net: add checking device state before run command
[sdk/emulator/qemu.git] / target-mips / translate.c
1 /*
2  *  MIPS32 emulation for qemu: main translation routines.
3  *
4  *  Copyright (c) 2004-2005 Jocelyn Mayer
5  *  Copyright (c) 2006 Marius Groeger (FPU operations)
6  *  Copyright (c) 2006 Thiemo Seufer (MIPS32R2 support)
7  *  Copyright (c) 2009 CodeSourcery (MIPS16 and microMIPS support)
8  *  Copyright (c) 2012 Jia Liu & Dongxue Zhang (MIPS ASE DSP support)
9  *
10  * This library is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public
12  * License as published by the Free Software Foundation; either
13  * version 2 of the License, or (at your option) any later version.
14  *
15  * This library is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * Lesser General Public License for more details.
19  *
20  * You should have received a copy of the GNU Lesser General Public
21  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
22  */
23
24 #include "qemu/osdep.h"
25 #include "cpu.h"
26 #include "disas/disas.h"
27 #include "exec/exec-all.h"
28 #include "tcg-op.h"
29 #include "exec/cpu_ldst.h"
30
31 #include "exec/helper-proto.h"
32 #include "exec/helper-gen.h"
33 #include "sysemu/kvm.h"
34 #include "exec/semihost.h"
35
36 #include "trace-tcg.h"
37 #include "exec/log.h"
38
39 #define MIPS_DEBUG_DISAS 0
40
41 /* MIPS major opcodes */
42 #define MASK_OP_MAJOR(op)  (op & (0x3F << 26))
43
44 enum {
45     /* indirect opcode tables */
46     OPC_SPECIAL  = (0x00 << 26),
47     OPC_REGIMM   = (0x01 << 26),
48     OPC_CP0      = (0x10 << 26),
49     OPC_CP1      = (0x11 << 26),
50     OPC_CP2      = (0x12 << 26),
51     OPC_CP3      = (0x13 << 26),
52     OPC_SPECIAL2 = (0x1C << 26),
53     OPC_SPECIAL3 = (0x1F << 26),
54     /* arithmetic with immediate */
55     OPC_ADDI     = (0x08 << 26),
56     OPC_ADDIU    = (0x09 << 26),
57     OPC_SLTI     = (0x0A << 26),
58     OPC_SLTIU    = (0x0B << 26),
59     /* logic with immediate */
60     OPC_ANDI     = (0x0C << 26),
61     OPC_ORI      = (0x0D << 26),
62     OPC_XORI     = (0x0E << 26),
63     OPC_LUI      = (0x0F << 26),
64     /* arithmetic with immediate */
65     OPC_DADDI    = (0x18 << 26),
66     OPC_DADDIU   = (0x19 << 26),
67     /* Jump and branches */
68     OPC_J        = (0x02 << 26),
69     OPC_JAL      = (0x03 << 26),
70     OPC_BEQ      = (0x04 << 26),  /* Unconditional if rs = rt = 0 (B) */
71     OPC_BEQL     = (0x14 << 26),
72     OPC_BNE      = (0x05 << 26),
73     OPC_BNEL     = (0x15 << 26),
74     OPC_BLEZ     = (0x06 << 26),
75     OPC_BLEZL    = (0x16 << 26),
76     OPC_BGTZ     = (0x07 << 26),
77     OPC_BGTZL    = (0x17 << 26),
78     OPC_JALX     = (0x1D << 26),
79     OPC_DAUI     = (0x1D << 26),
80     /* Load and stores */
81     OPC_LDL      = (0x1A << 26),
82     OPC_LDR      = (0x1B << 26),
83     OPC_LB       = (0x20 << 26),
84     OPC_LH       = (0x21 << 26),
85     OPC_LWL      = (0x22 << 26),
86     OPC_LW       = (0x23 << 26),
87     OPC_LWPC     = OPC_LW | 0x5,
88     OPC_LBU      = (0x24 << 26),
89     OPC_LHU      = (0x25 << 26),
90     OPC_LWR      = (0x26 << 26),
91     OPC_LWU      = (0x27 << 26),
92     OPC_SB       = (0x28 << 26),
93     OPC_SH       = (0x29 << 26),
94     OPC_SWL      = (0x2A << 26),
95     OPC_SW       = (0x2B << 26),
96     OPC_SDL      = (0x2C << 26),
97     OPC_SDR      = (0x2D << 26),
98     OPC_SWR      = (0x2E << 26),
99     OPC_LL       = (0x30 << 26),
100     OPC_LLD      = (0x34 << 26),
101     OPC_LD       = (0x37 << 26),
102     OPC_LDPC     = OPC_LD | 0x5,
103     OPC_SC       = (0x38 << 26),
104     OPC_SCD      = (0x3C << 26),
105     OPC_SD       = (0x3F << 26),
106     /* Floating point load/store */
107     OPC_LWC1     = (0x31 << 26),
108     OPC_LWC2     = (0x32 << 26),
109     OPC_LDC1     = (0x35 << 26),
110     OPC_LDC2     = (0x36 << 26),
111     OPC_SWC1     = (0x39 << 26),
112     OPC_SWC2     = (0x3A << 26),
113     OPC_SDC1     = (0x3D << 26),
114     OPC_SDC2     = (0x3E << 26),
115     /* Compact Branches */
116     OPC_BLEZALC  = (0x06 << 26),
117     OPC_BGEZALC  = (0x06 << 26),
118     OPC_BGEUC    = (0x06 << 26),
119     OPC_BGTZALC  = (0x07 << 26),
120     OPC_BLTZALC  = (0x07 << 26),
121     OPC_BLTUC    = (0x07 << 26),
122     OPC_BOVC     = (0x08 << 26),
123     OPC_BEQZALC  = (0x08 << 26),
124     OPC_BEQC     = (0x08 << 26),
125     OPC_BLEZC    = (0x16 << 26),
126     OPC_BGEZC    = (0x16 << 26),
127     OPC_BGEC     = (0x16 << 26),
128     OPC_BGTZC    = (0x17 << 26),
129     OPC_BLTZC    = (0x17 << 26),
130     OPC_BLTC     = (0x17 << 26),
131     OPC_BNVC     = (0x18 << 26),
132     OPC_BNEZALC  = (0x18 << 26),
133     OPC_BNEC     = (0x18 << 26),
134     OPC_BC       = (0x32 << 26),
135     OPC_BEQZC    = (0x36 << 26),
136     OPC_JIC      = (0x36 << 26),
137     OPC_BALC     = (0x3A << 26),
138     OPC_BNEZC    = (0x3E << 26),
139     OPC_JIALC    = (0x3E << 26),
140     /* MDMX ASE specific */
141     OPC_MDMX     = (0x1E << 26),
142     /* MSA ASE, same as MDMX */
143     OPC_MSA      = OPC_MDMX,
144     /* Cache and prefetch */
145     OPC_CACHE    = (0x2F << 26),
146     OPC_PREF     = (0x33 << 26),
147     /* PC-relative address computation / loads */
148     OPC_PCREL    = (0x3B << 26),
149 };
150
151 /* PC-relative address computation / loads  */
152 #define MASK_OPC_PCREL_TOP2BITS(op)  (MASK_OP_MAJOR(op) | (op & (3 << 19)))
153 #define MASK_OPC_PCREL_TOP5BITS(op)  (MASK_OP_MAJOR(op) | (op & (0x1f << 16)))
154 enum {
155     /* Instructions determined by bits 19 and 20 */
156     OPC_ADDIUPC = OPC_PCREL | (0 << 19),
157     R6_OPC_LWPC = OPC_PCREL | (1 << 19),
158     OPC_LWUPC   = OPC_PCREL | (2 << 19),
159
160     /* Instructions determined by bits 16 ... 20 */
161     OPC_AUIPC   = OPC_PCREL | (0x1e << 16),
162     OPC_ALUIPC  = OPC_PCREL | (0x1f << 16),
163
164     /* Other */
165     R6_OPC_LDPC = OPC_PCREL | (6 << 18),
166 };
167
168 /* MIPS special opcodes */
169 #define MASK_SPECIAL(op)   MASK_OP_MAJOR(op) | (op & 0x3F)
170
171 enum {
172     /* Shifts */
173     OPC_SLL      = 0x00 | OPC_SPECIAL,
174     /* NOP is SLL r0, r0, 0   */
175     /* SSNOP is SLL r0, r0, 1 */
176     /* EHB is SLL r0, r0, 3 */
177     OPC_SRL      = 0x02 | OPC_SPECIAL, /* also ROTR */
178     OPC_ROTR     = OPC_SRL | (1 << 21),
179     OPC_SRA      = 0x03 | OPC_SPECIAL,
180     OPC_SLLV     = 0x04 | OPC_SPECIAL,
181     OPC_SRLV     = 0x06 | OPC_SPECIAL, /* also ROTRV */
182     OPC_ROTRV    = OPC_SRLV | (1 << 6),
183     OPC_SRAV     = 0x07 | OPC_SPECIAL,
184     OPC_DSLLV    = 0x14 | OPC_SPECIAL,
185     OPC_DSRLV    = 0x16 | OPC_SPECIAL, /* also DROTRV */
186     OPC_DROTRV   = OPC_DSRLV | (1 << 6),
187     OPC_DSRAV    = 0x17 | OPC_SPECIAL,
188     OPC_DSLL     = 0x38 | OPC_SPECIAL,
189     OPC_DSRL     = 0x3A | OPC_SPECIAL, /* also DROTR */
190     OPC_DROTR    = OPC_DSRL | (1 << 21),
191     OPC_DSRA     = 0x3B | OPC_SPECIAL,
192     OPC_DSLL32   = 0x3C | OPC_SPECIAL,
193     OPC_DSRL32   = 0x3E | OPC_SPECIAL, /* also DROTR32 */
194     OPC_DROTR32  = OPC_DSRL32 | (1 << 21),
195     OPC_DSRA32   = 0x3F | OPC_SPECIAL,
196     /* Multiplication / division */
197     OPC_MULT     = 0x18 | OPC_SPECIAL,
198     OPC_MULTU    = 0x19 | OPC_SPECIAL,
199     OPC_DIV      = 0x1A | OPC_SPECIAL,
200     OPC_DIVU     = 0x1B | OPC_SPECIAL,
201     OPC_DMULT    = 0x1C | OPC_SPECIAL,
202     OPC_DMULTU   = 0x1D | OPC_SPECIAL,
203     OPC_DDIV     = 0x1E | OPC_SPECIAL,
204     OPC_DDIVU    = 0x1F | OPC_SPECIAL,
205
206     /* 2 registers arithmetic / logic */
207     OPC_ADD      = 0x20 | OPC_SPECIAL,
208     OPC_ADDU     = 0x21 | OPC_SPECIAL,
209     OPC_SUB      = 0x22 | OPC_SPECIAL,
210     OPC_SUBU     = 0x23 | OPC_SPECIAL,
211     OPC_AND      = 0x24 | OPC_SPECIAL,
212     OPC_OR       = 0x25 | OPC_SPECIAL,
213     OPC_XOR      = 0x26 | OPC_SPECIAL,
214     OPC_NOR      = 0x27 | OPC_SPECIAL,
215     OPC_SLT      = 0x2A | OPC_SPECIAL,
216     OPC_SLTU     = 0x2B | OPC_SPECIAL,
217     OPC_DADD     = 0x2C | OPC_SPECIAL,
218     OPC_DADDU    = 0x2D | OPC_SPECIAL,
219     OPC_DSUB     = 0x2E | OPC_SPECIAL,
220     OPC_DSUBU    = 0x2F | OPC_SPECIAL,
221     /* Jumps */
222     OPC_JR       = 0x08 | OPC_SPECIAL, /* Also JR.HB */
223     OPC_JALR     = 0x09 | OPC_SPECIAL, /* Also JALR.HB */
224     /* Traps */
225     OPC_TGE      = 0x30 | OPC_SPECIAL,
226     OPC_TGEU     = 0x31 | OPC_SPECIAL,
227     OPC_TLT      = 0x32 | OPC_SPECIAL,
228     OPC_TLTU     = 0x33 | OPC_SPECIAL,
229     OPC_TEQ      = 0x34 | OPC_SPECIAL,
230     OPC_TNE      = 0x36 | OPC_SPECIAL,
231     /* HI / LO registers load & stores */
232     OPC_MFHI     = 0x10 | OPC_SPECIAL,
233     OPC_MTHI     = 0x11 | OPC_SPECIAL,
234     OPC_MFLO     = 0x12 | OPC_SPECIAL,
235     OPC_MTLO     = 0x13 | OPC_SPECIAL,
236     /* Conditional moves */
237     OPC_MOVZ     = 0x0A | OPC_SPECIAL,
238     OPC_MOVN     = 0x0B | OPC_SPECIAL,
239
240     OPC_SELEQZ   = 0x35 | OPC_SPECIAL,
241     OPC_SELNEZ   = 0x37 | OPC_SPECIAL,
242
243     OPC_MOVCI    = 0x01 | OPC_SPECIAL,
244
245     /* Special */
246     OPC_PMON     = 0x05 | OPC_SPECIAL, /* unofficial */
247     OPC_SYSCALL  = 0x0C | OPC_SPECIAL,
248     OPC_BREAK    = 0x0D | OPC_SPECIAL,
249     OPC_SPIM     = 0x0E | OPC_SPECIAL, /* unofficial */
250     OPC_SYNC     = 0x0F | OPC_SPECIAL,
251
252     OPC_SPECIAL28_RESERVED = 0x28 | OPC_SPECIAL,
253     OPC_SPECIAL29_RESERVED = 0x29 | OPC_SPECIAL,
254     OPC_SPECIAL39_RESERVED = 0x39 | OPC_SPECIAL,
255     OPC_SPECIAL3D_RESERVED = 0x3D | OPC_SPECIAL,
256 };
257
258 /* R6 Multiply and Divide instructions have the same Opcode
259    and function field as legacy OPC_MULT[U]/OPC_DIV[U] */
260 #define MASK_R6_MULDIV(op)   (MASK_SPECIAL(op) | (op & (0x7ff)))
261
262 enum {
263     R6_OPC_MUL   = OPC_MULT  | (2 << 6),
264     R6_OPC_MUH   = OPC_MULT  | (3 << 6),
265     R6_OPC_MULU  = OPC_MULTU | (2 << 6),
266     R6_OPC_MUHU  = OPC_MULTU | (3 << 6),
267     R6_OPC_DIV   = OPC_DIV   | (2 << 6),
268     R6_OPC_MOD   = OPC_DIV   | (3 << 6),
269     R6_OPC_DIVU  = OPC_DIVU  | (2 << 6),
270     R6_OPC_MODU  = OPC_DIVU  | (3 << 6),
271
272     R6_OPC_DMUL   = OPC_DMULT  | (2 << 6),
273     R6_OPC_DMUH   = OPC_DMULT  | (3 << 6),
274     R6_OPC_DMULU  = OPC_DMULTU | (2 << 6),
275     R6_OPC_DMUHU  = OPC_DMULTU | (3 << 6),
276     R6_OPC_DDIV   = OPC_DDIV   | (2 << 6),
277     R6_OPC_DMOD   = OPC_DDIV   | (3 << 6),
278     R6_OPC_DDIVU  = OPC_DDIVU  | (2 << 6),
279     R6_OPC_DMODU  = OPC_DDIVU  | (3 << 6),
280
281     R6_OPC_CLZ      = 0x10 | OPC_SPECIAL,
282     R6_OPC_CLO      = 0x11 | OPC_SPECIAL,
283     R6_OPC_DCLZ     = 0x12 | OPC_SPECIAL,
284     R6_OPC_DCLO     = 0x13 | OPC_SPECIAL,
285     R6_OPC_SDBBP    = 0x0e | OPC_SPECIAL,
286
287     OPC_LSA  = 0x05 | OPC_SPECIAL,
288     OPC_DLSA = 0x15 | OPC_SPECIAL,
289 };
290
291 /* Multiplication variants of the vr54xx. */
292 #define MASK_MUL_VR54XX(op)   MASK_SPECIAL(op) | (op & (0x1F << 6))
293
294 enum {
295     OPC_VR54XX_MULS    = (0x03 << 6) | OPC_MULT,
296     OPC_VR54XX_MULSU   = (0x03 << 6) | OPC_MULTU,
297     OPC_VR54XX_MACC    = (0x05 << 6) | OPC_MULT,
298     OPC_VR54XX_MACCU   = (0x05 << 6) | OPC_MULTU,
299     OPC_VR54XX_MSAC    = (0x07 << 6) | OPC_MULT,
300     OPC_VR54XX_MSACU   = (0x07 << 6) | OPC_MULTU,
301     OPC_VR54XX_MULHI   = (0x09 << 6) | OPC_MULT,
302     OPC_VR54XX_MULHIU  = (0x09 << 6) | OPC_MULTU,
303     OPC_VR54XX_MULSHI  = (0x0B << 6) | OPC_MULT,
304     OPC_VR54XX_MULSHIU = (0x0B << 6) | OPC_MULTU,
305     OPC_VR54XX_MACCHI  = (0x0D << 6) | OPC_MULT,
306     OPC_VR54XX_MACCHIU = (0x0D << 6) | OPC_MULTU,
307     OPC_VR54XX_MSACHI  = (0x0F << 6) | OPC_MULT,
308     OPC_VR54XX_MSACHIU = (0x0F << 6) | OPC_MULTU,
309 };
310
311 /* REGIMM (rt field) opcodes */
312 #define MASK_REGIMM(op)    MASK_OP_MAJOR(op) | (op & (0x1F << 16))
313
314 enum {
315     OPC_BLTZ     = (0x00 << 16) | OPC_REGIMM,
316     OPC_BLTZL    = (0x02 << 16) | OPC_REGIMM,
317     OPC_BGEZ     = (0x01 << 16) | OPC_REGIMM,
318     OPC_BGEZL    = (0x03 << 16) | OPC_REGIMM,
319     OPC_BLTZAL   = (0x10 << 16) | OPC_REGIMM,
320     OPC_BLTZALL  = (0x12 << 16) | OPC_REGIMM,
321     OPC_BGEZAL   = (0x11 << 16) | OPC_REGIMM,
322     OPC_BGEZALL  = (0x13 << 16) | OPC_REGIMM,
323     OPC_TGEI     = (0x08 << 16) | OPC_REGIMM,
324     OPC_TGEIU    = (0x09 << 16) | OPC_REGIMM,
325     OPC_TLTI     = (0x0A << 16) | OPC_REGIMM,
326     OPC_TLTIU    = (0x0B << 16) | OPC_REGIMM,
327     OPC_TEQI     = (0x0C << 16) | OPC_REGIMM,
328     OPC_TNEI     = (0x0E << 16) | OPC_REGIMM,
329     OPC_SIGRIE   = (0x17 << 16) | OPC_REGIMM,
330     OPC_SYNCI    = (0x1F << 16) | OPC_REGIMM,
331
332     OPC_DAHI     = (0x06 << 16) | OPC_REGIMM,
333     OPC_DATI     = (0x1e << 16) | OPC_REGIMM,
334 };
335
336 /* Special2 opcodes */
337 #define MASK_SPECIAL2(op)  MASK_OP_MAJOR(op) | (op & 0x3F)
338
339 enum {
340     /* Multiply & xxx operations */
341     OPC_MADD     = 0x00 | OPC_SPECIAL2,
342     OPC_MADDU    = 0x01 | OPC_SPECIAL2,
343     OPC_MUL      = 0x02 | OPC_SPECIAL2,
344     OPC_MSUB     = 0x04 | OPC_SPECIAL2,
345     OPC_MSUBU    = 0x05 | OPC_SPECIAL2,
346     /* Loongson 2F */
347     OPC_MULT_G_2F   = 0x10 | OPC_SPECIAL2,
348     OPC_DMULT_G_2F  = 0x11 | OPC_SPECIAL2,
349     OPC_MULTU_G_2F  = 0x12 | OPC_SPECIAL2,
350     OPC_DMULTU_G_2F = 0x13 | OPC_SPECIAL2,
351     OPC_DIV_G_2F    = 0x14 | OPC_SPECIAL2,
352     OPC_DDIV_G_2F   = 0x15 | OPC_SPECIAL2,
353     OPC_DIVU_G_2F   = 0x16 | OPC_SPECIAL2,
354     OPC_DDIVU_G_2F  = 0x17 | OPC_SPECIAL2,
355     OPC_MOD_G_2F    = 0x1c | OPC_SPECIAL2,
356     OPC_DMOD_G_2F   = 0x1d | OPC_SPECIAL2,
357     OPC_MODU_G_2F   = 0x1e | OPC_SPECIAL2,
358     OPC_DMODU_G_2F  = 0x1f | OPC_SPECIAL2,
359     /* Misc */
360     OPC_CLZ      = 0x20 | OPC_SPECIAL2,
361     OPC_CLO      = 0x21 | OPC_SPECIAL2,
362     OPC_DCLZ     = 0x24 | OPC_SPECIAL2,
363     OPC_DCLO     = 0x25 | OPC_SPECIAL2,
364     /* Special */
365     OPC_SDBBP    = 0x3F | OPC_SPECIAL2,
366 };
367
368 /* Special3 opcodes */
369 #define MASK_SPECIAL3(op)  MASK_OP_MAJOR(op) | (op & 0x3F)
370
371 enum {
372     OPC_EXT      = 0x00 | OPC_SPECIAL3,
373     OPC_DEXTM    = 0x01 | OPC_SPECIAL3,
374     OPC_DEXTU    = 0x02 | OPC_SPECIAL3,
375     OPC_DEXT     = 0x03 | OPC_SPECIAL3,
376     OPC_INS      = 0x04 | OPC_SPECIAL3,
377     OPC_DINSM    = 0x05 | OPC_SPECIAL3,
378     OPC_DINSU    = 0x06 | OPC_SPECIAL3,
379     OPC_DINS     = 0x07 | OPC_SPECIAL3,
380     OPC_FORK     = 0x08 | OPC_SPECIAL3,
381     OPC_YIELD    = 0x09 | OPC_SPECIAL3,
382     OPC_BSHFL    = 0x20 | OPC_SPECIAL3,
383     OPC_DBSHFL   = 0x24 | OPC_SPECIAL3,
384     OPC_RDHWR    = 0x3B | OPC_SPECIAL3,
385
386     /* Loongson 2E */
387     OPC_MULT_G_2E   = 0x18 | OPC_SPECIAL3,
388     OPC_MULTU_G_2E  = 0x19 | OPC_SPECIAL3,
389     OPC_DIV_G_2E    = 0x1A | OPC_SPECIAL3,
390     OPC_DIVU_G_2E   = 0x1B | OPC_SPECIAL3,
391     OPC_DMULT_G_2E  = 0x1C | OPC_SPECIAL3,
392     OPC_DMULTU_G_2E = 0x1D | OPC_SPECIAL3,
393     OPC_DDIV_G_2E   = 0x1E | OPC_SPECIAL3,
394     OPC_DDIVU_G_2E  = 0x1F | OPC_SPECIAL3,
395     OPC_MOD_G_2E    = 0x22 | OPC_SPECIAL3,
396     OPC_MODU_G_2E   = 0x23 | OPC_SPECIAL3,
397     OPC_DMOD_G_2E   = 0x26 | OPC_SPECIAL3,
398     OPC_DMODU_G_2E  = 0x27 | OPC_SPECIAL3,
399
400     /* MIPS DSP Load */
401     OPC_LX_DSP         = 0x0A | OPC_SPECIAL3,
402     /* MIPS DSP Arithmetic */
403     OPC_ADDU_QB_DSP    = 0x10 | OPC_SPECIAL3,
404     OPC_ADDU_OB_DSP    = 0x14 | OPC_SPECIAL3,
405     OPC_ABSQ_S_PH_DSP  = 0x12 | OPC_SPECIAL3,
406     OPC_ABSQ_S_QH_DSP  = 0x16 | OPC_SPECIAL3,
407     /* OPC_ADDUH_QB_DSP is same as OPC_MULT_G_2E.  */
408     /* OPC_ADDUH_QB_DSP   = 0x18 | OPC_SPECIAL3,  */
409     OPC_CMPU_EQ_QB_DSP = 0x11 | OPC_SPECIAL3,
410     OPC_CMPU_EQ_OB_DSP = 0x15 | OPC_SPECIAL3,
411     /* MIPS DSP GPR-Based Shift Sub-class */
412     OPC_SHLL_QB_DSP    = 0x13 | OPC_SPECIAL3,
413     OPC_SHLL_OB_DSP    = 0x17 | OPC_SPECIAL3,
414     /* MIPS DSP Multiply Sub-class insns */
415     /* OPC_MUL_PH_DSP is same as OPC_ADDUH_QB_DSP.  */
416     /* OPC_MUL_PH_DSP     = 0x18 | OPC_SPECIAL3,  */
417     OPC_DPA_W_PH_DSP   = 0x30 | OPC_SPECIAL3,
418     OPC_DPAQ_W_QH_DSP  = 0x34 | OPC_SPECIAL3,
419     /* DSP Bit/Manipulation Sub-class */
420     OPC_INSV_DSP       = 0x0C | OPC_SPECIAL3,
421     OPC_DINSV_DSP      = 0x0D | OPC_SPECIAL3,
422     /* MIPS DSP Append Sub-class */
423     OPC_APPEND_DSP     = 0x31 | OPC_SPECIAL3,
424     OPC_DAPPEND_DSP    = 0x35 | OPC_SPECIAL3,
425     /* MIPS DSP Accumulator and DSPControl Access Sub-class */
426     OPC_EXTR_W_DSP     = 0x38 | OPC_SPECIAL3,
427     OPC_DEXTR_W_DSP    = 0x3C | OPC_SPECIAL3,
428
429     /* R6 */
430     R6_OPC_PREF        = 0x35 | OPC_SPECIAL3,
431     R6_OPC_CACHE       = 0x25 | OPC_SPECIAL3,
432     R6_OPC_LL          = 0x36 | OPC_SPECIAL3,
433     R6_OPC_SC          = 0x26 | OPC_SPECIAL3,
434     R6_OPC_LLD         = 0x37 | OPC_SPECIAL3,
435     R6_OPC_SCD         = 0x27 | OPC_SPECIAL3,
436 };
437
438 /* BSHFL opcodes */
439 #define MASK_BSHFL(op)     MASK_SPECIAL3(op) | (op & (0x1F << 6))
440
441 enum {
442     OPC_WSBH      = (0x02 << 6) | OPC_BSHFL,
443     OPC_SEB       = (0x10 << 6) | OPC_BSHFL,
444     OPC_SEH       = (0x18 << 6) | OPC_BSHFL,
445     OPC_ALIGN     = (0x08 << 6) | OPC_BSHFL, /* 010.bp */
446     OPC_ALIGN_END = (0x0B << 6) | OPC_BSHFL, /* 010.00 to 010.11 */
447     OPC_BITSWAP   = (0x00 << 6) | OPC_BSHFL  /* 00000 */
448 };
449
450 /* DBSHFL opcodes */
451 #define MASK_DBSHFL(op)    MASK_SPECIAL3(op) | (op & (0x1F << 6))
452
453 enum {
454     OPC_DSBH       = (0x02 << 6) | OPC_DBSHFL,
455     OPC_DSHD       = (0x05 << 6) | OPC_DBSHFL,
456     OPC_DALIGN     = (0x08 << 6) | OPC_DBSHFL, /* 01.bp */
457     OPC_DALIGN_END = (0x0F << 6) | OPC_DBSHFL, /* 01.000 to 01.111 */
458     OPC_DBITSWAP   = (0x00 << 6) | OPC_DBSHFL, /* 00000 */
459 };
460
461 /* MIPS DSP REGIMM opcodes */
462 enum {
463     OPC_BPOSGE32 = (0x1C << 16) | OPC_REGIMM,
464     OPC_BPOSGE64 = (0x1D << 16) | OPC_REGIMM,
465 };
466
467 #define MASK_LX(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
468 /* MIPS DSP Load */
469 enum {
470     OPC_LBUX = (0x06 << 6) | OPC_LX_DSP,
471     OPC_LHX  = (0x04 << 6) | OPC_LX_DSP,
472     OPC_LWX  = (0x00 << 6) | OPC_LX_DSP,
473     OPC_LDX = (0x08 << 6) | OPC_LX_DSP,
474 };
475
476 #define MASK_ADDU_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
477 enum {
478     /* MIPS DSP Arithmetic Sub-class */
479     OPC_ADDQ_PH        = (0x0A << 6) | OPC_ADDU_QB_DSP,
480     OPC_ADDQ_S_PH      = (0x0E << 6) | OPC_ADDU_QB_DSP,
481     OPC_ADDQ_S_W       = (0x16 << 6) | OPC_ADDU_QB_DSP,
482     OPC_ADDU_QB        = (0x00 << 6) | OPC_ADDU_QB_DSP,
483     OPC_ADDU_S_QB      = (0x04 << 6) | OPC_ADDU_QB_DSP,
484     OPC_ADDU_PH        = (0x08 << 6) | OPC_ADDU_QB_DSP,
485     OPC_ADDU_S_PH      = (0x0C << 6) | OPC_ADDU_QB_DSP,
486     OPC_SUBQ_PH        = (0x0B << 6) | OPC_ADDU_QB_DSP,
487     OPC_SUBQ_S_PH      = (0x0F << 6) | OPC_ADDU_QB_DSP,
488     OPC_SUBQ_S_W       = (0x17 << 6) | OPC_ADDU_QB_DSP,
489     OPC_SUBU_QB        = (0x01 << 6) | OPC_ADDU_QB_DSP,
490     OPC_SUBU_S_QB      = (0x05 << 6) | OPC_ADDU_QB_DSP,
491     OPC_SUBU_PH        = (0x09 << 6) | OPC_ADDU_QB_DSP,
492     OPC_SUBU_S_PH      = (0x0D << 6) | OPC_ADDU_QB_DSP,
493     OPC_ADDSC          = (0x10 << 6) | OPC_ADDU_QB_DSP,
494     OPC_ADDWC          = (0x11 << 6) | OPC_ADDU_QB_DSP,
495     OPC_MODSUB         = (0x12 << 6) | OPC_ADDU_QB_DSP,
496     OPC_RADDU_W_QB     = (0x14 << 6) | OPC_ADDU_QB_DSP,
497     /* MIPS DSP Multiply Sub-class insns */
498     OPC_MULEU_S_PH_QBL = (0x06 << 6) | OPC_ADDU_QB_DSP,
499     OPC_MULEU_S_PH_QBR = (0x07 << 6) | OPC_ADDU_QB_DSP,
500     OPC_MULQ_RS_PH     = (0x1F << 6) | OPC_ADDU_QB_DSP,
501     OPC_MULEQ_S_W_PHL  = (0x1C << 6) | OPC_ADDU_QB_DSP,
502     OPC_MULEQ_S_W_PHR  = (0x1D << 6) | OPC_ADDU_QB_DSP,
503     OPC_MULQ_S_PH      = (0x1E << 6) | OPC_ADDU_QB_DSP,
504 };
505
506 #define OPC_ADDUH_QB_DSP OPC_MULT_G_2E
507 #define MASK_ADDUH_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
508 enum {
509     /* MIPS DSP Arithmetic Sub-class */
510     OPC_ADDUH_QB   = (0x00 << 6) | OPC_ADDUH_QB_DSP,
511     OPC_ADDUH_R_QB = (0x02 << 6) | OPC_ADDUH_QB_DSP,
512     OPC_ADDQH_PH   = (0x08 << 6) | OPC_ADDUH_QB_DSP,
513     OPC_ADDQH_R_PH = (0x0A << 6) | OPC_ADDUH_QB_DSP,
514     OPC_ADDQH_W    = (0x10 << 6) | OPC_ADDUH_QB_DSP,
515     OPC_ADDQH_R_W  = (0x12 << 6) | OPC_ADDUH_QB_DSP,
516     OPC_SUBUH_QB   = (0x01 << 6) | OPC_ADDUH_QB_DSP,
517     OPC_SUBUH_R_QB = (0x03 << 6) | OPC_ADDUH_QB_DSP,
518     OPC_SUBQH_PH   = (0x09 << 6) | OPC_ADDUH_QB_DSP,
519     OPC_SUBQH_R_PH = (0x0B << 6) | OPC_ADDUH_QB_DSP,
520     OPC_SUBQH_W    = (0x11 << 6) | OPC_ADDUH_QB_DSP,
521     OPC_SUBQH_R_W  = (0x13 << 6) | OPC_ADDUH_QB_DSP,
522     /* MIPS DSP Multiply Sub-class insns */
523     OPC_MUL_PH     = (0x0C << 6) | OPC_ADDUH_QB_DSP,
524     OPC_MUL_S_PH   = (0x0E << 6) | OPC_ADDUH_QB_DSP,
525     OPC_MULQ_S_W   = (0x16 << 6) | OPC_ADDUH_QB_DSP,
526     OPC_MULQ_RS_W  = (0x17 << 6) | OPC_ADDUH_QB_DSP,
527 };
528
529 #define MASK_ABSQ_S_PH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
530 enum {
531     /* MIPS DSP Arithmetic Sub-class */
532     OPC_ABSQ_S_QB       = (0x01 << 6) | OPC_ABSQ_S_PH_DSP,
533     OPC_ABSQ_S_PH       = (0x09 << 6) | OPC_ABSQ_S_PH_DSP,
534     OPC_ABSQ_S_W        = (0x11 << 6) | OPC_ABSQ_S_PH_DSP,
535     OPC_PRECEQ_W_PHL    = (0x0C << 6) | OPC_ABSQ_S_PH_DSP,
536     OPC_PRECEQ_W_PHR    = (0x0D << 6) | OPC_ABSQ_S_PH_DSP,
537     OPC_PRECEQU_PH_QBL  = (0x04 << 6) | OPC_ABSQ_S_PH_DSP,
538     OPC_PRECEQU_PH_QBR  = (0x05 << 6) | OPC_ABSQ_S_PH_DSP,
539     OPC_PRECEQU_PH_QBLA = (0x06 << 6) | OPC_ABSQ_S_PH_DSP,
540     OPC_PRECEQU_PH_QBRA = (0x07 << 6) | OPC_ABSQ_S_PH_DSP,
541     OPC_PRECEU_PH_QBL   = (0x1C << 6) | OPC_ABSQ_S_PH_DSP,
542     OPC_PRECEU_PH_QBR   = (0x1D << 6) | OPC_ABSQ_S_PH_DSP,
543     OPC_PRECEU_PH_QBLA  = (0x1E << 6) | OPC_ABSQ_S_PH_DSP,
544     OPC_PRECEU_PH_QBRA  = (0x1F << 6) | OPC_ABSQ_S_PH_DSP,
545     /* DSP Bit/Manipulation Sub-class */
546     OPC_BITREV          = (0x1B << 6) | OPC_ABSQ_S_PH_DSP,
547     OPC_REPL_QB         = (0x02 << 6) | OPC_ABSQ_S_PH_DSP,
548     OPC_REPLV_QB        = (0x03 << 6) | OPC_ABSQ_S_PH_DSP,
549     OPC_REPL_PH         = (0x0A << 6) | OPC_ABSQ_S_PH_DSP,
550     OPC_REPLV_PH        = (0x0B << 6) | OPC_ABSQ_S_PH_DSP,
551 };
552
553 #define MASK_CMPU_EQ_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
554 enum {
555     /* MIPS DSP Arithmetic Sub-class */
556     OPC_PRECR_QB_PH      = (0x0D << 6) | OPC_CMPU_EQ_QB_DSP,
557     OPC_PRECRQ_QB_PH     = (0x0C << 6) | OPC_CMPU_EQ_QB_DSP,
558     OPC_PRECR_SRA_PH_W   = (0x1E << 6) | OPC_CMPU_EQ_QB_DSP,
559     OPC_PRECR_SRA_R_PH_W = (0x1F << 6) | OPC_CMPU_EQ_QB_DSP,
560     OPC_PRECRQ_PH_W      = (0x14 << 6) | OPC_CMPU_EQ_QB_DSP,
561     OPC_PRECRQ_RS_PH_W   = (0x15 << 6) | OPC_CMPU_EQ_QB_DSP,
562     OPC_PRECRQU_S_QB_PH  = (0x0F << 6) | OPC_CMPU_EQ_QB_DSP,
563     /* DSP Compare-Pick Sub-class */
564     OPC_CMPU_EQ_QB       = (0x00 << 6) | OPC_CMPU_EQ_QB_DSP,
565     OPC_CMPU_LT_QB       = (0x01 << 6) | OPC_CMPU_EQ_QB_DSP,
566     OPC_CMPU_LE_QB       = (0x02 << 6) | OPC_CMPU_EQ_QB_DSP,
567     OPC_CMPGU_EQ_QB      = (0x04 << 6) | OPC_CMPU_EQ_QB_DSP,
568     OPC_CMPGU_LT_QB      = (0x05 << 6) | OPC_CMPU_EQ_QB_DSP,
569     OPC_CMPGU_LE_QB      = (0x06 << 6) | OPC_CMPU_EQ_QB_DSP,
570     OPC_CMPGDU_EQ_QB     = (0x18 << 6) | OPC_CMPU_EQ_QB_DSP,
571     OPC_CMPGDU_LT_QB     = (0x19 << 6) | OPC_CMPU_EQ_QB_DSP,
572     OPC_CMPGDU_LE_QB     = (0x1A << 6) | OPC_CMPU_EQ_QB_DSP,
573     OPC_CMP_EQ_PH        = (0x08 << 6) | OPC_CMPU_EQ_QB_DSP,
574     OPC_CMP_LT_PH        = (0x09 << 6) | OPC_CMPU_EQ_QB_DSP,
575     OPC_CMP_LE_PH        = (0x0A << 6) | OPC_CMPU_EQ_QB_DSP,
576     OPC_PICK_QB          = (0x03 << 6) | OPC_CMPU_EQ_QB_DSP,
577     OPC_PICK_PH          = (0x0B << 6) | OPC_CMPU_EQ_QB_DSP,
578     OPC_PACKRL_PH        = (0x0E << 6) | OPC_CMPU_EQ_QB_DSP,
579 };
580
581 #define MASK_SHLL_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
582 enum {
583     /* MIPS DSP GPR-Based Shift Sub-class */
584     OPC_SHLL_QB    = (0x00 << 6) | OPC_SHLL_QB_DSP,
585     OPC_SHLLV_QB   = (0x02 << 6) | OPC_SHLL_QB_DSP,
586     OPC_SHLL_PH    = (0x08 << 6) | OPC_SHLL_QB_DSP,
587     OPC_SHLLV_PH   = (0x0A << 6) | OPC_SHLL_QB_DSP,
588     OPC_SHLL_S_PH  = (0x0C << 6) | OPC_SHLL_QB_DSP,
589     OPC_SHLLV_S_PH = (0x0E << 6) | OPC_SHLL_QB_DSP,
590     OPC_SHLL_S_W   = (0x14 << 6) | OPC_SHLL_QB_DSP,
591     OPC_SHLLV_S_W  = (0x16 << 6) | OPC_SHLL_QB_DSP,
592     OPC_SHRL_QB    = (0x01 << 6) | OPC_SHLL_QB_DSP,
593     OPC_SHRLV_QB   = (0x03 << 6) | OPC_SHLL_QB_DSP,
594     OPC_SHRL_PH    = (0x19 << 6) | OPC_SHLL_QB_DSP,
595     OPC_SHRLV_PH   = (0x1B << 6) | OPC_SHLL_QB_DSP,
596     OPC_SHRA_QB    = (0x04 << 6) | OPC_SHLL_QB_DSP,
597     OPC_SHRA_R_QB  = (0x05 << 6) | OPC_SHLL_QB_DSP,
598     OPC_SHRAV_QB   = (0x06 << 6) | OPC_SHLL_QB_DSP,
599     OPC_SHRAV_R_QB = (0x07 << 6) | OPC_SHLL_QB_DSP,
600     OPC_SHRA_PH    = (0x09 << 6) | OPC_SHLL_QB_DSP,
601     OPC_SHRAV_PH   = (0x0B << 6) | OPC_SHLL_QB_DSP,
602     OPC_SHRA_R_PH  = (0x0D << 6) | OPC_SHLL_QB_DSP,
603     OPC_SHRAV_R_PH = (0x0F << 6) | OPC_SHLL_QB_DSP,
604     OPC_SHRA_R_W   = (0x15 << 6) | OPC_SHLL_QB_DSP,
605     OPC_SHRAV_R_W  = (0x17 << 6) | OPC_SHLL_QB_DSP,
606 };
607
608 #define MASK_DPA_W_PH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
609 enum {
610     /* MIPS DSP Multiply Sub-class insns */
611     OPC_DPAU_H_QBL    = (0x03 << 6) | OPC_DPA_W_PH_DSP,
612     OPC_DPAU_H_QBR    = (0x07 << 6) | OPC_DPA_W_PH_DSP,
613     OPC_DPSU_H_QBL    = (0x0B << 6) | OPC_DPA_W_PH_DSP,
614     OPC_DPSU_H_QBR    = (0x0F << 6) | OPC_DPA_W_PH_DSP,
615     OPC_DPA_W_PH      = (0x00 << 6) | OPC_DPA_W_PH_DSP,
616     OPC_DPAX_W_PH     = (0x08 << 6) | OPC_DPA_W_PH_DSP,
617     OPC_DPAQ_S_W_PH   = (0x04 << 6) | OPC_DPA_W_PH_DSP,
618     OPC_DPAQX_S_W_PH  = (0x18 << 6) | OPC_DPA_W_PH_DSP,
619     OPC_DPAQX_SA_W_PH = (0x1A << 6) | OPC_DPA_W_PH_DSP,
620     OPC_DPS_W_PH      = (0x01 << 6) | OPC_DPA_W_PH_DSP,
621     OPC_DPSX_W_PH     = (0x09 << 6) | OPC_DPA_W_PH_DSP,
622     OPC_DPSQ_S_W_PH   = (0x05 << 6) | OPC_DPA_W_PH_DSP,
623     OPC_DPSQX_S_W_PH  = (0x19 << 6) | OPC_DPA_W_PH_DSP,
624     OPC_DPSQX_SA_W_PH = (0x1B << 6) | OPC_DPA_W_PH_DSP,
625     OPC_MULSAQ_S_W_PH = (0x06 << 6) | OPC_DPA_W_PH_DSP,
626     OPC_DPAQ_SA_L_W   = (0x0C << 6) | OPC_DPA_W_PH_DSP,
627     OPC_DPSQ_SA_L_W   = (0x0D << 6) | OPC_DPA_W_PH_DSP,
628     OPC_MAQ_S_W_PHL   = (0x14 << 6) | OPC_DPA_W_PH_DSP,
629     OPC_MAQ_S_W_PHR   = (0x16 << 6) | OPC_DPA_W_PH_DSP,
630     OPC_MAQ_SA_W_PHL  = (0x10 << 6) | OPC_DPA_W_PH_DSP,
631     OPC_MAQ_SA_W_PHR  = (0x12 << 6) | OPC_DPA_W_PH_DSP,
632     OPC_MULSA_W_PH    = (0x02 << 6) | OPC_DPA_W_PH_DSP,
633 };
634
635 #define MASK_INSV(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
636 enum {
637     /* DSP Bit/Manipulation Sub-class */
638     OPC_INSV = (0x00 << 6) | OPC_INSV_DSP,
639 };
640
641 #define MASK_APPEND(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
642 enum {
643     /* MIPS DSP Append Sub-class */
644     OPC_APPEND  = (0x00 << 6) | OPC_APPEND_DSP,
645     OPC_PREPEND = (0x01 << 6) | OPC_APPEND_DSP,
646     OPC_BALIGN  = (0x10 << 6) | OPC_APPEND_DSP,
647 };
648
649 #define MASK_EXTR_W(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
650 enum {
651     /* MIPS DSP Accumulator and DSPControl Access Sub-class */
652     OPC_EXTR_W     = (0x00 << 6) | OPC_EXTR_W_DSP,
653     OPC_EXTR_R_W   = (0x04 << 6) | OPC_EXTR_W_DSP,
654     OPC_EXTR_RS_W  = (0x06 << 6) | OPC_EXTR_W_DSP,
655     OPC_EXTR_S_H   = (0x0E << 6) | OPC_EXTR_W_DSP,
656     OPC_EXTRV_S_H  = (0x0F << 6) | OPC_EXTR_W_DSP,
657     OPC_EXTRV_W    = (0x01 << 6) | OPC_EXTR_W_DSP,
658     OPC_EXTRV_R_W  = (0x05 << 6) | OPC_EXTR_W_DSP,
659     OPC_EXTRV_RS_W = (0x07 << 6) | OPC_EXTR_W_DSP,
660     OPC_EXTP       = (0x02 << 6) | OPC_EXTR_W_DSP,
661     OPC_EXTPV      = (0x03 << 6) | OPC_EXTR_W_DSP,
662     OPC_EXTPDP     = (0x0A << 6) | OPC_EXTR_W_DSP,
663     OPC_EXTPDPV    = (0x0B << 6) | OPC_EXTR_W_DSP,
664     OPC_SHILO      = (0x1A << 6) | OPC_EXTR_W_DSP,
665     OPC_SHILOV     = (0x1B << 6) | OPC_EXTR_W_DSP,
666     OPC_MTHLIP     = (0x1F << 6) | OPC_EXTR_W_DSP,
667     OPC_WRDSP      = (0x13 << 6) | OPC_EXTR_W_DSP,
668     OPC_RDDSP      = (0x12 << 6) | OPC_EXTR_W_DSP,
669 };
670
671 #define MASK_ABSQ_S_QH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
672 enum {
673     /* MIPS DSP Arithmetic Sub-class */
674     OPC_PRECEQ_L_PWL    = (0x14 << 6) | OPC_ABSQ_S_QH_DSP,
675     OPC_PRECEQ_L_PWR    = (0x15 << 6) | OPC_ABSQ_S_QH_DSP,
676     OPC_PRECEQ_PW_QHL   = (0x0C << 6) | OPC_ABSQ_S_QH_DSP,
677     OPC_PRECEQ_PW_QHR   = (0x0D << 6) | OPC_ABSQ_S_QH_DSP,
678     OPC_PRECEQ_PW_QHLA  = (0x0E << 6) | OPC_ABSQ_S_QH_DSP,
679     OPC_PRECEQ_PW_QHRA  = (0x0F << 6) | OPC_ABSQ_S_QH_DSP,
680     OPC_PRECEQU_QH_OBL  = (0x04 << 6) | OPC_ABSQ_S_QH_DSP,
681     OPC_PRECEQU_QH_OBR  = (0x05 << 6) | OPC_ABSQ_S_QH_DSP,
682     OPC_PRECEQU_QH_OBLA = (0x06 << 6) | OPC_ABSQ_S_QH_DSP,
683     OPC_PRECEQU_QH_OBRA = (0x07 << 6) | OPC_ABSQ_S_QH_DSP,
684     OPC_PRECEU_QH_OBL   = (0x1C << 6) | OPC_ABSQ_S_QH_DSP,
685     OPC_PRECEU_QH_OBR   = (0x1D << 6) | OPC_ABSQ_S_QH_DSP,
686     OPC_PRECEU_QH_OBLA  = (0x1E << 6) | OPC_ABSQ_S_QH_DSP,
687     OPC_PRECEU_QH_OBRA  = (0x1F << 6) | OPC_ABSQ_S_QH_DSP,
688     OPC_ABSQ_S_OB       = (0x01 << 6) | OPC_ABSQ_S_QH_DSP,
689     OPC_ABSQ_S_PW       = (0x11 << 6) | OPC_ABSQ_S_QH_DSP,
690     OPC_ABSQ_S_QH       = (0x09 << 6) | OPC_ABSQ_S_QH_DSP,
691     /* DSP Bit/Manipulation Sub-class */
692     OPC_REPL_OB         = (0x02 << 6) | OPC_ABSQ_S_QH_DSP,
693     OPC_REPL_PW         = (0x12 << 6) | OPC_ABSQ_S_QH_DSP,
694     OPC_REPL_QH         = (0x0A << 6) | OPC_ABSQ_S_QH_DSP,
695     OPC_REPLV_OB        = (0x03 << 6) | OPC_ABSQ_S_QH_DSP,
696     OPC_REPLV_PW        = (0x13 << 6) | OPC_ABSQ_S_QH_DSP,
697     OPC_REPLV_QH        = (0x0B << 6) | OPC_ABSQ_S_QH_DSP,
698 };
699
700 #define MASK_ADDU_OB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
701 enum {
702     /* MIPS DSP Multiply Sub-class insns */
703     OPC_MULEQ_S_PW_QHL = (0x1C << 6) | OPC_ADDU_OB_DSP,
704     OPC_MULEQ_S_PW_QHR = (0x1D << 6) | OPC_ADDU_OB_DSP,
705     OPC_MULEU_S_QH_OBL = (0x06 << 6) | OPC_ADDU_OB_DSP,
706     OPC_MULEU_S_QH_OBR = (0x07 << 6) | OPC_ADDU_OB_DSP,
707     OPC_MULQ_RS_QH     = (0x1F << 6) | OPC_ADDU_OB_DSP,
708     /* MIPS DSP Arithmetic Sub-class */
709     OPC_RADDU_L_OB     = (0x14 << 6) | OPC_ADDU_OB_DSP,
710     OPC_SUBQ_PW        = (0x13 << 6) | OPC_ADDU_OB_DSP,
711     OPC_SUBQ_S_PW      = (0x17 << 6) | OPC_ADDU_OB_DSP,
712     OPC_SUBQ_QH        = (0x0B << 6) | OPC_ADDU_OB_DSP,
713     OPC_SUBQ_S_QH      = (0x0F << 6) | OPC_ADDU_OB_DSP,
714     OPC_SUBU_OB        = (0x01 << 6) | OPC_ADDU_OB_DSP,
715     OPC_SUBU_S_OB      = (0x05 << 6) | OPC_ADDU_OB_DSP,
716     OPC_SUBU_QH        = (0x09 << 6) | OPC_ADDU_OB_DSP,
717     OPC_SUBU_S_QH      = (0x0D << 6) | OPC_ADDU_OB_DSP,
718     OPC_SUBUH_OB       = (0x19 << 6) | OPC_ADDU_OB_DSP,
719     OPC_SUBUH_R_OB     = (0x1B << 6) | OPC_ADDU_OB_DSP,
720     OPC_ADDQ_PW        = (0x12 << 6) | OPC_ADDU_OB_DSP,
721     OPC_ADDQ_S_PW      = (0x16 << 6) | OPC_ADDU_OB_DSP,
722     OPC_ADDQ_QH        = (0x0A << 6) | OPC_ADDU_OB_DSP,
723     OPC_ADDQ_S_QH      = (0x0E << 6) | OPC_ADDU_OB_DSP,
724     OPC_ADDU_OB        = (0x00 << 6) | OPC_ADDU_OB_DSP,
725     OPC_ADDU_S_OB      = (0x04 << 6) | OPC_ADDU_OB_DSP,
726     OPC_ADDU_QH        = (0x08 << 6) | OPC_ADDU_OB_DSP,
727     OPC_ADDU_S_QH      = (0x0C << 6) | OPC_ADDU_OB_DSP,
728     OPC_ADDUH_OB       = (0x18 << 6) | OPC_ADDU_OB_DSP,
729     OPC_ADDUH_R_OB     = (0x1A << 6) | OPC_ADDU_OB_DSP,
730 };
731
732 #define MASK_CMPU_EQ_OB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
733 enum {
734     /* DSP Compare-Pick Sub-class */
735     OPC_CMP_EQ_PW         = (0x10 << 6) | OPC_CMPU_EQ_OB_DSP,
736     OPC_CMP_LT_PW         = (0x11 << 6) | OPC_CMPU_EQ_OB_DSP,
737     OPC_CMP_LE_PW         = (0x12 << 6) | OPC_CMPU_EQ_OB_DSP,
738     OPC_CMP_EQ_QH         = (0x08 << 6) | OPC_CMPU_EQ_OB_DSP,
739     OPC_CMP_LT_QH         = (0x09 << 6) | OPC_CMPU_EQ_OB_DSP,
740     OPC_CMP_LE_QH         = (0x0A << 6) | OPC_CMPU_EQ_OB_DSP,
741     OPC_CMPGDU_EQ_OB      = (0x18 << 6) | OPC_CMPU_EQ_OB_DSP,
742     OPC_CMPGDU_LT_OB      = (0x19 << 6) | OPC_CMPU_EQ_OB_DSP,
743     OPC_CMPGDU_LE_OB      = (0x1A << 6) | OPC_CMPU_EQ_OB_DSP,
744     OPC_CMPGU_EQ_OB       = (0x04 << 6) | OPC_CMPU_EQ_OB_DSP,
745     OPC_CMPGU_LT_OB       = (0x05 << 6) | OPC_CMPU_EQ_OB_DSP,
746     OPC_CMPGU_LE_OB       = (0x06 << 6) | OPC_CMPU_EQ_OB_DSP,
747     OPC_CMPU_EQ_OB        = (0x00 << 6) | OPC_CMPU_EQ_OB_DSP,
748     OPC_CMPU_LT_OB        = (0x01 << 6) | OPC_CMPU_EQ_OB_DSP,
749     OPC_CMPU_LE_OB        = (0x02 << 6) | OPC_CMPU_EQ_OB_DSP,
750     OPC_PACKRL_PW         = (0x0E << 6) | OPC_CMPU_EQ_OB_DSP,
751     OPC_PICK_OB           = (0x03 << 6) | OPC_CMPU_EQ_OB_DSP,
752     OPC_PICK_PW           = (0x13 << 6) | OPC_CMPU_EQ_OB_DSP,
753     OPC_PICK_QH           = (0x0B << 6) | OPC_CMPU_EQ_OB_DSP,
754     /* MIPS DSP Arithmetic Sub-class */
755     OPC_PRECR_OB_QH       = (0x0D << 6) | OPC_CMPU_EQ_OB_DSP,
756     OPC_PRECR_SRA_QH_PW   = (0x1E << 6) | OPC_CMPU_EQ_OB_DSP,
757     OPC_PRECR_SRA_R_QH_PW = (0x1F << 6) | OPC_CMPU_EQ_OB_DSP,
758     OPC_PRECRQ_OB_QH      = (0x0C << 6) | OPC_CMPU_EQ_OB_DSP,
759     OPC_PRECRQ_PW_L       = (0x1C << 6) | OPC_CMPU_EQ_OB_DSP,
760     OPC_PRECRQ_QH_PW      = (0x14 << 6) | OPC_CMPU_EQ_OB_DSP,
761     OPC_PRECRQ_RS_QH_PW   = (0x15 << 6) | OPC_CMPU_EQ_OB_DSP,
762     OPC_PRECRQU_S_OB_QH   = (0x0F << 6) | OPC_CMPU_EQ_OB_DSP,
763 };
764
765 #define MASK_DAPPEND(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
766 enum {
767     /* DSP Append Sub-class */
768     OPC_DAPPEND  = (0x00 << 6) | OPC_DAPPEND_DSP,
769     OPC_PREPENDD = (0x03 << 6) | OPC_DAPPEND_DSP,
770     OPC_PREPENDW = (0x01 << 6) | OPC_DAPPEND_DSP,
771     OPC_DBALIGN  = (0x10 << 6) | OPC_DAPPEND_DSP,
772 };
773
774 #define MASK_DEXTR_W(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
775 enum {
776     /* MIPS DSP Accumulator and DSPControl Access Sub-class */
777     OPC_DMTHLIP     = (0x1F << 6) | OPC_DEXTR_W_DSP,
778     OPC_DSHILO      = (0x1A << 6) | OPC_DEXTR_W_DSP,
779     OPC_DEXTP       = (0x02 << 6) | OPC_DEXTR_W_DSP,
780     OPC_DEXTPDP     = (0x0A << 6) | OPC_DEXTR_W_DSP,
781     OPC_DEXTPDPV    = (0x0B << 6) | OPC_DEXTR_W_DSP,
782     OPC_DEXTPV      = (0x03 << 6) | OPC_DEXTR_W_DSP,
783     OPC_DEXTR_L     = (0x10 << 6) | OPC_DEXTR_W_DSP,
784     OPC_DEXTR_R_L   = (0x14 << 6) | OPC_DEXTR_W_DSP,
785     OPC_DEXTR_RS_L  = (0x16 << 6) | OPC_DEXTR_W_DSP,
786     OPC_DEXTR_W     = (0x00 << 6) | OPC_DEXTR_W_DSP,
787     OPC_DEXTR_R_W   = (0x04 << 6) | OPC_DEXTR_W_DSP,
788     OPC_DEXTR_RS_W  = (0x06 << 6) | OPC_DEXTR_W_DSP,
789     OPC_DEXTR_S_H   = (0x0E << 6) | OPC_DEXTR_W_DSP,
790     OPC_DEXTRV_L    = (0x11 << 6) | OPC_DEXTR_W_DSP,
791     OPC_DEXTRV_R_L  = (0x15 << 6) | OPC_DEXTR_W_DSP,
792     OPC_DEXTRV_RS_L = (0x17 << 6) | OPC_DEXTR_W_DSP,
793     OPC_DEXTRV_S_H  = (0x0F << 6) | OPC_DEXTR_W_DSP,
794     OPC_DEXTRV_W    = (0x01 << 6) | OPC_DEXTR_W_DSP,
795     OPC_DEXTRV_R_W  = (0x05 << 6) | OPC_DEXTR_W_DSP,
796     OPC_DEXTRV_RS_W = (0x07 << 6) | OPC_DEXTR_W_DSP,
797     OPC_DSHILOV     = (0x1B << 6) | OPC_DEXTR_W_DSP,
798 };
799
800 #define MASK_DINSV(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
801 enum {
802     /* DSP Bit/Manipulation Sub-class */
803     OPC_DINSV = (0x00 << 6) | OPC_DINSV_DSP,
804 };
805
806 #define MASK_DPAQ_W_QH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
807 enum {
808     /* MIPS DSP Multiply Sub-class insns */
809     OPC_DMADD         = (0x19 << 6) | OPC_DPAQ_W_QH_DSP,
810     OPC_DMADDU        = (0x1D << 6) | OPC_DPAQ_W_QH_DSP,
811     OPC_DMSUB         = (0x1B << 6) | OPC_DPAQ_W_QH_DSP,
812     OPC_DMSUBU        = (0x1F << 6) | OPC_DPAQ_W_QH_DSP,
813     OPC_DPA_W_QH      = (0x00 << 6) | OPC_DPAQ_W_QH_DSP,
814     OPC_DPAQ_S_W_QH   = (0x04 << 6) | OPC_DPAQ_W_QH_DSP,
815     OPC_DPAQ_SA_L_PW  = (0x0C << 6) | OPC_DPAQ_W_QH_DSP,
816     OPC_DPAU_H_OBL    = (0x03 << 6) | OPC_DPAQ_W_QH_DSP,
817     OPC_DPAU_H_OBR    = (0x07 << 6) | OPC_DPAQ_W_QH_DSP,
818     OPC_DPS_W_QH      = (0x01 << 6) | OPC_DPAQ_W_QH_DSP,
819     OPC_DPSQ_S_W_QH   = (0x05 << 6) | OPC_DPAQ_W_QH_DSP,
820     OPC_DPSQ_SA_L_PW  = (0x0D << 6) | OPC_DPAQ_W_QH_DSP,
821     OPC_DPSU_H_OBL    = (0x0B << 6) | OPC_DPAQ_W_QH_DSP,
822     OPC_DPSU_H_OBR    = (0x0F << 6) | OPC_DPAQ_W_QH_DSP,
823     OPC_MAQ_S_L_PWL   = (0x1C << 6) | OPC_DPAQ_W_QH_DSP,
824     OPC_MAQ_S_L_PWR   = (0x1E << 6) | OPC_DPAQ_W_QH_DSP,
825     OPC_MAQ_S_W_QHLL  = (0x14 << 6) | OPC_DPAQ_W_QH_DSP,
826     OPC_MAQ_SA_W_QHLL = (0x10 << 6) | OPC_DPAQ_W_QH_DSP,
827     OPC_MAQ_S_W_QHLR  = (0x15 << 6) | OPC_DPAQ_W_QH_DSP,
828     OPC_MAQ_SA_W_QHLR = (0x11 << 6) | OPC_DPAQ_W_QH_DSP,
829     OPC_MAQ_S_W_QHRL  = (0x16 << 6) | OPC_DPAQ_W_QH_DSP,
830     OPC_MAQ_SA_W_QHRL = (0x12 << 6) | OPC_DPAQ_W_QH_DSP,
831     OPC_MAQ_S_W_QHRR  = (0x17 << 6) | OPC_DPAQ_W_QH_DSP,
832     OPC_MAQ_SA_W_QHRR = (0x13 << 6) | OPC_DPAQ_W_QH_DSP,
833     OPC_MULSAQ_S_L_PW = (0x0E << 6) | OPC_DPAQ_W_QH_DSP,
834     OPC_MULSAQ_S_W_QH = (0x06 << 6) | OPC_DPAQ_W_QH_DSP,
835 };
836
837 #define MASK_SHLL_OB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
838 enum {
839     /* MIPS DSP GPR-Based Shift Sub-class */
840     OPC_SHLL_PW    = (0x10 << 6) | OPC_SHLL_OB_DSP,
841     OPC_SHLL_S_PW  = (0x14 << 6) | OPC_SHLL_OB_DSP,
842     OPC_SHLLV_OB   = (0x02 << 6) | OPC_SHLL_OB_DSP,
843     OPC_SHLLV_PW   = (0x12 << 6) | OPC_SHLL_OB_DSP,
844     OPC_SHLLV_S_PW = (0x16 << 6) | OPC_SHLL_OB_DSP,
845     OPC_SHLLV_QH   = (0x0A << 6) | OPC_SHLL_OB_DSP,
846     OPC_SHLLV_S_QH = (0x0E << 6) | OPC_SHLL_OB_DSP,
847     OPC_SHRA_PW    = (0x11 << 6) | OPC_SHLL_OB_DSP,
848     OPC_SHRA_R_PW  = (0x15 << 6) | OPC_SHLL_OB_DSP,
849     OPC_SHRAV_OB   = (0x06 << 6) | OPC_SHLL_OB_DSP,
850     OPC_SHRAV_R_OB = (0x07 << 6) | OPC_SHLL_OB_DSP,
851     OPC_SHRAV_PW   = (0x13 << 6) | OPC_SHLL_OB_DSP,
852     OPC_SHRAV_R_PW = (0x17 << 6) | OPC_SHLL_OB_DSP,
853     OPC_SHRAV_QH   = (0x0B << 6) | OPC_SHLL_OB_DSP,
854     OPC_SHRAV_R_QH = (0x0F << 6) | OPC_SHLL_OB_DSP,
855     OPC_SHRLV_OB   = (0x03 << 6) | OPC_SHLL_OB_DSP,
856     OPC_SHRLV_QH   = (0x1B << 6) | OPC_SHLL_OB_DSP,
857     OPC_SHLL_OB    = (0x00 << 6) | OPC_SHLL_OB_DSP,
858     OPC_SHLL_QH    = (0x08 << 6) | OPC_SHLL_OB_DSP,
859     OPC_SHLL_S_QH  = (0x0C << 6) | OPC_SHLL_OB_DSP,
860     OPC_SHRA_OB    = (0x04 << 6) | OPC_SHLL_OB_DSP,
861     OPC_SHRA_R_OB  = (0x05 << 6) | OPC_SHLL_OB_DSP,
862     OPC_SHRA_QH    = (0x09 << 6) | OPC_SHLL_OB_DSP,
863     OPC_SHRA_R_QH  = (0x0D << 6) | OPC_SHLL_OB_DSP,
864     OPC_SHRL_OB    = (0x01 << 6) | OPC_SHLL_OB_DSP,
865     OPC_SHRL_QH    = (0x19 << 6) | OPC_SHLL_OB_DSP,
866 };
867
868 /* Coprocessor 0 (rs field) */
869 #define MASK_CP0(op)       MASK_OP_MAJOR(op) | (op & (0x1F << 21))
870
871 enum {
872     OPC_MFC0     = (0x00 << 21) | OPC_CP0,
873     OPC_DMFC0    = (0x01 << 21) | OPC_CP0,
874     OPC_MFHC0    = (0x02 << 21) | OPC_CP0,
875     OPC_MTC0     = (0x04 << 21) | OPC_CP0,
876     OPC_DMTC0    = (0x05 << 21) | OPC_CP0,
877     OPC_MTHC0    = (0x06 << 21) | OPC_CP0,
878     OPC_MFTR     = (0x08 << 21) | OPC_CP0,
879     OPC_RDPGPR   = (0x0A << 21) | OPC_CP0,
880     OPC_MFMC0    = (0x0B << 21) | OPC_CP0,
881     OPC_MTTR     = (0x0C << 21) | OPC_CP0,
882     OPC_WRPGPR   = (0x0E << 21) | OPC_CP0,
883     OPC_C0       = (0x10 << 21) | OPC_CP0,
884     OPC_C0_FIRST = (0x10 << 21) | OPC_CP0,
885     OPC_C0_LAST  = (0x1F << 21) | OPC_CP0,
886 };
887
888 /* MFMC0 opcodes */
889 #define MASK_MFMC0(op)     MASK_CP0(op) | (op & 0xFFFF)
890
891 enum {
892     OPC_DMT      = 0x01 | (0 << 5) | (0x0F << 6) | (0x01 << 11) | OPC_MFMC0,
893     OPC_EMT      = 0x01 | (1 << 5) | (0x0F << 6) | (0x01 << 11) | OPC_MFMC0,
894     OPC_DVPE     = 0x01 | (0 << 5) | OPC_MFMC0,
895     OPC_EVPE     = 0x01 | (1 << 5) | OPC_MFMC0,
896     OPC_DI       = (0 << 5) | (0x0C << 11) | OPC_MFMC0,
897     OPC_EI       = (1 << 5) | (0x0C << 11) | OPC_MFMC0,
898     OPC_DVP      = 0x04 | (0 << 3) | (1 << 5) | (0 << 11) | OPC_MFMC0,
899     OPC_EVP      = 0x04 | (0 << 3) | (0 << 5) | (0 << 11) | OPC_MFMC0,
900 };
901
902 /* Coprocessor 0 (with rs == C0) */
903 #define MASK_C0(op)        MASK_CP0(op) | (op & 0x3F)
904
905 enum {
906     OPC_TLBR     = 0x01 | OPC_C0,
907     OPC_TLBWI    = 0x02 | OPC_C0,
908     OPC_TLBINV   = 0x03 | OPC_C0,
909     OPC_TLBINVF  = 0x04 | OPC_C0,
910     OPC_TLBWR    = 0x06 | OPC_C0,
911     OPC_TLBP     = 0x08 | OPC_C0,
912     OPC_RFE      = 0x10 | OPC_C0,
913     OPC_ERET     = 0x18 | OPC_C0,
914     OPC_DERET    = 0x1F | OPC_C0,
915     OPC_WAIT     = 0x20 | OPC_C0,
916 };
917
918 /* Coprocessor 1 (rs field) */
919 #define MASK_CP1(op)       MASK_OP_MAJOR(op) | (op & (0x1F << 21))
920
921 /* Values for the fmt field in FP instructions */
922 enum {
923     /* 0 - 15 are reserved */
924     FMT_S = 16,          /* single fp */
925     FMT_D = 17,          /* double fp */
926     FMT_E = 18,          /* extended fp */
927     FMT_Q = 19,          /* quad fp */
928     FMT_W = 20,          /* 32-bit fixed */
929     FMT_L = 21,          /* 64-bit fixed */
930     FMT_PS = 22,         /* paired single fp */
931     /* 23 - 31 are reserved */
932 };
933
934 enum {
935     OPC_MFC1     = (0x00 << 21) | OPC_CP1,
936     OPC_DMFC1    = (0x01 << 21) | OPC_CP1,
937     OPC_CFC1     = (0x02 << 21) | OPC_CP1,
938     OPC_MFHC1    = (0x03 << 21) | OPC_CP1,
939     OPC_MTC1     = (0x04 << 21) | OPC_CP1,
940     OPC_DMTC1    = (0x05 << 21) | OPC_CP1,
941     OPC_CTC1     = (0x06 << 21) | OPC_CP1,
942     OPC_MTHC1    = (0x07 << 21) | OPC_CP1,
943     OPC_BC1      = (0x08 << 21) | OPC_CP1, /* bc */
944     OPC_BC1ANY2  = (0x09 << 21) | OPC_CP1,
945     OPC_BC1ANY4  = (0x0A << 21) | OPC_CP1,
946     OPC_BZ_V     = (0x0B << 21) | OPC_CP1,
947     OPC_BNZ_V    = (0x0F << 21) | OPC_CP1,
948     OPC_S_FMT    = (FMT_S << 21) | OPC_CP1,
949     OPC_D_FMT    = (FMT_D << 21) | OPC_CP1,
950     OPC_E_FMT    = (FMT_E << 21) | OPC_CP1,
951     OPC_Q_FMT    = (FMT_Q << 21) | OPC_CP1,
952     OPC_W_FMT    = (FMT_W << 21) | OPC_CP1,
953     OPC_L_FMT    = (FMT_L << 21) | OPC_CP1,
954     OPC_PS_FMT   = (FMT_PS << 21) | OPC_CP1,
955     OPC_BC1EQZ   = (0x09 << 21) | OPC_CP1,
956     OPC_BC1NEZ   = (0x0D << 21) | OPC_CP1,
957     OPC_BZ_B     = (0x18 << 21) | OPC_CP1,
958     OPC_BZ_H     = (0x19 << 21) | OPC_CP1,
959     OPC_BZ_W     = (0x1A << 21) | OPC_CP1,
960     OPC_BZ_D     = (0x1B << 21) | OPC_CP1,
961     OPC_BNZ_B    = (0x1C << 21) | OPC_CP1,
962     OPC_BNZ_H    = (0x1D << 21) | OPC_CP1,
963     OPC_BNZ_W    = (0x1E << 21) | OPC_CP1,
964     OPC_BNZ_D    = (0x1F << 21) | OPC_CP1,
965 };
966
967 #define MASK_CP1_FUNC(op)       MASK_CP1(op) | (op & 0x3F)
968 #define MASK_BC1(op)            MASK_CP1(op) | (op & (0x3 << 16))
969
970 enum {
971     OPC_BC1F     = (0x00 << 16) | OPC_BC1,
972     OPC_BC1T     = (0x01 << 16) | OPC_BC1,
973     OPC_BC1FL    = (0x02 << 16) | OPC_BC1,
974     OPC_BC1TL    = (0x03 << 16) | OPC_BC1,
975 };
976
977 enum {
978     OPC_BC1FANY2     = (0x00 << 16) | OPC_BC1ANY2,
979     OPC_BC1TANY2     = (0x01 << 16) | OPC_BC1ANY2,
980 };
981
982 enum {
983     OPC_BC1FANY4     = (0x00 << 16) | OPC_BC1ANY4,
984     OPC_BC1TANY4     = (0x01 << 16) | OPC_BC1ANY4,
985 };
986
987 #define MASK_CP2(op)       MASK_OP_MAJOR(op) | (op & (0x1F << 21))
988
989 enum {
990     OPC_MFC2    = (0x00 << 21) | OPC_CP2,
991     OPC_DMFC2   = (0x01 << 21) | OPC_CP2,
992     OPC_CFC2    = (0x02 << 21) | OPC_CP2,
993     OPC_MFHC2   = (0x03 << 21) | OPC_CP2,
994     OPC_MTC2    = (0x04 << 21) | OPC_CP2,
995     OPC_DMTC2   = (0x05 << 21) | OPC_CP2,
996     OPC_CTC2    = (0x06 << 21) | OPC_CP2,
997     OPC_MTHC2   = (0x07 << 21) | OPC_CP2,
998     OPC_BC2     = (0x08 << 21) | OPC_CP2,
999     OPC_BC2EQZ  = (0x09 << 21) | OPC_CP2,
1000     OPC_BC2NEZ  = (0x0D << 21) | OPC_CP2,
1001 };
1002
1003 #define MASK_LMI(op)  (MASK_OP_MAJOR(op) | (op & (0x1F << 21)) | (op & 0x1F))
1004
1005 enum {
1006     OPC_PADDSH  = (24 << 21) | (0x00) | OPC_CP2,
1007     OPC_PADDUSH = (25 << 21) | (0x00) | OPC_CP2,
1008     OPC_PADDH   = (26 << 21) | (0x00) | OPC_CP2,
1009     OPC_PADDW   = (27 << 21) | (0x00) | OPC_CP2,
1010     OPC_PADDSB  = (28 << 21) | (0x00) | OPC_CP2,
1011     OPC_PADDUSB = (29 << 21) | (0x00) | OPC_CP2,
1012     OPC_PADDB   = (30 << 21) | (0x00) | OPC_CP2,
1013     OPC_PADDD   = (31 << 21) | (0x00) | OPC_CP2,
1014
1015     OPC_PSUBSH  = (24 << 21) | (0x01) | OPC_CP2,
1016     OPC_PSUBUSH = (25 << 21) | (0x01) | OPC_CP2,
1017     OPC_PSUBH   = (26 << 21) | (0x01) | OPC_CP2,
1018     OPC_PSUBW   = (27 << 21) | (0x01) | OPC_CP2,
1019     OPC_PSUBSB  = (28 << 21) | (0x01) | OPC_CP2,
1020     OPC_PSUBUSB = (29 << 21) | (0x01) | OPC_CP2,
1021     OPC_PSUBB   = (30 << 21) | (0x01) | OPC_CP2,
1022     OPC_PSUBD   = (31 << 21) | (0x01) | OPC_CP2,
1023
1024     OPC_PSHUFH   = (24 << 21) | (0x02) | OPC_CP2,
1025     OPC_PACKSSWH = (25 << 21) | (0x02) | OPC_CP2,
1026     OPC_PACKSSHB = (26 << 21) | (0x02) | OPC_CP2,
1027     OPC_PACKUSHB = (27 << 21) | (0x02) | OPC_CP2,
1028     OPC_XOR_CP2  = (28 << 21) | (0x02) | OPC_CP2,
1029     OPC_NOR_CP2  = (29 << 21) | (0x02) | OPC_CP2,
1030     OPC_AND_CP2  = (30 << 21) | (0x02) | OPC_CP2,
1031     OPC_PANDN    = (31 << 21) | (0x02) | OPC_CP2,
1032
1033     OPC_PUNPCKLHW = (24 << 21) | (0x03) | OPC_CP2,
1034     OPC_PUNPCKHHW = (25 << 21) | (0x03) | OPC_CP2,
1035     OPC_PUNPCKLBH = (26 << 21) | (0x03) | OPC_CP2,
1036     OPC_PUNPCKHBH = (27 << 21) | (0x03) | OPC_CP2,
1037     OPC_PINSRH_0  = (28 << 21) | (0x03) | OPC_CP2,
1038     OPC_PINSRH_1  = (29 << 21) | (0x03) | OPC_CP2,
1039     OPC_PINSRH_2  = (30 << 21) | (0x03) | OPC_CP2,
1040     OPC_PINSRH_3  = (31 << 21) | (0x03) | OPC_CP2,
1041
1042     OPC_PAVGH   = (24 << 21) | (0x08) | OPC_CP2,
1043     OPC_PAVGB   = (25 << 21) | (0x08) | OPC_CP2,
1044     OPC_PMAXSH  = (26 << 21) | (0x08) | OPC_CP2,
1045     OPC_PMINSH  = (27 << 21) | (0x08) | OPC_CP2,
1046     OPC_PMAXUB  = (28 << 21) | (0x08) | OPC_CP2,
1047     OPC_PMINUB  = (29 << 21) | (0x08) | OPC_CP2,
1048
1049     OPC_PCMPEQW = (24 << 21) | (0x09) | OPC_CP2,
1050     OPC_PCMPGTW = (25 << 21) | (0x09) | OPC_CP2,
1051     OPC_PCMPEQH = (26 << 21) | (0x09) | OPC_CP2,
1052     OPC_PCMPGTH = (27 << 21) | (0x09) | OPC_CP2,
1053     OPC_PCMPEQB = (28 << 21) | (0x09) | OPC_CP2,
1054     OPC_PCMPGTB = (29 << 21) | (0x09) | OPC_CP2,
1055
1056     OPC_PSLLW   = (24 << 21) | (0x0A) | OPC_CP2,
1057     OPC_PSLLH   = (25 << 21) | (0x0A) | OPC_CP2,
1058     OPC_PMULLH  = (26 << 21) | (0x0A) | OPC_CP2,
1059     OPC_PMULHH  = (27 << 21) | (0x0A) | OPC_CP2,
1060     OPC_PMULUW  = (28 << 21) | (0x0A) | OPC_CP2,
1061     OPC_PMULHUH = (29 << 21) | (0x0A) | OPC_CP2,
1062
1063     OPC_PSRLW     = (24 << 21) | (0x0B) | OPC_CP2,
1064     OPC_PSRLH     = (25 << 21) | (0x0B) | OPC_CP2,
1065     OPC_PSRAW     = (26 << 21) | (0x0B) | OPC_CP2,
1066     OPC_PSRAH     = (27 << 21) | (0x0B) | OPC_CP2,
1067     OPC_PUNPCKLWD = (28 << 21) | (0x0B) | OPC_CP2,
1068     OPC_PUNPCKHWD = (29 << 21) | (0x0B) | OPC_CP2,
1069
1070     OPC_ADDU_CP2 = (24 << 21) | (0x0C) | OPC_CP2,
1071     OPC_OR_CP2   = (25 << 21) | (0x0C) | OPC_CP2,
1072     OPC_ADD_CP2  = (26 << 21) | (0x0C) | OPC_CP2,
1073     OPC_DADD_CP2 = (27 << 21) | (0x0C) | OPC_CP2,
1074     OPC_SEQU_CP2 = (28 << 21) | (0x0C) | OPC_CP2,
1075     OPC_SEQ_CP2  = (29 << 21) | (0x0C) | OPC_CP2,
1076
1077     OPC_SUBU_CP2 = (24 << 21) | (0x0D) | OPC_CP2,
1078     OPC_PASUBUB  = (25 << 21) | (0x0D) | OPC_CP2,
1079     OPC_SUB_CP2  = (26 << 21) | (0x0D) | OPC_CP2,
1080     OPC_DSUB_CP2 = (27 << 21) | (0x0D) | OPC_CP2,
1081     OPC_SLTU_CP2 = (28 << 21) | (0x0D) | OPC_CP2,
1082     OPC_SLT_CP2  = (29 << 21) | (0x0D) | OPC_CP2,
1083
1084     OPC_SLL_CP2  = (24 << 21) | (0x0E) | OPC_CP2,
1085     OPC_DSLL_CP2 = (25 << 21) | (0x0E) | OPC_CP2,
1086     OPC_PEXTRH   = (26 << 21) | (0x0E) | OPC_CP2,
1087     OPC_PMADDHW  = (27 << 21) | (0x0E) | OPC_CP2,
1088     OPC_SLEU_CP2 = (28 << 21) | (0x0E) | OPC_CP2,
1089     OPC_SLE_CP2  = (29 << 21) | (0x0E) | OPC_CP2,
1090
1091     OPC_SRL_CP2  = (24 << 21) | (0x0F) | OPC_CP2,
1092     OPC_DSRL_CP2 = (25 << 21) | (0x0F) | OPC_CP2,
1093     OPC_SRA_CP2  = (26 << 21) | (0x0F) | OPC_CP2,
1094     OPC_DSRA_CP2 = (27 << 21) | (0x0F) | OPC_CP2,
1095     OPC_BIADD    = (28 << 21) | (0x0F) | OPC_CP2,
1096     OPC_PMOVMSKB = (29 << 21) | (0x0F) | OPC_CP2,
1097 };
1098
1099
1100 #define MASK_CP3(op)       MASK_OP_MAJOR(op) | (op & 0x3F)
1101
1102 enum {
1103     OPC_LWXC1   = 0x00 | OPC_CP3,
1104     OPC_LDXC1   = 0x01 | OPC_CP3,
1105     OPC_LUXC1   = 0x05 | OPC_CP3,
1106     OPC_SWXC1   = 0x08 | OPC_CP3,
1107     OPC_SDXC1   = 0x09 | OPC_CP3,
1108     OPC_SUXC1   = 0x0D | OPC_CP3,
1109     OPC_PREFX   = 0x0F | OPC_CP3,
1110     OPC_ALNV_PS = 0x1E | OPC_CP3,
1111     OPC_MADD_S  = 0x20 | OPC_CP3,
1112     OPC_MADD_D  = 0x21 | OPC_CP3,
1113     OPC_MADD_PS = 0x26 | OPC_CP3,
1114     OPC_MSUB_S  = 0x28 | OPC_CP3,
1115     OPC_MSUB_D  = 0x29 | OPC_CP3,
1116     OPC_MSUB_PS = 0x2E | OPC_CP3,
1117     OPC_NMADD_S = 0x30 | OPC_CP3,
1118     OPC_NMADD_D = 0x31 | OPC_CP3,
1119     OPC_NMADD_PS= 0x36 | OPC_CP3,
1120     OPC_NMSUB_S = 0x38 | OPC_CP3,
1121     OPC_NMSUB_D = 0x39 | OPC_CP3,
1122     OPC_NMSUB_PS= 0x3E | OPC_CP3,
1123 };
1124
1125 /* MSA Opcodes */
1126 #define MASK_MSA_MINOR(op)    (MASK_OP_MAJOR(op) | (op & 0x3F))
1127 enum {
1128     OPC_MSA_I8_00   = 0x00 | OPC_MSA,
1129     OPC_MSA_I8_01   = 0x01 | OPC_MSA,
1130     OPC_MSA_I8_02   = 0x02 | OPC_MSA,
1131     OPC_MSA_I5_06   = 0x06 | OPC_MSA,
1132     OPC_MSA_I5_07   = 0x07 | OPC_MSA,
1133     OPC_MSA_BIT_09  = 0x09 | OPC_MSA,
1134     OPC_MSA_BIT_0A  = 0x0A | OPC_MSA,
1135     OPC_MSA_3R_0D   = 0x0D | OPC_MSA,
1136     OPC_MSA_3R_0E   = 0x0E | OPC_MSA,
1137     OPC_MSA_3R_0F   = 0x0F | OPC_MSA,
1138     OPC_MSA_3R_10   = 0x10 | OPC_MSA,
1139     OPC_MSA_3R_11   = 0x11 | OPC_MSA,
1140     OPC_MSA_3R_12   = 0x12 | OPC_MSA,
1141     OPC_MSA_3R_13   = 0x13 | OPC_MSA,
1142     OPC_MSA_3R_14   = 0x14 | OPC_MSA,
1143     OPC_MSA_3R_15   = 0x15 | OPC_MSA,
1144     OPC_MSA_ELM     = 0x19 | OPC_MSA,
1145     OPC_MSA_3RF_1A  = 0x1A | OPC_MSA,
1146     OPC_MSA_3RF_1B  = 0x1B | OPC_MSA,
1147     OPC_MSA_3RF_1C  = 0x1C | OPC_MSA,
1148     OPC_MSA_VEC     = 0x1E | OPC_MSA,
1149
1150     /* MI10 instruction */
1151     OPC_LD_B    = (0x20) | OPC_MSA,
1152     OPC_LD_H    = (0x21) | OPC_MSA,
1153     OPC_LD_W    = (0x22) | OPC_MSA,
1154     OPC_LD_D    = (0x23) | OPC_MSA,
1155     OPC_ST_B    = (0x24) | OPC_MSA,
1156     OPC_ST_H    = (0x25) | OPC_MSA,
1157     OPC_ST_W    = (0x26) | OPC_MSA,
1158     OPC_ST_D    = (0x27) | OPC_MSA,
1159 };
1160
1161 enum {
1162     /* I5 instruction df(bits 22..21) = _b, _h, _w, _d */
1163     OPC_ADDVI_df    = (0x0 << 23) | OPC_MSA_I5_06,
1164     OPC_CEQI_df     = (0x0 << 23) | OPC_MSA_I5_07,
1165     OPC_SUBVI_df    = (0x1 << 23) | OPC_MSA_I5_06,
1166     OPC_MAXI_S_df   = (0x2 << 23) | OPC_MSA_I5_06,
1167     OPC_CLTI_S_df   = (0x2 << 23) | OPC_MSA_I5_07,
1168     OPC_MAXI_U_df   = (0x3 << 23) | OPC_MSA_I5_06,
1169     OPC_CLTI_U_df   = (0x3 << 23) | OPC_MSA_I5_07,
1170     OPC_MINI_S_df   = (0x4 << 23) | OPC_MSA_I5_06,
1171     OPC_CLEI_S_df   = (0x4 << 23) | OPC_MSA_I5_07,
1172     OPC_MINI_U_df   = (0x5 << 23) | OPC_MSA_I5_06,
1173     OPC_CLEI_U_df   = (0x5 << 23) | OPC_MSA_I5_07,
1174     OPC_LDI_df      = (0x6 << 23) | OPC_MSA_I5_07,
1175
1176     /* I8 instruction */
1177     OPC_ANDI_B  = (0x0 << 24) | OPC_MSA_I8_00,
1178     OPC_BMNZI_B = (0x0 << 24) | OPC_MSA_I8_01,
1179     OPC_SHF_B   = (0x0 << 24) | OPC_MSA_I8_02,
1180     OPC_ORI_B   = (0x1 << 24) | OPC_MSA_I8_00,
1181     OPC_BMZI_B  = (0x1 << 24) | OPC_MSA_I8_01,
1182     OPC_SHF_H   = (0x1 << 24) | OPC_MSA_I8_02,
1183     OPC_NORI_B  = (0x2 << 24) | OPC_MSA_I8_00,
1184     OPC_BSELI_B = (0x2 << 24) | OPC_MSA_I8_01,
1185     OPC_SHF_W   = (0x2 << 24) | OPC_MSA_I8_02,
1186     OPC_XORI_B  = (0x3 << 24) | OPC_MSA_I8_00,
1187
1188     /* VEC/2R/2RF instruction */
1189     OPC_AND_V   = (0x00 << 21) | OPC_MSA_VEC,
1190     OPC_OR_V    = (0x01 << 21) | OPC_MSA_VEC,
1191     OPC_NOR_V   = (0x02 << 21) | OPC_MSA_VEC,
1192     OPC_XOR_V   = (0x03 << 21) | OPC_MSA_VEC,
1193     OPC_BMNZ_V  = (0x04 << 21) | OPC_MSA_VEC,
1194     OPC_BMZ_V   = (0x05 << 21) | OPC_MSA_VEC,
1195     OPC_BSEL_V  = (0x06 << 21) | OPC_MSA_VEC,
1196
1197     OPC_MSA_2R      = (0x18 << 21) | OPC_MSA_VEC,
1198     OPC_MSA_2RF     = (0x19 << 21) | OPC_MSA_VEC,
1199
1200     /* 2R instruction df(bits 17..16) = _b, _h, _w, _d */
1201     OPC_FILL_df = (0x00 << 18) | OPC_MSA_2R,
1202     OPC_PCNT_df = (0x01 << 18) | OPC_MSA_2R,
1203     OPC_NLOC_df = (0x02 << 18) | OPC_MSA_2R,
1204     OPC_NLZC_df = (0x03 << 18) | OPC_MSA_2R,
1205
1206     /* 2RF instruction df(bit 16) = _w, _d */
1207     OPC_FCLASS_df   = (0x00 << 17) | OPC_MSA_2RF,
1208     OPC_FTRUNC_S_df = (0x01 << 17) | OPC_MSA_2RF,
1209     OPC_FTRUNC_U_df = (0x02 << 17) | OPC_MSA_2RF,
1210     OPC_FSQRT_df    = (0x03 << 17) | OPC_MSA_2RF,
1211     OPC_FRSQRT_df   = (0x04 << 17) | OPC_MSA_2RF,
1212     OPC_FRCP_df     = (0x05 << 17) | OPC_MSA_2RF,
1213     OPC_FRINT_df    = (0x06 << 17) | OPC_MSA_2RF,
1214     OPC_FLOG2_df    = (0x07 << 17) | OPC_MSA_2RF,
1215     OPC_FEXUPL_df   = (0x08 << 17) | OPC_MSA_2RF,
1216     OPC_FEXUPR_df   = (0x09 << 17) | OPC_MSA_2RF,
1217     OPC_FFQL_df     = (0x0A << 17) | OPC_MSA_2RF,
1218     OPC_FFQR_df     = (0x0B << 17) | OPC_MSA_2RF,
1219     OPC_FTINT_S_df  = (0x0C << 17) | OPC_MSA_2RF,
1220     OPC_FTINT_U_df  = (0x0D << 17) | OPC_MSA_2RF,
1221     OPC_FFINT_S_df  = (0x0E << 17) | OPC_MSA_2RF,
1222     OPC_FFINT_U_df  = (0x0F << 17) | OPC_MSA_2RF,
1223
1224     /* 3R instruction df(bits 22..21) = _b, _h, _w, d */
1225     OPC_SLL_df      = (0x0 << 23) | OPC_MSA_3R_0D,
1226     OPC_ADDV_df     = (0x0 << 23) | OPC_MSA_3R_0E,
1227     OPC_CEQ_df      = (0x0 << 23) | OPC_MSA_3R_0F,
1228     OPC_ADD_A_df    = (0x0 << 23) | OPC_MSA_3R_10,
1229     OPC_SUBS_S_df   = (0x0 << 23) | OPC_MSA_3R_11,
1230     OPC_MULV_df     = (0x0 << 23) | OPC_MSA_3R_12,
1231     OPC_DOTP_S_df   = (0x0 << 23) | OPC_MSA_3R_13,
1232     OPC_SLD_df      = (0x0 << 23) | OPC_MSA_3R_14,
1233     OPC_VSHF_df     = (0x0 << 23) | OPC_MSA_3R_15,
1234     OPC_SRA_df      = (0x1 << 23) | OPC_MSA_3R_0D,
1235     OPC_SUBV_df     = (0x1 << 23) | OPC_MSA_3R_0E,
1236     OPC_ADDS_A_df   = (0x1 << 23) | OPC_MSA_3R_10,
1237     OPC_SUBS_U_df   = (0x1 << 23) | OPC_MSA_3R_11,
1238     OPC_MADDV_df    = (0x1 << 23) | OPC_MSA_3R_12,
1239     OPC_DOTP_U_df   = (0x1 << 23) | OPC_MSA_3R_13,
1240     OPC_SPLAT_df    = (0x1 << 23) | OPC_MSA_3R_14,
1241     OPC_SRAR_df     = (0x1 << 23) | OPC_MSA_3R_15,
1242     OPC_SRL_df      = (0x2 << 23) | OPC_MSA_3R_0D,
1243     OPC_MAX_S_df    = (0x2 << 23) | OPC_MSA_3R_0E,
1244     OPC_CLT_S_df    = (0x2 << 23) | OPC_MSA_3R_0F,
1245     OPC_ADDS_S_df   = (0x2 << 23) | OPC_MSA_3R_10,
1246     OPC_SUBSUS_U_df = (0x2 << 23) | OPC_MSA_3R_11,
1247     OPC_MSUBV_df    = (0x2 << 23) | OPC_MSA_3R_12,
1248     OPC_DPADD_S_df  = (0x2 << 23) | OPC_MSA_3R_13,
1249     OPC_PCKEV_df    = (0x2 << 23) | OPC_MSA_3R_14,
1250     OPC_SRLR_df     = (0x2 << 23) | OPC_MSA_3R_15,
1251     OPC_BCLR_df     = (0x3 << 23) | OPC_MSA_3R_0D,
1252     OPC_MAX_U_df    = (0x3 << 23) | OPC_MSA_3R_0E,
1253     OPC_CLT_U_df    = (0x3 << 23) | OPC_MSA_3R_0F,
1254     OPC_ADDS_U_df   = (0x3 << 23) | OPC_MSA_3R_10,
1255     OPC_SUBSUU_S_df = (0x3 << 23) | OPC_MSA_3R_11,
1256     OPC_DPADD_U_df  = (0x3 << 23) | OPC_MSA_3R_13,
1257     OPC_PCKOD_df    = (0x3 << 23) | OPC_MSA_3R_14,
1258     OPC_BSET_df     = (0x4 << 23) | OPC_MSA_3R_0D,
1259     OPC_MIN_S_df    = (0x4 << 23) | OPC_MSA_3R_0E,
1260     OPC_CLE_S_df    = (0x4 << 23) | OPC_MSA_3R_0F,
1261     OPC_AVE_S_df    = (0x4 << 23) | OPC_MSA_3R_10,
1262     OPC_ASUB_S_df   = (0x4 << 23) | OPC_MSA_3R_11,
1263     OPC_DIV_S_df    = (0x4 << 23) | OPC_MSA_3R_12,
1264     OPC_DPSUB_S_df  = (0x4 << 23) | OPC_MSA_3R_13,
1265     OPC_ILVL_df     = (0x4 << 23) | OPC_MSA_3R_14,
1266     OPC_HADD_S_df   = (0x4 << 23) | OPC_MSA_3R_15,
1267     OPC_BNEG_df     = (0x5 << 23) | OPC_MSA_3R_0D,
1268     OPC_MIN_U_df    = (0x5 << 23) | OPC_MSA_3R_0E,
1269     OPC_CLE_U_df    = (0x5 << 23) | OPC_MSA_3R_0F,
1270     OPC_AVE_U_df    = (0x5 << 23) | OPC_MSA_3R_10,
1271     OPC_ASUB_U_df   = (0x5 << 23) | OPC_MSA_3R_11,
1272     OPC_DIV_U_df    = (0x5 << 23) | OPC_MSA_3R_12,
1273     OPC_DPSUB_U_df  = (0x5 << 23) | OPC_MSA_3R_13,
1274     OPC_ILVR_df     = (0x5 << 23) | OPC_MSA_3R_14,
1275     OPC_HADD_U_df   = (0x5 << 23) | OPC_MSA_3R_15,
1276     OPC_BINSL_df    = (0x6 << 23) | OPC_MSA_3R_0D,
1277     OPC_MAX_A_df    = (0x6 << 23) | OPC_MSA_3R_0E,
1278     OPC_AVER_S_df   = (0x6 << 23) | OPC_MSA_3R_10,
1279     OPC_MOD_S_df    = (0x6 << 23) | OPC_MSA_3R_12,
1280     OPC_ILVEV_df    = (0x6 << 23) | OPC_MSA_3R_14,
1281     OPC_HSUB_S_df   = (0x6 << 23) | OPC_MSA_3R_15,
1282     OPC_BINSR_df    = (0x7 << 23) | OPC_MSA_3R_0D,
1283     OPC_MIN_A_df    = (0x7 << 23) | OPC_MSA_3R_0E,
1284     OPC_AVER_U_df   = (0x7 << 23) | OPC_MSA_3R_10,
1285     OPC_MOD_U_df    = (0x7 << 23) | OPC_MSA_3R_12,
1286     OPC_ILVOD_df    = (0x7 << 23) | OPC_MSA_3R_14,
1287     OPC_HSUB_U_df   = (0x7 << 23) | OPC_MSA_3R_15,
1288
1289     /* ELM instructions df(bits 21..16) = _b, _h, _w, _d */
1290     OPC_SLDI_df     = (0x0 << 22) | (0x00 << 16) | OPC_MSA_ELM,
1291     OPC_CTCMSA      = (0x0 << 22) | (0x3E << 16) | OPC_MSA_ELM,
1292     OPC_SPLATI_df   = (0x1 << 22) | (0x00 << 16) | OPC_MSA_ELM,
1293     OPC_CFCMSA      = (0x1 << 22) | (0x3E << 16) | OPC_MSA_ELM,
1294     OPC_COPY_S_df   = (0x2 << 22) | (0x00 << 16) | OPC_MSA_ELM,
1295     OPC_MOVE_V      = (0x2 << 22) | (0x3E << 16) | OPC_MSA_ELM,
1296     OPC_COPY_U_df   = (0x3 << 22) | (0x00 << 16) | OPC_MSA_ELM,
1297     OPC_INSERT_df   = (0x4 << 22) | (0x00 << 16) | OPC_MSA_ELM,
1298     OPC_INSVE_df    = (0x5 << 22) | (0x00 << 16) | OPC_MSA_ELM,
1299
1300     /* 3RF instruction _df(bit 21) = _w, _d */
1301     OPC_FCAF_df     = (0x0 << 22) | OPC_MSA_3RF_1A,
1302     OPC_FADD_df     = (0x0 << 22) | OPC_MSA_3RF_1B,
1303     OPC_FCUN_df     = (0x1 << 22) | OPC_MSA_3RF_1A,
1304     OPC_FSUB_df     = (0x1 << 22) | OPC_MSA_3RF_1B,
1305     OPC_FCOR_df     = (0x1 << 22) | OPC_MSA_3RF_1C,
1306     OPC_FCEQ_df     = (0x2 << 22) | OPC_MSA_3RF_1A,
1307     OPC_FMUL_df     = (0x2 << 22) | OPC_MSA_3RF_1B,
1308     OPC_FCUNE_df    = (0x2 << 22) | OPC_MSA_3RF_1C,
1309     OPC_FCUEQ_df    = (0x3 << 22) | OPC_MSA_3RF_1A,
1310     OPC_FDIV_df     = (0x3 << 22) | OPC_MSA_3RF_1B,
1311     OPC_FCNE_df     = (0x3 << 22) | OPC_MSA_3RF_1C,
1312     OPC_FCLT_df     = (0x4 << 22) | OPC_MSA_3RF_1A,
1313     OPC_FMADD_df    = (0x4 << 22) | OPC_MSA_3RF_1B,
1314     OPC_MUL_Q_df    = (0x4 << 22) | OPC_MSA_3RF_1C,
1315     OPC_FCULT_df    = (0x5 << 22) | OPC_MSA_3RF_1A,
1316     OPC_FMSUB_df    = (0x5 << 22) | OPC_MSA_3RF_1B,
1317     OPC_MADD_Q_df   = (0x5 << 22) | OPC_MSA_3RF_1C,
1318     OPC_FCLE_df     = (0x6 << 22) | OPC_MSA_3RF_1A,
1319     OPC_MSUB_Q_df   = (0x6 << 22) | OPC_MSA_3RF_1C,
1320     OPC_FCULE_df    = (0x7 << 22) | OPC_MSA_3RF_1A,
1321     OPC_FEXP2_df    = (0x7 << 22) | OPC_MSA_3RF_1B,
1322     OPC_FSAF_df     = (0x8 << 22) | OPC_MSA_3RF_1A,
1323     OPC_FEXDO_df    = (0x8 << 22) | OPC_MSA_3RF_1B,
1324     OPC_FSUN_df     = (0x9 << 22) | OPC_MSA_3RF_1A,
1325     OPC_FSOR_df     = (0x9 << 22) | OPC_MSA_3RF_1C,
1326     OPC_FSEQ_df     = (0xA << 22) | OPC_MSA_3RF_1A,
1327     OPC_FTQ_df      = (0xA << 22) | OPC_MSA_3RF_1B,
1328     OPC_FSUNE_df    = (0xA << 22) | OPC_MSA_3RF_1C,
1329     OPC_FSUEQ_df    = (0xB << 22) | OPC_MSA_3RF_1A,
1330     OPC_FSNE_df     = (0xB << 22) | OPC_MSA_3RF_1C,
1331     OPC_FSLT_df     = (0xC << 22) | OPC_MSA_3RF_1A,
1332     OPC_FMIN_df     = (0xC << 22) | OPC_MSA_3RF_1B,
1333     OPC_MULR_Q_df   = (0xC << 22) | OPC_MSA_3RF_1C,
1334     OPC_FSULT_df    = (0xD << 22) | OPC_MSA_3RF_1A,
1335     OPC_FMIN_A_df   = (0xD << 22) | OPC_MSA_3RF_1B,
1336     OPC_MADDR_Q_df  = (0xD << 22) | OPC_MSA_3RF_1C,
1337     OPC_FSLE_df     = (0xE << 22) | OPC_MSA_3RF_1A,
1338     OPC_FMAX_df     = (0xE << 22) | OPC_MSA_3RF_1B,
1339     OPC_MSUBR_Q_df  = (0xE << 22) | OPC_MSA_3RF_1C,
1340     OPC_FSULE_df    = (0xF << 22) | OPC_MSA_3RF_1A,
1341     OPC_FMAX_A_df   = (0xF << 22) | OPC_MSA_3RF_1B,
1342
1343     /* BIT instruction df(bits 22..16) = _B _H _W _D */
1344     OPC_SLLI_df     = (0x0 << 23) | OPC_MSA_BIT_09,
1345     OPC_SAT_S_df    = (0x0 << 23) | OPC_MSA_BIT_0A,
1346     OPC_SRAI_df     = (0x1 << 23) | OPC_MSA_BIT_09,
1347     OPC_SAT_U_df    = (0x1 << 23) | OPC_MSA_BIT_0A,
1348     OPC_SRLI_df     = (0x2 << 23) | OPC_MSA_BIT_09,
1349     OPC_SRARI_df    = (0x2 << 23) | OPC_MSA_BIT_0A,
1350     OPC_BCLRI_df    = (0x3 << 23) | OPC_MSA_BIT_09,
1351     OPC_SRLRI_df    = (0x3 << 23) | OPC_MSA_BIT_0A,
1352     OPC_BSETI_df    = (0x4 << 23) | OPC_MSA_BIT_09,
1353     OPC_BNEGI_df    = (0x5 << 23) | OPC_MSA_BIT_09,
1354     OPC_BINSLI_df   = (0x6 << 23) | OPC_MSA_BIT_09,
1355     OPC_BINSRI_df   = (0x7 << 23) | OPC_MSA_BIT_09,
1356 };
1357
1358 /* global register indices */
1359 static TCGv_env cpu_env;
1360 static TCGv cpu_gpr[32], cpu_PC;
1361 static TCGv cpu_HI[MIPS_DSP_ACC], cpu_LO[MIPS_DSP_ACC];
1362 static TCGv cpu_dspctrl, btarget, bcond;
1363 static TCGv_i32 hflags;
1364 static TCGv_i32 fpu_fcr0, fpu_fcr31;
1365 static TCGv_i64 fpu_f64[32];
1366 static TCGv_i64 msa_wr_d[64];
1367
1368 #include "exec/gen-icount.h"
1369
1370 #define gen_helper_0e0i(name, arg) do {                           \
1371     TCGv_i32 helper_tmp = tcg_const_i32(arg);                     \
1372     gen_helper_##name(cpu_env, helper_tmp);                       \
1373     tcg_temp_free_i32(helper_tmp);                                \
1374     } while(0)
1375
1376 #define gen_helper_0e1i(name, arg1, arg2) do {                    \
1377     TCGv_i32 helper_tmp = tcg_const_i32(arg2);                    \
1378     gen_helper_##name(cpu_env, arg1, helper_tmp);                 \
1379     tcg_temp_free_i32(helper_tmp);                                \
1380     } while(0)
1381
1382 #define gen_helper_1e0i(name, ret, arg1) do {                     \
1383     TCGv_i32 helper_tmp = tcg_const_i32(arg1);                    \
1384     gen_helper_##name(ret, cpu_env, helper_tmp);                  \
1385     tcg_temp_free_i32(helper_tmp);                                \
1386     } while(0)
1387
1388 #define gen_helper_1e1i(name, ret, arg1, arg2) do {               \
1389     TCGv_i32 helper_tmp = tcg_const_i32(arg2);                    \
1390     gen_helper_##name(ret, cpu_env, arg1, helper_tmp);            \
1391     tcg_temp_free_i32(helper_tmp);                                \
1392     } while(0)
1393
1394 #define gen_helper_0e2i(name, arg1, arg2, arg3) do {              \
1395     TCGv_i32 helper_tmp = tcg_const_i32(arg3);                    \
1396     gen_helper_##name(cpu_env, arg1, arg2, helper_tmp);           \
1397     tcg_temp_free_i32(helper_tmp);                                \
1398     } while(0)
1399
1400 #define gen_helper_1e2i(name, ret, arg1, arg2, arg3) do {         \
1401     TCGv_i32 helper_tmp = tcg_const_i32(arg3);                    \
1402     gen_helper_##name(ret, cpu_env, arg1, arg2, helper_tmp);      \
1403     tcg_temp_free_i32(helper_tmp);                                \
1404     } while(0)
1405
1406 #define gen_helper_0e3i(name, arg1, arg2, arg3, arg4) do {        \
1407     TCGv_i32 helper_tmp = tcg_const_i32(arg4);                    \
1408     gen_helper_##name(cpu_env, arg1, arg2, arg3, helper_tmp);     \
1409     tcg_temp_free_i32(helper_tmp);                                \
1410     } while(0)
1411
1412 typedef struct DisasContext {
1413     struct TranslationBlock *tb;
1414     target_ulong pc, saved_pc;
1415     uint32_t opcode;
1416     int singlestep_enabled;
1417     int insn_flags;
1418     int32_t CP0_Config1;
1419     /* Routine used to access memory */
1420     int mem_idx;
1421     TCGMemOp default_tcg_memop_mask;
1422     uint32_t hflags, saved_hflags;
1423     int bstate;
1424     target_ulong btarget;
1425     bool ulri;
1426     int kscrexist;
1427     bool rxi;
1428     int ie;
1429     bool bi;
1430     bool bp;
1431     uint64_t PAMask;
1432     bool mvh;
1433     int CP0_LLAddr_shift;
1434     bool ps;
1435     bool vp;
1436     bool cmgcr;
1437     bool mrp;
1438     bool nan2008;
1439     bool abs2008;
1440 } DisasContext;
1441
1442 enum {
1443     BS_NONE     = 0, /* We go out of the TB without reaching a branch or an
1444                       * exception condition */
1445     BS_STOP     = 1, /* We want to stop translation for any reason */
1446     BS_BRANCH   = 2, /* We reached a branch condition     */
1447     BS_EXCP     = 3, /* We reached an exception condition */
1448 };
1449
1450 static const char * const regnames[] = {
1451     "r0", "at", "v0", "v1", "a0", "a1", "a2", "a3",
1452     "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
1453     "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1454     "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra",
1455 };
1456
1457 static const char * const regnames_HI[] = {
1458     "HI0", "HI1", "HI2", "HI3",
1459 };
1460
1461 static const char * const regnames_LO[] = {
1462     "LO0", "LO1", "LO2", "LO3",
1463 };
1464
1465 static const char * const fregnames[] = {
1466     "f0",  "f1",  "f2",  "f3",  "f4",  "f5",  "f6",  "f7",
1467     "f8",  "f9",  "f10", "f11", "f12", "f13", "f14", "f15",
1468     "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1469     "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
1470 };
1471
1472 static const char * const msaregnames[] = {
1473     "w0.d0",  "w0.d1",  "w1.d0",  "w1.d1",
1474     "w2.d0",  "w2.d1",  "w3.d0",  "w3.d1",
1475     "w4.d0",  "w4.d1",  "w5.d0",  "w5.d1",
1476     "w6.d0",  "w6.d1",  "w7.d0",  "w7.d1",
1477     "w8.d0",  "w8.d1",  "w9.d0",  "w9.d1",
1478     "w10.d0", "w10.d1", "w11.d0", "w11.d1",
1479     "w12.d0", "w12.d1", "w13.d0", "w13.d1",
1480     "w14.d0", "w14.d1", "w15.d0", "w15.d1",
1481     "w16.d0", "w16.d1", "w17.d0", "w17.d1",
1482     "w18.d0", "w18.d1", "w19.d0", "w19.d1",
1483     "w20.d0", "w20.d1", "w21.d0", "w21.d1",
1484     "w22.d0", "w22.d1", "w23.d0", "w23.d1",
1485     "w24.d0", "w24.d1", "w25.d0", "w25.d1",
1486     "w26.d0", "w26.d1", "w27.d0", "w27.d1",
1487     "w28.d0", "w28.d1", "w29.d0", "w29.d1",
1488     "w30.d0", "w30.d1", "w31.d0", "w31.d1",
1489 };
1490
1491 #define LOG_DISAS(...)                                                        \
1492     do {                                                                      \
1493         if (MIPS_DEBUG_DISAS) {                                               \
1494             qemu_log_mask(CPU_LOG_TB_IN_ASM, ## __VA_ARGS__);                 \
1495         }                                                                     \
1496     } while (0)
1497
1498 #define MIPS_INVAL(op)                                                        \
1499     do {                                                                      \
1500         if (MIPS_DEBUG_DISAS) {                                               \
1501             qemu_log_mask(CPU_LOG_TB_IN_ASM,                                  \
1502                           TARGET_FMT_lx ": %08x Invalid %s %03x %03x %03x\n", \
1503                           ctx->pc, ctx->opcode, op, ctx->opcode >> 26,        \
1504                           ctx->opcode & 0x3F, ((ctx->opcode >> 16) & 0x1F));  \
1505         }                                                                     \
1506     } while (0)
1507
1508 /* General purpose registers moves. */
1509 static inline void gen_load_gpr (TCGv t, int reg)
1510 {
1511     if (reg == 0)
1512         tcg_gen_movi_tl(t, 0);
1513     else
1514         tcg_gen_mov_tl(t, cpu_gpr[reg]);
1515 }
1516
1517 static inline void gen_store_gpr (TCGv t, int reg)
1518 {
1519     if (reg != 0)
1520         tcg_gen_mov_tl(cpu_gpr[reg], t);
1521 }
1522
1523 /* Moves to/from shadow registers. */
1524 static inline void gen_load_srsgpr (int from, int to)
1525 {
1526     TCGv t0 = tcg_temp_new();
1527
1528     if (from == 0)
1529         tcg_gen_movi_tl(t0, 0);
1530     else {
1531         TCGv_i32 t2 = tcg_temp_new_i32();
1532         TCGv_ptr addr = tcg_temp_new_ptr();
1533
1534         tcg_gen_ld_i32(t2, cpu_env, offsetof(CPUMIPSState, CP0_SRSCtl));
1535         tcg_gen_shri_i32(t2, t2, CP0SRSCtl_PSS);
1536         tcg_gen_andi_i32(t2, t2, 0xf);
1537         tcg_gen_muli_i32(t2, t2, sizeof(target_ulong) * 32);
1538         tcg_gen_ext_i32_ptr(addr, t2);
1539         tcg_gen_add_ptr(addr, cpu_env, addr);
1540
1541         tcg_gen_ld_tl(t0, addr, sizeof(target_ulong) * from);
1542         tcg_temp_free_ptr(addr);
1543         tcg_temp_free_i32(t2);
1544     }
1545     gen_store_gpr(t0, to);
1546     tcg_temp_free(t0);
1547 }
1548
1549 static inline void gen_store_srsgpr (int from, int to)
1550 {
1551     if (to != 0) {
1552         TCGv t0 = tcg_temp_new();
1553         TCGv_i32 t2 = tcg_temp_new_i32();
1554         TCGv_ptr addr = tcg_temp_new_ptr();
1555
1556         gen_load_gpr(t0, from);
1557         tcg_gen_ld_i32(t2, cpu_env, offsetof(CPUMIPSState, CP0_SRSCtl));
1558         tcg_gen_shri_i32(t2, t2, CP0SRSCtl_PSS);
1559         tcg_gen_andi_i32(t2, t2, 0xf);
1560         tcg_gen_muli_i32(t2, t2, sizeof(target_ulong) * 32);
1561         tcg_gen_ext_i32_ptr(addr, t2);
1562         tcg_gen_add_ptr(addr, cpu_env, addr);
1563
1564         tcg_gen_st_tl(t0, addr, sizeof(target_ulong) * to);
1565         tcg_temp_free_ptr(addr);
1566         tcg_temp_free_i32(t2);
1567         tcg_temp_free(t0);
1568     }
1569 }
1570
1571 /* Tests */
1572 static inline void gen_save_pc(target_ulong pc)
1573 {
1574     tcg_gen_movi_tl(cpu_PC, pc);
1575 }
1576
1577 static inline void save_cpu_state(DisasContext *ctx, int do_save_pc)
1578 {
1579     LOG_DISAS("hflags %08x saved %08x\n", ctx->hflags, ctx->saved_hflags);
1580     if (do_save_pc && ctx->pc != ctx->saved_pc) {
1581         gen_save_pc(ctx->pc);
1582         ctx->saved_pc = ctx->pc;
1583     }
1584     if (ctx->hflags != ctx->saved_hflags) {
1585         tcg_gen_movi_i32(hflags, ctx->hflags);
1586         ctx->saved_hflags = ctx->hflags;
1587         switch (ctx->hflags & MIPS_HFLAG_BMASK_BASE) {
1588         case MIPS_HFLAG_BR:
1589             break;
1590         case MIPS_HFLAG_BC:
1591         case MIPS_HFLAG_BL:
1592         case MIPS_HFLAG_B:
1593             tcg_gen_movi_tl(btarget, ctx->btarget);
1594             break;
1595         }
1596     }
1597 }
1598
1599 static inline void restore_cpu_state(CPUMIPSState *env, DisasContext *ctx)
1600 {
1601     ctx->saved_hflags = ctx->hflags;
1602     switch (ctx->hflags & MIPS_HFLAG_BMASK_BASE) {
1603     case MIPS_HFLAG_BR:
1604         break;
1605     case MIPS_HFLAG_BC:
1606     case MIPS_HFLAG_BL:
1607     case MIPS_HFLAG_B:
1608         ctx->btarget = env->btarget;
1609         break;
1610     }
1611 }
1612
1613 static inline void generate_exception_err(DisasContext *ctx, int excp, int err)
1614 {
1615     TCGv_i32 texcp = tcg_const_i32(excp);
1616     TCGv_i32 terr = tcg_const_i32(err);
1617     save_cpu_state(ctx, 1);
1618     gen_helper_raise_exception_err(cpu_env, texcp, terr);
1619     tcg_temp_free_i32(terr);
1620     tcg_temp_free_i32(texcp);
1621     ctx->bstate = BS_EXCP;
1622 }
1623
1624 static inline void generate_exception(DisasContext *ctx, int excp)
1625 {
1626     gen_helper_0e0i(raise_exception, excp);
1627 }
1628
1629 static inline void generate_exception_end(DisasContext *ctx, int excp)
1630 {
1631     generate_exception_err(ctx, excp, 0);
1632 }
1633
1634 /* Floating point register moves. */
1635 static void gen_load_fpr32(DisasContext *ctx, TCGv_i32 t, int reg)
1636 {
1637     if (ctx->hflags & MIPS_HFLAG_FRE) {
1638         generate_exception(ctx, EXCP_RI);
1639     }
1640     tcg_gen_extrl_i64_i32(t, fpu_f64[reg]);
1641 }
1642
1643 static void gen_store_fpr32(DisasContext *ctx, TCGv_i32 t, int reg)
1644 {
1645     TCGv_i64 t64;
1646     if (ctx->hflags & MIPS_HFLAG_FRE) {
1647         generate_exception(ctx, EXCP_RI);
1648     }
1649     t64 = tcg_temp_new_i64();
1650     tcg_gen_extu_i32_i64(t64, t);
1651     tcg_gen_deposit_i64(fpu_f64[reg], fpu_f64[reg], t64, 0, 32);
1652     tcg_temp_free_i64(t64);
1653 }
1654
1655 static void gen_load_fpr32h(DisasContext *ctx, TCGv_i32 t, int reg)
1656 {
1657     if (ctx->hflags & MIPS_HFLAG_F64) {
1658         tcg_gen_extrh_i64_i32(t, fpu_f64[reg]);
1659     } else {
1660         gen_load_fpr32(ctx, t, reg | 1);
1661     }
1662 }
1663
1664 static void gen_store_fpr32h(DisasContext *ctx, TCGv_i32 t, int reg)
1665 {
1666     if (ctx->hflags & MIPS_HFLAG_F64) {
1667         TCGv_i64 t64 = tcg_temp_new_i64();
1668         tcg_gen_extu_i32_i64(t64, t);
1669         tcg_gen_deposit_i64(fpu_f64[reg], fpu_f64[reg], t64, 32, 32);
1670         tcg_temp_free_i64(t64);
1671     } else {
1672         gen_store_fpr32(ctx, t, reg | 1);
1673     }
1674 }
1675
1676 static void gen_load_fpr64(DisasContext *ctx, TCGv_i64 t, int reg)
1677 {
1678     if (ctx->hflags & MIPS_HFLAG_F64) {
1679         tcg_gen_mov_i64(t, fpu_f64[reg]);
1680     } else {
1681         tcg_gen_concat32_i64(t, fpu_f64[reg & ~1], fpu_f64[reg | 1]);
1682     }
1683 }
1684
1685 static void gen_store_fpr64(DisasContext *ctx, TCGv_i64 t, int reg)
1686 {
1687     if (ctx->hflags & MIPS_HFLAG_F64) {
1688         tcg_gen_mov_i64(fpu_f64[reg], t);
1689     } else {
1690         TCGv_i64 t0;
1691         tcg_gen_deposit_i64(fpu_f64[reg & ~1], fpu_f64[reg & ~1], t, 0, 32);
1692         t0 = tcg_temp_new_i64();
1693         tcg_gen_shri_i64(t0, t, 32);
1694         tcg_gen_deposit_i64(fpu_f64[reg | 1], fpu_f64[reg | 1], t0, 0, 32);
1695         tcg_temp_free_i64(t0);
1696     }
1697 }
1698
1699 static inline int get_fp_bit (int cc)
1700 {
1701     if (cc)
1702         return 24 + cc;
1703     else
1704         return 23;
1705 }
1706
1707 /* Addresses computation */
1708 static inline void gen_op_addr_add (DisasContext *ctx, TCGv ret, TCGv arg0, TCGv arg1)
1709 {
1710     tcg_gen_add_tl(ret, arg0, arg1);
1711
1712 #if defined(TARGET_MIPS64)
1713     if (ctx->hflags & MIPS_HFLAG_AWRAP) {
1714         tcg_gen_ext32s_i64(ret, ret);
1715     }
1716 #endif
1717 }
1718
1719 /* Addresses computation (translation time) */
1720 static target_long addr_add(DisasContext *ctx, target_long base,
1721                             target_long offset)
1722 {
1723     target_long sum = base + offset;
1724
1725 #if defined(TARGET_MIPS64)
1726     if (ctx->hflags & MIPS_HFLAG_AWRAP) {
1727         sum = (int32_t)sum;
1728     }
1729 #endif
1730     return sum;
1731 }
1732
1733 /* Sign-extract the low 32-bits to a target_long.  */
1734 static inline void gen_move_low32(TCGv ret, TCGv_i64 arg)
1735 {
1736 #if defined(TARGET_MIPS64)
1737     tcg_gen_ext32s_i64(ret, arg);
1738 #else
1739     tcg_gen_extrl_i64_i32(ret, arg);
1740 #endif
1741 }
1742
1743 /* Sign-extract the high 32-bits to a target_long.  */
1744 static inline void gen_move_high32(TCGv ret, TCGv_i64 arg)
1745 {
1746 #if defined(TARGET_MIPS64)
1747     tcg_gen_sari_i64(ret, arg, 32);
1748 #else
1749     tcg_gen_extrh_i64_i32(ret, arg);
1750 #endif
1751 }
1752
1753 static inline void check_cp0_enabled(DisasContext *ctx)
1754 {
1755     if (unlikely(!(ctx->hflags & MIPS_HFLAG_CP0)))
1756         generate_exception_err(ctx, EXCP_CpU, 0);
1757 }
1758
1759 static inline void check_cp1_enabled(DisasContext *ctx)
1760 {
1761     if (unlikely(!(ctx->hflags & MIPS_HFLAG_FPU)))
1762         generate_exception_err(ctx, EXCP_CpU, 1);
1763 }
1764
1765 /* Verify that the processor is running with COP1X instructions enabled.
1766    This is associated with the nabla symbol in the MIPS32 and MIPS64
1767    opcode tables.  */
1768
1769 static inline void check_cop1x(DisasContext *ctx)
1770 {
1771     if (unlikely(!(ctx->hflags & MIPS_HFLAG_COP1X)))
1772         generate_exception_end(ctx, EXCP_RI);
1773 }
1774
1775 /* Verify that the processor is running with 64-bit floating-point
1776    operations enabled.  */
1777
1778 static inline void check_cp1_64bitmode(DisasContext *ctx)
1779 {
1780     if (unlikely(~ctx->hflags & (MIPS_HFLAG_F64 | MIPS_HFLAG_COP1X)))
1781         generate_exception_end(ctx, EXCP_RI);
1782 }
1783
1784 /*
1785  * Verify if floating point register is valid; an operation is not defined
1786  * if bit 0 of any register specification is set and the FR bit in the
1787  * Status register equals zero, since the register numbers specify an
1788  * even-odd pair of adjacent coprocessor general registers. When the FR bit
1789  * in the Status register equals one, both even and odd register numbers
1790  * are valid. This limitation exists only for 64 bit wide (d,l,ps) registers.
1791  *
1792  * Multiple 64 bit wide registers can be checked by calling
1793  * gen_op_cp1_registers(freg1 | freg2 | ... | fregN);
1794  */
1795 static inline void check_cp1_registers(DisasContext *ctx, int regs)
1796 {
1797     if (unlikely(!(ctx->hflags & MIPS_HFLAG_F64) && (regs & 1)))
1798         generate_exception_end(ctx, EXCP_RI);
1799 }
1800
1801 /* Verify that the processor is running with DSP instructions enabled.
1802    This is enabled by CP0 Status register MX(24) bit.
1803  */
1804
1805 static inline void check_dsp(DisasContext *ctx)
1806 {
1807     if (unlikely(!(ctx->hflags & MIPS_HFLAG_DSP))) {
1808         if (ctx->insn_flags & ASE_DSP) {
1809             generate_exception_end(ctx, EXCP_DSPDIS);
1810         } else {
1811             generate_exception_end(ctx, EXCP_RI);
1812         }
1813     }
1814 }
1815
1816 static inline void check_dspr2(DisasContext *ctx)
1817 {
1818     if (unlikely(!(ctx->hflags & MIPS_HFLAG_DSPR2))) {
1819         if (ctx->insn_flags & ASE_DSP) {
1820             generate_exception_end(ctx, EXCP_DSPDIS);
1821         } else {
1822             generate_exception_end(ctx, EXCP_RI);
1823         }
1824     }
1825 }
1826
1827 /* This code generates a "reserved instruction" exception if the
1828    CPU does not support the instruction set corresponding to flags. */
1829 static inline void check_insn(DisasContext *ctx, int flags)
1830 {
1831     if (unlikely(!(ctx->insn_flags & flags))) {
1832         generate_exception_end(ctx, EXCP_RI);
1833     }
1834 }
1835
1836 /* This code generates a "reserved instruction" exception if the
1837    CPU has corresponding flag set which indicates that the instruction
1838    has been removed. */
1839 static inline void check_insn_opc_removed(DisasContext *ctx, int flags)
1840 {
1841     if (unlikely(ctx->insn_flags & flags)) {
1842         generate_exception_end(ctx, EXCP_RI);
1843     }
1844 }
1845
1846 /* This code generates a "reserved instruction" exception if the
1847    CPU does not support 64-bit paired-single (PS) floating point data type */
1848 static inline void check_ps(DisasContext *ctx)
1849 {
1850     if (unlikely(!ctx->ps)) {
1851         generate_exception(ctx, EXCP_RI);
1852     }
1853     check_cp1_64bitmode(ctx);
1854 }
1855
1856 #ifdef TARGET_MIPS64
1857 /* This code generates a "reserved instruction" exception if 64-bit
1858    instructions are not enabled. */
1859 static inline void check_mips_64(DisasContext *ctx)
1860 {
1861     if (unlikely(!(ctx->hflags & MIPS_HFLAG_64)))
1862         generate_exception_end(ctx, EXCP_RI);
1863 }
1864 #endif
1865
1866 #ifndef CONFIG_USER_ONLY
1867 static inline void check_mvh(DisasContext *ctx)
1868 {
1869     if (unlikely(!ctx->mvh)) {
1870         generate_exception(ctx, EXCP_RI);
1871     }
1872 }
1873 #endif
1874
1875 /* Define small wrappers for gen_load_fpr* so that we have a uniform
1876    calling interface for 32 and 64-bit FPRs.  No sense in changing
1877    all callers for gen_load_fpr32 when we need the CTX parameter for
1878    this one use.  */
1879 #define gen_ldcmp_fpr32(ctx, x, y) gen_load_fpr32(ctx, x, y)
1880 #define gen_ldcmp_fpr64(ctx, x, y) gen_load_fpr64(ctx, x, y)
1881 #define FOP_CONDS(type, abs, fmt, ifmt, bits)                                 \
1882 static inline void gen_cmp ## type ## _ ## fmt(DisasContext *ctx, int n,      \
1883                                                int ft, int fs, int cc)        \
1884 {                                                                             \
1885     TCGv_i##bits fp0 = tcg_temp_new_i##bits ();                               \
1886     TCGv_i##bits fp1 = tcg_temp_new_i##bits ();                               \
1887     switch (ifmt) {                                                           \
1888     case FMT_PS:                                                              \
1889         check_ps(ctx);                                                        \
1890         break;                                                                \
1891     case FMT_D:                                                               \
1892         if (abs) {                                                            \
1893             check_cop1x(ctx);                                                 \
1894         }                                                                     \
1895         check_cp1_registers(ctx, fs | ft);                                    \
1896         break;                                                                \
1897     case FMT_S:                                                               \
1898         if (abs) {                                                            \
1899             check_cop1x(ctx);                                                 \
1900         }                                                                     \
1901         break;                                                                \
1902     }                                                                         \
1903     gen_ldcmp_fpr##bits (ctx, fp0, fs);                                       \
1904     gen_ldcmp_fpr##bits (ctx, fp1, ft);                                       \
1905     switch (n) {                                                              \
1906     case  0: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _f, fp0, fp1, cc);    break;\
1907     case  1: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _un, fp0, fp1, cc);   break;\
1908     case  2: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _eq, fp0, fp1, cc);   break;\
1909     case  3: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ueq, fp0, fp1, cc);  break;\
1910     case  4: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _olt, fp0, fp1, cc);  break;\
1911     case  5: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ult, fp0, fp1, cc);  break;\
1912     case  6: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ole, fp0, fp1, cc);  break;\
1913     case  7: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ule, fp0, fp1, cc);  break;\
1914     case  8: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _sf, fp0, fp1, cc);   break;\
1915     case  9: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngle, fp0, fp1, cc); break;\
1916     case 10: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _seq, fp0, fp1, cc);  break;\
1917     case 11: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngl, fp0, fp1, cc);  break;\
1918     case 12: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _lt, fp0, fp1, cc);   break;\
1919     case 13: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _nge, fp0, fp1, cc);  break;\
1920     case 14: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _le, fp0, fp1, cc);   break;\
1921     case 15: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngt, fp0, fp1, cc);  break;\
1922     default: abort();                                                         \
1923     }                                                                         \
1924     tcg_temp_free_i##bits (fp0);                                              \
1925     tcg_temp_free_i##bits (fp1);                                              \
1926 }
1927
1928 FOP_CONDS(, 0, d, FMT_D, 64)
1929 FOP_CONDS(abs, 1, d, FMT_D, 64)
1930 FOP_CONDS(, 0, s, FMT_S, 32)
1931 FOP_CONDS(abs, 1, s, FMT_S, 32)
1932 FOP_CONDS(, 0, ps, FMT_PS, 64)
1933 FOP_CONDS(abs, 1, ps, FMT_PS, 64)
1934 #undef FOP_CONDS
1935
1936 #define FOP_CONDNS(fmt, ifmt, bits, STORE)                              \
1937 static inline void gen_r6_cmp_ ## fmt(DisasContext * ctx, int n,        \
1938                                       int ft, int fs, int fd)           \
1939 {                                                                       \
1940     TCGv_i ## bits fp0 = tcg_temp_new_i ## bits();                      \
1941     TCGv_i ## bits fp1 = tcg_temp_new_i ## bits();                      \
1942     if (ifmt == FMT_D) {                                                \
1943         check_cp1_registers(ctx, fs | ft | fd);                         \
1944     }                                                                   \
1945     gen_ldcmp_fpr ## bits(ctx, fp0, fs);                                \
1946     gen_ldcmp_fpr ## bits(ctx, fp1, ft);                                \
1947     switch (n) {                                                        \
1948     case  0:                                                            \
1949         gen_helper_r6_cmp_ ## fmt ## _af(fp0, cpu_env, fp0, fp1);       \
1950         break;                                                          \
1951     case  1:                                                            \
1952         gen_helper_r6_cmp_ ## fmt ## _un(fp0, cpu_env, fp0, fp1);       \
1953         break;                                                          \
1954     case  2:                                                            \
1955         gen_helper_r6_cmp_ ## fmt ## _eq(fp0, cpu_env, fp0, fp1);       \
1956         break;                                                          \
1957     case  3:                                                            \
1958         gen_helper_r6_cmp_ ## fmt ## _ueq(fp0, cpu_env, fp0, fp1);      \
1959         break;                                                          \
1960     case  4:                                                            \
1961         gen_helper_r6_cmp_ ## fmt ## _lt(fp0, cpu_env, fp0, fp1);       \
1962         break;                                                          \
1963     case  5:                                                            \
1964         gen_helper_r6_cmp_ ## fmt ## _ult(fp0, cpu_env, fp0, fp1);      \
1965         break;                                                          \
1966     case  6:                                                            \
1967         gen_helper_r6_cmp_ ## fmt ## _le(fp0, cpu_env, fp0, fp1);       \
1968         break;                                                          \
1969     case  7:                                                            \
1970         gen_helper_r6_cmp_ ## fmt ## _ule(fp0, cpu_env, fp0, fp1);      \
1971         break;                                                          \
1972     case  8:                                                            \
1973         gen_helper_r6_cmp_ ## fmt ## _saf(fp0, cpu_env, fp0, fp1);      \
1974         break;                                                          \
1975     case  9:                                                            \
1976         gen_helper_r6_cmp_ ## fmt ## _sun(fp0, cpu_env, fp0, fp1);      \
1977         break;                                                          \
1978     case 10:                                                            \
1979         gen_helper_r6_cmp_ ## fmt ## _seq(fp0, cpu_env, fp0, fp1);      \
1980         break;                                                          \
1981     case 11:                                                            \
1982         gen_helper_r6_cmp_ ## fmt ## _sueq(fp0, cpu_env, fp0, fp1);     \
1983         break;                                                          \
1984     case 12:                                                            \
1985         gen_helper_r6_cmp_ ## fmt ## _slt(fp0, cpu_env, fp0, fp1);      \
1986         break;                                                          \
1987     case 13:                                                            \
1988         gen_helper_r6_cmp_ ## fmt ## _sult(fp0, cpu_env, fp0, fp1);     \
1989         break;                                                          \
1990     case 14:                                                            \
1991         gen_helper_r6_cmp_ ## fmt ## _sle(fp0, cpu_env, fp0, fp1);      \
1992         break;                                                          \
1993     case 15:                                                            \
1994         gen_helper_r6_cmp_ ## fmt ## _sule(fp0, cpu_env, fp0, fp1);     \
1995         break;                                                          \
1996     case 17:                                                            \
1997         gen_helper_r6_cmp_ ## fmt ## _or(fp0, cpu_env, fp0, fp1);       \
1998         break;                                                          \
1999     case 18:                                                            \
2000         gen_helper_r6_cmp_ ## fmt ## _une(fp0, cpu_env, fp0, fp1);      \
2001         break;                                                          \
2002     case 19:                                                            \
2003         gen_helper_r6_cmp_ ## fmt ## _ne(fp0, cpu_env, fp0, fp1);       \
2004         break;                                                          \
2005     case 25:                                                            \
2006         gen_helper_r6_cmp_ ## fmt ## _sor(fp0, cpu_env, fp0, fp1);      \
2007         break;                                                          \
2008     case 26:                                                            \
2009         gen_helper_r6_cmp_ ## fmt ## _sune(fp0, cpu_env, fp0, fp1);     \
2010         break;                                                          \
2011     case 27:                                                            \
2012         gen_helper_r6_cmp_ ## fmt ## _sne(fp0, cpu_env, fp0, fp1);      \
2013         break;                                                          \
2014     default:                                                            \
2015         abort();                                                        \
2016     }                                                                   \
2017     STORE;                                                              \
2018     tcg_temp_free_i ## bits (fp0);                                      \
2019     tcg_temp_free_i ## bits (fp1);                                      \
2020 }
2021
2022 FOP_CONDNS(d, FMT_D, 64, gen_store_fpr64(ctx, fp0, fd))
2023 FOP_CONDNS(s, FMT_S, 32, gen_store_fpr32(ctx, fp0, fd))
2024 #undef FOP_CONDNS
2025 #undef gen_ldcmp_fpr32
2026 #undef gen_ldcmp_fpr64
2027
2028 /* load/store instructions. */
2029 #ifdef CONFIG_USER_ONLY
2030 #define OP_LD_ATOMIC(insn,fname)                                           \
2031 static inline void op_ld_##insn(TCGv ret, TCGv arg1, DisasContext *ctx)    \
2032 {                                                                          \
2033     TCGv t0 = tcg_temp_new();                                              \
2034     tcg_gen_mov_tl(t0, arg1);                                              \
2035     tcg_gen_qemu_##fname(ret, arg1, ctx->mem_idx);                         \
2036     tcg_gen_st_tl(t0, cpu_env, offsetof(CPUMIPSState, lladdr));                \
2037     tcg_gen_st_tl(ret, cpu_env, offsetof(CPUMIPSState, llval));                \
2038     tcg_temp_free(t0);                                                     \
2039 }
2040 #else
2041 #define OP_LD_ATOMIC(insn,fname)                                           \
2042 static inline void op_ld_##insn(TCGv ret, TCGv arg1, DisasContext *ctx)    \
2043 {                                                                          \
2044     gen_helper_1e1i(insn, ret, arg1, ctx->mem_idx);                        \
2045 }
2046 #endif
2047 OP_LD_ATOMIC(ll,ld32s);
2048 #if defined(TARGET_MIPS64)
2049 OP_LD_ATOMIC(lld,ld64);
2050 #endif
2051 #undef OP_LD_ATOMIC
2052
2053 #ifdef CONFIG_USER_ONLY
2054 #define OP_ST_ATOMIC(insn,fname,ldname,almask)                               \
2055 static inline void op_st_##insn(TCGv arg1, TCGv arg2, int rt, DisasContext *ctx) \
2056 {                                                                            \
2057     TCGv t0 = tcg_temp_new();                                                \
2058     TCGLabel *l1 = gen_new_label();                                          \
2059     TCGLabel *l2 = gen_new_label();                                          \
2060                                                                              \
2061     tcg_gen_andi_tl(t0, arg2, almask);                                       \
2062     tcg_gen_brcondi_tl(TCG_COND_EQ, t0, 0, l1);                              \
2063     tcg_gen_st_tl(arg2, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));          \
2064     generate_exception(ctx, EXCP_AdES);                                      \
2065     gen_set_label(l1);                                                       \
2066     tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUMIPSState, lladdr));                  \
2067     tcg_gen_brcond_tl(TCG_COND_NE, arg2, t0, l2);                            \
2068     tcg_gen_movi_tl(t0, rt | ((almask << 3) & 0x20));                        \
2069     tcg_gen_st_tl(t0, cpu_env, offsetof(CPUMIPSState, llreg));                   \
2070     tcg_gen_st_tl(arg1, cpu_env, offsetof(CPUMIPSState, llnewval));              \
2071     generate_exception_end(ctx, EXCP_SC);                                    \
2072     gen_set_label(l2);                                                       \
2073     tcg_gen_movi_tl(t0, 0);                                                  \
2074     gen_store_gpr(t0, rt);                                                   \
2075     tcg_temp_free(t0);                                                       \
2076 }
2077 #else
2078 #define OP_ST_ATOMIC(insn,fname,ldname,almask)                               \
2079 static inline void op_st_##insn(TCGv arg1, TCGv arg2, int rt, DisasContext *ctx) \
2080 {                                                                            \
2081     TCGv t0 = tcg_temp_new();                                                \
2082     gen_helper_1e2i(insn, t0, arg1, arg2, ctx->mem_idx);                     \
2083     gen_store_gpr(t0, rt);                                                   \
2084     tcg_temp_free(t0);                                                       \
2085 }
2086 #endif
2087 OP_ST_ATOMIC(sc,st32,ld32s,0x3);
2088 #if defined(TARGET_MIPS64)
2089 OP_ST_ATOMIC(scd,st64,ld64,0x7);
2090 #endif
2091 #undef OP_ST_ATOMIC
2092
2093 static void gen_base_offset_addr (DisasContext *ctx, TCGv addr,
2094                                   int base, int16_t offset)
2095 {
2096     if (base == 0) {
2097         tcg_gen_movi_tl(addr, offset);
2098     } else if (offset == 0) {
2099         gen_load_gpr(addr, base);
2100     } else {
2101         tcg_gen_movi_tl(addr, offset);
2102         gen_op_addr_add(ctx, addr, cpu_gpr[base], addr);
2103     }
2104 }
2105
2106 static target_ulong pc_relative_pc (DisasContext *ctx)
2107 {
2108     target_ulong pc = ctx->pc;
2109
2110     if (ctx->hflags & MIPS_HFLAG_BMASK) {
2111         int branch_bytes = ctx->hflags & MIPS_HFLAG_BDS16 ? 2 : 4;
2112
2113         pc -= branch_bytes;
2114     }
2115
2116     pc &= ~(target_ulong)3;
2117     return pc;
2118 }
2119
2120 /* Load */
2121 static void gen_ld(DisasContext *ctx, uint32_t opc,
2122                    int rt, int base, int16_t offset)
2123 {
2124     TCGv t0, t1, t2;
2125
2126     if (rt == 0 && ctx->insn_flags & (INSN_LOONGSON2E | INSN_LOONGSON2F)) {
2127         /* Loongson CPU uses a load to zero register for prefetch.
2128            We emulate it as a NOP. On other CPU we must perform the
2129            actual memory access. */
2130         return;
2131     }
2132
2133     t0 = tcg_temp_new();
2134     gen_base_offset_addr(ctx, t0, base, offset);
2135
2136     switch (opc) {
2137 #if defined(TARGET_MIPS64)
2138     case OPC_LWU:
2139         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEUL |
2140                            ctx->default_tcg_memop_mask);
2141         gen_store_gpr(t0, rt);
2142         break;
2143     case OPC_LD:
2144         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ |
2145                            ctx->default_tcg_memop_mask);
2146         gen_store_gpr(t0, rt);
2147         break;
2148     case OPC_LLD:
2149     case R6_OPC_LLD:
2150         op_ld_lld(t0, t0, ctx);
2151         gen_store_gpr(t0, rt);
2152         break;
2153     case OPC_LDL:
2154         t1 = tcg_temp_new();
2155         /* Do a byte access to possibly trigger a page
2156            fault with the unaligned address.  */
2157         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_UB);
2158         tcg_gen_andi_tl(t1, t0, 7);
2159 #ifndef TARGET_WORDS_BIGENDIAN
2160         tcg_gen_xori_tl(t1, t1, 7);
2161 #endif
2162         tcg_gen_shli_tl(t1, t1, 3);
2163         tcg_gen_andi_tl(t0, t0, ~7);
2164         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ);
2165         tcg_gen_shl_tl(t0, t0, t1);
2166         t2 = tcg_const_tl(-1);
2167         tcg_gen_shl_tl(t2, t2, t1);
2168         gen_load_gpr(t1, rt);
2169         tcg_gen_andc_tl(t1, t1, t2);
2170         tcg_temp_free(t2);
2171         tcg_gen_or_tl(t0, t0, t1);
2172         tcg_temp_free(t1);
2173         gen_store_gpr(t0, rt);
2174         break;
2175     case OPC_LDR:
2176         t1 = tcg_temp_new();
2177         /* Do a byte access to possibly trigger a page
2178            fault with the unaligned address.  */
2179         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_UB);
2180         tcg_gen_andi_tl(t1, t0, 7);
2181 #ifdef TARGET_WORDS_BIGENDIAN
2182         tcg_gen_xori_tl(t1, t1, 7);
2183 #endif
2184         tcg_gen_shli_tl(t1, t1, 3);
2185         tcg_gen_andi_tl(t0, t0, ~7);
2186         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ);
2187         tcg_gen_shr_tl(t0, t0, t1);
2188         tcg_gen_xori_tl(t1, t1, 63);
2189         t2 = tcg_const_tl(0xfffffffffffffffeull);
2190         tcg_gen_shl_tl(t2, t2, t1);
2191         gen_load_gpr(t1, rt);
2192         tcg_gen_and_tl(t1, t1, t2);
2193         tcg_temp_free(t2);
2194         tcg_gen_or_tl(t0, t0, t1);
2195         tcg_temp_free(t1);
2196         gen_store_gpr(t0, rt);
2197         break;
2198     case OPC_LDPC:
2199         t1 = tcg_const_tl(pc_relative_pc(ctx));
2200         gen_op_addr_add(ctx, t0, t0, t1);
2201         tcg_temp_free(t1);
2202         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ);
2203         gen_store_gpr(t0, rt);
2204         break;
2205 #endif
2206     case OPC_LWPC:
2207         t1 = tcg_const_tl(pc_relative_pc(ctx));
2208         gen_op_addr_add(ctx, t0, t0, t1);
2209         tcg_temp_free(t1);
2210         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL);
2211         gen_store_gpr(t0, rt);
2212         break;
2213     case OPC_LW:
2214         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL |
2215                            ctx->default_tcg_memop_mask);
2216         gen_store_gpr(t0, rt);
2217         break;
2218     case OPC_LH:
2219         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESW |
2220                            ctx->default_tcg_memop_mask);
2221         gen_store_gpr(t0, rt);
2222         break;
2223     case OPC_LHU:
2224         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEUW |
2225                            ctx->default_tcg_memop_mask);
2226         gen_store_gpr(t0, rt);
2227         break;
2228     case OPC_LB:
2229         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_SB);
2230         gen_store_gpr(t0, rt);
2231         break;
2232     case OPC_LBU:
2233         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_UB);
2234         gen_store_gpr(t0, rt);
2235         break;
2236     case OPC_LWL:
2237         t1 = tcg_temp_new();
2238         /* Do a byte access to possibly trigger a page
2239            fault with the unaligned address.  */
2240         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_UB);
2241         tcg_gen_andi_tl(t1, t0, 3);
2242 #ifndef TARGET_WORDS_BIGENDIAN
2243         tcg_gen_xori_tl(t1, t1, 3);
2244 #endif
2245         tcg_gen_shli_tl(t1, t1, 3);
2246         tcg_gen_andi_tl(t0, t0, ~3);
2247         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEUL);
2248         tcg_gen_shl_tl(t0, t0, t1);
2249         t2 = tcg_const_tl(-1);
2250         tcg_gen_shl_tl(t2, t2, t1);
2251         gen_load_gpr(t1, rt);
2252         tcg_gen_andc_tl(t1, t1, t2);
2253         tcg_temp_free(t2);
2254         tcg_gen_or_tl(t0, t0, t1);
2255         tcg_temp_free(t1);
2256         tcg_gen_ext32s_tl(t0, t0);
2257         gen_store_gpr(t0, rt);
2258         break;
2259     case OPC_LWR:
2260         t1 = tcg_temp_new();
2261         /* Do a byte access to possibly trigger a page
2262            fault with the unaligned address.  */
2263         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_UB);
2264         tcg_gen_andi_tl(t1, t0, 3);
2265 #ifdef TARGET_WORDS_BIGENDIAN
2266         tcg_gen_xori_tl(t1, t1, 3);
2267 #endif
2268         tcg_gen_shli_tl(t1, t1, 3);
2269         tcg_gen_andi_tl(t0, t0, ~3);
2270         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEUL);
2271         tcg_gen_shr_tl(t0, t0, t1);
2272         tcg_gen_xori_tl(t1, t1, 31);
2273         t2 = tcg_const_tl(0xfffffffeull);
2274         tcg_gen_shl_tl(t2, t2, t1);
2275         gen_load_gpr(t1, rt);
2276         tcg_gen_and_tl(t1, t1, t2);
2277         tcg_temp_free(t2);
2278         tcg_gen_or_tl(t0, t0, t1);
2279         tcg_temp_free(t1);
2280         tcg_gen_ext32s_tl(t0, t0);
2281         gen_store_gpr(t0, rt);
2282         break;
2283     case OPC_LL:
2284     case R6_OPC_LL:
2285         op_ld_ll(t0, t0, ctx);
2286         gen_store_gpr(t0, rt);
2287         break;
2288     }
2289     tcg_temp_free(t0);
2290 }
2291
2292 /* Store */
2293 static void gen_st (DisasContext *ctx, uint32_t opc, int rt,
2294                     int base, int16_t offset)
2295 {
2296     TCGv t0 = tcg_temp_new();
2297     TCGv t1 = tcg_temp_new();
2298
2299     gen_base_offset_addr(ctx, t0, base, offset);
2300     gen_load_gpr(t1, rt);
2301     switch (opc) {
2302 #if defined(TARGET_MIPS64)
2303     case OPC_SD:
2304         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ |
2305                            ctx->default_tcg_memop_mask);
2306         break;
2307     case OPC_SDL:
2308         gen_helper_0e2i(sdl, t1, t0, ctx->mem_idx);
2309         break;
2310     case OPC_SDR:
2311         gen_helper_0e2i(sdr, t1, t0, ctx->mem_idx);
2312         break;
2313 #endif
2314     case OPC_SW:
2315         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL |
2316                            ctx->default_tcg_memop_mask);
2317         break;
2318     case OPC_SH:
2319         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUW |
2320                            ctx->default_tcg_memop_mask);
2321         break;
2322     case OPC_SB:
2323         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_8);
2324         break;
2325     case OPC_SWL:
2326         gen_helper_0e2i(swl, t1, t0, ctx->mem_idx);
2327         break;
2328     case OPC_SWR:
2329         gen_helper_0e2i(swr, t1, t0, ctx->mem_idx);
2330         break;
2331     }
2332     tcg_temp_free(t0);
2333     tcg_temp_free(t1);
2334 }
2335
2336
2337 /* Store conditional */
2338 static void gen_st_cond (DisasContext *ctx, uint32_t opc, int rt,
2339                          int base, int16_t offset)
2340 {
2341     TCGv t0, t1;
2342
2343 #ifdef CONFIG_USER_ONLY
2344     t0 = tcg_temp_local_new();
2345     t1 = tcg_temp_local_new();
2346 #else
2347     t0 = tcg_temp_new();
2348     t1 = tcg_temp_new();
2349 #endif
2350     gen_base_offset_addr(ctx, t0, base, offset);
2351     gen_load_gpr(t1, rt);
2352     switch (opc) {
2353 #if defined(TARGET_MIPS64)
2354     case OPC_SCD:
2355     case R6_OPC_SCD:
2356         op_st_scd(t1, t0, rt, ctx);
2357         break;
2358 #endif
2359     case OPC_SC:
2360     case R6_OPC_SC:
2361         op_st_sc(t1, t0, rt, ctx);
2362         break;
2363     }
2364     tcg_temp_free(t1);
2365     tcg_temp_free(t0);
2366 }
2367
2368 /* Load and store */
2369 static void gen_flt_ldst (DisasContext *ctx, uint32_t opc, int ft,
2370                           int base, int16_t offset)
2371 {
2372     TCGv t0 = tcg_temp_new();
2373
2374     gen_base_offset_addr(ctx, t0, base, offset);
2375     /* Don't do NOP if destination is zero: we must perform the actual
2376        memory access. */
2377     switch (opc) {
2378     case OPC_LWC1:
2379         {
2380             TCGv_i32 fp0 = tcg_temp_new_i32();
2381             tcg_gen_qemu_ld_i32(fp0, t0, ctx->mem_idx, MO_TESL |
2382                                 ctx->default_tcg_memop_mask);
2383             gen_store_fpr32(ctx, fp0, ft);
2384             tcg_temp_free_i32(fp0);
2385         }
2386         break;
2387     case OPC_SWC1:
2388         {
2389             TCGv_i32 fp0 = tcg_temp_new_i32();
2390             gen_load_fpr32(ctx, fp0, ft);
2391             tcg_gen_qemu_st_i32(fp0, t0, ctx->mem_idx, MO_TEUL |
2392                                 ctx->default_tcg_memop_mask);
2393             tcg_temp_free_i32(fp0);
2394         }
2395         break;
2396     case OPC_LDC1:
2397         {
2398             TCGv_i64 fp0 = tcg_temp_new_i64();
2399             tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ |
2400                                 ctx->default_tcg_memop_mask);
2401             gen_store_fpr64(ctx, fp0, ft);
2402             tcg_temp_free_i64(fp0);
2403         }
2404         break;
2405     case OPC_SDC1:
2406         {
2407             TCGv_i64 fp0 = tcg_temp_new_i64();
2408             gen_load_fpr64(ctx, fp0, ft);
2409             tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ |
2410                                 ctx->default_tcg_memop_mask);
2411             tcg_temp_free_i64(fp0);
2412         }
2413         break;
2414     default:
2415         MIPS_INVAL("flt_ldst");
2416         generate_exception_end(ctx, EXCP_RI);
2417         goto out;
2418     }
2419  out:
2420     tcg_temp_free(t0);
2421 }
2422
2423 static void gen_cop1_ldst(DisasContext *ctx, uint32_t op, int rt,
2424                           int rs, int16_t imm)
2425 {
2426     if (ctx->CP0_Config1 & (1 << CP0C1_FP)) {
2427         check_cp1_enabled(ctx);
2428         switch (op) {
2429         case OPC_LDC1:
2430         case OPC_SDC1:
2431             check_insn(ctx, ISA_MIPS2);
2432             /* Fallthrough */
2433         default:
2434             gen_flt_ldst(ctx, op, rt, rs, imm);
2435         }
2436     } else {
2437         generate_exception_err(ctx, EXCP_CpU, 1);
2438     }
2439 }
2440
2441 /* Arithmetic with immediate operand */
2442 static void gen_arith_imm(DisasContext *ctx, uint32_t opc,
2443                           int rt, int rs, int16_t imm)
2444 {
2445     target_ulong uimm = (target_long)imm; /* Sign extend to 32/64 bits */
2446
2447     if (rt == 0 && opc != OPC_ADDI && opc != OPC_DADDI) {
2448         /* If no destination, treat it as a NOP.
2449            For addi, we must generate the overflow exception when needed. */
2450         return;
2451     }
2452     switch (opc) {
2453     case OPC_ADDI:
2454         {
2455             TCGv t0 = tcg_temp_local_new();
2456             TCGv t1 = tcg_temp_new();
2457             TCGv t2 = tcg_temp_new();
2458             TCGLabel *l1 = gen_new_label();
2459
2460             gen_load_gpr(t1, rs);
2461             tcg_gen_addi_tl(t0, t1, uimm);
2462             tcg_gen_ext32s_tl(t0, t0);
2463
2464             tcg_gen_xori_tl(t1, t1, ~uimm);
2465             tcg_gen_xori_tl(t2, t0, uimm);
2466             tcg_gen_and_tl(t1, t1, t2);
2467             tcg_temp_free(t2);
2468             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2469             tcg_temp_free(t1);
2470             /* operands of same sign, result different sign */
2471             generate_exception(ctx, EXCP_OVERFLOW);
2472             gen_set_label(l1);
2473             tcg_gen_ext32s_tl(t0, t0);
2474             gen_store_gpr(t0, rt);
2475             tcg_temp_free(t0);
2476         }
2477         break;
2478     case OPC_ADDIU:
2479         if (rs != 0) {
2480             tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2481             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
2482         } else {
2483             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
2484         }
2485         break;
2486 #if defined(TARGET_MIPS64)
2487     case OPC_DADDI:
2488         {
2489             TCGv t0 = tcg_temp_local_new();
2490             TCGv t1 = tcg_temp_new();
2491             TCGv t2 = tcg_temp_new();
2492             TCGLabel *l1 = gen_new_label();
2493
2494             gen_load_gpr(t1, rs);
2495             tcg_gen_addi_tl(t0, t1, uimm);
2496
2497             tcg_gen_xori_tl(t1, t1, ~uimm);
2498             tcg_gen_xori_tl(t2, t0, uimm);
2499             tcg_gen_and_tl(t1, t1, t2);
2500             tcg_temp_free(t2);
2501             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2502             tcg_temp_free(t1);
2503             /* operands of same sign, result different sign */
2504             generate_exception(ctx, EXCP_OVERFLOW);
2505             gen_set_label(l1);
2506             gen_store_gpr(t0, rt);
2507             tcg_temp_free(t0);
2508         }
2509         break;
2510     case OPC_DADDIU:
2511         if (rs != 0) {
2512             tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2513         } else {
2514             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
2515         }
2516         break;
2517 #endif
2518     }
2519 }
2520
2521 /* Logic with immediate operand */
2522 static void gen_logic_imm(DisasContext *ctx, uint32_t opc,
2523                           int rt, int rs, int16_t imm)
2524 {
2525     target_ulong uimm;
2526
2527     if (rt == 0) {
2528         /* If no destination, treat it as a NOP. */
2529         return;
2530     }
2531     uimm = (uint16_t)imm;
2532     switch (opc) {
2533     case OPC_ANDI:
2534         if (likely(rs != 0))
2535             tcg_gen_andi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2536         else
2537             tcg_gen_movi_tl(cpu_gpr[rt], 0);
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         break;
2545     case OPC_XORI:
2546         if (likely(rs != 0))
2547             tcg_gen_xori_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2548         else
2549             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
2550         break;
2551     case OPC_LUI:
2552         if (rs != 0 && (ctx->insn_flags & ISA_MIPS32R6)) {
2553             /* OPC_AUI */
2554             tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], imm << 16);
2555             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
2556         } else {
2557             tcg_gen_movi_tl(cpu_gpr[rt], imm << 16);
2558         }
2559         break;
2560
2561     default:
2562         break;
2563     }
2564 }
2565
2566 /* Set on less than with immediate operand */
2567 static void gen_slt_imm(DisasContext *ctx, uint32_t opc,
2568                         int rt, int rs, int16_t imm)
2569 {
2570     target_ulong uimm = (target_long)imm; /* Sign extend to 32/64 bits */
2571     TCGv t0;
2572
2573     if (rt == 0) {
2574         /* If no destination, treat it as a NOP. */
2575         return;
2576     }
2577     t0 = tcg_temp_new();
2578     gen_load_gpr(t0, rs);
2579     switch (opc) {
2580     case OPC_SLTI:
2581         tcg_gen_setcondi_tl(TCG_COND_LT, cpu_gpr[rt], t0, uimm);
2582         break;
2583     case OPC_SLTIU:
2584         tcg_gen_setcondi_tl(TCG_COND_LTU, cpu_gpr[rt], t0, uimm);
2585         break;
2586     }
2587     tcg_temp_free(t0);
2588 }
2589
2590 /* Shifts with immediate operand */
2591 static void gen_shift_imm(DisasContext *ctx, uint32_t opc,
2592                           int rt, int rs, int16_t imm)
2593 {
2594     target_ulong uimm = ((uint16_t)imm) & 0x1f;
2595     TCGv t0;
2596
2597     if (rt == 0) {
2598         /* If no destination, treat it as a NOP. */
2599         return;
2600     }
2601
2602     t0 = tcg_temp_new();
2603     gen_load_gpr(t0, rs);
2604     switch (opc) {
2605     case OPC_SLL:
2606         tcg_gen_shli_tl(t0, t0, uimm);
2607         tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
2608         break;
2609     case OPC_SRA:
2610         tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm);
2611         break;
2612     case OPC_SRL:
2613         if (uimm != 0) {
2614             tcg_gen_ext32u_tl(t0, t0);
2615             tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm);
2616         } else {
2617             tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
2618         }
2619         break;
2620     case OPC_ROTR:
2621         if (uimm != 0) {
2622             TCGv_i32 t1 = tcg_temp_new_i32();
2623
2624             tcg_gen_trunc_tl_i32(t1, t0);
2625             tcg_gen_rotri_i32(t1, t1, uimm);
2626             tcg_gen_ext_i32_tl(cpu_gpr[rt], t1);
2627             tcg_temp_free_i32(t1);
2628         } else {
2629             tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
2630         }
2631         break;
2632 #if defined(TARGET_MIPS64)
2633     case OPC_DSLL:
2634         tcg_gen_shli_tl(cpu_gpr[rt], t0, uimm);
2635         break;
2636     case OPC_DSRA:
2637         tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm);
2638         break;
2639     case OPC_DSRL:
2640         tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm);
2641         break;
2642     case OPC_DROTR:
2643         if (uimm != 0) {
2644             tcg_gen_rotri_tl(cpu_gpr[rt], t0, uimm);
2645         } else {
2646             tcg_gen_mov_tl(cpu_gpr[rt], t0);
2647         }
2648         break;
2649     case OPC_DSLL32:
2650         tcg_gen_shli_tl(cpu_gpr[rt], t0, uimm + 32);
2651         break;
2652     case OPC_DSRA32:
2653         tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm + 32);
2654         break;
2655     case OPC_DSRL32:
2656         tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm + 32);
2657         break;
2658     case OPC_DROTR32:
2659         tcg_gen_rotri_tl(cpu_gpr[rt], t0, uimm + 32);
2660         break;
2661 #endif
2662     }
2663     tcg_temp_free(t0);
2664 }
2665
2666 /* Arithmetic */
2667 static void gen_arith(DisasContext *ctx, uint32_t opc,
2668                       int rd, int rs, int rt)
2669 {
2670     if (rd == 0 && opc != OPC_ADD && opc != OPC_SUB
2671        && opc != OPC_DADD && opc != OPC_DSUB) {
2672         /* If no destination, treat it as a NOP.
2673            For add & sub, we must generate the overflow exception when needed. */
2674         return;
2675     }
2676
2677     switch (opc) {
2678     case OPC_ADD:
2679         {
2680             TCGv t0 = tcg_temp_local_new();
2681             TCGv t1 = tcg_temp_new();
2682             TCGv t2 = tcg_temp_new();
2683             TCGLabel *l1 = gen_new_label();
2684
2685             gen_load_gpr(t1, rs);
2686             gen_load_gpr(t2, rt);
2687             tcg_gen_add_tl(t0, t1, t2);
2688             tcg_gen_ext32s_tl(t0, t0);
2689             tcg_gen_xor_tl(t1, t1, t2);
2690             tcg_gen_xor_tl(t2, t0, t2);
2691             tcg_gen_andc_tl(t1, t2, t1);
2692             tcg_temp_free(t2);
2693             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2694             tcg_temp_free(t1);
2695             /* operands of same sign, result different sign */
2696             generate_exception(ctx, EXCP_OVERFLOW);
2697             gen_set_label(l1);
2698             gen_store_gpr(t0, rd);
2699             tcg_temp_free(t0);
2700         }
2701         break;
2702     case OPC_ADDU:
2703         if (rs != 0 && rt != 0) {
2704             tcg_gen_add_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2705             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2706         } else if (rs == 0 && rt != 0) {
2707             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
2708         } else if (rs != 0 && rt == 0) {
2709             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2710         } else {
2711             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2712         }
2713         break;
2714     case OPC_SUB:
2715         {
2716             TCGv t0 = tcg_temp_local_new();
2717             TCGv t1 = tcg_temp_new();
2718             TCGv t2 = tcg_temp_new();
2719             TCGLabel *l1 = gen_new_label();
2720
2721             gen_load_gpr(t1, rs);
2722             gen_load_gpr(t2, rt);
2723             tcg_gen_sub_tl(t0, t1, t2);
2724             tcg_gen_ext32s_tl(t0, t0);
2725             tcg_gen_xor_tl(t2, t1, t2);
2726             tcg_gen_xor_tl(t1, t0, t1);
2727             tcg_gen_and_tl(t1, t1, t2);
2728             tcg_temp_free(t2);
2729             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2730             tcg_temp_free(t1);
2731             /* operands of different sign, first operand and result different sign */
2732             generate_exception(ctx, EXCP_OVERFLOW);
2733             gen_set_label(l1);
2734             gen_store_gpr(t0, rd);
2735             tcg_temp_free(t0);
2736         }
2737         break;
2738     case OPC_SUBU:
2739         if (rs != 0 && rt != 0) {
2740             tcg_gen_sub_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2741             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2742         } else if (rs == 0 && rt != 0) {
2743             tcg_gen_neg_tl(cpu_gpr[rd], cpu_gpr[rt]);
2744             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2745         } else if (rs != 0 && rt == 0) {
2746             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2747         } else {
2748             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2749         }
2750         break;
2751 #if defined(TARGET_MIPS64)
2752     case OPC_DADD:
2753         {
2754             TCGv t0 = tcg_temp_local_new();
2755             TCGv t1 = tcg_temp_new();
2756             TCGv t2 = tcg_temp_new();
2757             TCGLabel *l1 = gen_new_label();
2758
2759             gen_load_gpr(t1, rs);
2760             gen_load_gpr(t2, rt);
2761             tcg_gen_add_tl(t0, t1, t2);
2762             tcg_gen_xor_tl(t1, t1, t2);
2763             tcg_gen_xor_tl(t2, t0, t2);
2764             tcg_gen_andc_tl(t1, t2, t1);
2765             tcg_temp_free(t2);
2766             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2767             tcg_temp_free(t1);
2768             /* operands of same sign, result different sign */
2769             generate_exception(ctx, EXCP_OVERFLOW);
2770             gen_set_label(l1);
2771             gen_store_gpr(t0, rd);
2772             tcg_temp_free(t0);
2773         }
2774         break;
2775     case OPC_DADDU:
2776         if (rs != 0 && rt != 0) {
2777             tcg_gen_add_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2778         } else if (rs == 0 && rt != 0) {
2779             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
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         break;
2786     case OPC_DSUB:
2787         {
2788             TCGv t0 = tcg_temp_local_new();
2789             TCGv t1 = tcg_temp_new();
2790             TCGv t2 = tcg_temp_new();
2791             TCGLabel *l1 = gen_new_label();
2792
2793             gen_load_gpr(t1, rs);
2794             gen_load_gpr(t2, rt);
2795             tcg_gen_sub_tl(t0, t1, t2);
2796             tcg_gen_xor_tl(t2, t1, t2);
2797             tcg_gen_xor_tl(t1, t0, t1);
2798             tcg_gen_and_tl(t1, t1, t2);
2799             tcg_temp_free(t2);
2800             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2801             tcg_temp_free(t1);
2802             /* operands of different sign, first operand and result different sign */
2803             generate_exception(ctx, EXCP_OVERFLOW);
2804             gen_set_label(l1);
2805             gen_store_gpr(t0, rd);
2806             tcg_temp_free(t0);
2807         }
2808         break;
2809     case OPC_DSUBU:
2810         if (rs != 0 && rt != 0) {
2811             tcg_gen_sub_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2812         } else if (rs == 0 && rt != 0) {
2813             tcg_gen_neg_tl(cpu_gpr[rd], cpu_gpr[rt]);
2814         } else if (rs != 0 && rt == 0) {
2815             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2816         } else {
2817             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2818         }
2819         break;
2820 #endif
2821     case OPC_MUL:
2822         if (likely(rs != 0 && rt != 0)) {
2823             tcg_gen_mul_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2824             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2825         } else {
2826             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2827         }
2828         break;
2829     }
2830 }
2831
2832 /* Conditional move */
2833 static void gen_cond_move(DisasContext *ctx, uint32_t opc,
2834                           int rd, int rs, int rt)
2835 {
2836     TCGv t0, t1, t2;
2837
2838     if (rd == 0) {
2839         /* If no destination, treat it as a NOP. */
2840         return;
2841     }
2842
2843     t0 = tcg_temp_new();
2844     gen_load_gpr(t0, rt);
2845     t1 = tcg_const_tl(0);
2846     t2 = tcg_temp_new();
2847     gen_load_gpr(t2, rs);
2848     switch (opc) {
2849     case OPC_MOVN:
2850         tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr[rd], t0, t1, t2, cpu_gpr[rd]);
2851         break;
2852     case OPC_MOVZ:
2853         tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr[rd], t0, t1, t2, cpu_gpr[rd]);
2854         break;
2855     case OPC_SELNEZ:
2856         tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr[rd], t0, t1, t2, t1);
2857         break;
2858     case OPC_SELEQZ:
2859         tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr[rd], t0, t1, t2, t1);
2860         break;
2861     }
2862     tcg_temp_free(t2);
2863     tcg_temp_free(t1);
2864     tcg_temp_free(t0);
2865 }
2866
2867 /* Logic */
2868 static void gen_logic(DisasContext *ctx, uint32_t opc,
2869                       int rd, int rs, int rt)
2870 {
2871     if (rd == 0) {
2872         /* If no destination, treat it as a NOP. */
2873         return;
2874     }
2875
2876     switch (opc) {
2877     case OPC_AND:
2878         if (likely(rs != 0 && rt != 0)) {
2879             tcg_gen_and_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2880         } else {
2881             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2882         }
2883         break;
2884     case OPC_NOR:
2885         if (rs != 0 && rt != 0) {
2886             tcg_gen_nor_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2887         } else if (rs == 0 && rt != 0) {
2888             tcg_gen_not_tl(cpu_gpr[rd], cpu_gpr[rt]);
2889         } else if (rs != 0 && rt == 0) {
2890             tcg_gen_not_tl(cpu_gpr[rd], cpu_gpr[rs]);
2891         } else {
2892             tcg_gen_movi_tl(cpu_gpr[rd], ~((target_ulong)0));
2893         }
2894         break;
2895     case OPC_OR:
2896         if (likely(rs != 0 && rt != 0)) {
2897             tcg_gen_or_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2898         } else if (rs == 0 && rt != 0) {
2899             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
2900         } else if (rs != 0 && rt == 0) {
2901             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2902         } else {
2903             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2904         }
2905         break;
2906     case OPC_XOR:
2907         if (likely(rs != 0 && rt != 0)) {
2908             tcg_gen_xor_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2909         } else if (rs == 0 && rt != 0) {
2910             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
2911         } else if (rs != 0 && rt == 0) {
2912             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2913         } else {
2914             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2915         }
2916         break;
2917     }
2918 }
2919
2920 /* Set on lower than */
2921 static void gen_slt(DisasContext *ctx, uint32_t opc,
2922                     int rd, int rs, int rt)
2923 {
2924     TCGv t0, t1;
2925
2926     if (rd == 0) {
2927         /* If no destination, treat it as a NOP. */
2928         return;
2929     }
2930
2931     t0 = tcg_temp_new();
2932     t1 = tcg_temp_new();
2933     gen_load_gpr(t0, rs);
2934     gen_load_gpr(t1, rt);
2935     switch (opc) {
2936     case OPC_SLT:
2937         tcg_gen_setcond_tl(TCG_COND_LT, cpu_gpr[rd], t0, t1);
2938         break;
2939     case OPC_SLTU:
2940         tcg_gen_setcond_tl(TCG_COND_LTU, cpu_gpr[rd], t0, t1);
2941         break;
2942     }
2943     tcg_temp_free(t0);
2944     tcg_temp_free(t1);
2945 }
2946
2947 /* Shifts */
2948 static void gen_shift(DisasContext *ctx, uint32_t opc,
2949                       int rd, int rs, int rt)
2950 {
2951     TCGv t0, t1;
2952
2953     if (rd == 0) {
2954         /* If no destination, treat it as a NOP.
2955            For add & sub, we must generate the overflow exception when needed. */
2956         return;
2957     }
2958
2959     t0 = tcg_temp_new();
2960     t1 = tcg_temp_new();
2961     gen_load_gpr(t0, rs);
2962     gen_load_gpr(t1, rt);
2963     switch (opc) {
2964     case OPC_SLLV:
2965         tcg_gen_andi_tl(t0, t0, 0x1f);
2966         tcg_gen_shl_tl(t0, t1, t0);
2967         tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
2968         break;
2969     case OPC_SRAV:
2970         tcg_gen_andi_tl(t0, t0, 0x1f);
2971         tcg_gen_sar_tl(cpu_gpr[rd], t1, t0);
2972         break;
2973     case OPC_SRLV:
2974         tcg_gen_ext32u_tl(t1, t1);
2975         tcg_gen_andi_tl(t0, t0, 0x1f);
2976         tcg_gen_shr_tl(t0, t1, t0);
2977         tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
2978         break;
2979     case OPC_ROTRV:
2980         {
2981             TCGv_i32 t2 = tcg_temp_new_i32();
2982             TCGv_i32 t3 = tcg_temp_new_i32();
2983
2984             tcg_gen_trunc_tl_i32(t2, t0);
2985             tcg_gen_trunc_tl_i32(t3, t1);
2986             tcg_gen_andi_i32(t2, t2, 0x1f);
2987             tcg_gen_rotr_i32(t2, t3, t2);
2988             tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
2989             tcg_temp_free_i32(t2);
2990             tcg_temp_free_i32(t3);
2991         }
2992         break;
2993 #if defined(TARGET_MIPS64)
2994     case OPC_DSLLV:
2995         tcg_gen_andi_tl(t0, t0, 0x3f);
2996         tcg_gen_shl_tl(cpu_gpr[rd], t1, t0);
2997         break;
2998     case OPC_DSRAV:
2999         tcg_gen_andi_tl(t0, t0, 0x3f);
3000         tcg_gen_sar_tl(cpu_gpr[rd], t1, t0);
3001         break;
3002     case OPC_DSRLV:
3003         tcg_gen_andi_tl(t0, t0, 0x3f);
3004         tcg_gen_shr_tl(cpu_gpr[rd], t1, t0);
3005         break;
3006     case OPC_DROTRV:
3007         tcg_gen_andi_tl(t0, t0, 0x3f);
3008         tcg_gen_rotr_tl(cpu_gpr[rd], t1, t0);
3009         break;
3010 #endif
3011     }
3012     tcg_temp_free(t0);
3013     tcg_temp_free(t1);
3014 }
3015
3016 /* Arithmetic on HI/LO registers */
3017 static void gen_HILO(DisasContext *ctx, uint32_t opc, int acc, int reg)
3018 {
3019     if (reg == 0 && (opc == OPC_MFHI || opc == OPC_MFLO)) {
3020         /* Treat as NOP. */
3021         return;
3022     }
3023
3024     if (acc != 0) {
3025         check_dsp(ctx);
3026     }
3027
3028     switch (opc) {
3029     case OPC_MFHI:
3030 #if defined(TARGET_MIPS64)
3031         if (acc != 0) {
3032             tcg_gen_ext32s_tl(cpu_gpr[reg], cpu_HI[acc]);
3033         } else
3034 #endif
3035         {
3036             tcg_gen_mov_tl(cpu_gpr[reg], cpu_HI[acc]);
3037         }
3038         break;
3039     case OPC_MFLO:
3040 #if defined(TARGET_MIPS64)
3041         if (acc != 0) {
3042             tcg_gen_ext32s_tl(cpu_gpr[reg], cpu_LO[acc]);
3043         } else
3044 #endif
3045         {
3046             tcg_gen_mov_tl(cpu_gpr[reg], cpu_LO[acc]);
3047         }
3048         break;
3049     case OPC_MTHI:
3050         if (reg != 0) {
3051 #if defined(TARGET_MIPS64)
3052             if (acc != 0) {
3053                 tcg_gen_ext32s_tl(cpu_HI[acc], cpu_gpr[reg]);
3054             } else
3055 #endif
3056             {
3057                 tcg_gen_mov_tl(cpu_HI[acc], cpu_gpr[reg]);
3058             }
3059         } else {
3060             tcg_gen_movi_tl(cpu_HI[acc], 0);
3061         }
3062         break;
3063     case OPC_MTLO:
3064         if (reg != 0) {
3065 #if defined(TARGET_MIPS64)
3066             if (acc != 0) {
3067                 tcg_gen_ext32s_tl(cpu_LO[acc], cpu_gpr[reg]);
3068             } else
3069 #endif
3070             {
3071                 tcg_gen_mov_tl(cpu_LO[acc], cpu_gpr[reg]);
3072             }
3073         } else {
3074             tcg_gen_movi_tl(cpu_LO[acc], 0);
3075         }
3076         break;
3077     }
3078 }
3079
3080 static inline void gen_r6_ld(target_long addr, int reg, int memidx,
3081                              TCGMemOp memop)
3082 {
3083     TCGv t0 = tcg_const_tl(addr);
3084     tcg_gen_qemu_ld_tl(t0, t0, memidx, memop);
3085     gen_store_gpr(t0, reg);
3086     tcg_temp_free(t0);
3087 }
3088
3089 static inline void gen_pcrel(DisasContext *ctx, int opc, target_ulong pc,
3090                              int rs)
3091 {
3092     target_long offset;
3093     target_long addr;
3094
3095     switch (MASK_OPC_PCREL_TOP2BITS(opc)) {
3096     case OPC_ADDIUPC:
3097         if (rs != 0) {
3098             offset = sextract32(ctx->opcode << 2, 0, 21);
3099             addr = addr_add(ctx, pc, offset);
3100             tcg_gen_movi_tl(cpu_gpr[rs], addr);
3101         }
3102         break;
3103     case R6_OPC_LWPC:
3104         offset = sextract32(ctx->opcode << 2, 0, 21);
3105         addr = addr_add(ctx, pc, offset);
3106         gen_r6_ld(addr, rs, ctx->mem_idx, MO_TESL);
3107         break;
3108 #if defined(TARGET_MIPS64)
3109     case OPC_LWUPC:
3110         check_mips_64(ctx);
3111         offset = sextract32(ctx->opcode << 2, 0, 21);
3112         addr = addr_add(ctx, pc, offset);
3113         gen_r6_ld(addr, rs, ctx->mem_idx, MO_TEUL);
3114         break;
3115 #endif
3116     default:
3117         switch (MASK_OPC_PCREL_TOP5BITS(opc)) {
3118         case OPC_AUIPC:
3119             if (rs != 0) {
3120                 offset = sextract32(ctx->opcode, 0, 16) << 16;
3121                 addr = addr_add(ctx, pc, offset);
3122                 tcg_gen_movi_tl(cpu_gpr[rs], addr);
3123             }
3124             break;
3125         case OPC_ALUIPC:
3126             if (rs != 0) {
3127                 offset = sextract32(ctx->opcode, 0, 16) << 16;
3128                 addr = ~0xFFFF & addr_add(ctx, pc, offset);
3129                 tcg_gen_movi_tl(cpu_gpr[rs], addr);
3130             }
3131             break;
3132 #if defined(TARGET_MIPS64)
3133         case R6_OPC_LDPC: /* bits 16 and 17 are part of immediate */
3134         case R6_OPC_LDPC + (1 << 16):
3135         case R6_OPC_LDPC + (2 << 16):
3136         case R6_OPC_LDPC + (3 << 16):
3137             check_mips_64(ctx);
3138             offset = sextract32(ctx->opcode << 3, 0, 21);
3139             addr = addr_add(ctx, (pc & ~0x7), offset);
3140             gen_r6_ld(addr, rs, ctx->mem_idx, MO_TEQ);
3141             break;
3142 #endif
3143         default:
3144             MIPS_INVAL("OPC_PCREL");
3145             generate_exception_end(ctx, EXCP_RI);
3146             break;
3147         }
3148         break;
3149     }
3150 }
3151
3152 static void gen_r6_muldiv(DisasContext *ctx, int opc, int rd, int rs, int rt)
3153 {
3154     TCGv t0, t1;
3155
3156     if (rd == 0) {
3157         /* Treat as NOP. */
3158         return;
3159     }
3160
3161     t0 = tcg_temp_new();
3162     t1 = tcg_temp_new();
3163
3164     gen_load_gpr(t0, rs);
3165     gen_load_gpr(t1, rt);
3166
3167     switch (opc) {
3168     case R6_OPC_DIV:
3169         {
3170             TCGv t2 = tcg_temp_new();
3171             TCGv t3 = tcg_temp_new();
3172             tcg_gen_ext32s_tl(t0, t0);
3173             tcg_gen_ext32s_tl(t1, t1);
3174             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, INT_MIN);
3175             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1);
3176             tcg_gen_and_tl(t2, t2, t3);
3177             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3178             tcg_gen_or_tl(t2, t2, t3);
3179             tcg_gen_movi_tl(t3, 0);
3180             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3181             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
3182             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3183             tcg_temp_free(t3);
3184             tcg_temp_free(t2);
3185         }
3186         break;
3187     case R6_OPC_MOD:
3188         {
3189             TCGv t2 = tcg_temp_new();
3190             TCGv t3 = tcg_temp_new();
3191             tcg_gen_ext32s_tl(t0, t0);
3192             tcg_gen_ext32s_tl(t1, t1);
3193             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, INT_MIN);
3194             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1);
3195             tcg_gen_and_tl(t2, t2, t3);
3196             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3197             tcg_gen_or_tl(t2, t2, t3);
3198             tcg_gen_movi_tl(t3, 0);
3199             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3200             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
3201             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3202             tcg_temp_free(t3);
3203             tcg_temp_free(t2);
3204         }
3205         break;
3206     case R6_OPC_DIVU:
3207         {
3208             TCGv t2 = tcg_const_tl(0);
3209             TCGv t3 = tcg_const_tl(1);
3210             tcg_gen_ext32u_tl(t0, t0);
3211             tcg_gen_ext32u_tl(t1, t1);
3212             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3213             tcg_gen_divu_tl(cpu_gpr[rd], t0, t1);
3214             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3215             tcg_temp_free(t3);
3216             tcg_temp_free(t2);
3217         }
3218         break;
3219     case R6_OPC_MODU:
3220         {
3221             TCGv t2 = tcg_const_tl(0);
3222             TCGv t3 = tcg_const_tl(1);
3223             tcg_gen_ext32u_tl(t0, t0);
3224             tcg_gen_ext32u_tl(t1, t1);
3225             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3226             tcg_gen_remu_tl(cpu_gpr[rd], t0, t1);
3227             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3228             tcg_temp_free(t3);
3229             tcg_temp_free(t2);
3230         }
3231         break;
3232     case R6_OPC_MUL:
3233         {
3234             TCGv_i32 t2 = tcg_temp_new_i32();
3235             TCGv_i32 t3 = tcg_temp_new_i32();
3236             tcg_gen_trunc_tl_i32(t2, t0);
3237             tcg_gen_trunc_tl_i32(t3, t1);
3238             tcg_gen_mul_i32(t2, t2, t3);
3239             tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
3240             tcg_temp_free_i32(t2);
3241             tcg_temp_free_i32(t3);
3242         }
3243         break;
3244     case R6_OPC_MUH:
3245         {
3246             TCGv_i32 t2 = tcg_temp_new_i32();
3247             TCGv_i32 t3 = tcg_temp_new_i32();
3248             tcg_gen_trunc_tl_i32(t2, t0);
3249             tcg_gen_trunc_tl_i32(t3, t1);
3250             tcg_gen_muls2_i32(t2, t3, t2, t3);
3251             tcg_gen_ext_i32_tl(cpu_gpr[rd], t3);
3252             tcg_temp_free_i32(t2);
3253             tcg_temp_free_i32(t3);
3254         }
3255         break;
3256     case R6_OPC_MULU:
3257         {
3258             TCGv_i32 t2 = tcg_temp_new_i32();
3259             TCGv_i32 t3 = tcg_temp_new_i32();
3260             tcg_gen_trunc_tl_i32(t2, t0);
3261             tcg_gen_trunc_tl_i32(t3, t1);
3262             tcg_gen_mul_i32(t2, t2, t3);
3263             tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
3264             tcg_temp_free_i32(t2);
3265             tcg_temp_free_i32(t3);
3266         }
3267         break;
3268     case R6_OPC_MUHU:
3269         {
3270             TCGv_i32 t2 = tcg_temp_new_i32();
3271             TCGv_i32 t3 = tcg_temp_new_i32();
3272             tcg_gen_trunc_tl_i32(t2, t0);
3273             tcg_gen_trunc_tl_i32(t3, t1);
3274             tcg_gen_mulu2_i32(t2, t3, t2, t3);
3275             tcg_gen_ext_i32_tl(cpu_gpr[rd], t3);
3276             tcg_temp_free_i32(t2);
3277             tcg_temp_free_i32(t3);
3278         }
3279         break;
3280 #if defined(TARGET_MIPS64)
3281     case R6_OPC_DDIV:
3282         {
3283             TCGv t2 = tcg_temp_new();
3284             TCGv t3 = tcg_temp_new();
3285             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, -1LL << 63);
3286             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1LL);
3287             tcg_gen_and_tl(t2, t2, t3);
3288             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3289             tcg_gen_or_tl(t2, t2, t3);
3290             tcg_gen_movi_tl(t3, 0);
3291             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3292             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
3293             tcg_temp_free(t3);
3294             tcg_temp_free(t2);
3295         }
3296         break;
3297     case R6_OPC_DMOD:
3298         {
3299             TCGv t2 = tcg_temp_new();
3300             TCGv t3 = tcg_temp_new();
3301             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, -1LL << 63);
3302             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1LL);
3303             tcg_gen_and_tl(t2, t2, t3);
3304             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3305             tcg_gen_or_tl(t2, t2, t3);
3306             tcg_gen_movi_tl(t3, 0);
3307             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3308             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
3309             tcg_temp_free(t3);
3310             tcg_temp_free(t2);
3311         }
3312         break;
3313     case R6_OPC_DDIVU:
3314         {
3315             TCGv t2 = tcg_const_tl(0);
3316             TCGv t3 = tcg_const_tl(1);
3317             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3318             tcg_gen_divu_i64(cpu_gpr[rd], t0, t1);
3319             tcg_temp_free(t3);
3320             tcg_temp_free(t2);
3321         }
3322         break;
3323     case R6_OPC_DMODU:
3324         {
3325             TCGv t2 = tcg_const_tl(0);
3326             TCGv t3 = tcg_const_tl(1);
3327             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3328             tcg_gen_remu_i64(cpu_gpr[rd], t0, t1);
3329             tcg_temp_free(t3);
3330             tcg_temp_free(t2);
3331         }
3332         break;
3333     case R6_OPC_DMUL:
3334         tcg_gen_mul_i64(cpu_gpr[rd], t0, t1);
3335         break;
3336     case R6_OPC_DMUH:
3337         {
3338             TCGv t2 = tcg_temp_new();
3339             tcg_gen_muls2_i64(t2, cpu_gpr[rd], t0, t1);
3340             tcg_temp_free(t2);
3341         }
3342         break;
3343     case R6_OPC_DMULU:
3344         tcg_gen_mul_i64(cpu_gpr[rd], t0, t1);
3345         break;
3346     case R6_OPC_DMUHU:
3347         {
3348             TCGv t2 = tcg_temp_new();
3349             tcg_gen_mulu2_i64(t2, cpu_gpr[rd], t0, t1);
3350             tcg_temp_free(t2);
3351         }
3352         break;
3353 #endif
3354     default:
3355         MIPS_INVAL("r6 mul/div");
3356         generate_exception_end(ctx, EXCP_RI);
3357         goto out;
3358     }
3359  out:
3360     tcg_temp_free(t0);
3361     tcg_temp_free(t1);
3362 }
3363
3364 static void gen_muldiv(DisasContext *ctx, uint32_t opc,
3365                        int acc, int rs, int rt)
3366 {
3367     TCGv t0, t1;
3368
3369     t0 = tcg_temp_new();
3370     t1 = tcg_temp_new();
3371
3372     gen_load_gpr(t0, rs);
3373     gen_load_gpr(t1, rt);
3374
3375     if (acc != 0) {
3376         check_dsp(ctx);
3377     }
3378
3379     switch (opc) {
3380     case OPC_DIV:
3381         {
3382             TCGv t2 = tcg_temp_new();
3383             TCGv t3 = tcg_temp_new();
3384             tcg_gen_ext32s_tl(t0, t0);
3385             tcg_gen_ext32s_tl(t1, t1);
3386             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, INT_MIN);
3387             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1);
3388             tcg_gen_and_tl(t2, t2, t3);
3389             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3390             tcg_gen_or_tl(t2, t2, t3);
3391             tcg_gen_movi_tl(t3, 0);
3392             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3393             tcg_gen_div_tl(cpu_LO[acc], t0, t1);
3394             tcg_gen_rem_tl(cpu_HI[acc], t0, t1);
3395             tcg_gen_ext32s_tl(cpu_LO[acc], cpu_LO[acc]);
3396             tcg_gen_ext32s_tl(cpu_HI[acc], cpu_HI[acc]);
3397             tcg_temp_free(t3);
3398             tcg_temp_free(t2);
3399         }
3400         break;
3401     case OPC_DIVU:
3402         {
3403             TCGv t2 = tcg_const_tl(0);
3404             TCGv t3 = tcg_const_tl(1);
3405             tcg_gen_ext32u_tl(t0, t0);
3406             tcg_gen_ext32u_tl(t1, t1);
3407             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3408             tcg_gen_divu_tl(cpu_LO[acc], t0, t1);
3409             tcg_gen_remu_tl(cpu_HI[acc], t0, t1);
3410             tcg_gen_ext32s_tl(cpu_LO[acc], cpu_LO[acc]);
3411             tcg_gen_ext32s_tl(cpu_HI[acc], cpu_HI[acc]);
3412             tcg_temp_free(t3);
3413             tcg_temp_free(t2);
3414         }
3415         break;
3416     case OPC_MULT:
3417         {
3418             TCGv_i32 t2 = tcg_temp_new_i32();
3419             TCGv_i32 t3 = tcg_temp_new_i32();
3420             tcg_gen_trunc_tl_i32(t2, t0);
3421             tcg_gen_trunc_tl_i32(t3, t1);
3422             tcg_gen_muls2_i32(t2, t3, t2, t3);
3423             tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
3424             tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
3425             tcg_temp_free_i32(t2);
3426             tcg_temp_free_i32(t3);
3427         }
3428         break;
3429     case OPC_MULTU:
3430         {
3431             TCGv_i32 t2 = tcg_temp_new_i32();
3432             TCGv_i32 t3 = tcg_temp_new_i32();
3433             tcg_gen_trunc_tl_i32(t2, t0);
3434             tcg_gen_trunc_tl_i32(t3, t1);
3435             tcg_gen_mulu2_i32(t2, t3, t2, t3);
3436             tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
3437             tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
3438             tcg_temp_free_i32(t2);
3439             tcg_temp_free_i32(t3);
3440         }
3441         break;
3442 #if defined(TARGET_MIPS64)
3443     case OPC_DDIV:
3444         {
3445             TCGv t2 = tcg_temp_new();
3446             TCGv t3 = tcg_temp_new();
3447             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, -1LL << 63);
3448             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1LL);
3449             tcg_gen_and_tl(t2, t2, t3);
3450             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3451             tcg_gen_or_tl(t2, t2, t3);
3452             tcg_gen_movi_tl(t3, 0);
3453             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3454             tcg_gen_div_tl(cpu_LO[acc], t0, t1);
3455             tcg_gen_rem_tl(cpu_HI[acc], t0, t1);
3456             tcg_temp_free(t3);
3457             tcg_temp_free(t2);
3458         }
3459         break;
3460     case OPC_DDIVU:
3461         {
3462             TCGv t2 = tcg_const_tl(0);
3463             TCGv t3 = tcg_const_tl(1);
3464             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3465             tcg_gen_divu_i64(cpu_LO[acc], t0, t1);
3466             tcg_gen_remu_i64(cpu_HI[acc], t0, t1);
3467             tcg_temp_free(t3);
3468             tcg_temp_free(t2);
3469         }
3470         break;
3471     case OPC_DMULT:
3472         tcg_gen_muls2_i64(cpu_LO[acc], cpu_HI[acc], t0, t1);
3473         break;
3474     case OPC_DMULTU:
3475         tcg_gen_mulu2_i64(cpu_LO[acc], cpu_HI[acc], t0, t1);
3476         break;
3477 #endif
3478     case OPC_MADD:
3479         {
3480             TCGv_i64 t2 = tcg_temp_new_i64();
3481             TCGv_i64 t3 = tcg_temp_new_i64();
3482
3483             tcg_gen_ext_tl_i64(t2, t0);
3484             tcg_gen_ext_tl_i64(t3, t1);
3485             tcg_gen_mul_i64(t2, t2, t3);
3486             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
3487             tcg_gen_add_i64(t2, t2, t3);
3488             tcg_temp_free_i64(t3);
3489             gen_move_low32(cpu_LO[acc], t2);
3490             gen_move_high32(cpu_HI[acc], t2);
3491             tcg_temp_free_i64(t2);
3492         }
3493         break;
3494     case OPC_MADDU:
3495         {
3496             TCGv_i64 t2 = tcg_temp_new_i64();
3497             TCGv_i64 t3 = tcg_temp_new_i64();
3498
3499             tcg_gen_ext32u_tl(t0, t0);
3500             tcg_gen_ext32u_tl(t1, t1);
3501             tcg_gen_extu_tl_i64(t2, t0);
3502             tcg_gen_extu_tl_i64(t3, t1);
3503             tcg_gen_mul_i64(t2, t2, t3);
3504             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
3505             tcg_gen_add_i64(t2, t2, t3);
3506             tcg_temp_free_i64(t3);
3507             gen_move_low32(cpu_LO[acc], t2);
3508             gen_move_high32(cpu_HI[acc], t2);
3509             tcg_temp_free_i64(t2);
3510         }
3511         break;
3512     case OPC_MSUB:
3513         {
3514             TCGv_i64 t2 = tcg_temp_new_i64();
3515             TCGv_i64 t3 = tcg_temp_new_i64();
3516
3517             tcg_gen_ext_tl_i64(t2, t0);
3518             tcg_gen_ext_tl_i64(t3, t1);
3519             tcg_gen_mul_i64(t2, t2, t3);
3520             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
3521             tcg_gen_sub_i64(t2, t3, t2);
3522             tcg_temp_free_i64(t3);
3523             gen_move_low32(cpu_LO[acc], t2);
3524             gen_move_high32(cpu_HI[acc], t2);
3525             tcg_temp_free_i64(t2);
3526         }
3527         break;
3528     case OPC_MSUBU:
3529         {
3530             TCGv_i64 t2 = tcg_temp_new_i64();
3531             TCGv_i64 t3 = tcg_temp_new_i64();
3532
3533             tcg_gen_ext32u_tl(t0, t0);
3534             tcg_gen_ext32u_tl(t1, t1);
3535             tcg_gen_extu_tl_i64(t2, t0);
3536             tcg_gen_extu_tl_i64(t3, t1);
3537             tcg_gen_mul_i64(t2, t2, t3);
3538             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
3539             tcg_gen_sub_i64(t2, t3, t2);
3540             tcg_temp_free_i64(t3);
3541             gen_move_low32(cpu_LO[acc], t2);
3542             gen_move_high32(cpu_HI[acc], t2);
3543             tcg_temp_free_i64(t2);
3544         }
3545         break;
3546     default:
3547         MIPS_INVAL("mul/div");
3548         generate_exception_end(ctx, EXCP_RI);
3549         goto out;
3550     }
3551  out:
3552     tcg_temp_free(t0);
3553     tcg_temp_free(t1);
3554 }
3555
3556 static void gen_mul_vr54xx (DisasContext *ctx, uint32_t opc,
3557                             int rd, int rs, int rt)
3558 {
3559     TCGv t0 = tcg_temp_new();
3560     TCGv t1 = tcg_temp_new();
3561
3562     gen_load_gpr(t0, rs);
3563     gen_load_gpr(t1, rt);
3564
3565     switch (opc) {
3566     case OPC_VR54XX_MULS:
3567         gen_helper_muls(t0, cpu_env, t0, t1);
3568         break;
3569     case OPC_VR54XX_MULSU:
3570         gen_helper_mulsu(t0, cpu_env, t0, t1);
3571         break;
3572     case OPC_VR54XX_MACC:
3573         gen_helper_macc(t0, cpu_env, t0, t1);
3574         break;
3575     case OPC_VR54XX_MACCU:
3576         gen_helper_maccu(t0, cpu_env, t0, t1);
3577         break;
3578     case OPC_VR54XX_MSAC:
3579         gen_helper_msac(t0, cpu_env, t0, t1);
3580         break;
3581     case OPC_VR54XX_MSACU:
3582         gen_helper_msacu(t0, cpu_env, t0, t1);
3583         break;
3584     case OPC_VR54XX_MULHI:
3585         gen_helper_mulhi(t0, cpu_env, t0, t1);
3586         break;
3587     case OPC_VR54XX_MULHIU:
3588         gen_helper_mulhiu(t0, cpu_env, t0, t1);
3589         break;
3590     case OPC_VR54XX_MULSHI:
3591         gen_helper_mulshi(t0, cpu_env, t0, t1);
3592         break;
3593     case OPC_VR54XX_MULSHIU:
3594         gen_helper_mulshiu(t0, cpu_env, t0, t1);
3595         break;
3596     case OPC_VR54XX_MACCHI:
3597         gen_helper_macchi(t0, cpu_env, t0, t1);
3598         break;
3599     case OPC_VR54XX_MACCHIU:
3600         gen_helper_macchiu(t0, cpu_env, t0, t1);
3601         break;
3602     case OPC_VR54XX_MSACHI:
3603         gen_helper_msachi(t0, cpu_env, t0, t1);
3604         break;
3605     case OPC_VR54XX_MSACHIU:
3606         gen_helper_msachiu(t0, cpu_env, t0, t1);
3607         break;
3608     default:
3609         MIPS_INVAL("mul vr54xx");
3610         generate_exception_end(ctx, EXCP_RI);
3611         goto out;
3612     }
3613     gen_store_gpr(t0, rd);
3614
3615  out:
3616     tcg_temp_free(t0);
3617     tcg_temp_free(t1);
3618 }
3619
3620 static void gen_cl (DisasContext *ctx, uint32_t opc,
3621                     int rd, int rs)
3622 {
3623     TCGv t0;
3624
3625     if (rd == 0) {
3626         /* Treat as NOP. */
3627         return;
3628     }
3629     t0 = tcg_temp_new();
3630     gen_load_gpr(t0, rs);
3631     switch (opc) {
3632     case OPC_CLO:
3633     case R6_OPC_CLO:
3634         gen_helper_clo(cpu_gpr[rd], t0);
3635         break;
3636     case OPC_CLZ:
3637     case R6_OPC_CLZ:
3638         gen_helper_clz(cpu_gpr[rd], t0);
3639         break;
3640 #if defined(TARGET_MIPS64)
3641     case OPC_DCLO:
3642     case R6_OPC_DCLO:
3643         gen_helper_dclo(cpu_gpr[rd], t0);
3644         break;
3645     case OPC_DCLZ:
3646     case R6_OPC_DCLZ:
3647         gen_helper_dclz(cpu_gpr[rd], t0);
3648         break;
3649 #endif
3650     }
3651     tcg_temp_free(t0);
3652 }
3653
3654 /* Godson integer instructions */
3655 static void gen_loongson_integer(DisasContext *ctx, uint32_t opc,
3656                                  int rd, int rs, int rt)
3657 {
3658     TCGv t0, t1;
3659
3660     if (rd == 0) {
3661         /* Treat as NOP. */
3662         return;
3663     }
3664
3665     switch (opc) {
3666     case OPC_MULT_G_2E:
3667     case OPC_MULT_G_2F:
3668     case OPC_MULTU_G_2E:
3669     case OPC_MULTU_G_2F:
3670 #if defined(TARGET_MIPS64)
3671     case OPC_DMULT_G_2E:
3672     case OPC_DMULT_G_2F:
3673     case OPC_DMULTU_G_2E:
3674     case OPC_DMULTU_G_2F:
3675 #endif
3676         t0 = tcg_temp_new();
3677         t1 = tcg_temp_new();
3678         break;
3679     default:
3680         t0 = tcg_temp_local_new();
3681         t1 = tcg_temp_local_new();
3682         break;
3683     }
3684
3685     gen_load_gpr(t0, rs);
3686     gen_load_gpr(t1, rt);
3687
3688     switch (opc) {
3689     case OPC_MULT_G_2E:
3690     case OPC_MULT_G_2F:
3691         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3692         tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3693         break;
3694     case OPC_MULTU_G_2E:
3695     case OPC_MULTU_G_2F:
3696         tcg_gen_ext32u_tl(t0, t0);
3697         tcg_gen_ext32u_tl(t1, t1);
3698         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3699         tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3700         break;
3701     case OPC_DIV_G_2E:
3702     case OPC_DIV_G_2F:
3703         {
3704             TCGLabel *l1 = gen_new_label();
3705             TCGLabel *l2 = gen_new_label();
3706             TCGLabel *l3 = gen_new_label();
3707             tcg_gen_ext32s_tl(t0, t0);
3708             tcg_gen_ext32s_tl(t1, t1);
3709             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3710             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3711             tcg_gen_br(l3);
3712             gen_set_label(l1);
3713             tcg_gen_brcondi_tl(TCG_COND_NE, t0, INT_MIN, l2);
3714             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1, l2);
3715             tcg_gen_mov_tl(cpu_gpr[rd], t0);
3716             tcg_gen_br(l3);
3717             gen_set_label(l2);
3718             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
3719             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3720             gen_set_label(l3);
3721         }
3722         break;
3723     case OPC_DIVU_G_2E:
3724     case OPC_DIVU_G_2F:
3725         {
3726             TCGLabel *l1 = gen_new_label();
3727             TCGLabel *l2 = gen_new_label();
3728             tcg_gen_ext32u_tl(t0, t0);
3729             tcg_gen_ext32u_tl(t1, t1);
3730             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3731             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3732             tcg_gen_br(l2);
3733             gen_set_label(l1);
3734             tcg_gen_divu_tl(cpu_gpr[rd], t0, t1);
3735             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3736             gen_set_label(l2);
3737         }
3738         break;
3739     case OPC_MOD_G_2E:
3740     case OPC_MOD_G_2F:
3741         {
3742             TCGLabel *l1 = gen_new_label();
3743             TCGLabel *l2 = gen_new_label();
3744             TCGLabel *l3 = gen_new_label();
3745             tcg_gen_ext32u_tl(t0, t0);
3746             tcg_gen_ext32u_tl(t1, t1);
3747             tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
3748             tcg_gen_brcondi_tl(TCG_COND_NE, t0, INT_MIN, l2);
3749             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1, l2);
3750             gen_set_label(l1);
3751             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3752             tcg_gen_br(l3);
3753             gen_set_label(l2);
3754             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
3755             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3756             gen_set_label(l3);
3757         }
3758         break;
3759     case OPC_MODU_G_2E:
3760     case OPC_MODU_G_2F:
3761         {
3762             TCGLabel *l1 = gen_new_label();
3763             TCGLabel *l2 = gen_new_label();
3764             tcg_gen_ext32u_tl(t0, t0);
3765             tcg_gen_ext32u_tl(t1, t1);
3766             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3767             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3768             tcg_gen_br(l2);
3769             gen_set_label(l1);
3770             tcg_gen_remu_tl(cpu_gpr[rd], t0, t1);
3771             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3772             gen_set_label(l2);
3773         }
3774         break;
3775 #if defined(TARGET_MIPS64)
3776     case OPC_DMULT_G_2E:
3777     case OPC_DMULT_G_2F:
3778         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3779         break;
3780     case OPC_DMULTU_G_2E:
3781     case OPC_DMULTU_G_2F:
3782         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3783         break;
3784     case OPC_DDIV_G_2E:
3785     case OPC_DDIV_G_2F:
3786         {
3787             TCGLabel *l1 = gen_new_label();
3788             TCGLabel *l2 = gen_new_label();
3789             TCGLabel *l3 = gen_new_label();
3790             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3791             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3792             tcg_gen_br(l3);
3793             gen_set_label(l1);
3794             tcg_gen_brcondi_tl(TCG_COND_NE, t0, -1LL << 63, l2);
3795             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1LL, l2);
3796             tcg_gen_mov_tl(cpu_gpr[rd], t0);
3797             tcg_gen_br(l3);
3798             gen_set_label(l2);
3799             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
3800             gen_set_label(l3);
3801         }
3802         break;
3803     case OPC_DDIVU_G_2E:
3804     case OPC_DDIVU_G_2F:
3805         {
3806             TCGLabel *l1 = gen_new_label();
3807             TCGLabel *l2 = gen_new_label();
3808             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3809             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3810             tcg_gen_br(l2);
3811             gen_set_label(l1);
3812             tcg_gen_divu_tl(cpu_gpr[rd], t0, t1);
3813             gen_set_label(l2);
3814         }
3815         break;
3816     case OPC_DMOD_G_2E:
3817     case OPC_DMOD_G_2F:
3818         {
3819             TCGLabel *l1 = gen_new_label();
3820             TCGLabel *l2 = gen_new_label();
3821             TCGLabel *l3 = gen_new_label();
3822             tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
3823             tcg_gen_brcondi_tl(TCG_COND_NE, t0, -1LL << 63, l2);
3824             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1LL, l2);
3825             gen_set_label(l1);
3826             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3827             tcg_gen_br(l3);
3828             gen_set_label(l2);
3829             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
3830             gen_set_label(l3);
3831         }
3832         break;
3833     case OPC_DMODU_G_2E:
3834     case OPC_DMODU_G_2F:
3835         {
3836             TCGLabel *l1 = gen_new_label();
3837             TCGLabel *l2 = gen_new_label();
3838             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3839             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3840             tcg_gen_br(l2);
3841             gen_set_label(l1);
3842             tcg_gen_remu_tl(cpu_gpr[rd], t0, t1);
3843             gen_set_label(l2);
3844         }
3845         break;
3846 #endif
3847     }
3848
3849     tcg_temp_free(t0);
3850     tcg_temp_free(t1);
3851 }
3852
3853 /* Loongson multimedia instructions */
3854 static void gen_loongson_multimedia(DisasContext *ctx, int rd, int rs, int rt)
3855 {
3856     uint32_t opc, shift_max;
3857     TCGv_i64 t0, t1;
3858
3859     opc = MASK_LMI(ctx->opcode);
3860     switch (opc) {
3861     case OPC_ADD_CP2:
3862     case OPC_SUB_CP2:
3863     case OPC_DADD_CP2:
3864     case OPC_DSUB_CP2:
3865         t0 = tcg_temp_local_new_i64();
3866         t1 = tcg_temp_local_new_i64();
3867         break;
3868     default:
3869         t0 = tcg_temp_new_i64();
3870         t1 = tcg_temp_new_i64();
3871         break;
3872     }
3873
3874     check_cp1_enabled(ctx);
3875     gen_load_fpr64(ctx, t0, rs);
3876     gen_load_fpr64(ctx, t1, rt);
3877
3878 #define LMI_HELPER(UP, LO) \
3879     case OPC_##UP: gen_helper_##LO(t0, t0, t1); break
3880 #define LMI_HELPER_1(UP, LO) \
3881     case OPC_##UP: gen_helper_##LO(t0, t0); break
3882 #define LMI_DIRECT(UP, LO, OP) \
3883     case OPC_##UP: tcg_gen_##OP##_i64(t0, t0, t1); break
3884
3885     switch (opc) {
3886     LMI_HELPER(PADDSH, paddsh);
3887     LMI_HELPER(PADDUSH, paddush);
3888     LMI_HELPER(PADDH, paddh);
3889     LMI_HELPER(PADDW, paddw);
3890     LMI_HELPER(PADDSB, paddsb);
3891     LMI_HELPER(PADDUSB, paddusb);
3892     LMI_HELPER(PADDB, paddb);
3893
3894     LMI_HELPER(PSUBSH, psubsh);
3895     LMI_HELPER(PSUBUSH, psubush);
3896     LMI_HELPER(PSUBH, psubh);
3897     LMI_HELPER(PSUBW, psubw);
3898     LMI_HELPER(PSUBSB, psubsb);
3899     LMI_HELPER(PSUBUSB, psubusb);
3900     LMI_HELPER(PSUBB, psubb);
3901
3902     LMI_HELPER(PSHUFH, pshufh);
3903     LMI_HELPER(PACKSSWH, packsswh);
3904     LMI_HELPER(PACKSSHB, packsshb);
3905     LMI_HELPER(PACKUSHB, packushb);
3906
3907     LMI_HELPER(PUNPCKLHW, punpcklhw);
3908     LMI_HELPER(PUNPCKHHW, punpckhhw);
3909     LMI_HELPER(PUNPCKLBH, punpcklbh);
3910     LMI_HELPER(PUNPCKHBH, punpckhbh);
3911     LMI_HELPER(PUNPCKLWD, punpcklwd);
3912     LMI_HELPER(PUNPCKHWD, punpckhwd);
3913
3914     LMI_HELPER(PAVGH, pavgh);
3915     LMI_HELPER(PAVGB, pavgb);
3916     LMI_HELPER(PMAXSH, pmaxsh);
3917     LMI_HELPER(PMINSH, pminsh);
3918     LMI_HELPER(PMAXUB, pmaxub);
3919     LMI_HELPER(PMINUB, pminub);
3920
3921     LMI_HELPER(PCMPEQW, pcmpeqw);
3922     LMI_HELPER(PCMPGTW, pcmpgtw);
3923     LMI_HELPER(PCMPEQH, pcmpeqh);
3924     LMI_HELPER(PCMPGTH, pcmpgth);
3925     LMI_HELPER(PCMPEQB, pcmpeqb);
3926     LMI_HELPER(PCMPGTB, pcmpgtb);
3927
3928     LMI_HELPER(PSLLW, psllw);
3929     LMI_HELPER(PSLLH, psllh);
3930     LMI_HELPER(PSRLW, psrlw);
3931     LMI_HELPER(PSRLH, psrlh);
3932     LMI_HELPER(PSRAW, psraw);
3933     LMI_HELPER(PSRAH, psrah);
3934
3935     LMI_HELPER(PMULLH, pmullh);
3936     LMI_HELPER(PMULHH, pmulhh);
3937     LMI_HELPER(PMULHUH, pmulhuh);
3938     LMI_HELPER(PMADDHW, pmaddhw);
3939
3940     LMI_HELPER(PASUBUB, pasubub);
3941     LMI_HELPER_1(BIADD, biadd);
3942     LMI_HELPER_1(PMOVMSKB, pmovmskb);
3943
3944     LMI_DIRECT(PADDD, paddd, add);
3945     LMI_DIRECT(PSUBD, psubd, sub);
3946     LMI_DIRECT(XOR_CP2, xor, xor);
3947     LMI_DIRECT(NOR_CP2, nor, nor);
3948     LMI_DIRECT(AND_CP2, and, and);
3949     LMI_DIRECT(OR_CP2, or, or);
3950
3951     case OPC_PANDN:
3952         tcg_gen_andc_i64(t0, t1, t0);
3953         break;
3954
3955     case OPC_PINSRH_0:
3956         tcg_gen_deposit_i64(t0, t0, t1, 0, 16);
3957         break;
3958     case OPC_PINSRH_1:
3959         tcg_gen_deposit_i64(t0, t0, t1, 16, 16);
3960         break;
3961     case OPC_PINSRH_2:
3962         tcg_gen_deposit_i64(t0, t0, t1, 32, 16);
3963         break;
3964     case OPC_PINSRH_3:
3965         tcg_gen_deposit_i64(t0, t0, t1, 48, 16);
3966         break;
3967
3968     case OPC_PEXTRH:
3969         tcg_gen_andi_i64(t1, t1, 3);
3970         tcg_gen_shli_i64(t1, t1, 4);
3971         tcg_gen_shr_i64(t0, t0, t1);
3972         tcg_gen_ext16u_i64(t0, t0);
3973         break;
3974
3975     case OPC_ADDU_CP2:
3976         tcg_gen_add_i64(t0, t0, t1);
3977         tcg_gen_ext32s_i64(t0, t0);
3978         break;
3979     case OPC_SUBU_CP2:
3980         tcg_gen_sub_i64(t0, t0, t1);
3981         tcg_gen_ext32s_i64(t0, t0);
3982         break;
3983
3984     case OPC_SLL_CP2:
3985         shift_max = 32;
3986         goto do_shift;
3987     case OPC_SRL_CP2:
3988         shift_max = 32;
3989         goto do_shift;
3990     case OPC_SRA_CP2:
3991         shift_max = 32;
3992         goto do_shift;
3993     case OPC_DSLL_CP2:
3994         shift_max = 64;
3995         goto do_shift;
3996     case OPC_DSRL_CP2:
3997         shift_max = 64;
3998         goto do_shift;
3999     case OPC_DSRA_CP2:
4000         shift_max = 64;
4001         goto do_shift;
4002     do_shift:
4003         /* Make sure shift count isn't TCG undefined behaviour.  */
4004         tcg_gen_andi_i64(t1, t1, shift_max - 1);
4005
4006         switch (opc) {
4007         case OPC_SLL_CP2:
4008         case OPC_DSLL_CP2:
4009             tcg_gen_shl_i64(t0, t0, t1);
4010             break;
4011         case OPC_SRA_CP2:
4012         case OPC_DSRA_CP2:
4013             /* Since SRA is UndefinedResult without sign-extended inputs,
4014                we can treat SRA and DSRA the same.  */
4015             tcg_gen_sar_i64(t0, t0, t1);
4016             break;
4017         case OPC_SRL_CP2:
4018             /* We want to shift in zeros for SRL; zero-extend first.  */
4019             tcg_gen_ext32u_i64(t0, t0);
4020             /* FALLTHRU */
4021         case OPC_DSRL_CP2:
4022             tcg_gen_shr_i64(t0, t0, t1);
4023             break;
4024         }
4025
4026         if (shift_max == 32) {
4027             tcg_gen_ext32s_i64(t0, t0);
4028         }
4029
4030         /* Shifts larger than MAX produce zero.  */
4031         tcg_gen_setcondi_i64(TCG_COND_LTU, t1, t1, shift_max);
4032         tcg_gen_neg_i64(t1, t1);
4033         tcg_gen_and_i64(t0, t0, t1);
4034         break;
4035
4036     case OPC_ADD_CP2:
4037     case OPC_DADD_CP2:
4038         {
4039             TCGv_i64 t2 = tcg_temp_new_i64();
4040             TCGLabel *lab = gen_new_label();
4041
4042             tcg_gen_mov_i64(t2, t0);
4043             tcg_gen_add_i64(t0, t1, t2);
4044             if (opc == OPC_ADD_CP2) {
4045                 tcg_gen_ext32s_i64(t0, t0);
4046             }
4047             tcg_gen_xor_i64(t1, t1, t2);
4048             tcg_gen_xor_i64(t2, t2, t0);
4049             tcg_gen_andc_i64(t1, t2, t1);
4050             tcg_temp_free_i64(t2);
4051             tcg_gen_brcondi_i64(TCG_COND_GE, t1, 0, lab);
4052             generate_exception(ctx, EXCP_OVERFLOW);
4053             gen_set_label(lab);
4054             break;
4055         }
4056
4057     case OPC_SUB_CP2:
4058     case OPC_DSUB_CP2:
4059         {
4060             TCGv_i64 t2 = tcg_temp_new_i64();
4061             TCGLabel *lab = gen_new_label();
4062
4063             tcg_gen_mov_i64(t2, t0);
4064             tcg_gen_sub_i64(t0, t1, t2);
4065             if (opc == OPC_SUB_CP2) {
4066                 tcg_gen_ext32s_i64(t0, t0);
4067             }
4068             tcg_gen_xor_i64(t1, t1, t2);
4069             tcg_gen_xor_i64(t2, t2, t0);
4070             tcg_gen_and_i64(t1, t1, t2);
4071             tcg_temp_free_i64(t2);
4072             tcg_gen_brcondi_i64(TCG_COND_GE, t1, 0, lab);
4073             generate_exception(ctx, EXCP_OVERFLOW);
4074             gen_set_label(lab);
4075             break;
4076         }
4077
4078     case OPC_PMULUW:
4079         tcg_gen_ext32u_i64(t0, t0);
4080         tcg_gen_ext32u_i64(t1, t1);
4081         tcg_gen_mul_i64(t0, t0, t1);
4082         break;
4083
4084     case OPC_SEQU_CP2:
4085     case OPC_SEQ_CP2:
4086     case OPC_SLTU_CP2:
4087     case OPC_SLT_CP2:
4088     case OPC_SLEU_CP2:
4089     case OPC_SLE_CP2:
4090         /* ??? Document is unclear: Set FCC[CC].  Does that mean the
4091            FD field is the CC field?  */
4092     default:
4093         MIPS_INVAL("loongson_cp2");
4094         generate_exception_end(ctx, EXCP_RI);
4095         return;
4096     }
4097
4098 #undef LMI_HELPER
4099 #undef LMI_DIRECT
4100
4101     gen_store_fpr64(ctx, t0, rd);
4102
4103     tcg_temp_free_i64(t0);
4104     tcg_temp_free_i64(t1);
4105 }
4106
4107 /* Traps */
4108 static void gen_trap (DisasContext *ctx, uint32_t opc,
4109                       int rs, int rt, int16_t imm)
4110 {
4111     int cond;
4112     TCGv t0 = tcg_temp_new();
4113     TCGv t1 = tcg_temp_new();
4114
4115     cond = 0;
4116     /* Load needed operands */
4117     switch (opc) {
4118     case OPC_TEQ:
4119     case OPC_TGE:
4120     case OPC_TGEU:
4121     case OPC_TLT:
4122     case OPC_TLTU:
4123     case OPC_TNE:
4124         /* Compare two registers */
4125         if (rs != rt) {
4126             gen_load_gpr(t0, rs);
4127             gen_load_gpr(t1, rt);
4128             cond = 1;
4129         }
4130         break;
4131     case OPC_TEQI:
4132     case OPC_TGEI:
4133     case OPC_TGEIU:
4134     case OPC_TLTI:
4135     case OPC_TLTIU:
4136     case OPC_TNEI:
4137         /* Compare register to immediate */
4138         if (rs != 0 || imm != 0) {
4139             gen_load_gpr(t0, rs);
4140             tcg_gen_movi_tl(t1, (int32_t)imm);
4141             cond = 1;
4142         }
4143         break;
4144     }
4145     if (cond == 0) {
4146         switch (opc) {
4147         case OPC_TEQ:   /* rs == rs */
4148         case OPC_TEQI:  /* r0 == 0  */
4149         case OPC_TGE:   /* rs >= rs */
4150         case OPC_TGEI:  /* r0 >= 0  */
4151         case OPC_TGEU:  /* rs >= rs unsigned */
4152         case OPC_TGEIU: /* r0 >= 0  unsigned */
4153             /* Always trap */
4154             generate_exception_end(ctx, EXCP_TRAP);
4155             break;
4156         case OPC_TLT:   /* rs < rs           */
4157         case OPC_TLTI:  /* r0 < 0            */
4158         case OPC_TLTU:  /* rs < rs unsigned  */
4159         case OPC_TLTIU: /* r0 < 0  unsigned  */
4160         case OPC_TNE:   /* rs != rs          */
4161         case OPC_TNEI:  /* r0 != 0           */
4162             /* Never trap: treat as NOP. */
4163             break;
4164         }
4165     } else {
4166         TCGLabel *l1 = gen_new_label();
4167
4168         switch (opc) {
4169         case OPC_TEQ:
4170         case OPC_TEQI:
4171             tcg_gen_brcond_tl(TCG_COND_NE, t0, t1, l1);
4172             break;
4173         case OPC_TGE:
4174         case OPC_TGEI:
4175             tcg_gen_brcond_tl(TCG_COND_LT, t0, t1, l1);
4176             break;
4177         case OPC_TGEU:
4178         case OPC_TGEIU:
4179             tcg_gen_brcond_tl(TCG_COND_LTU, t0, t1, l1);
4180             break;
4181         case OPC_TLT:
4182         case OPC_TLTI:
4183             tcg_gen_brcond_tl(TCG_COND_GE, t0, t1, l1);
4184             break;
4185         case OPC_TLTU:
4186         case OPC_TLTIU:
4187             tcg_gen_brcond_tl(TCG_COND_GEU, t0, t1, l1);
4188             break;
4189         case OPC_TNE:
4190         case OPC_TNEI:
4191             tcg_gen_brcond_tl(TCG_COND_EQ, t0, t1, l1);
4192             break;
4193         }
4194         generate_exception(ctx, EXCP_TRAP);
4195         gen_set_label(l1);
4196     }
4197     tcg_temp_free(t0);
4198     tcg_temp_free(t1);
4199 }
4200
4201 static inline bool use_goto_tb(DisasContext *ctx, target_ulong dest)
4202 {
4203     if (unlikely(ctx->singlestep_enabled)) {
4204         return false;
4205     }
4206
4207 #ifndef CONFIG_USER_ONLY
4208     return (ctx->tb->pc & TARGET_PAGE_MASK) == (dest & TARGET_PAGE_MASK);
4209 #else
4210     return true;
4211 #endif
4212 }
4213
4214 static inline void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
4215 {
4216     if (use_goto_tb(ctx, dest)) {
4217         tcg_gen_goto_tb(n);
4218         gen_save_pc(dest);
4219         tcg_gen_exit_tb((uintptr_t)ctx->tb + n);
4220     } else {
4221         gen_save_pc(dest);
4222         if (ctx->singlestep_enabled) {
4223             save_cpu_state(ctx, 0);
4224             gen_helper_raise_exception_debug(cpu_env);
4225         }
4226         tcg_gen_exit_tb(0);
4227     }
4228 }
4229
4230 /* Branches (before delay slot) */
4231 static void gen_compute_branch (DisasContext *ctx, uint32_t opc,
4232                                 int insn_bytes,
4233                                 int rs, int rt, int32_t offset,
4234                                 int delayslot_size)
4235 {
4236     target_ulong btgt = -1;
4237     int blink = 0;
4238     int bcond_compute = 0;
4239     TCGv t0 = tcg_temp_new();
4240     TCGv t1 = tcg_temp_new();
4241
4242     if (ctx->hflags & MIPS_HFLAG_BMASK) {
4243 #ifdef MIPS_DEBUG_DISAS
4244         LOG_DISAS("Branch in delay / forbidden slot at PC 0x"
4245                   TARGET_FMT_lx "\n", ctx->pc);
4246 #endif
4247         generate_exception_end(ctx, EXCP_RI);
4248         goto out;
4249     }
4250
4251     /* Load needed operands */
4252     switch (opc) {
4253     case OPC_BEQ:
4254     case OPC_BEQL:
4255     case OPC_BNE:
4256     case OPC_BNEL:
4257         /* Compare two registers */
4258         if (rs != rt) {
4259             gen_load_gpr(t0, rs);
4260             gen_load_gpr(t1, rt);
4261             bcond_compute = 1;
4262         }
4263         btgt = ctx->pc + insn_bytes + offset;
4264         break;
4265     case OPC_BGEZ:
4266     case OPC_BGEZAL:
4267     case OPC_BGEZALL:
4268     case OPC_BGEZL:
4269     case OPC_BGTZ:
4270     case OPC_BGTZL:
4271     case OPC_BLEZ:
4272     case OPC_BLEZL:
4273     case OPC_BLTZ:
4274     case OPC_BLTZAL:
4275     case OPC_BLTZALL:
4276     case OPC_BLTZL:
4277         /* Compare to zero */
4278         if (rs != 0) {
4279             gen_load_gpr(t0, rs);
4280             bcond_compute = 1;
4281         }
4282         btgt = ctx->pc + insn_bytes + offset;
4283         break;
4284     case OPC_BPOSGE32:
4285 #if defined(TARGET_MIPS64)
4286     case OPC_BPOSGE64:
4287         tcg_gen_andi_tl(t0, cpu_dspctrl, 0x7F);
4288 #else
4289         tcg_gen_andi_tl(t0, cpu_dspctrl, 0x3F);
4290 #endif
4291         bcond_compute = 1;
4292         btgt = ctx->pc + insn_bytes + offset;
4293         break;
4294     case OPC_J:
4295     case OPC_JAL:
4296     case OPC_JALX:
4297         /* Jump to immediate */
4298         btgt = ((ctx->pc + insn_bytes) & (int32_t)0xF0000000) | (uint32_t)offset;
4299         break;
4300     case OPC_JR:
4301     case OPC_JALR:
4302         /* Jump to register */
4303         if (offset != 0 && offset != 16) {
4304             /* Hint = 0 is JR/JALR, hint 16 is JR.HB/JALR.HB, the
4305                others are reserved. */
4306             MIPS_INVAL("jump hint");
4307             generate_exception_end(ctx, EXCP_RI);
4308             goto out;
4309         }
4310         gen_load_gpr(btarget, rs);
4311         break;
4312     default:
4313         MIPS_INVAL("branch/jump");
4314         generate_exception_end(ctx, EXCP_RI);
4315         goto out;
4316     }
4317     if (bcond_compute == 0) {
4318         /* No condition to be computed */
4319         switch (opc) {
4320         case OPC_BEQ:     /* rx == rx        */
4321         case OPC_BEQL:    /* rx == rx likely */
4322         case OPC_BGEZ:    /* 0 >= 0          */
4323         case OPC_BGEZL:   /* 0 >= 0 likely   */
4324         case OPC_BLEZ:    /* 0 <= 0          */
4325         case OPC_BLEZL:   /* 0 <= 0 likely   */
4326             /* Always take */
4327             ctx->hflags |= MIPS_HFLAG_B;
4328             break;
4329         case OPC_BGEZAL:  /* 0 >= 0          */
4330         case OPC_BGEZALL: /* 0 >= 0 likely   */
4331             /* Always take and link */
4332             blink = 31;
4333             ctx->hflags |= MIPS_HFLAG_B;
4334             break;
4335         case OPC_BNE:     /* rx != rx        */
4336         case OPC_BGTZ:    /* 0 > 0           */
4337         case OPC_BLTZ:    /* 0 < 0           */
4338             /* Treat as NOP. */
4339             goto out;
4340         case OPC_BLTZAL:  /* 0 < 0           */
4341             /* Handle as an unconditional branch to get correct delay
4342                slot checking.  */
4343             blink = 31;
4344             btgt = ctx->pc + insn_bytes + delayslot_size;
4345             ctx->hflags |= MIPS_HFLAG_B;
4346             break;
4347         case OPC_BLTZALL: /* 0 < 0 likely */
4348             tcg_gen_movi_tl(cpu_gpr[31], ctx->pc + 8);
4349             /* Skip the instruction in the delay slot */
4350             ctx->pc += 4;
4351             goto out;
4352         case OPC_BNEL:    /* rx != rx likely */
4353         case OPC_BGTZL:   /* 0 > 0 likely */
4354         case OPC_BLTZL:   /* 0 < 0 likely */
4355             /* Skip the instruction in the delay slot */
4356             ctx->pc += 4;
4357             goto out;
4358         case OPC_J:
4359             ctx->hflags |= MIPS_HFLAG_B;
4360             break;
4361         case OPC_JALX:
4362             ctx->hflags |= MIPS_HFLAG_BX;
4363             /* Fallthrough */
4364         case OPC_JAL:
4365             blink = 31;
4366             ctx->hflags |= MIPS_HFLAG_B;
4367             break;
4368         case OPC_JR:
4369             ctx->hflags |= MIPS_HFLAG_BR;
4370             break;
4371         case OPC_JALR:
4372             blink = rt;
4373             ctx->hflags |= MIPS_HFLAG_BR;
4374             break;
4375         default:
4376             MIPS_INVAL("branch/jump");
4377             generate_exception_end(ctx, EXCP_RI);
4378             goto out;
4379         }
4380     } else {
4381         switch (opc) {
4382         case OPC_BEQ:
4383             tcg_gen_setcond_tl(TCG_COND_EQ, bcond, t0, t1);
4384             goto not_likely;
4385         case OPC_BEQL:
4386             tcg_gen_setcond_tl(TCG_COND_EQ, bcond, t0, t1);
4387             goto likely;
4388         case OPC_BNE:
4389             tcg_gen_setcond_tl(TCG_COND_NE, bcond, t0, t1);
4390             goto not_likely;
4391         case OPC_BNEL:
4392             tcg_gen_setcond_tl(TCG_COND_NE, bcond, t0, t1);
4393             goto likely;
4394         case OPC_BGEZ:
4395             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
4396             goto not_likely;
4397         case OPC_BGEZL:
4398             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
4399             goto likely;
4400         case OPC_BGEZAL:
4401             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
4402             blink = 31;
4403             goto not_likely;
4404         case OPC_BGEZALL:
4405             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
4406             blink = 31;
4407             goto likely;
4408         case OPC_BGTZ:
4409             tcg_gen_setcondi_tl(TCG_COND_GT, bcond, t0, 0);
4410             goto not_likely;
4411         case OPC_BGTZL:
4412             tcg_gen_setcondi_tl(TCG_COND_GT, bcond, t0, 0);
4413             goto likely;
4414         case OPC_BLEZ:
4415             tcg_gen_setcondi_tl(TCG_COND_LE, bcond, t0, 0);
4416             goto not_likely;
4417         case OPC_BLEZL:
4418             tcg_gen_setcondi_tl(TCG_COND_LE, bcond, t0, 0);
4419             goto likely;
4420         case OPC_BLTZ:
4421             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
4422             goto not_likely;
4423         case OPC_BLTZL:
4424             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
4425             goto likely;
4426         case OPC_BPOSGE32:
4427             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 32);
4428             goto not_likely;
4429 #if defined(TARGET_MIPS64)
4430         case OPC_BPOSGE64:
4431             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 64);
4432             goto not_likely;
4433 #endif
4434         case OPC_BLTZAL:
4435             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
4436             blink = 31;
4437         not_likely:
4438             ctx->hflags |= MIPS_HFLAG_BC;
4439             break;
4440         case OPC_BLTZALL:
4441             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
4442             blink = 31;
4443         likely:
4444             ctx->hflags |= MIPS_HFLAG_BL;
4445             break;
4446         default:
4447             MIPS_INVAL("conditional branch/jump");
4448             generate_exception_end(ctx, EXCP_RI);
4449             goto out;
4450         }
4451     }
4452
4453     ctx->btarget = btgt;
4454
4455     switch (delayslot_size) {
4456     case 2:
4457         ctx->hflags |= MIPS_HFLAG_BDS16;
4458         break;
4459     case 4:
4460         ctx->hflags |= MIPS_HFLAG_BDS32;
4461         break;
4462     }
4463
4464     if (blink > 0) {
4465         int post_delay = insn_bytes + delayslot_size;
4466         int lowbit = !!(ctx->hflags & MIPS_HFLAG_M16);
4467
4468         tcg_gen_movi_tl(cpu_gpr[blink], ctx->pc + post_delay + lowbit);
4469     }
4470
4471  out:
4472     if (insn_bytes == 2)
4473         ctx->hflags |= MIPS_HFLAG_B16;
4474     tcg_temp_free(t0);
4475     tcg_temp_free(t1);
4476 }
4477
4478 /* special3 bitfield operations */
4479 static void gen_bitops (DisasContext *ctx, uint32_t opc, int rt,
4480                         int rs, int lsb, int msb)
4481 {
4482     TCGv t0 = tcg_temp_new();
4483     TCGv t1 = tcg_temp_new();
4484
4485     gen_load_gpr(t1, rs);
4486     switch (opc) {
4487     case OPC_EXT:
4488         if (lsb + msb > 31) {
4489             goto fail;
4490         }
4491         tcg_gen_shri_tl(t0, t1, lsb);
4492         if (msb != 31) {
4493             tcg_gen_andi_tl(t0, t0, (1U << (msb + 1)) - 1);
4494         } else {
4495             tcg_gen_ext32s_tl(t0, t0);
4496         }
4497         break;
4498 #if defined(TARGET_MIPS64)
4499     case OPC_DEXTU:
4500         lsb += 32;
4501         goto do_dext;
4502     case OPC_DEXTM:
4503         msb += 32;
4504         goto do_dext;
4505     case OPC_DEXT:
4506     do_dext:
4507         if (lsb + msb > 63) {
4508             goto fail;
4509         }
4510         tcg_gen_shri_tl(t0, t1, lsb);
4511         if (msb != 63) {
4512             tcg_gen_andi_tl(t0, t0, (1ULL << (msb + 1)) - 1);
4513         }
4514         break;
4515 #endif
4516     case OPC_INS:
4517         if (lsb > msb) {
4518             goto fail;
4519         }
4520         gen_load_gpr(t0, rt);
4521         tcg_gen_deposit_tl(t0, t0, t1, lsb, msb - lsb + 1);
4522         tcg_gen_ext32s_tl(t0, t0);
4523         break;
4524 #if defined(TARGET_MIPS64)
4525     case OPC_DINSU:
4526         lsb += 32;
4527         /* FALLTHRU */
4528     case OPC_DINSM:
4529         msb += 32;
4530         /* FALLTHRU */
4531     case OPC_DINS:
4532         if (lsb > msb) {
4533             goto fail;
4534         }
4535         gen_load_gpr(t0, rt);
4536         tcg_gen_deposit_tl(t0, t0, t1, lsb, msb - lsb + 1);
4537         break;
4538 #endif
4539     default:
4540 fail:
4541         MIPS_INVAL("bitops");
4542         generate_exception_end(ctx, EXCP_RI);
4543         tcg_temp_free(t0);
4544         tcg_temp_free(t1);
4545         return;
4546     }
4547     gen_store_gpr(t0, rt);
4548     tcg_temp_free(t0);
4549     tcg_temp_free(t1);
4550 }
4551
4552 static void gen_bshfl (DisasContext *ctx, uint32_t op2, int rt, int rd)
4553 {
4554     TCGv t0;
4555
4556     if (rd == 0) {
4557         /* If no destination, treat it as a NOP. */
4558         return;
4559     }
4560
4561     t0 = tcg_temp_new();
4562     gen_load_gpr(t0, rt);
4563     switch (op2) {
4564     case OPC_WSBH:
4565         {
4566             TCGv t1 = tcg_temp_new();
4567
4568             tcg_gen_shri_tl(t1, t0, 8);
4569             tcg_gen_andi_tl(t1, t1, 0x00FF00FF);
4570             tcg_gen_shli_tl(t0, t0, 8);
4571             tcg_gen_andi_tl(t0, t0, ~0x00FF00FF);
4572             tcg_gen_or_tl(t0, t0, t1);
4573             tcg_temp_free(t1);
4574             tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
4575         }
4576         break;
4577     case OPC_SEB:
4578         tcg_gen_ext8s_tl(cpu_gpr[rd], t0);
4579         break;
4580     case OPC_SEH:
4581         tcg_gen_ext16s_tl(cpu_gpr[rd], t0);
4582         break;
4583 #if defined(TARGET_MIPS64)
4584     case OPC_DSBH:
4585         {
4586             TCGv t1 = tcg_temp_new();
4587
4588             tcg_gen_shri_tl(t1, t0, 8);
4589             tcg_gen_andi_tl(t1, t1, 0x00FF00FF00FF00FFULL);
4590             tcg_gen_shli_tl(t0, t0, 8);
4591             tcg_gen_andi_tl(t0, t0, ~0x00FF00FF00FF00FFULL);
4592             tcg_gen_or_tl(cpu_gpr[rd], t0, t1);
4593             tcg_temp_free(t1);
4594         }
4595         break;
4596     case OPC_DSHD:
4597         {
4598             TCGv t1 = tcg_temp_new();
4599
4600             tcg_gen_shri_tl(t1, t0, 16);
4601             tcg_gen_andi_tl(t1, t1, 0x0000FFFF0000FFFFULL);
4602             tcg_gen_shli_tl(t0, t0, 16);
4603             tcg_gen_andi_tl(t0, t0, ~0x0000FFFF0000FFFFULL);
4604             tcg_gen_or_tl(t0, t0, t1);
4605             tcg_gen_shri_tl(t1, t0, 32);
4606             tcg_gen_shli_tl(t0, t0, 32);
4607             tcg_gen_or_tl(cpu_gpr[rd], t0, t1);
4608             tcg_temp_free(t1);
4609         }
4610         break;
4611 #endif
4612     default:
4613         MIPS_INVAL("bsfhl");
4614         generate_exception_end(ctx, EXCP_RI);
4615         tcg_temp_free(t0);
4616         return;
4617     }
4618     tcg_temp_free(t0);
4619 }
4620
4621 static void gen_lsa(DisasContext *ctx, int opc, int rd, int rs, int rt,
4622                     int imm2)
4623 {
4624     TCGv t0;
4625     TCGv t1;
4626     if (rd == 0) {
4627         /* Treat as NOP. */
4628         return;
4629     }
4630     t0 = tcg_temp_new();
4631     t1 = tcg_temp_new();
4632     gen_load_gpr(t0, rs);
4633     gen_load_gpr(t1, rt);
4634     tcg_gen_shli_tl(t0, t0, imm2 + 1);
4635     tcg_gen_add_tl(cpu_gpr[rd], t0, t1);
4636     if (opc == OPC_LSA) {
4637         tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
4638     }
4639
4640     tcg_temp_free(t1);
4641     tcg_temp_free(t0);
4642
4643     return;
4644 }
4645
4646 static void gen_align(DisasContext *ctx, int opc, int rd, int rs, int rt,
4647                       int bp)
4648 {
4649     TCGv t0;
4650     if (rd == 0) {
4651         /* Treat as NOP. */
4652         return;
4653     }
4654     t0 = tcg_temp_new();
4655     gen_load_gpr(t0, rt);
4656     if (bp == 0) {
4657         switch (opc) {
4658         case OPC_ALIGN:
4659             tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
4660             break;
4661 #if defined(TARGET_MIPS64)
4662         case OPC_DALIGN:
4663             tcg_gen_mov_tl(cpu_gpr[rd], t0);
4664             break;
4665 #endif
4666         }
4667     } else {
4668         TCGv t1 = tcg_temp_new();
4669         gen_load_gpr(t1, rs);
4670         switch (opc) {
4671         case OPC_ALIGN:
4672             {
4673                 TCGv_i64 t2 = tcg_temp_new_i64();
4674                 tcg_gen_concat_tl_i64(t2, t1, t0);
4675                 tcg_gen_shri_i64(t2, t2, 8 * (4 - bp));
4676                 gen_move_low32(cpu_gpr[rd], t2);
4677                 tcg_temp_free_i64(t2);
4678             }
4679             break;
4680 #if defined(TARGET_MIPS64)
4681         case OPC_DALIGN:
4682             tcg_gen_shli_tl(t0, t0, 8 * bp);
4683             tcg_gen_shri_tl(t1, t1, 8 * (8 - bp));
4684             tcg_gen_or_tl(cpu_gpr[rd], t1, t0);
4685             break;
4686 #endif
4687         }
4688         tcg_temp_free(t1);
4689     }
4690
4691     tcg_temp_free(t0);
4692 }
4693
4694 static void gen_bitswap(DisasContext *ctx, int opc, int rd, int rt)
4695 {
4696     TCGv t0;
4697     if (rd == 0) {
4698         /* Treat as NOP. */
4699         return;
4700     }
4701     t0 = tcg_temp_new();
4702     gen_load_gpr(t0, rt);
4703     switch (opc) {
4704     case OPC_BITSWAP:
4705         gen_helper_bitswap(cpu_gpr[rd], t0);
4706         break;
4707 #if defined(TARGET_MIPS64)
4708     case OPC_DBITSWAP:
4709         gen_helper_dbitswap(cpu_gpr[rd], t0);
4710         break;
4711 #endif
4712     }
4713     tcg_temp_free(t0);
4714 }
4715
4716 #ifndef CONFIG_USER_ONLY
4717 /* CP0 (MMU and control) */
4718 static inline void gen_mthc0_entrylo(TCGv arg, target_ulong off)
4719 {
4720     TCGv_i64 t0 = tcg_temp_new_i64();
4721     TCGv_i64 t1 = tcg_temp_new_i64();
4722
4723     tcg_gen_ext_tl_i64(t0, arg);
4724     tcg_gen_ld_i64(t1, cpu_env, off);
4725 #if defined(TARGET_MIPS64)
4726     tcg_gen_deposit_i64(t1, t1, t0, 30, 32);
4727 #else
4728     tcg_gen_concat32_i64(t1, t1, t0);
4729 #endif
4730     tcg_gen_st_i64(t1, cpu_env, off);
4731     tcg_temp_free_i64(t1);
4732     tcg_temp_free_i64(t0);
4733 }
4734
4735 static inline void gen_mthc0_store64(TCGv arg, target_ulong off)
4736 {
4737     TCGv_i64 t0 = tcg_temp_new_i64();
4738     TCGv_i64 t1 = tcg_temp_new_i64();
4739
4740     tcg_gen_ext_tl_i64(t0, arg);
4741     tcg_gen_ld_i64(t1, cpu_env, off);
4742     tcg_gen_concat32_i64(t1, t1, t0);
4743     tcg_gen_st_i64(t1, cpu_env, off);
4744     tcg_temp_free_i64(t1);
4745     tcg_temp_free_i64(t0);
4746 }
4747
4748 static inline void gen_mfhc0_entrylo(TCGv arg, target_ulong off)
4749 {
4750     TCGv_i64 t0 = tcg_temp_new_i64();
4751
4752     tcg_gen_ld_i64(t0, cpu_env, off);
4753 #if defined(TARGET_MIPS64)
4754     tcg_gen_shri_i64(t0, t0, 30);
4755 #else
4756     tcg_gen_shri_i64(t0, t0, 32);
4757 #endif
4758     gen_move_low32(arg, t0);
4759     tcg_temp_free_i64(t0);
4760 }
4761
4762 static inline void gen_mfhc0_load64(TCGv arg, target_ulong off, int shift)
4763 {
4764     TCGv_i64 t0 = tcg_temp_new_i64();
4765
4766     tcg_gen_ld_i64(t0, cpu_env, off);
4767     tcg_gen_shri_i64(t0, t0, 32 + shift);
4768     gen_move_low32(arg, t0);
4769     tcg_temp_free_i64(t0);
4770 }
4771
4772 static inline void gen_mfc0_load32 (TCGv arg, target_ulong off)
4773 {
4774     TCGv_i32 t0 = tcg_temp_new_i32();
4775
4776     tcg_gen_ld_i32(t0, cpu_env, off);
4777     tcg_gen_ext_i32_tl(arg, t0);
4778     tcg_temp_free_i32(t0);
4779 }
4780
4781 static inline void gen_mfc0_load64 (TCGv arg, target_ulong off)
4782 {
4783     tcg_gen_ld_tl(arg, cpu_env, off);
4784     tcg_gen_ext32s_tl(arg, arg);
4785 }
4786
4787 static inline void gen_mtc0_store32 (TCGv arg, target_ulong off)
4788 {
4789     TCGv_i32 t0 = tcg_temp_new_i32();
4790
4791     tcg_gen_trunc_tl_i32(t0, arg);
4792     tcg_gen_st_i32(t0, cpu_env, off);
4793     tcg_temp_free_i32(t0);
4794 }
4795
4796 #define CP0_CHECK(c)                            \
4797     do {                                        \
4798         if (!(c)) {                             \
4799             goto cp0_unimplemented;             \
4800         }                                       \
4801     } while (0)
4802
4803 static void gen_mfhc0(DisasContext *ctx, TCGv arg, int reg, int sel)
4804 {
4805     const char *rn = "invalid";
4806
4807     CP0_CHECK(ctx->hflags & MIPS_HFLAG_ELPA);
4808
4809     switch (reg) {
4810     case 2:
4811         switch (sel) {
4812         case 0:
4813             gen_mfhc0_entrylo(arg, offsetof(CPUMIPSState, CP0_EntryLo0));
4814             rn = "EntryLo0";
4815             break;
4816         default:
4817             goto cp0_unimplemented;
4818         }
4819         break;
4820     case 3:
4821         switch (sel) {
4822         case 0:
4823             gen_mfhc0_entrylo(arg, offsetof(CPUMIPSState, CP0_EntryLo1));
4824             rn = "EntryLo1";
4825             break;
4826         default:
4827             goto cp0_unimplemented;
4828         }
4829         break;
4830     case 17:
4831         switch (sel) {
4832         case 0:
4833             gen_mfhc0_load64(arg, offsetof(CPUMIPSState, lladdr),
4834                              ctx->CP0_LLAddr_shift);
4835             rn = "LLAddr";
4836             break;
4837         case 1:
4838             CP0_CHECK(ctx->mrp);
4839             gen_helper_mfhc0_maar(arg, cpu_env);
4840             rn = "MAAR";
4841             break;
4842         default:
4843             goto cp0_unimplemented;
4844         }
4845         break;
4846     case 28:
4847         switch (sel) {
4848         case 0:
4849         case 2:
4850         case 4:
4851         case 6:
4852             gen_mfhc0_load64(arg, offsetof(CPUMIPSState, CP0_TagLo), 0);
4853             rn = "TagLo";
4854             break;
4855         default:
4856             goto cp0_unimplemented;
4857         }
4858         break;
4859     default:
4860         goto cp0_unimplemented;
4861     }
4862
4863     (void)rn; /* avoid a compiler warning */
4864     LOG_DISAS("mfhc0 %s (reg %d sel %d)\n", rn, reg, sel);
4865     return;
4866
4867 cp0_unimplemented:
4868     LOG_DISAS("mfhc0 %s (reg %d sel %d)\n", rn, reg, sel);
4869     tcg_gen_movi_tl(arg, 0);
4870 }
4871
4872 static void gen_mthc0(DisasContext *ctx, TCGv arg, int reg, int sel)
4873 {
4874     const char *rn = "invalid";
4875     uint64_t mask = ctx->PAMask >> 36;
4876
4877     CP0_CHECK(ctx->hflags & MIPS_HFLAG_ELPA);
4878
4879     switch (reg) {
4880     case 2:
4881         switch (sel) {
4882         case 0:
4883             tcg_gen_andi_tl(arg, arg, mask);
4884             gen_mthc0_entrylo(arg, offsetof(CPUMIPSState, CP0_EntryLo0));
4885             rn = "EntryLo0";
4886             break;
4887         default:
4888             goto cp0_unimplemented;
4889         }
4890         break;
4891     case 3:
4892         switch (sel) {
4893         case 0:
4894             tcg_gen_andi_tl(arg, arg, mask);
4895             gen_mthc0_entrylo(arg, offsetof(CPUMIPSState, CP0_EntryLo1));
4896             rn = "EntryLo1";
4897             break;
4898         default:
4899             goto cp0_unimplemented;
4900         }
4901         break;
4902     case 17:
4903         switch (sel) {
4904         case 0:
4905             /* LLAddr is read-only (the only exception is bit 0 if LLB is
4906                supported); the CP0_LLAddr_rw_bitmask does not seem to be
4907                relevant for modern MIPS cores supporting MTHC0, therefore
4908                treating MTHC0 to LLAddr as NOP. */
4909             rn = "LLAddr";
4910             break;
4911         case 1:
4912             CP0_CHECK(ctx->mrp);
4913             gen_helper_mthc0_maar(cpu_env, arg);
4914             rn = "MAAR";
4915             break;
4916         default:
4917             goto cp0_unimplemented;
4918         }
4919         break;
4920     case 28:
4921         switch (sel) {
4922         case 0:
4923         case 2:
4924         case 4:
4925         case 6:
4926             tcg_gen_andi_tl(arg, arg, mask);
4927             gen_mthc0_store64(arg, offsetof(CPUMIPSState, CP0_TagLo));
4928             rn = "TagLo";
4929             break;
4930         default:
4931             goto cp0_unimplemented;
4932         }
4933         break;
4934     default:
4935         goto cp0_unimplemented;
4936     }
4937
4938     (void)rn; /* avoid a compiler warning */
4939 cp0_unimplemented:
4940     LOG_DISAS("mthc0 %s (reg %d sel %d)\n", rn, reg, sel);
4941 }
4942
4943 static inline void gen_mfc0_unimplemented(DisasContext *ctx, TCGv arg)
4944 {
4945     if (ctx->insn_flags & ISA_MIPS32R6) {
4946         tcg_gen_movi_tl(arg, 0);
4947     } else {
4948         tcg_gen_movi_tl(arg, ~0);
4949     }
4950 }
4951
4952 static void gen_mfc0(DisasContext *ctx, TCGv arg, int reg, int sel)
4953 {
4954     const char *rn = "invalid";
4955
4956     if (sel != 0)
4957         check_insn(ctx, ISA_MIPS32);
4958
4959     switch (reg) {
4960     case 0:
4961         switch (sel) {
4962         case 0:
4963             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Index));
4964             rn = "Index";
4965             break;
4966         case 1:
4967             CP0_CHECK(ctx->insn_flags & ASE_MT);
4968             gen_helper_mfc0_mvpcontrol(arg, cpu_env);
4969             rn = "MVPControl";
4970             break;
4971         case 2:
4972             CP0_CHECK(ctx->insn_flags & ASE_MT);
4973             gen_helper_mfc0_mvpconf0(arg, cpu_env);
4974             rn = "MVPConf0";
4975             break;
4976         case 3:
4977             CP0_CHECK(ctx->insn_flags & ASE_MT);
4978             gen_helper_mfc0_mvpconf1(arg, cpu_env);
4979             rn = "MVPConf1";
4980             break;
4981         case 4:
4982             CP0_CHECK(ctx->vp);
4983             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPControl));
4984             rn = "VPControl";
4985             break;
4986         default:
4987             goto cp0_unimplemented;
4988         }
4989         break;
4990     case 1:
4991         switch (sel) {
4992         case 0:
4993             CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
4994             gen_helper_mfc0_random(arg, cpu_env);
4995             rn = "Random";
4996             break;
4997         case 1:
4998             CP0_CHECK(ctx->insn_flags & ASE_MT);
4999             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEControl));
5000             rn = "VPEControl";
5001             break;
5002         case 2:
5003             CP0_CHECK(ctx->insn_flags & ASE_MT);
5004             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf0));
5005             rn = "VPEConf0";
5006             break;
5007         case 3:
5008             CP0_CHECK(ctx->insn_flags & ASE_MT);
5009             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf1));
5010             rn = "VPEConf1";
5011             break;
5012         case 4:
5013             CP0_CHECK(ctx->insn_flags & ASE_MT);
5014             gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_YQMask));
5015             rn = "YQMask";
5016             break;
5017         case 5:
5018             CP0_CHECK(ctx->insn_flags & ASE_MT);
5019             gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_VPESchedule));
5020             rn = "VPESchedule";
5021             break;
5022         case 6:
5023             CP0_CHECK(ctx->insn_flags & ASE_MT);
5024             gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_VPEScheFBack));
5025             rn = "VPEScheFBack";
5026             break;
5027         case 7:
5028             CP0_CHECK(ctx->insn_flags & ASE_MT);
5029             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEOpt));
5030             rn = "VPEOpt";
5031             break;
5032         default:
5033             goto cp0_unimplemented;
5034         }
5035         break;
5036     case 2:
5037         switch (sel) {
5038         case 0:
5039             {
5040                 TCGv_i64 tmp = tcg_temp_new_i64();
5041                 tcg_gen_ld_i64(tmp, cpu_env,
5042                                offsetof(CPUMIPSState, CP0_EntryLo0));
5043 #if defined(TARGET_MIPS64)
5044                 if (ctx->rxi) {
5045                     /* Move RI/XI fields to bits 31:30 */
5046                     tcg_gen_shri_tl(arg, tmp, CP0EnLo_XI);
5047                     tcg_gen_deposit_tl(tmp, tmp, arg, 30, 2);
5048                 }
5049 #endif
5050                 gen_move_low32(arg, tmp);
5051                 tcg_temp_free_i64(tmp);
5052             }
5053             rn = "EntryLo0";
5054             break;
5055         case 1:
5056             CP0_CHECK(ctx->insn_flags & ASE_MT);
5057             gen_helper_mfc0_tcstatus(arg, cpu_env);
5058             rn = "TCStatus";
5059             break;
5060         case 2:
5061             CP0_CHECK(ctx->insn_flags & ASE_MT);
5062             gen_helper_mfc0_tcbind(arg, cpu_env);
5063             rn = "TCBind";
5064             break;
5065         case 3:
5066             CP0_CHECK(ctx->insn_flags & ASE_MT);
5067             gen_helper_mfc0_tcrestart(arg, cpu_env);
5068             rn = "TCRestart";
5069             break;
5070         case 4:
5071             CP0_CHECK(ctx->insn_flags & ASE_MT);
5072             gen_helper_mfc0_tchalt(arg, cpu_env);
5073             rn = "TCHalt";
5074             break;
5075         case 5:
5076             CP0_CHECK(ctx->insn_flags & ASE_MT);
5077             gen_helper_mfc0_tccontext(arg, cpu_env);
5078             rn = "TCContext";
5079             break;
5080         case 6:
5081             CP0_CHECK(ctx->insn_flags & ASE_MT);
5082             gen_helper_mfc0_tcschedule(arg, cpu_env);
5083             rn = "TCSchedule";
5084             break;
5085         case 7:
5086             CP0_CHECK(ctx->insn_flags & ASE_MT);
5087             gen_helper_mfc0_tcschefback(arg, cpu_env);
5088             rn = "TCScheFBack";
5089             break;
5090         default:
5091             goto cp0_unimplemented;
5092         }
5093         break;
5094     case 3:
5095         switch (sel) {
5096         case 0:
5097             {
5098                 TCGv_i64 tmp = tcg_temp_new_i64();
5099                 tcg_gen_ld_i64(tmp, cpu_env,
5100                                offsetof(CPUMIPSState, CP0_EntryLo1));
5101 #if defined(TARGET_MIPS64)
5102                 if (ctx->rxi) {
5103                     /* Move RI/XI fields to bits 31:30 */
5104                     tcg_gen_shri_tl(arg, tmp, CP0EnLo_XI);
5105                     tcg_gen_deposit_tl(tmp, tmp, arg, 30, 2);
5106                 }
5107 #endif
5108                 gen_move_low32(arg, tmp);
5109                 tcg_temp_free_i64(tmp);
5110             }
5111             rn = "EntryLo1";
5112             break;
5113         case 1:
5114             CP0_CHECK(ctx->vp);
5115             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_GlobalNumber));
5116             rn = "GlobalNumber";
5117             break;
5118         default:
5119             goto cp0_unimplemented;
5120         }
5121         break;
5122     case 4:
5123         switch (sel) {
5124         case 0:
5125             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_Context));
5126             tcg_gen_ext32s_tl(arg, arg);
5127             rn = "Context";
5128             break;
5129         case 1:
5130 //            gen_helper_mfc0_contextconfig(arg); /* SmartMIPS ASE */
5131             rn = "ContextConfig";
5132             goto cp0_unimplemented;
5133 //            break;
5134         case 2:
5135             CP0_CHECK(ctx->ulri);
5136             tcg_gen_ld32s_tl(arg, cpu_env,
5137                              offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
5138             rn = "UserLocal";
5139             break;
5140         default:
5141             goto cp0_unimplemented;
5142         }
5143         break;
5144     case 5:
5145         switch (sel) {
5146         case 0:
5147             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageMask));
5148             rn = "PageMask";
5149             break;
5150         case 1:
5151             check_insn(ctx, ISA_MIPS32R2);
5152             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageGrain));
5153             rn = "PageGrain";
5154             break;
5155         default:
5156             goto cp0_unimplemented;
5157         }
5158         break;
5159     case 6:
5160         switch (sel) {
5161         case 0:
5162             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Wired));
5163             rn = "Wired";
5164             break;
5165         case 1:
5166             check_insn(ctx, ISA_MIPS32R2);
5167             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf0));
5168             rn = "SRSConf0";
5169             break;
5170         case 2:
5171             check_insn(ctx, ISA_MIPS32R2);
5172             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf1));
5173             rn = "SRSConf1";
5174             break;
5175         case 3:
5176             check_insn(ctx, ISA_MIPS32R2);
5177             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf2));
5178             rn = "SRSConf2";
5179             break;
5180         case 4:
5181             check_insn(ctx, ISA_MIPS32R2);
5182             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf3));
5183             rn = "SRSConf3";
5184             break;
5185         case 5:
5186             check_insn(ctx, ISA_MIPS32R2);
5187             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf4));
5188             rn = "SRSConf4";
5189             break;
5190         default:
5191             goto cp0_unimplemented;
5192         }
5193         break;
5194     case 7:
5195         switch (sel) {
5196         case 0:
5197             check_insn(ctx, ISA_MIPS32R2);
5198             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_HWREna));
5199             rn = "HWREna";
5200             break;
5201         default:
5202             goto cp0_unimplemented;
5203         }
5204         break;
5205     case 8:
5206         switch (sel) {
5207         case 0:
5208             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));
5209             tcg_gen_ext32s_tl(arg, arg);
5210             rn = "BadVAddr";
5211             break;
5212         case 1:
5213             CP0_CHECK(ctx->bi);
5214             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstr));
5215             rn = "BadInstr";
5216             break;
5217         case 2:
5218             CP0_CHECK(ctx->bp);
5219             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrP));
5220             rn = "BadInstrP";
5221             break;
5222         default:
5223             goto cp0_unimplemented;
5224         }
5225         break;
5226     case 9:
5227         switch (sel) {
5228         case 0:
5229             /* Mark as an IO operation because we read the time.  */
5230             if (ctx->tb->cflags & CF_USE_ICOUNT) {
5231                 gen_io_start();
5232             }
5233             gen_helper_mfc0_count(arg, cpu_env);
5234             if (ctx->tb->cflags & CF_USE_ICOUNT) {
5235                 gen_io_end();
5236             }
5237             /* Break the TB to be able to take timer interrupts immediately
5238                after reading count.  */
5239             ctx->bstate = BS_STOP;
5240             rn = "Count";
5241             break;
5242         /* 6,7 are implementation dependent */
5243         default:
5244             goto cp0_unimplemented;
5245         }
5246         break;
5247     case 10:
5248         switch (sel) {
5249         case 0:
5250             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryHi));
5251             tcg_gen_ext32s_tl(arg, arg);
5252             rn = "EntryHi";
5253             break;
5254         default:
5255             goto cp0_unimplemented;
5256         }
5257         break;
5258     case 11:
5259         switch (sel) {
5260         case 0:
5261             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Compare));
5262             rn = "Compare";
5263             break;
5264         /* 6,7 are implementation dependent */
5265         default:
5266             goto cp0_unimplemented;
5267         }
5268         break;
5269     case 12:
5270         switch (sel) {
5271         case 0:
5272             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Status));
5273             rn = "Status";
5274             break;
5275         case 1:
5276             check_insn(ctx, ISA_MIPS32R2);
5277             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_IntCtl));
5278             rn = "IntCtl";
5279             break;
5280         case 2:
5281             check_insn(ctx, ISA_MIPS32R2);
5282             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSCtl));
5283             rn = "SRSCtl";
5284             break;
5285         case 3:
5286             check_insn(ctx, ISA_MIPS32R2);
5287             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
5288             rn = "SRSMap";
5289             break;
5290         default:
5291             goto cp0_unimplemented;
5292        }
5293         break;
5294     case 13:
5295         switch (sel) {
5296         case 0:
5297             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Cause));
5298             rn = "Cause";
5299             break;
5300         default:
5301             goto cp0_unimplemented;
5302        }
5303         break;
5304     case 14:
5305         switch (sel) {
5306         case 0:
5307             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
5308             tcg_gen_ext32s_tl(arg, arg);
5309             rn = "EPC";
5310             break;
5311         default:
5312             goto cp0_unimplemented;
5313         }
5314         break;
5315     case 15:
5316         switch (sel) {
5317         case 0:
5318             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PRid));
5319             rn = "PRid";
5320             break;
5321         case 1:
5322             check_insn(ctx, ISA_MIPS32R2);
5323             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_EBase));
5324             rn = "EBase";
5325             break;
5326         case 3:
5327             check_insn(ctx, ISA_MIPS32R2);
5328             CP0_CHECK(ctx->cmgcr);
5329             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_CMGCRBase));
5330             tcg_gen_ext32s_tl(arg, arg);
5331             rn = "CMGCRBase";
5332             break;
5333         default:
5334             goto cp0_unimplemented;
5335        }
5336         break;
5337     case 16:
5338         switch (sel) {
5339         case 0:
5340             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config0));
5341             rn = "Config";
5342             break;
5343         case 1:
5344             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config1));
5345             rn = "Config1";
5346             break;
5347         case 2:
5348             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config2));
5349             rn = "Config2";
5350             break;
5351         case 3:
5352             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config3));
5353             rn = "Config3";
5354             break;
5355         case 4:
5356             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config4));
5357             rn = "Config4";
5358             break;
5359         case 5:
5360             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config5));
5361             rn = "Config5";
5362             break;
5363         /* 6,7 are implementation dependent */
5364         case 6:
5365             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config6));
5366             rn = "Config6";
5367             break;
5368         case 7:
5369             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config7));
5370             rn = "Config7";
5371             break;
5372         default:
5373             goto cp0_unimplemented;
5374         }
5375         break;
5376     case 17:
5377         switch (sel) {
5378         case 0:
5379             gen_helper_mfc0_lladdr(arg, cpu_env);
5380             rn = "LLAddr";
5381             break;
5382         case 1:
5383             CP0_CHECK(ctx->mrp);
5384             gen_helper_mfc0_maar(arg, cpu_env);
5385             rn = "MAAR";
5386             break;
5387         case 2:
5388             CP0_CHECK(ctx->mrp);
5389             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_MAARI));
5390             rn = "MAARI";
5391             break;
5392         default:
5393             goto cp0_unimplemented;
5394         }
5395         break;
5396     case 18:
5397         switch (sel) {
5398         case 0 ... 7:
5399             gen_helper_1e0i(mfc0_watchlo, arg, sel);
5400             rn = "WatchLo";
5401             break;
5402         default:
5403             goto cp0_unimplemented;
5404         }
5405         break;
5406     case 19:
5407         switch (sel) {
5408         case 0 ...7:
5409             gen_helper_1e0i(mfc0_watchhi, arg, sel);
5410             rn = "WatchHi";
5411             break;
5412         default:
5413             goto cp0_unimplemented;
5414         }
5415         break;
5416     case 20:
5417         switch (sel) {
5418         case 0:
5419 #if defined(TARGET_MIPS64)
5420             check_insn(ctx, ISA_MIPS3);
5421             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_XContext));
5422             tcg_gen_ext32s_tl(arg, arg);
5423             rn = "XContext";
5424             break;
5425 #endif
5426         default:
5427             goto cp0_unimplemented;
5428         }
5429         break;
5430     case 21:
5431        /* Officially reserved, but sel 0 is used for R1x000 framemask */
5432         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
5433         switch (sel) {
5434         case 0:
5435             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Framemask));
5436             rn = "Framemask";
5437             break;
5438         default:
5439             goto cp0_unimplemented;
5440         }
5441         break;
5442     case 22:
5443         tcg_gen_movi_tl(arg, 0); /* unimplemented */
5444         rn = "'Diagnostic"; /* implementation dependent */
5445         break;
5446     case 23:
5447         switch (sel) {
5448         case 0:
5449             gen_helper_mfc0_debug(arg, cpu_env); /* EJTAG support */
5450             rn = "Debug";
5451             break;
5452         case 1:
5453 //            gen_helper_mfc0_tracecontrol(arg); /* PDtrace support */
5454             rn = "TraceControl";
5455 //            break;
5456         case 2:
5457 //            gen_helper_mfc0_tracecontrol2(arg); /* PDtrace support */
5458             rn = "TraceControl2";
5459 //            break;
5460         case 3:
5461 //            gen_helper_mfc0_usertracedata(arg); /* PDtrace support */
5462             rn = "UserTraceData";
5463 //            break;
5464         case 4:
5465 //            gen_helper_mfc0_tracebpc(arg); /* PDtrace support */
5466             rn = "TraceBPC";
5467 //            break;
5468         default:
5469             goto cp0_unimplemented;
5470         }
5471         break;
5472     case 24:
5473         switch (sel) {
5474         case 0:
5475             /* EJTAG support */
5476             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
5477             tcg_gen_ext32s_tl(arg, arg);
5478             rn = "DEPC";
5479             break;
5480         default:
5481             goto cp0_unimplemented;
5482         }
5483         break;
5484     case 25:
5485         switch (sel) {
5486         case 0:
5487             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Performance0));
5488             rn = "Performance0";
5489             break;
5490         case 1:
5491 //            gen_helper_mfc0_performance1(arg);
5492             rn = "Performance1";
5493 //            break;
5494         case 2:
5495 //            gen_helper_mfc0_performance2(arg);
5496             rn = "Performance2";
5497 //            break;
5498         case 3:
5499 //            gen_helper_mfc0_performance3(arg);
5500             rn = "Performance3";
5501 //            break;
5502         case 4:
5503 //            gen_helper_mfc0_performance4(arg);
5504             rn = "Performance4";
5505 //            break;
5506         case 5:
5507 //            gen_helper_mfc0_performance5(arg);
5508             rn = "Performance5";
5509 //            break;
5510         case 6:
5511 //            gen_helper_mfc0_performance6(arg);
5512             rn = "Performance6";
5513 //            break;
5514         case 7:
5515 //            gen_helper_mfc0_performance7(arg);
5516             rn = "Performance7";
5517 //            break;
5518         default:
5519             goto cp0_unimplemented;
5520         }
5521         break;
5522     case 26:
5523         switch (sel) {
5524         case 0:
5525             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_ErrCtl));
5526             rn = "ErrCtl";
5527             break;
5528         default:
5529             goto cp0_unimplemented;
5530         }
5531         break;
5532     case 27:
5533         switch (sel) {
5534         case 0 ... 3:
5535             tcg_gen_movi_tl(arg, 0); /* unimplemented */
5536             rn = "CacheErr";
5537             break;
5538         default:
5539             goto cp0_unimplemented;
5540         }
5541         break;
5542     case 28:
5543         switch (sel) {
5544         case 0:
5545         case 2:
5546         case 4:
5547         case 6:
5548             {
5549                 TCGv_i64 tmp = tcg_temp_new_i64();
5550                 tcg_gen_ld_i64(tmp, cpu_env, offsetof(CPUMIPSState, CP0_TagLo));
5551                 gen_move_low32(arg, tmp);
5552                 tcg_temp_free_i64(tmp);
5553             }
5554             rn = "TagLo";
5555             break;
5556         case 1:
5557         case 3:
5558         case 5:
5559         case 7:
5560             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataLo));
5561             rn = "DataLo";
5562             break;
5563         default:
5564             goto cp0_unimplemented;
5565         }
5566         break;
5567     case 29:
5568         switch (sel) {
5569         case 0:
5570         case 2:
5571         case 4:
5572         case 6:
5573             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagHi));
5574             rn = "TagHi";
5575             break;
5576         case 1:
5577         case 3:
5578         case 5:
5579         case 7:
5580             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataHi));
5581             rn = "DataHi";
5582             break;
5583         default:
5584             goto cp0_unimplemented;
5585         }
5586         break;
5587     case 30:
5588         switch (sel) {
5589         case 0:
5590             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
5591             tcg_gen_ext32s_tl(arg, arg);
5592             rn = "ErrorEPC";
5593             break;
5594         default:
5595             goto cp0_unimplemented;
5596         }
5597         break;
5598     case 31:
5599         switch (sel) {
5600         case 0:
5601             /* EJTAG support */
5602             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
5603             rn = "DESAVE";
5604             break;
5605         case 2 ... 7:
5606             CP0_CHECK(ctx->kscrexist & (1 << sel));
5607             tcg_gen_ld_tl(arg, cpu_env,
5608                           offsetof(CPUMIPSState, CP0_KScratch[sel-2]));
5609             tcg_gen_ext32s_tl(arg, arg);
5610             rn = "KScratch";
5611             break;
5612         default:
5613             goto cp0_unimplemented;
5614         }
5615         break;
5616     default:
5617        goto cp0_unimplemented;
5618     }
5619     (void)rn; /* avoid a compiler warning */
5620     LOG_DISAS("mfc0 %s (reg %d sel %d)\n", rn, reg, sel);
5621     return;
5622
5623 cp0_unimplemented:
5624     LOG_DISAS("mfc0 %s (reg %d sel %d)\n", rn, reg, sel);
5625     gen_mfc0_unimplemented(ctx, arg);
5626 }
5627
5628 static void gen_mtc0(DisasContext *ctx, TCGv arg, int reg, int sel)
5629 {
5630     const char *rn = "invalid";
5631
5632     if (sel != 0)
5633         check_insn(ctx, ISA_MIPS32);
5634
5635     if (ctx->tb->cflags & CF_USE_ICOUNT) {
5636         gen_io_start();
5637     }
5638
5639     switch (reg) {
5640     case 0:
5641         switch (sel) {
5642         case 0:
5643             gen_helper_mtc0_index(cpu_env, arg);
5644             rn = "Index";
5645             break;
5646         case 1:
5647             CP0_CHECK(ctx->insn_flags & ASE_MT);
5648             gen_helper_mtc0_mvpcontrol(cpu_env, arg);
5649             rn = "MVPControl";
5650             break;
5651         case 2:
5652             CP0_CHECK(ctx->insn_flags & ASE_MT);
5653             /* ignored */
5654             rn = "MVPConf0";
5655             break;
5656         case 3:
5657             CP0_CHECK(ctx->insn_flags & ASE_MT);
5658             /* ignored */
5659             rn = "MVPConf1";
5660             break;
5661         case 4:
5662             CP0_CHECK(ctx->vp);
5663             /* ignored */
5664             rn = "VPControl";
5665             break;
5666         default:
5667             goto cp0_unimplemented;
5668         }
5669         break;
5670     case 1:
5671         switch (sel) {
5672         case 0:
5673             /* ignored */
5674             rn = "Random";
5675             break;
5676         case 1:
5677             CP0_CHECK(ctx->insn_flags & ASE_MT);
5678             gen_helper_mtc0_vpecontrol(cpu_env, arg);
5679             rn = "VPEControl";
5680             break;
5681         case 2:
5682             CP0_CHECK(ctx->insn_flags & ASE_MT);
5683             gen_helper_mtc0_vpeconf0(cpu_env, arg);
5684             rn = "VPEConf0";
5685             break;
5686         case 3:
5687             CP0_CHECK(ctx->insn_flags & ASE_MT);
5688             gen_helper_mtc0_vpeconf1(cpu_env, arg);
5689             rn = "VPEConf1";
5690             break;
5691         case 4:
5692             CP0_CHECK(ctx->insn_flags & ASE_MT);
5693             gen_helper_mtc0_yqmask(cpu_env, arg);
5694             rn = "YQMask";
5695             break;
5696         case 5:
5697             CP0_CHECK(ctx->insn_flags & ASE_MT);
5698             tcg_gen_st_tl(arg, cpu_env,
5699                           offsetof(CPUMIPSState, CP0_VPESchedule));
5700             rn = "VPESchedule";
5701             break;
5702         case 6:
5703             CP0_CHECK(ctx->insn_flags & ASE_MT);
5704             tcg_gen_st_tl(arg, cpu_env,
5705                           offsetof(CPUMIPSState, CP0_VPEScheFBack));
5706             rn = "VPEScheFBack";
5707             break;
5708         case 7:
5709             CP0_CHECK(ctx->insn_flags & ASE_MT);
5710             gen_helper_mtc0_vpeopt(cpu_env, arg);
5711             rn = "VPEOpt";
5712             break;
5713         default:
5714             goto cp0_unimplemented;
5715         }
5716         break;
5717     case 2:
5718         switch (sel) {
5719         case 0:
5720             gen_helper_mtc0_entrylo0(cpu_env, arg);
5721             rn = "EntryLo0";
5722             break;
5723         case 1:
5724             CP0_CHECK(ctx->insn_flags & ASE_MT);
5725             gen_helper_mtc0_tcstatus(cpu_env, arg);
5726             rn = "TCStatus";
5727             break;
5728         case 2:
5729             CP0_CHECK(ctx->insn_flags & ASE_MT);
5730             gen_helper_mtc0_tcbind(cpu_env, arg);
5731             rn = "TCBind";
5732             break;
5733         case 3:
5734             CP0_CHECK(ctx->insn_flags & ASE_MT);
5735             gen_helper_mtc0_tcrestart(cpu_env, arg);
5736             rn = "TCRestart";
5737             break;
5738         case 4:
5739             CP0_CHECK(ctx->insn_flags & ASE_MT);
5740             gen_helper_mtc0_tchalt(cpu_env, arg);
5741             rn = "TCHalt";
5742             break;
5743         case 5:
5744             CP0_CHECK(ctx->insn_flags & ASE_MT);
5745             gen_helper_mtc0_tccontext(cpu_env, arg);
5746             rn = "TCContext";
5747             break;
5748         case 6:
5749             CP0_CHECK(ctx->insn_flags & ASE_MT);
5750             gen_helper_mtc0_tcschedule(cpu_env, arg);
5751             rn = "TCSchedule";
5752             break;
5753         case 7:
5754             CP0_CHECK(ctx->insn_flags & ASE_MT);
5755             gen_helper_mtc0_tcschefback(cpu_env, arg);
5756             rn = "TCScheFBack";
5757             break;
5758         default:
5759             goto cp0_unimplemented;
5760         }
5761         break;
5762     case 3:
5763         switch (sel) {
5764         case 0:
5765             gen_helper_mtc0_entrylo1(cpu_env, arg);
5766             rn = "EntryLo1";
5767             break;
5768         case 1:
5769             CP0_CHECK(ctx->vp);
5770             /* ignored */
5771             rn = "GlobalNumber";
5772             break;
5773         default:
5774             goto cp0_unimplemented;
5775         }
5776         break;
5777     case 4:
5778         switch (sel) {
5779         case 0:
5780             gen_helper_mtc0_context(cpu_env, arg);
5781             rn = "Context";
5782             break;
5783         case 1:
5784 //            gen_helper_mtc0_contextconfig(cpu_env, arg); /* SmartMIPS ASE */
5785             rn = "ContextConfig";
5786             goto cp0_unimplemented;
5787 //            break;
5788         case 2:
5789             CP0_CHECK(ctx->ulri);
5790             tcg_gen_st_tl(arg, cpu_env,
5791                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
5792             rn = "UserLocal";
5793             break;
5794         default:
5795             goto cp0_unimplemented;
5796         }
5797         break;
5798     case 5:
5799         switch (sel) {
5800         case 0:
5801             gen_helper_mtc0_pagemask(cpu_env, arg);
5802             rn = "PageMask";
5803             break;
5804         case 1:
5805             check_insn(ctx, ISA_MIPS32R2);
5806             gen_helper_mtc0_pagegrain(cpu_env, arg);
5807             rn = "PageGrain";
5808             ctx->bstate = BS_STOP;
5809             break;
5810         default:
5811             goto cp0_unimplemented;
5812         }
5813         break;
5814     case 6:
5815         switch (sel) {
5816         case 0:
5817             gen_helper_mtc0_wired(cpu_env, arg);
5818             rn = "Wired";
5819             break;
5820         case 1:
5821             check_insn(ctx, ISA_MIPS32R2);
5822             gen_helper_mtc0_srsconf0(cpu_env, arg);
5823             rn = "SRSConf0";
5824             break;
5825         case 2:
5826             check_insn(ctx, ISA_MIPS32R2);
5827             gen_helper_mtc0_srsconf1(cpu_env, arg);
5828             rn = "SRSConf1";
5829             break;
5830         case 3:
5831             check_insn(ctx, ISA_MIPS32R2);
5832             gen_helper_mtc0_srsconf2(cpu_env, arg);
5833             rn = "SRSConf2";
5834             break;
5835         case 4:
5836             check_insn(ctx, ISA_MIPS32R2);
5837             gen_helper_mtc0_srsconf3(cpu_env, arg);
5838             rn = "SRSConf3";
5839             break;
5840         case 5:
5841             check_insn(ctx, ISA_MIPS32R2);
5842             gen_helper_mtc0_srsconf4(cpu_env, arg);
5843             rn = "SRSConf4";
5844             break;
5845         default:
5846             goto cp0_unimplemented;
5847         }
5848         break;
5849     case 7:
5850         switch (sel) {
5851         case 0:
5852             check_insn(ctx, ISA_MIPS32R2);
5853             gen_helper_mtc0_hwrena(cpu_env, arg);
5854             ctx->bstate = BS_STOP;
5855             rn = "HWREna";
5856             break;
5857         default:
5858             goto cp0_unimplemented;
5859         }
5860         break;
5861     case 8:
5862         switch (sel) {
5863         case 0:
5864             /* ignored */
5865             rn = "BadVAddr";
5866             break;
5867         case 1:
5868             /* ignored */
5869             rn = "BadInstr";
5870             break;
5871         case 2:
5872             /* ignored */
5873             rn = "BadInstrP";
5874             break;
5875         default:
5876             goto cp0_unimplemented;
5877         }
5878         break;
5879     case 9:
5880         switch (sel) {
5881         case 0:
5882             gen_helper_mtc0_count(cpu_env, arg);
5883             rn = "Count";
5884             break;
5885         /* 6,7 are implementation dependent */
5886         default:
5887             goto cp0_unimplemented;
5888         }
5889         break;
5890     case 10:
5891         switch (sel) {
5892         case 0:
5893             gen_helper_mtc0_entryhi(cpu_env, arg);
5894             rn = "EntryHi";
5895             break;
5896         default:
5897             goto cp0_unimplemented;
5898         }
5899         break;
5900     case 11:
5901         switch (sel) {
5902         case 0:
5903             gen_helper_mtc0_compare(cpu_env, arg);
5904             rn = "Compare";
5905             break;
5906         /* 6,7 are implementation dependent */
5907         default:
5908             goto cp0_unimplemented;
5909         }
5910         break;
5911     case 12:
5912         switch (sel) {
5913         case 0:
5914             save_cpu_state(ctx, 1);
5915             gen_helper_mtc0_status(cpu_env, arg);
5916             /* BS_STOP isn't good enough here, hflags may have changed. */
5917             gen_save_pc(ctx->pc + 4);
5918             ctx->bstate = BS_EXCP;
5919             rn = "Status";
5920             break;
5921         case 1:
5922             check_insn(ctx, ISA_MIPS32R2);
5923             gen_helper_mtc0_intctl(cpu_env, arg);
5924             /* Stop translation as we may have switched the execution mode */
5925             ctx->bstate = BS_STOP;
5926             rn = "IntCtl";
5927             break;
5928         case 2:
5929             check_insn(ctx, ISA_MIPS32R2);
5930             gen_helper_mtc0_srsctl(cpu_env, arg);
5931             /* Stop translation as we may have switched the execution mode */
5932             ctx->bstate = BS_STOP;
5933             rn = "SRSCtl";
5934             break;
5935         case 3:
5936             check_insn(ctx, ISA_MIPS32R2);
5937             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
5938             /* Stop translation as we may have switched the execution mode */
5939             ctx->bstate = BS_STOP;
5940             rn = "SRSMap";
5941             break;
5942         default:
5943             goto cp0_unimplemented;
5944         }
5945         break;
5946     case 13:
5947         switch (sel) {
5948         case 0:
5949             save_cpu_state(ctx, 1);
5950             gen_helper_mtc0_cause(cpu_env, arg);
5951             rn = "Cause";
5952             break;
5953         default:
5954             goto cp0_unimplemented;
5955         }
5956         break;
5957     case 14:
5958         switch (sel) {
5959         case 0:
5960             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
5961             rn = "EPC";
5962             break;
5963         default:
5964             goto cp0_unimplemented;
5965         }
5966         break;
5967     case 15:
5968         switch (sel) {
5969         case 0:
5970             /* ignored */
5971             rn = "PRid";
5972             break;
5973         case 1:
5974             check_insn(ctx, ISA_MIPS32R2);
5975             gen_helper_mtc0_ebase(cpu_env, arg);
5976             rn = "EBase";
5977             break;
5978         default:
5979             goto cp0_unimplemented;
5980         }
5981         break;
5982     case 16:
5983         switch (sel) {
5984         case 0:
5985             gen_helper_mtc0_config0(cpu_env, arg);
5986             rn = "Config";
5987             /* Stop translation as we may have switched the execution mode */
5988             ctx->bstate = BS_STOP;
5989             break;
5990         case 1:
5991             /* ignored, read only */
5992             rn = "Config1";
5993             break;
5994         case 2:
5995             gen_helper_mtc0_config2(cpu_env, arg);
5996             rn = "Config2";
5997             /* Stop translation as we may have switched the execution mode */
5998             ctx->bstate = BS_STOP;
5999             break;
6000         case 3:
6001             gen_helper_mtc0_config3(cpu_env, arg);
6002             rn = "Config3";
6003             /* Stop translation as we may have switched the execution mode */
6004             ctx->bstate = BS_STOP;
6005             break;
6006         case 4:
6007             gen_helper_mtc0_config4(cpu_env, arg);
6008             rn = "Config4";
6009             ctx->bstate = BS_STOP;
6010             break;
6011         case 5:
6012             gen_helper_mtc0_config5(cpu_env, arg);
6013             rn = "Config5";
6014             /* Stop translation as we may have switched the execution mode */
6015             ctx->bstate = BS_STOP;
6016             break;
6017         /* 6,7 are implementation dependent */
6018         case 6:
6019             /* ignored */
6020             rn = "Config6";
6021             break;
6022         case 7:
6023             /* ignored */
6024             rn = "Config7";
6025             break;
6026         default:
6027             rn = "Invalid config selector";
6028             goto cp0_unimplemented;
6029         }
6030         break;
6031     case 17:
6032         switch (sel) {
6033         case 0:
6034             gen_helper_mtc0_lladdr(cpu_env, arg);
6035             rn = "LLAddr";
6036             break;
6037         case 1:
6038             CP0_CHECK(ctx->mrp);
6039             gen_helper_mtc0_maar(cpu_env, arg);
6040             rn = "MAAR";
6041             break;
6042         case 2:
6043             CP0_CHECK(ctx->mrp);
6044             gen_helper_mtc0_maari(cpu_env, arg);
6045             rn = "MAARI";
6046             break;
6047         default:
6048             goto cp0_unimplemented;
6049         }
6050         break;
6051     case 18:
6052         switch (sel) {
6053         case 0 ... 7:
6054             gen_helper_0e1i(mtc0_watchlo, arg, sel);
6055             rn = "WatchLo";
6056             break;
6057         default:
6058             goto cp0_unimplemented;
6059         }
6060         break;
6061     case 19:
6062         switch (sel) {
6063         case 0 ... 7:
6064             gen_helper_0e1i(mtc0_watchhi, arg, sel);
6065             rn = "WatchHi";
6066             break;
6067         default:
6068             goto cp0_unimplemented;
6069         }
6070         break;
6071     case 20:
6072         switch (sel) {
6073         case 0:
6074 #if defined(TARGET_MIPS64)
6075             check_insn(ctx, ISA_MIPS3);
6076             gen_helper_mtc0_xcontext(cpu_env, arg);
6077             rn = "XContext";
6078             break;
6079 #endif
6080         default:
6081             goto cp0_unimplemented;
6082         }
6083         break;
6084     case 21:
6085        /* Officially reserved, but sel 0 is used for R1x000 framemask */
6086         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
6087         switch (sel) {
6088         case 0:
6089             gen_helper_mtc0_framemask(cpu_env, arg);
6090             rn = "Framemask";
6091             break;
6092         default:
6093             goto cp0_unimplemented;
6094         }
6095         break;
6096     case 22:
6097         /* ignored */
6098         rn = "Diagnostic"; /* implementation dependent */
6099         break;
6100     case 23:
6101         switch (sel) {
6102         case 0:
6103             gen_helper_mtc0_debug(cpu_env, arg); /* EJTAG support */
6104             /* BS_STOP isn't good enough here, hflags may have changed. */
6105             gen_save_pc(ctx->pc + 4);
6106             ctx->bstate = BS_EXCP;
6107             rn = "Debug";
6108             break;
6109         case 1:
6110 //            gen_helper_mtc0_tracecontrol(cpu_env, arg); /* PDtrace support */
6111             rn = "TraceControl";
6112             /* Stop translation as we may have switched the execution mode */
6113             ctx->bstate = BS_STOP;
6114 //            break;
6115         case 2:
6116 //            gen_helper_mtc0_tracecontrol2(cpu_env, arg); /* PDtrace support */
6117             rn = "TraceControl2";
6118             /* Stop translation as we may have switched the execution mode */
6119             ctx->bstate = BS_STOP;
6120 //            break;
6121         case 3:
6122             /* Stop translation as we may have switched the execution mode */
6123             ctx->bstate = BS_STOP;
6124 //            gen_helper_mtc0_usertracedata(cpu_env, arg); /* PDtrace support */
6125             rn = "UserTraceData";
6126             /* Stop translation as we may have switched the execution mode */
6127             ctx->bstate = BS_STOP;
6128 //            break;
6129         case 4:
6130 //            gen_helper_mtc0_tracebpc(cpu_env, arg); /* PDtrace support */
6131             /* Stop translation as we may have switched the execution mode */
6132             ctx->bstate = BS_STOP;
6133             rn = "TraceBPC";
6134 //            break;
6135         default:
6136             goto cp0_unimplemented;
6137         }
6138         break;
6139     case 24:
6140         switch (sel) {
6141         case 0:
6142             /* EJTAG support */
6143             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
6144             rn = "DEPC";
6145             break;
6146         default:
6147             goto cp0_unimplemented;
6148         }
6149         break;
6150     case 25:
6151         switch (sel) {
6152         case 0:
6153             gen_helper_mtc0_performance0(cpu_env, arg);
6154             rn = "Performance0";
6155             break;
6156         case 1:
6157 //            gen_helper_mtc0_performance1(arg);
6158             rn = "Performance1";
6159 //            break;
6160         case 2:
6161 //            gen_helper_mtc0_performance2(arg);
6162             rn = "Performance2";
6163 //            break;
6164         case 3:
6165 //            gen_helper_mtc0_performance3(arg);
6166             rn = "Performance3";
6167 //            break;
6168         case 4:
6169 //            gen_helper_mtc0_performance4(arg);
6170             rn = "Performance4";
6171 //            break;
6172         case 5:
6173 //            gen_helper_mtc0_performance5(arg);
6174             rn = "Performance5";
6175 //            break;
6176         case 6:
6177 //            gen_helper_mtc0_performance6(arg);
6178             rn = "Performance6";
6179 //            break;
6180         case 7:
6181 //            gen_helper_mtc0_performance7(arg);
6182             rn = "Performance7";
6183 //            break;
6184         default:
6185             goto cp0_unimplemented;
6186         }
6187        break;
6188     case 26:
6189         switch (sel) {
6190         case 0:
6191             gen_helper_mtc0_errctl(cpu_env, arg);
6192             ctx->bstate = BS_STOP;
6193             rn = "ErrCtl";
6194             break;
6195         default:
6196             goto cp0_unimplemented;
6197         }
6198         break;
6199     case 27:
6200         switch (sel) {
6201         case 0 ... 3:
6202             /* ignored */
6203             rn = "CacheErr";
6204             break;
6205         default:
6206             goto cp0_unimplemented;
6207         }
6208        break;
6209     case 28:
6210         switch (sel) {
6211         case 0:
6212         case 2:
6213         case 4:
6214         case 6:
6215             gen_helper_mtc0_taglo(cpu_env, arg);
6216             rn = "TagLo";
6217             break;
6218         case 1:
6219         case 3:
6220         case 5:
6221         case 7:
6222             gen_helper_mtc0_datalo(cpu_env, arg);
6223             rn = "DataLo";
6224             break;
6225         default:
6226             goto cp0_unimplemented;
6227         }
6228         break;
6229     case 29:
6230         switch (sel) {
6231         case 0:
6232         case 2:
6233         case 4:
6234         case 6:
6235             gen_helper_mtc0_taghi(cpu_env, arg);
6236             rn = "TagHi";
6237             break;
6238         case 1:
6239         case 3:
6240         case 5:
6241         case 7:
6242             gen_helper_mtc0_datahi(cpu_env, arg);
6243             rn = "DataHi";
6244             break;
6245         default:
6246             rn = "invalid sel";
6247             goto cp0_unimplemented;
6248         }
6249        break;
6250     case 30:
6251         switch (sel) {
6252         case 0:
6253             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
6254             rn = "ErrorEPC";
6255             break;
6256         default:
6257             goto cp0_unimplemented;
6258         }
6259         break;
6260     case 31:
6261         switch (sel) {
6262         case 0:
6263             /* EJTAG support */
6264             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
6265             rn = "DESAVE";
6266             break;
6267         case 2 ... 7:
6268             CP0_CHECK(ctx->kscrexist & (1 << sel));
6269             tcg_gen_st_tl(arg, cpu_env,
6270                           offsetof(CPUMIPSState, CP0_KScratch[sel-2]));
6271             rn = "KScratch";
6272             break;
6273         default:
6274             goto cp0_unimplemented;
6275         }
6276         /* Stop translation as we may have switched the execution mode */
6277         ctx->bstate = BS_STOP;
6278         break;
6279     default:
6280        goto cp0_unimplemented;
6281     }
6282     (void)rn; /* avoid a compiler warning */
6283     LOG_DISAS("mtc0 %s (reg %d sel %d)\n", rn, reg, sel);
6284     /* For simplicity assume that all writes can cause interrupts.  */
6285     if (ctx->tb->cflags & CF_USE_ICOUNT) {
6286         gen_io_end();
6287         ctx->bstate = BS_STOP;
6288     }
6289     return;
6290
6291 cp0_unimplemented:
6292     LOG_DISAS("mtc0 %s (reg %d sel %d)\n", rn, reg, sel);
6293 }
6294
6295 #if defined(TARGET_MIPS64)
6296 static void gen_dmfc0(DisasContext *ctx, TCGv arg, int reg, int sel)
6297 {
6298     const char *rn = "invalid";
6299
6300     if (sel != 0)
6301         check_insn(ctx, ISA_MIPS64);
6302
6303     switch (reg) {
6304     case 0:
6305         switch (sel) {
6306         case 0:
6307             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Index));
6308             rn = "Index";
6309             break;
6310         case 1:
6311             CP0_CHECK(ctx->insn_flags & ASE_MT);
6312             gen_helper_mfc0_mvpcontrol(arg, cpu_env);
6313             rn = "MVPControl";
6314             break;
6315         case 2:
6316             CP0_CHECK(ctx->insn_flags & ASE_MT);
6317             gen_helper_mfc0_mvpconf0(arg, cpu_env);
6318             rn = "MVPConf0";
6319             break;
6320         case 3:
6321             CP0_CHECK(ctx->insn_flags & ASE_MT);
6322             gen_helper_mfc0_mvpconf1(arg, cpu_env);
6323             rn = "MVPConf1";
6324             break;
6325         case 4:
6326             CP0_CHECK(ctx->vp);
6327             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPControl));
6328             rn = "VPControl";
6329             break;
6330         default:
6331             goto cp0_unimplemented;
6332         }
6333         break;
6334     case 1:
6335         switch (sel) {
6336         case 0:
6337             CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
6338             gen_helper_mfc0_random(arg, cpu_env);
6339             rn = "Random";
6340             break;
6341         case 1:
6342             CP0_CHECK(ctx->insn_flags & ASE_MT);
6343             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEControl));
6344             rn = "VPEControl";
6345             break;
6346         case 2:
6347             CP0_CHECK(ctx->insn_flags & ASE_MT);
6348             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf0));
6349             rn = "VPEConf0";
6350             break;
6351         case 3:
6352             CP0_CHECK(ctx->insn_flags & ASE_MT);
6353             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf1));
6354             rn = "VPEConf1";
6355             break;
6356         case 4:
6357             CP0_CHECK(ctx->insn_flags & ASE_MT);
6358             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_YQMask));
6359             rn = "YQMask";
6360             break;
6361         case 5:
6362             CP0_CHECK(ctx->insn_flags & ASE_MT);
6363             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPESchedule));
6364             rn = "VPESchedule";
6365             break;
6366         case 6:
6367             CP0_CHECK(ctx->insn_flags & ASE_MT);
6368             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPEScheFBack));
6369             rn = "VPEScheFBack";
6370             break;
6371         case 7:
6372             CP0_CHECK(ctx->insn_flags & ASE_MT);
6373             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEOpt));
6374             rn = "VPEOpt";
6375             break;
6376         default:
6377             goto cp0_unimplemented;
6378         }
6379         break;
6380     case 2:
6381         switch (sel) {
6382         case 0:
6383             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryLo0));
6384             rn = "EntryLo0";
6385             break;
6386         case 1:
6387             CP0_CHECK(ctx->insn_flags & ASE_MT);
6388             gen_helper_mfc0_tcstatus(arg, cpu_env);
6389             rn = "TCStatus";
6390             break;
6391         case 2:
6392             CP0_CHECK(ctx->insn_flags & ASE_MT);
6393             gen_helper_mfc0_tcbind(arg, cpu_env);
6394             rn = "TCBind";
6395             break;
6396         case 3:
6397             CP0_CHECK(ctx->insn_flags & ASE_MT);
6398             gen_helper_dmfc0_tcrestart(arg, cpu_env);
6399             rn = "TCRestart";
6400             break;
6401         case 4:
6402             CP0_CHECK(ctx->insn_flags & ASE_MT);
6403             gen_helper_dmfc0_tchalt(arg, cpu_env);
6404             rn = "TCHalt";
6405             break;
6406         case 5:
6407             CP0_CHECK(ctx->insn_flags & ASE_MT);
6408             gen_helper_dmfc0_tccontext(arg, cpu_env);
6409             rn = "TCContext";
6410             break;
6411         case 6:
6412             CP0_CHECK(ctx->insn_flags & ASE_MT);
6413             gen_helper_dmfc0_tcschedule(arg, cpu_env);
6414             rn = "TCSchedule";
6415             break;
6416         case 7:
6417             CP0_CHECK(ctx->insn_flags & ASE_MT);
6418             gen_helper_dmfc0_tcschefback(arg, cpu_env);
6419             rn = "TCScheFBack";
6420             break;
6421         default:
6422             goto cp0_unimplemented;
6423         }
6424         break;
6425     case 3:
6426         switch (sel) {
6427         case 0:
6428             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryLo1));
6429             rn = "EntryLo1";
6430             break;
6431         case 1:
6432             CP0_CHECK(ctx->vp);
6433             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_GlobalNumber));
6434             rn = "GlobalNumber";
6435             break;
6436         default:
6437             goto cp0_unimplemented;
6438         }
6439         break;
6440     case 4:
6441         switch (sel) {
6442         case 0:
6443             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_Context));
6444             rn = "Context";
6445             break;
6446         case 1:
6447 //            gen_helper_dmfc0_contextconfig(arg); /* SmartMIPS ASE */
6448             rn = "ContextConfig";
6449             goto cp0_unimplemented;
6450 //            break;
6451         case 2:
6452             CP0_CHECK(ctx->ulri);
6453             tcg_gen_ld_tl(arg, cpu_env,
6454                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
6455             rn = "UserLocal";
6456             break;
6457         default:
6458             goto cp0_unimplemented;
6459         }
6460         break;
6461     case 5:
6462         switch (sel) {
6463         case 0:
6464             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageMask));
6465             rn = "PageMask";
6466             break;
6467         case 1:
6468             check_insn(ctx, ISA_MIPS32R2);
6469             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageGrain));
6470             rn = "PageGrain";
6471             break;
6472         default:
6473             goto cp0_unimplemented;
6474         }
6475         break;
6476     case 6:
6477         switch (sel) {
6478         case 0:
6479             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Wired));
6480             rn = "Wired";
6481             break;
6482         case 1:
6483             check_insn(ctx, ISA_MIPS32R2);
6484             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf0));
6485             rn = "SRSConf0";
6486             break;
6487         case 2:
6488             check_insn(ctx, ISA_MIPS32R2);
6489             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf1));
6490             rn = "SRSConf1";
6491             break;
6492         case 3:
6493             check_insn(ctx, ISA_MIPS32R2);
6494             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf2));
6495             rn = "SRSConf2";
6496             break;
6497         case 4:
6498             check_insn(ctx, ISA_MIPS32R2);
6499             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf3));
6500             rn = "SRSConf3";
6501             break;
6502         case 5:
6503             check_insn(ctx, ISA_MIPS32R2);
6504             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf4));
6505             rn = "SRSConf4";
6506             break;
6507         default:
6508             goto cp0_unimplemented;
6509         }
6510         break;
6511     case 7:
6512         switch (sel) {
6513         case 0:
6514             check_insn(ctx, ISA_MIPS32R2);
6515             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_HWREna));
6516             rn = "HWREna";
6517             break;
6518         default:
6519             goto cp0_unimplemented;
6520         }
6521         break;
6522     case 8:
6523         switch (sel) {
6524         case 0:
6525             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));
6526             rn = "BadVAddr";
6527             break;
6528         case 1:
6529             CP0_CHECK(ctx->bi);
6530             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstr));
6531             rn = "BadInstr";
6532             break;
6533         case 2:
6534             CP0_CHECK(ctx->bp);
6535             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrP));
6536             rn = "BadInstrP";
6537             break;
6538         default:
6539             goto cp0_unimplemented;
6540         }
6541         break;
6542     case 9:
6543         switch (sel) {
6544         case 0:
6545             /* Mark as an IO operation because we read the time.  */
6546             if (ctx->tb->cflags & CF_USE_ICOUNT) {
6547                 gen_io_start();
6548             }
6549             gen_helper_mfc0_count(arg, cpu_env);
6550             if (ctx->tb->cflags & CF_USE_ICOUNT) {
6551                 gen_io_end();
6552             }
6553             /* Break the TB to be able to take timer interrupts immediately
6554                after reading count.  */
6555             ctx->bstate = BS_STOP;
6556             rn = "Count";
6557             break;
6558         /* 6,7 are implementation dependent */
6559         default:
6560             goto cp0_unimplemented;
6561         }
6562         break;
6563     case 10:
6564         switch (sel) {
6565         case 0:
6566             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryHi));
6567             rn = "EntryHi";
6568             break;
6569         default:
6570             goto cp0_unimplemented;
6571         }
6572         break;
6573     case 11:
6574         switch (sel) {
6575         case 0:
6576             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Compare));
6577             rn = "Compare";
6578             break;
6579         /* 6,7 are implementation dependent */
6580         default:
6581             goto cp0_unimplemented;
6582         }
6583         break;
6584     case 12:
6585         switch (sel) {
6586         case 0:
6587             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Status));
6588             rn = "Status";
6589             break;
6590         case 1:
6591             check_insn(ctx, ISA_MIPS32R2);
6592             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_IntCtl));
6593             rn = "IntCtl";
6594             break;
6595         case 2:
6596             check_insn(ctx, ISA_MIPS32R2);
6597             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSCtl));
6598             rn = "SRSCtl";
6599             break;
6600         case 3:
6601             check_insn(ctx, ISA_MIPS32R2);
6602             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
6603             rn = "SRSMap";
6604             break;
6605         default:
6606             goto cp0_unimplemented;
6607         }
6608         break;
6609     case 13:
6610         switch (sel) {
6611         case 0:
6612             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Cause));
6613             rn = "Cause";
6614             break;
6615         default:
6616             goto cp0_unimplemented;
6617         }
6618         break;
6619     case 14:
6620         switch (sel) {
6621         case 0:
6622             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
6623             rn = "EPC";
6624             break;
6625         default:
6626             goto cp0_unimplemented;
6627         }
6628         break;
6629     case 15:
6630         switch (sel) {
6631         case 0:
6632             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PRid));
6633             rn = "PRid";
6634             break;
6635         case 1:
6636             check_insn(ctx, ISA_MIPS32R2);
6637             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_EBase));
6638             rn = "EBase";
6639             break;
6640         case 3:
6641             check_insn(ctx, ISA_MIPS32R2);
6642             CP0_CHECK(ctx->cmgcr);
6643             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_CMGCRBase));
6644             rn = "CMGCRBase";
6645             break;
6646         default:
6647             goto cp0_unimplemented;
6648         }
6649         break;
6650     case 16:
6651         switch (sel) {
6652         case 0:
6653             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config0));
6654             rn = "Config";
6655             break;
6656         case 1:
6657             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config1));
6658             rn = "Config1";
6659             break;
6660         case 2:
6661             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config2));
6662             rn = "Config2";
6663             break;
6664         case 3:
6665             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config3));
6666             rn = "Config3";
6667             break;
6668         case 4:
6669             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config4));
6670             rn = "Config4";
6671             break;
6672         case 5:
6673             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config5));
6674             rn = "Config5";
6675             break;
6676        /* 6,7 are implementation dependent */
6677         case 6:
6678             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config6));
6679             rn = "Config6";
6680             break;
6681         case 7:
6682             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config7));
6683             rn = "Config7";
6684             break;
6685         default:
6686             goto cp0_unimplemented;
6687         }
6688         break;
6689     case 17:
6690         switch (sel) {
6691         case 0:
6692             gen_helper_dmfc0_lladdr(arg, cpu_env);
6693             rn = "LLAddr";
6694             break;
6695         case 1:
6696             CP0_CHECK(ctx->mrp);
6697             gen_helper_dmfc0_maar(arg, cpu_env);
6698             rn = "MAAR";
6699             break;
6700         case 2:
6701             CP0_CHECK(ctx->mrp);
6702             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_MAARI));
6703             rn = "MAARI";
6704             break;
6705         default:
6706             goto cp0_unimplemented;
6707         }
6708         break;
6709     case 18:
6710         switch (sel) {
6711         case 0 ... 7:
6712             gen_helper_1e0i(dmfc0_watchlo, arg, sel);
6713             rn = "WatchLo";
6714             break;
6715         default:
6716             goto cp0_unimplemented;
6717         }
6718         break;
6719     case 19:
6720         switch (sel) {
6721         case 0 ... 7:
6722             gen_helper_1e0i(mfc0_watchhi, arg, sel);
6723             rn = "WatchHi";
6724             break;
6725         default:
6726             goto cp0_unimplemented;
6727         }
6728         break;
6729     case 20:
6730         switch (sel) {
6731         case 0:
6732             check_insn(ctx, ISA_MIPS3);
6733             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_XContext));
6734             rn = "XContext";
6735             break;
6736         default:
6737             goto cp0_unimplemented;
6738         }
6739         break;
6740     case 21:
6741        /* Officially reserved, but sel 0 is used for R1x000 framemask */
6742         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
6743         switch (sel) {
6744         case 0:
6745             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Framemask));
6746             rn = "Framemask";
6747             break;
6748         default:
6749             goto cp0_unimplemented;
6750         }
6751         break;
6752     case 22:
6753         tcg_gen_movi_tl(arg, 0); /* unimplemented */
6754         rn = "'Diagnostic"; /* implementation dependent */
6755         break;
6756     case 23:
6757         switch (sel) {
6758         case 0:
6759             gen_helper_mfc0_debug(arg, cpu_env); /* EJTAG support */
6760             rn = "Debug";
6761             break;
6762         case 1:
6763 //            gen_helper_dmfc0_tracecontrol(arg, cpu_env); /* PDtrace support */
6764             rn = "TraceControl";
6765 //            break;
6766         case 2:
6767 //            gen_helper_dmfc0_tracecontrol2(arg, cpu_env); /* PDtrace support */
6768             rn = "TraceControl2";
6769 //            break;
6770         case 3:
6771 //            gen_helper_dmfc0_usertracedata(arg, cpu_env); /* PDtrace support */
6772             rn = "UserTraceData";
6773 //            break;
6774         case 4:
6775 //            gen_helper_dmfc0_tracebpc(arg, cpu_env); /* PDtrace support */
6776             rn = "TraceBPC";
6777 //            break;
6778         default:
6779             goto cp0_unimplemented;
6780         }
6781         break;
6782     case 24:
6783         switch (sel) {
6784         case 0:
6785             /* EJTAG support */
6786             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
6787             rn = "DEPC";
6788             break;
6789         default:
6790             goto cp0_unimplemented;
6791         }
6792         break;
6793     case 25:
6794         switch (sel) {
6795         case 0:
6796             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Performance0));
6797             rn = "Performance0";
6798             break;
6799         case 1:
6800 //            gen_helper_dmfc0_performance1(arg);
6801             rn = "Performance1";
6802 //            break;
6803         case 2:
6804 //            gen_helper_dmfc0_performance2(arg);
6805             rn = "Performance2";
6806 //            break;
6807         case 3:
6808 //            gen_helper_dmfc0_performance3(arg);
6809             rn = "Performance3";
6810 //            break;
6811         case 4:
6812 //            gen_helper_dmfc0_performance4(arg);
6813             rn = "Performance4";
6814 //            break;
6815         case 5:
6816 //            gen_helper_dmfc0_performance5(arg);
6817             rn = "Performance5";
6818 //            break;
6819         case 6:
6820 //            gen_helper_dmfc0_performance6(arg);
6821             rn = "Performance6";
6822 //            break;
6823         case 7:
6824 //            gen_helper_dmfc0_performance7(arg);
6825             rn = "Performance7";
6826 //            break;
6827         default:
6828             goto cp0_unimplemented;
6829         }
6830         break;
6831     case 26:
6832         switch (sel) {
6833         case 0:
6834             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_ErrCtl));
6835             rn = "ErrCtl";
6836             break;
6837         default:
6838             goto cp0_unimplemented;
6839         }
6840         break;
6841     case 27:
6842         switch (sel) {
6843         /* ignored */
6844         case 0 ... 3:
6845             tcg_gen_movi_tl(arg, 0); /* unimplemented */
6846             rn = "CacheErr";
6847             break;
6848         default:
6849             goto cp0_unimplemented;
6850         }
6851         break;
6852     case 28:
6853         switch (sel) {
6854         case 0:
6855         case 2:
6856         case 4:
6857         case 6:
6858             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagLo));
6859             rn = "TagLo";
6860             break;
6861         case 1:
6862         case 3:
6863         case 5:
6864         case 7:
6865             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataLo));
6866             rn = "DataLo";
6867             break;
6868         default:
6869             goto cp0_unimplemented;
6870         }
6871         break;
6872     case 29:
6873         switch (sel) {
6874         case 0:
6875         case 2:
6876         case 4:
6877         case 6:
6878             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagHi));
6879             rn = "TagHi";
6880             break;
6881         case 1:
6882         case 3:
6883         case 5:
6884         case 7:
6885             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataHi));
6886             rn = "DataHi";
6887             break;
6888         default:
6889             goto cp0_unimplemented;
6890         }
6891         break;
6892     case 30:
6893         switch (sel) {
6894         case 0:
6895             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
6896             rn = "ErrorEPC";
6897             break;
6898         default:
6899             goto cp0_unimplemented;
6900         }
6901         break;
6902     case 31:
6903         switch (sel) {
6904         case 0:
6905             /* EJTAG support */
6906             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
6907             rn = "DESAVE";
6908             break;
6909         case 2 ... 7:
6910             CP0_CHECK(ctx->kscrexist & (1 << sel));
6911             tcg_gen_ld_tl(arg, cpu_env,
6912                           offsetof(CPUMIPSState, CP0_KScratch[sel-2]));
6913             rn = "KScratch";
6914             break;
6915         default:
6916             goto cp0_unimplemented;
6917         }
6918         break;
6919     default:
6920         goto cp0_unimplemented;
6921     }
6922     (void)rn; /* avoid a compiler warning */
6923     LOG_DISAS("dmfc0 %s (reg %d sel %d)\n", rn, reg, sel);
6924     return;
6925
6926 cp0_unimplemented:
6927     LOG_DISAS("dmfc0 %s (reg %d sel %d)\n", rn, reg, sel);
6928     gen_mfc0_unimplemented(ctx, arg);
6929 }
6930
6931 static void gen_dmtc0(DisasContext *ctx, TCGv arg, int reg, int sel)
6932 {
6933     const char *rn = "invalid";
6934
6935     if (sel != 0)
6936         check_insn(ctx, ISA_MIPS64);
6937
6938     if (ctx->tb->cflags & CF_USE_ICOUNT) {
6939         gen_io_start();
6940     }
6941
6942     switch (reg) {
6943     case 0:
6944         switch (sel) {
6945         case 0:
6946             gen_helper_mtc0_index(cpu_env, arg);
6947             rn = "Index";
6948             break;
6949         case 1:
6950             CP0_CHECK(ctx->insn_flags & ASE_MT);
6951             gen_helper_mtc0_mvpcontrol(cpu_env, arg);
6952             rn = "MVPControl";
6953             break;
6954         case 2:
6955             CP0_CHECK(ctx->insn_flags & ASE_MT);
6956             /* ignored */
6957             rn = "MVPConf0";
6958             break;
6959         case 3:
6960             CP0_CHECK(ctx->insn_flags & ASE_MT);
6961             /* ignored */
6962             rn = "MVPConf1";
6963             break;
6964         case 4:
6965             CP0_CHECK(ctx->vp);
6966             /* ignored */
6967             rn = "VPControl";
6968             break;
6969         default:
6970             goto cp0_unimplemented;
6971         }
6972         break;
6973     case 1:
6974         switch (sel) {
6975         case 0:
6976             /* ignored */
6977             rn = "Random";
6978             break;
6979         case 1:
6980             CP0_CHECK(ctx->insn_flags & ASE_MT);
6981             gen_helper_mtc0_vpecontrol(cpu_env, arg);
6982             rn = "VPEControl";
6983             break;
6984         case 2:
6985             CP0_CHECK(ctx->insn_flags & ASE_MT);
6986             gen_helper_mtc0_vpeconf0(cpu_env, arg);
6987             rn = "VPEConf0";
6988             break;
6989         case 3:
6990             CP0_CHECK(ctx->insn_flags & ASE_MT);
6991             gen_helper_mtc0_vpeconf1(cpu_env, arg);
6992             rn = "VPEConf1";
6993             break;
6994         case 4:
6995             CP0_CHECK(ctx->insn_flags & ASE_MT);
6996             gen_helper_mtc0_yqmask(cpu_env, arg);
6997             rn = "YQMask";
6998             break;
6999         case 5:
7000             CP0_CHECK(ctx->insn_flags & ASE_MT);
7001             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPESchedule));
7002             rn = "VPESchedule";
7003             break;
7004         case 6:
7005             CP0_CHECK(ctx->insn_flags & ASE_MT);
7006             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPEScheFBack));
7007             rn = "VPEScheFBack";
7008             break;
7009         case 7:
7010             CP0_CHECK(ctx->insn_flags & ASE_MT);
7011             gen_helper_mtc0_vpeopt(cpu_env, arg);
7012             rn = "VPEOpt";
7013             break;
7014         default:
7015             goto cp0_unimplemented;
7016         }
7017         break;
7018     case 2:
7019         switch (sel) {
7020         case 0:
7021             gen_helper_dmtc0_entrylo0(cpu_env, arg);
7022             rn = "EntryLo0";
7023             break;
7024         case 1:
7025             CP0_CHECK(ctx->insn_flags & ASE_MT);
7026             gen_helper_mtc0_tcstatus(cpu_env, arg);
7027             rn = "TCStatus";
7028             break;
7029         case 2:
7030             CP0_CHECK(ctx->insn_flags & ASE_MT);
7031             gen_helper_mtc0_tcbind(cpu_env, arg);
7032             rn = "TCBind";
7033             break;
7034         case 3:
7035             CP0_CHECK(ctx->insn_flags & ASE_MT);
7036             gen_helper_mtc0_tcrestart(cpu_env, arg);
7037             rn = "TCRestart";
7038             break;
7039         case 4:
7040             CP0_CHECK(ctx->insn_flags & ASE_MT);
7041             gen_helper_mtc0_tchalt(cpu_env, arg);
7042             rn = "TCHalt";
7043             break;
7044         case 5:
7045             CP0_CHECK(ctx->insn_flags & ASE_MT);
7046             gen_helper_mtc0_tccontext(cpu_env, arg);
7047             rn = "TCContext";
7048             break;
7049         case 6:
7050             CP0_CHECK(ctx->insn_flags & ASE_MT);
7051             gen_helper_mtc0_tcschedule(cpu_env, arg);
7052             rn = "TCSchedule";
7053             break;
7054         case 7:
7055             CP0_CHECK(ctx->insn_flags & ASE_MT);
7056             gen_helper_mtc0_tcschefback(cpu_env, arg);
7057             rn = "TCScheFBack";
7058             break;
7059         default:
7060             goto cp0_unimplemented;
7061         }
7062         break;
7063     case 3:
7064         switch (sel) {
7065         case 0:
7066             gen_helper_dmtc0_entrylo1(cpu_env, arg);
7067             rn = "EntryLo1";
7068             break;
7069         case 1:
7070             CP0_CHECK(ctx->vp);
7071             /* ignored */
7072             rn = "GlobalNumber";
7073             break;
7074         default:
7075             goto cp0_unimplemented;
7076         }
7077         break;
7078     case 4:
7079         switch (sel) {
7080         case 0:
7081             gen_helper_mtc0_context(cpu_env, arg);
7082             rn = "Context";
7083             break;
7084         case 1:
7085 //           gen_helper_mtc0_contextconfig(cpu_env, arg); /* SmartMIPS ASE */
7086             rn = "ContextConfig";
7087             goto cp0_unimplemented;
7088 //           break;
7089         case 2:
7090             CP0_CHECK(ctx->ulri);
7091             tcg_gen_st_tl(arg, cpu_env,
7092                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
7093             rn = "UserLocal";
7094             break;
7095         default:
7096             goto cp0_unimplemented;
7097         }
7098         break;
7099     case 5:
7100         switch (sel) {
7101         case 0:
7102             gen_helper_mtc0_pagemask(cpu_env, arg);
7103             rn = "PageMask";
7104             break;
7105         case 1:
7106             check_insn(ctx, ISA_MIPS32R2);
7107             gen_helper_mtc0_pagegrain(cpu_env, arg);
7108             rn = "PageGrain";
7109             break;
7110         default:
7111             goto cp0_unimplemented;
7112         }
7113         break;
7114     case 6:
7115         switch (sel) {
7116         case 0:
7117             gen_helper_mtc0_wired(cpu_env, arg);
7118             rn = "Wired";
7119             break;
7120         case 1:
7121             check_insn(ctx, ISA_MIPS32R2);
7122             gen_helper_mtc0_srsconf0(cpu_env, arg);
7123             rn = "SRSConf0";
7124             break;
7125         case 2:
7126             check_insn(ctx, ISA_MIPS32R2);
7127             gen_helper_mtc0_srsconf1(cpu_env, arg);
7128             rn = "SRSConf1";
7129             break;
7130         case 3:
7131             check_insn(ctx, ISA_MIPS32R2);
7132             gen_helper_mtc0_srsconf2(cpu_env, arg);
7133             rn = "SRSConf2";
7134             break;
7135         case 4:
7136             check_insn(ctx, ISA_MIPS32R2);
7137             gen_helper_mtc0_srsconf3(cpu_env, arg);
7138             rn = "SRSConf3";
7139             break;
7140         case 5:
7141             check_insn(ctx, ISA_MIPS32R2);
7142             gen_helper_mtc0_srsconf4(cpu_env, arg);
7143             rn = "SRSConf4";
7144             break;
7145         default:
7146             goto cp0_unimplemented;
7147         }
7148         break;
7149     case 7:
7150         switch (sel) {
7151         case 0:
7152             check_insn(ctx, ISA_MIPS32R2);
7153             gen_helper_mtc0_hwrena(cpu_env, arg);
7154             ctx->bstate = BS_STOP;
7155             rn = "HWREna";
7156             break;
7157         default:
7158             goto cp0_unimplemented;
7159         }
7160         break;
7161     case 8:
7162         switch (sel) {
7163         case 0:
7164             /* ignored */
7165             rn = "BadVAddr";
7166             break;
7167         case 1:
7168             /* ignored */
7169             rn = "BadInstr";
7170             break;
7171         case 2:
7172             /* ignored */
7173             rn = "BadInstrP";
7174             break;
7175         default:
7176             goto cp0_unimplemented;
7177         }
7178         break;
7179     case 9:
7180         switch (sel) {
7181         case 0:
7182             gen_helper_mtc0_count(cpu_env, arg);
7183             rn = "Count";
7184             break;
7185         /* 6,7 are implementation dependent */
7186         default:
7187             goto cp0_unimplemented;
7188         }
7189         /* Stop translation as we may have switched the execution mode */
7190         ctx->bstate = BS_STOP;
7191         break;
7192     case 10:
7193         switch (sel) {
7194         case 0:
7195             gen_helper_mtc0_entryhi(cpu_env, arg);
7196             rn = "EntryHi";
7197             break;
7198         default:
7199             goto cp0_unimplemented;
7200         }
7201         break;
7202     case 11:
7203         switch (sel) {
7204         case 0:
7205             gen_helper_mtc0_compare(cpu_env, arg);
7206             rn = "Compare";
7207             break;
7208         /* 6,7 are implementation dependent */
7209         default:
7210             goto cp0_unimplemented;
7211         }
7212         /* Stop translation as we may have switched the execution mode */
7213         ctx->bstate = BS_STOP;
7214         break;
7215     case 12:
7216         switch (sel) {
7217         case 0:
7218             save_cpu_state(ctx, 1);
7219             gen_helper_mtc0_status(cpu_env, arg);
7220             /* BS_STOP isn't good enough here, hflags may have changed. */
7221             gen_save_pc(ctx->pc + 4);
7222             ctx->bstate = BS_EXCP;
7223             rn = "Status";
7224             break;
7225         case 1:
7226             check_insn(ctx, ISA_MIPS32R2);
7227             gen_helper_mtc0_intctl(cpu_env, arg);
7228             /* Stop translation as we may have switched the execution mode */
7229             ctx->bstate = BS_STOP;
7230             rn = "IntCtl";
7231             break;
7232         case 2:
7233             check_insn(ctx, ISA_MIPS32R2);
7234             gen_helper_mtc0_srsctl(cpu_env, arg);
7235             /* Stop translation as we may have switched the execution mode */
7236             ctx->bstate = BS_STOP;
7237             rn = "SRSCtl";
7238             break;
7239         case 3:
7240             check_insn(ctx, ISA_MIPS32R2);
7241             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
7242             /* Stop translation as we may have switched the execution mode */
7243             ctx->bstate = BS_STOP;
7244             rn = "SRSMap";
7245             break;
7246         default:
7247             goto cp0_unimplemented;
7248         }
7249         break;
7250     case 13:
7251         switch (sel) {
7252         case 0:
7253             save_cpu_state(ctx, 1);
7254             /* Mark as an IO operation because we may trigger a software
7255                interrupt.  */
7256             if (ctx->tb->cflags & CF_USE_ICOUNT) {
7257                 gen_io_start();
7258             }
7259             gen_helper_mtc0_cause(cpu_env, arg);
7260             if (ctx->tb->cflags & CF_USE_ICOUNT) {
7261                 gen_io_end();
7262             }
7263             /* Stop translation as we may have triggered an intetrupt */
7264             ctx->bstate = BS_STOP;
7265             rn = "Cause";
7266             break;
7267         default:
7268             goto cp0_unimplemented;
7269         }
7270         break;
7271     case 14:
7272         switch (sel) {
7273         case 0:
7274             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
7275             rn = "EPC";
7276             break;
7277         default:
7278             goto cp0_unimplemented;
7279         }
7280         break;
7281     case 15:
7282         switch (sel) {
7283         case 0:
7284             /* ignored */
7285             rn = "PRid";
7286             break;
7287         case 1:
7288             check_insn(ctx, ISA_MIPS32R2);
7289             gen_helper_mtc0_ebase(cpu_env, arg);
7290             rn = "EBase";
7291             break;
7292         default:
7293             goto cp0_unimplemented;
7294         }
7295         break;
7296     case 16:
7297         switch (sel) {
7298         case 0:
7299             gen_helper_mtc0_config0(cpu_env, arg);
7300             rn = "Config";
7301             /* Stop translation as we may have switched the execution mode */
7302             ctx->bstate = BS_STOP;
7303             break;
7304         case 1:
7305             /* ignored, read only */
7306             rn = "Config1";
7307             break;
7308         case 2:
7309             gen_helper_mtc0_config2(cpu_env, arg);
7310             rn = "Config2";
7311             /* Stop translation as we may have switched the execution mode */
7312             ctx->bstate = BS_STOP;
7313             break;
7314         case 3:
7315             gen_helper_mtc0_config3(cpu_env, arg);
7316             rn = "Config3";
7317             /* Stop translation as we may have switched the execution mode */
7318             ctx->bstate = BS_STOP;
7319             break;
7320         case 4:
7321             /* currently ignored */
7322             rn = "Config4";
7323             break;
7324         case 5:
7325             gen_helper_mtc0_config5(cpu_env, arg);
7326             rn = "Config5";
7327             /* Stop translation as we may have switched the execution mode */
7328             ctx->bstate = BS_STOP;
7329             break;
7330         /* 6,7 are implementation dependent */
7331         default:
7332             rn = "Invalid config selector";
7333             goto cp0_unimplemented;
7334         }
7335         break;
7336     case 17:
7337         switch (sel) {
7338         case 0:
7339             gen_helper_mtc0_lladdr(cpu_env, arg);
7340             rn = "LLAddr";
7341             break;
7342         case 1:
7343             CP0_CHECK(ctx->mrp);
7344             gen_helper_mtc0_maar(cpu_env, arg);
7345             rn = "MAAR";
7346             break;
7347         case 2:
7348             CP0_CHECK(ctx->mrp);
7349             gen_helper_mtc0_maari(cpu_env, arg);
7350             rn = "MAARI";
7351             break;
7352         default:
7353             goto cp0_unimplemented;
7354         }
7355         break;
7356     case 18:
7357         switch (sel) {
7358         case 0 ... 7:
7359             gen_helper_0e1i(mtc0_watchlo, arg, sel);
7360             rn = "WatchLo";
7361             break;
7362         default:
7363             goto cp0_unimplemented;
7364         }
7365         break;
7366     case 19:
7367         switch (sel) {
7368         case 0 ... 7:
7369             gen_helper_0e1i(mtc0_watchhi, arg, sel);
7370             rn = "WatchHi";
7371             break;
7372         default:
7373             goto cp0_unimplemented;
7374         }
7375         break;
7376     case 20:
7377         switch (sel) {
7378         case 0:
7379             check_insn(ctx, ISA_MIPS3);
7380             gen_helper_mtc0_xcontext(cpu_env, arg);
7381             rn = "XContext";
7382             break;
7383         default:
7384             goto cp0_unimplemented;
7385         }
7386         break;
7387     case 21:
7388        /* Officially reserved, but sel 0 is used for R1x000 framemask */
7389         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS32R6));
7390         switch (sel) {
7391         case 0:
7392             gen_helper_mtc0_framemask(cpu_env, arg);
7393             rn = "Framemask";
7394             break;
7395         default:
7396             goto cp0_unimplemented;
7397         }
7398         break;
7399     case 22:
7400         /* ignored */
7401         rn = "Diagnostic"; /* implementation dependent */
7402         break;
7403     case 23:
7404         switch (sel) {
7405         case 0:
7406             gen_helper_mtc0_debug(cpu_env, arg); /* EJTAG support */
7407             /* BS_STOP isn't good enough here, hflags may have changed. */
7408             gen_save_pc(ctx->pc + 4);
7409             ctx->bstate = BS_EXCP;
7410             rn = "Debug";
7411             break;
7412         case 1:
7413 //            gen_helper_mtc0_tracecontrol(cpu_env, arg); /* PDtrace support */
7414             /* Stop translation as we may have switched the execution mode */
7415             ctx->bstate = BS_STOP;
7416             rn = "TraceControl";
7417 //            break;
7418         case 2:
7419 //            gen_helper_mtc0_tracecontrol2(cpu_env, arg); /* PDtrace support */
7420             /* Stop translation as we may have switched the execution mode */
7421             ctx->bstate = BS_STOP;
7422             rn = "TraceControl2";
7423 //            break;
7424         case 3:
7425 //            gen_helper_mtc0_usertracedata(cpu_env, arg); /* PDtrace support */
7426             /* Stop translation as we may have switched the execution mode */
7427             ctx->bstate = BS_STOP;
7428             rn = "UserTraceData";
7429 //            break;
7430         case 4:
7431 //            gen_helper_mtc0_tracebpc(cpu_env, arg); /* PDtrace support */
7432             /* Stop translation as we may have switched the execution mode */
7433             ctx->bstate = BS_STOP;
7434             rn = "TraceBPC";
7435 //            break;
7436         default:
7437             goto cp0_unimplemented;
7438         }
7439         break;
7440     case 24:
7441         switch (sel) {
7442         case 0:
7443             /* EJTAG support */
7444             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
7445             rn = "DEPC";
7446             break;
7447         default:
7448             goto cp0_unimplemented;
7449         }
7450         break;
7451     case 25:
7452         switch (sel) {
7453         case 0:
7454             gen_helper_mtc0_performance0(cpu_env, arg);
7455             rn = "Performance0";
7456             break;
7457         case 1:
7458 //            gen_helper_mtc0_performance1(cpu_env, arg);
7459             rn = "Performance1";
7460 //            break;
7461         case 2:
7462 //            gen_helper_mtc0_performance2(cpu_env, arg);
7463             rn = "Performance2";
7464 //            break;
7465         case 3:
7466 //            gen_helper_mtc0_performance3(cpu_env, arg);
7467             rn = "Performance3";
7468 //            break;
7469         case 4:
7470 //            gen_helper_mtc0_performance4(cpu_env, arg);
7471             rn = "Performance4";
7472 //            break;
7473         case 5:
7474 //            gen_helper_mtc0_performance5(cpu_env, arg);
7475             rn = "Performance5";
7476 //            break;
7477         case 6:
7478 //            gen_helper_mtc0_performance6(cpu_env, arg);
7479             rn = "Performance6";
7480 //            break;
7481         case 7:
7482 //            gen_helper_mtc0_performance7(cpu_env, arg);
7483             rn = "Performance7";
7484 //            break;
7485         default:
7486             goto cp0_unimplemented;
7487         }
7488         break;
7489     case 26:
7490         switch (sel) {
7491         case 0:
7492             gen_helper_mtc0_errctl(cpu_env, arg);
7493             ctx->bstate = BS_STOP;
7494             rn = "ErrCtl";
7495             break;
7496         default:
7497             goto cp0_unimplemented;
7498         }
7499         break;
7500     case 27:
7501         switch (sel) {
7502         case 0 ... 3:
7503             /* ignored */
7504             rn = "CacheErr";
7505             break;
7506         default:
7507             goto cp0_unimplemented;
7508         }
7509         break;
7510     case 28:
7511         switch (sel) {
7512         case 0:
7513         case 2:
7514         case 4:
7515         case 6:
7516             gen_helper_mtc0_taglo(cpu_env, arg);
7517             rn = "TagLo";
7518             break;
7519         case 1:
7520         case 3:
7521         case 5:
7522         case 7:
7523             gen_helper_mtc0_datalo(cpu_env, arg);
7524             rn = "DataLo";
7525             break;
7526         default:
7527             goto cp0_unimplemented;
7528         }
7529         break;
7530     case 29:
7531         switch (sel) {
7532         case 0:
7533         case 2:
7534         case 4:
7535         case 6:
7536             gen_helper_mtc0_taghi(cpu_env, arg);
7537             rn = "TagHi";
7538             break;
7539         case 1:
7540         case 3:
7541         case 5:
7542         case 7:
7543             gen_helper_mtc0_datahi(cpu_env, arg);
7544             rn = "DataHi";
7545             break;
7546         default:
7547             rn = "invalid sel";
7548             goto cp0_unimplemented;
7549         }
7550         break;
7551     case 30:
7552         switch (sel) {
7553         case 0:
7554             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
7555             rn = "ErrorEPC";
7556             break;
7557         default:
7558             goto cp0_unimplemented;
7559         }
7560         break;
7561     case 31:
7562         switch (sel) {
7563         case 0:
7564             /* EJTAG support */
7565             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
7566             rn = "DESAVE";
7567             break;
7568         case 2 ... 7:
7569             CP0_CHECK(ctx->kscrexist & (1 << sel));
7570             tcg_gen_st_tl(arg, cpu_env,
7571                           offsetof(CPUMIPSState, CP0_KScratch[sel-2]));
7572             rn = "KScratch";
7573             break;
7574         default:
7575             goto cp0_unimplemented;
7576         }
7577         /* Stop translation as we may have switched the execution mode */
7578         ctx->bstate = BS_STOP;
7579         break;
7580     default:
7581         goto cp0_unimplemented;
7582     }
7583     (void)rn; /* avoid a compiler warning */
7584     LOG_DISAS("dmtc0 %s (reg %d sel %d)\n", rn, reg, sel);
7585     /* For simplicity assume that all writes can cause interrupts.  */
7586     if (ctx->tb->cflags & CF_USE_ICOUNT) {
7587         gen_io_end();
7588         ctx->bstate = BS_STOP;
7589     }
7590     return;
7591
7592 cp0_unimplemented:
7593     LOG_DISAS("dmtc0 %s (reg %d sel %d)\n", rn, reg, sel);
7594 }
7595 #endif /* TARGET_MIPS64 */
7596
7597 static void gen_mftr(CPUMIPSState *env, DisasContext *ctx, int rt, int rd,
7598                      int u, int sel, int h)
7599 {
7600     int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
7601     TCGv t0 = tcg_temp_local_new();
7602
7603     if ((env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) == 0 &&
7604         ((env->tcs[other_tc].CP0_TCBind & (0xf << CP0TCBd_CurVPE)) !=
7605          (env->active_tc.CP0_TCBind & (0xf << CP0TCBd_CurVPE))))
7606         tcg_gen_movi_tl(t0, -1);
7607     else if ((env->CP0_VPEControl & (0xff << CP0VPECo_TargTC)) >
7608              (env->mvp->CP0_MVPConf0 & (0xff << CP0MVPC0_PTC)))
7609         tcg_gen_movi_tl(t0, -1);
7610     else if (u == 0) {
7611         switch (rt) {
7612         case 1:
7613             switch (sel) {
7614             case 1:
7615                 gen_helper_mftc0_vpecontrol(t0, cpu_env);
7616                 break;
7617             case 2:
7618                 gen_helper_mftc0_vpeconf0(t0, cpu_env);
7619                 break;
7620             default:
7621                 goto die;
7622                 break;
7623             }
7624             break;
7625         case 2:
7626             switch (sel) {
7627             case 1:
7628                 gen_helper_mftc0_tcstatus(t0, cpu_env);
7629                 break;
7630             case 2:
7631                 gen_helper_mftc0_tcbind(t0, cpu_env);
7632                 break;
7633             case 3:
7634                 gen_helper_mftc0_tcrestart(t0, cpu_env);
7635                 break;
7636             case 4:
7637                 gen_helper_mftc0_tchalt(t0, cpu_env);
7638                 break;
7639             case 5:
7640                 gen_helper_mftc0_tccontext(t0, cpu_env);
7641                 break;
7642             case 6:
7643                 gen_helper_mftc0_tcschedule(t0, cpu_env);
7644                 break;
7645             case 7:
7646                 gen_helper_mftc0_tcschefback(t0, cpu_env);
7647                 break;
7648             default:
7649                 gen_mfc0(ctx, t0, rt, sel);
7650                 break;
7651             }
7652             break;
7653         case 10:
7654             switch (sel) {
7655             case 0:
7656                 gen_helper_mftc0_entryhi(t0, cpu_env);
7657                 break;
7658             default:
7659                 gen_mfc0(ctx, t0, rt, sel);
7660                 break;
7661             }
7662         case 12:
7663             switch (sel) {
7664             case 0:
7665                 gen_helper_mftc0_status(t0, cpu_env);
7666                 break;
7667             default:
7668                 gen_mfc0(ctx, t0, rt, sel);
7669                 break;
7670             }
7671         case 13:
7672             switch (sel) {
7673             case 0:
7674                 gen_helper_mftc0_cause(t0, cpu_env);
7675                 break;
7676             default:
7677                 goto die;
7678                 break;
7679             }
7680             break;
7681         case 14:
7682             switch (sel) {
7683             case 0:
7684                 gen_helper_mftc0_epc(t0, cpu_env);
7685                 break;
7686             default:
7687                 goto die;
7688                 break;
7689             }
7690             break;
7691         case 15:
7692             switch (sel) {
7693             case 1:
7694                 gen_helper_mftc0_ebase(t0, cpu_env);
7695                 break;
7696             default:
7697                 goto die;
7698                 break;
7699             }
7700             break;
7701         case 16:
7702             switch (sel) {
7703             case 0 ... 7:
7704                 gen_helper_mftc0_configx(t0, cpu_env, tcg_const_tl(sel));
7705                 break;
7706             default:
7707                 goto die;
7708                 break;
7709             }
7710             break;
7711         case 23:
7712             switch (sel) {
7713             case 0:
7714                 gen_helper_mftc0_debug(t0, cpu_env);
7715                 break;
7716             default:
7717                 gen_mfc0(ctx, t0, rt, sel);
7718                 break;
7719             }
7720             break;
7721         default:
7722             gen_mfc0(ctx, t0, rt, sel);
7723         }
7724     } else switch (sel) {
7725     /* GPR registers. */
7726     case 0:
7727         gen_helper_1e0i(mftgpr, t0, rt);
7728         break;
7729     /* Auxiliary CPU registers */
7730     case 1:
7731         switch (rt) {
7732         case 0:
7733             gen_helper_1e0i(mftlo, t0, 0);
7734             break;
7735         case 1:
7736             gen_helper_1e0i(mfthi, t0, 0);
7737             break;
7738         case 2:
7739             gen_helper_1e0i(mftacx, t0, 0);
7740             break;
7741         case 4:
7742             gen_helper_1e0i(mftlo, t0, 1);
7743             break;
7744         case 5:
7745             gen_helper_1e0i(mfthi, t0, 1);
7746             break;
7747         case 6:
7748             gen_helper_1e0i(mftacx, t0, 1);
7749             break;
7750         case 8:
7751             gen_helper_1e0i(mftlo, t0, 2);
7752             break;
7753         case 9:
7754             gen_helper_1e0i(mfthi, t0, 2);
7755             break;
7756         case 10:
7757             gen_helper_1e0i(mftacx, t0, 2);
7758             break;
7759         case 12:
7760             gen_helper_1e0i(mftlo, t0, 3);
7761             break;
7762         case 13:
7763             gen_helper_1e0i(mfthi, t0, 3);
7764             break;
7765         case 14:
7766             gen_helper_1e0i(mftacx, t0, 3);
7767             break;
7768         case 16:
7769             gen_helper_mftdsp(t0, cpu_env);
7770             break;
7771         default:
7772             goto die;
7773         }
7774         break;
7775     /* Floating point (COP1). */
7776     case 2:
7777         /* XXX: For now we support only a single FPU context. */
7778         if (h == 0) {
7779             TCGv_i32 fp0 = tcg_temp_new_i32();
7780
7781             gen_load_fpr32(ctx, fp0, rt);
7782             tcg_gen_ext_i32_tl(t0, fp0);
7783             tcg_temp_free_i32(fp0);
7784         } else {
7785             TCGv_i32 fp0 = tcg_temp_new_i32();
7786
7787             gen_load_fpr32h(ctx, fp0, rt);
7788             tcg_gen_ext_i32_tl(t0, fp0);
7789             tcg_temp_free_i32(fp0);
7790         }
7791         break;
7792     case 3:
7793         /* XXX: For now we support only a single FPU context. */
7794         gen_helper_1e0i(cfc1, t0, rt);
7795         break;
7796     /* COP2: Not implemented. */
7797     case 4:
7798     case 5:
7799         /* fall through */
7800     default:
7801         goto die;
7802     }
7803     LOG_DISAS("mftr (reg %d u %d sel %d h %d)\n", rt, u, sel, h);
7804     gen_store_gpr(t0, rd);
7805     tcg_temp_free(t0);
7806     return;
7807
7808 die:
7809     tcg_temp_free(t0);
7810     LOG_DISAS("mftr (reg %d u %d sel %d h %d)\n", rt, u, sel, h);
7811     generate_exception_end(ctx, EXCP_RI);
7812 }
7813
7814 static void gen_mttr(CPUMIPSState *env, DisasContext *ctx, int rd, int rt,
7815                      int u, int sel, int h)
7816 {
7817     int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
7818     TCGv t0 = tcg_temp_local_new();
7819
7820     gen_load_gpr(t0, rt);
7821     if ((env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) == 0 &&
7822         ((env->tcs[other_tc].CP0_TCBind & (0xf << CP0TCBd_CurVPE)) !=
7823          (env->active_tc.CP0_TCBind & (0xf << CP0TCBd_CurVPE))))
7824         /* NOP */ ;
7825     else if ((env->CP0_VPEControl & (0xff << CP0VPECo_TargTC)) >
7826              (env->mvp->CP0_MVPConf0 & (0xff << CP0MVPC0_PTC)))
7827         /* NOP */ ;
7828     else if (u == 0) {
7829         switch (rd) {
7830         case 1:
7831             switch (sel) {
7832             case 1:
7833                 gen_helper_mttc0_vpecontrol(cpu_env, t0);
7834                 break;
7835             case 2:
7836                 gen_helper_mttc0_vpeconf0(cpu_env, t0);
7837                 break;
7838             default:
7839                 goto die;
7840                 break;
7841             }
7842             break;
7843         case 2:
7844             switch (sel) {
7845             case 1:
7846                 gen_helper_mttc0_tcstatus(cpu_env, t0);
7847                 break;
7848             case 2:
7849                 gen_helper_mttc0_tcbind(cpu_env, t0);
7850                 break;
7851             case 3:
7852                 gen_helper_mttc0_tcrestart(cpu_env, t0);
7853                 break;
7854             case 4:
7855                 gen_helper_mttc0_tchalt(cpu_env, t0);
7856                 break;
7857             case 5:
7858                 gen_helper_mttc0_tccontext(cpu_env, t0);
7859                 break;
7860             case 6:
7861                 gen_helper_mttc0_tcschedule(cpu_env, t0);
7862                 break;
7863             case 7:
7864                 gen_helper_mttc0_tcschefback(cpu_env, t0);
7865                 break;
7866             default:
7867                 gen_mtc0(ctx, t0, rd, sel);
7868                 break;
7869             }
7870             break;
7871         case 10:
7872             switch (sel) {
7873             case 0:
7874                 gen_helper_mttc0_entryhi(cpu_env, t0);
7875                 break;
7876             default:
7877                 gen_mtc0(ctx, t0, rd, sel);
7878                 break;
7879             }
7880         case 12:
7881             switch (sel) {
7882             case 0:
7883                 gen_helper_mttc0_status(cpu_env, t0);
7884                 break;
7885             default:
7886                 gen_mtc0(ctx, t0, rd, sel);
7887                 break;
7888             }
7889         case 13:
7890             switch (sel) {
7891             case 0:
7892                 gen_helper_mttc0_cause(cpu_env, t0);
7893                 break;
7894             default:
7895                 goto die;
7896                 break;
7897             }
7898             break;
7899         case 15:
7900             switch (sel) {
7901             case 1:
7902                 gen_helper_mttc0_ebase(cpu_env, t0);
7903                 break;
7904             default:
7905                 goto die;
7906                 break;
7907             }
7908             break;
7909         case 23:
7910             switch (sel) {
7911             case 0:
7912                 gen_helper_mttc0_debug(cpu_env, t0);
7913                 break;
7914             default:
7915                 gen_mtc0(ctx, t0, rd, sel);
7916                 break;
7917             }
7918             break;
7919         default:
7920             gen_mtc0(ctx, t0, rd, sel);
7921         }
7922     } else switch (sel) {
7923     /* GPR registers. */
7924     case 0:
7925         gen_helper_0e1i(mttgpr, t0, rd);
7926         break;
7927     /* Auxiliary CPU registers */
7928     case 1:
7929         switch (rd) {
7930         case 0:
7931             gen_helper_0e1i(mttlo, t0, 0);
7932             break;
7933         case 1:
7934             gen_helper_0e1i(mtthi, t0, 0);
7935             break;
7936         case 2:
7937             gen_helper_0e1i(mttacx, t0, 0);
7938             break;
7939         case 4:
7940             gen_helper_0e1i(mttlo, t0, 1);
7941             break;
7942         case 5:
7943             gen_helper_0e1i(mtthi, t0, 1);
7944             break;
7945         case 6:
7946             gen_helper_0e1i(mttacx, t0, 1);
7947             break;
7948         case 8:
7949             gen_helper_0e1i(mttlo, t0, 2);
7950             break;
7951         case 9:
7952             gen_helper_0e1i(mtthi, t0, 2);
7953             break;
7954         case 10:
7955             gen_helper_0e1i(mttacx, t0, 2);
7956             break;
7957         case 12:
7958             gen_helper_0e1i(mttlo, t0, 3);
7959             break;
7960         case 13:
7961             gen_helper_0e1i(mtthi, t0, 3);
7962             break;
7963         case 14:
7964             gen_helper_0e1i(mttacx, t0, 3);
7965             break;
7966         case 16:
7967             gen_helper_mttdsp(cpu_env, t0);
7968             break;
7969         default:
7970             goto die;
7971         }
7972         break;
7973     /* Floating point (COP1). */
7974     case 2:
7975         /* XXX: For now we support only a single FPU context. */
7976         if (h == 0) {
7977             TCGv_i32 fp0 = tcg_temp_new_i32();
7978
7979             tcg_gen_trunc_tl_i32(fp0, t0);
7980             gen_store_fpr32(ctx, fp0, rd);
7981             tcg_temp_free_i32(fp0);
7982         } else {
7983             TCGv_i32 fp0 = tcg_temp_new_i32();
7984
7985             tcg_gen_trunc_tl_i32(fp0, t0);
7986             gen_store_fpr32h(ctx, fp0, rd);
7987             tcg_temp_free_i32(fp0);
7988         }
7989         break;
7990     case 3:
7991         /* XXX: For now we support only a single FPU context. */
7992         {
7993             TCGv_i32 fs_tmp = tcg_const_i32(rd);
7994
7995             gen_helper_0e2i(ctc1, t0, fs_tmp, rt);
7996             tcg_temp_free_i32(fs_tmp);
7997         }
7998         /* Stop translation as we may have changed hflags */
7999         ctx->bstate = BS_STOP;
8000         break;
8001     /* COP2: Not implemented. */
8002     case 4:
8003     case 5:
8004         /* fall through */
8005     default:
8006         goto die;
8007     }
8008     LOG_DISAS("mttr (reg %d u %d sel %d h %d)\n", rd, u, sel, h);
8009     tcg_temp_free(t0);
8010     return;
8011
8012 die:
8013     tcg_temp_free(t0);
8014     LOG_DISAS("mttr (reg %d u %d sel %d h %d)\n", rd, u, sel, h);
8015     generate_exception_end(ctx, EXCP_RI);
8016 }
8017
8018 static void gen_cp0 (CPUMIPSState *env, DisasContext *ctx, uint32_t opc, int rt, int rd)
8019 {
8020     const char *opn = "ldst";
8021
8022     check_cp0_enabled(ctx);
8023     switch (opc) {
8024     case OPC_MFC0:
8025         if (rt == 0) {
8026             /* Treat as NOP. */
8027             return;
8028         }
8029         gen_mfc0(ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
8030         opn = "mfc0";
8031         break;
8032     case OPC_MTC0:
8033         {
8034             TCGv t0 = tcg_temp_new();
8035
8036             gen_load_gpr(t0, rt);
8037             gen_mtc0(ctx, t0, rd, ctx->opcode & 0x7);
8038             tcg_temp_free(t0);
8039         }
8040         opn = "mtc0";
8041         break;
8042 #if defined(TARGET_MIPS64)
8043     case OPC_DMFC0:
8044         check_insn(ctx, ISA_MIPS3);
8045         if (rt == 0) {
8046             /* Treat as NOP. */
8047             return;
8048         }
8049         gen_dmfc0(ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
8050         opn = "dmfc0";
8051         break;
8052     case OPC_DMTC0:
8053         check_insn(ctx, ISA_MIPS3);
8054         {
8055             TCGv t0 = tcg_temp_new();
8056
8057             gen_load_gpr(t0, rt);
8058             gen_dmtc0(ctx, t0, rd, ctx->opcode & 0x7);
8059             tcg_temp_free(t0);
8060         }
8061         opn = "dmtc0";
8062         break;
8063 #endif
8064     case OPC_MFHC0:
8065         check_mvh(ctx);
8066         if (rt == 0) {
8067             /* Treat as NOP. */
8068             return;
8069         }
8070         gen_mfhc0(ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
8071         opn = "mfhc0";
8072         break;
8073     case OPC_MTHC0:
8074         check_mvh(ctx);
8075         {
8076             TCGv t0 = tcg_temp_new();
8077             gen_load_gpr(t0, rt);
8078             gen_mthc0(ctx, t0, rd, ctx->opcode & 0x7);
8079             tcg_temp_free(t0);
8080         }
8081         opn = "mthc0";
8082         break;
8083     case OPC_MFTR:
8084         check_insn(ctx, ASE_MT);
8085         if (rd == 0) {
8086             /* Treat as NOP. */
8087             return;
8088         }
8089         gen_mftr(env, ctx, rt, rd, (ctx->opcode >> 5) & 1,
8090                  ctx->opcode & 0x7, (ctx->opcode >> 4) & 1);
8091         opn = "mftr";
8092         break;
8093     case OPC_MTTR:
8094         check_insn(ctx, ASE_MT);
8095         gen_mttr(env, ctx, rd, rt, (ctx->opcode >> 5) & 1,
8096                  ctx->opcode & 0x7, (ctx->opcode >> 4) & 1);
8097         opn = "mttr";
8098         break;
8099     case OPC_TLBWI:
8100         opn = "tlbwi";
8101         if (!env->tlb->helper_tlbwi)
8102             goto die;
8103         gen_helper_tlbwi(cpu_env);
8104         break;
8105     case OPC_TLBINV:
8106         opn = "tlbinv";
8107         if (ctx->ie >= 2) {
8108             if (!env->tlb->helper_tlbinv) {
8109                 goto die;
8110             }
8111             gen_helper_tlbinv(cpu_env);
8112         } /* treat as nop if TLBINV not supported */
8113         break;
8114     case OPC_TLBINVF:
8115         opn = "tlbinvf";
8116         if (ctx->ie >= 2) {
8117             if (!env->tlb->helper_tlbinvf) {
8118                 goto die;
8119             }
8120             gen_helper_tlbinvf(cpu_env);
8121         } /* treat as nop if TLBINV not supported */
8122         break;
8123     case OPC_TLBWR:
8124         opn = "tlbwr";
8125         if (!env->tlb->helper_tlbwr)
8126             goto die;
8127         gen_helper_tlbwr(cpu_env);
8128         break;
8129     case OPC_TLBP:
8130         opn = "tlbp";
8131         if (!env->tlb->helper_tlbp)
8132             goto die;
8133         gen_helper_tlbp(cpu_env);
8134         break;
8135     case OPC_TLBR:
8136         opn = "tlbr";
8137         if (!env->tlb->helper_tlbr)
8138             goto die;
8139         gen_helper_tlbr(cpu_env);
8140         break;
8141     case OPC_ERET: /* OPC_ERETNC */
8142         if ((ctx->insn_flags & ISA_MIPS32R6) &&
8143             (ctx->hflags & MIPS_HFLAG_BMASK)) {
8144             goto die;
8145         } else {
8146             int bit_shift = (ctx->hflags & MIPS_HFLAG_M16) ? 16 : 6;
8147             if (ctx->opcode & (1 << bit_shift)) {
8148                 /* OPC_ERETNC */
8149                 opn = "eretnc";
8150                 check_insn(ctx, ISA_MIPS32R5);
8151                 gen_helper_eretnc(cpu_env);
8152             } else {
8153                 /* OPC_ERET */
8154                 opn = "eret";
8155                 check_insn(ctx, ISA_MIPS2);
8156                 gen_helper_eret(cpu_env);
8157             }
8158             ctx->bstate = BS_EXCP;
8159         }
8160         break;
8161     case OPC_DERET:
8162         opn = "deret";
8163         check_insn(ctx, ISA_MIPS32);
8164         if ((ctx->insn_flags & ISA_MIPS32R6) &&
8165             (ctx->hflags & MIPS_HFLAG_BMASK)) {
8166             goto die;
8167         }
8168         if (!(ctx->hflags & MIPS_HFLAG_DM)) {
8169             MIPS_INVAL(opn);
8170             generate_exception_end(ctx, EXCP_RI);
8171         } else {
8172             gen_helper_deret(cpu_env);
8173             ctx->bstate = BS_EXCP;
8174         }
8175         break;
8176     case OPC_WAIT:
8177         opn = "wait";
8178         check_insn(ctx, ISA_MIPS3 | ISA_MIPS32);
8179         if ((ctx->insn_flags & ISA_MIPS32R6) &&
8180             (ctx->hflags & MIPS_HFLAG_BMASK)) {
8181             goto die;
8182         }
8183         /* If we get an exception, we want to restart at next instruction */
8184         ctx->pc += 4;
8185         save_cpu_state(ctx, 1);
8186         ctx->pc -= 4;
8187         gen_helper_wait(cpu_env);
8188         ctx->bstate = BS_EXCP;
8189         break;
8190     default:
8191  die:
8192         MIPS_INVAL(opn);
8193         generate_exception_end(ctx, EXCP_RI);
8194         return;
8195     }
8196     (void)opn; /* avoid a compiler warning */
8197 }
8198 #endif /* !CONFIG_USER_ONLY */
8199
8200 /* CP1 Branches (before delay slot) */
8201 static void gen_compute_branch1(DisasContext *ctx, uint32_t op,
8202                                 int32_t cc, int32_t offset)
8203 {
8204     target_ulong btarget;
8205     TCGv_i32 t0 = tcg_temp_new_i32();
8206
8207     if ((ctx->insn_flags & ISA_MIPS32R6) && (ctx->hflags & MIPS_HFLAG_BMASK)) {
8208         generate_exception_end(ctx, EXCP_RI);
8209         goto out;
8210     }
8211
8212     if (cc != 0)
8213         check_insn(ctx, ISA_MIPS4 | ISA_MIPS32);
8214
8215     btarget = ctx->pc + 4 + offset;
8216
8217     switch (op) {
8218     case OPC_BC1F:
8219         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
8220         tcg_gen_not_i32(t0, t0);
8221         tcg_gen_andi_i32(t0, t0, 1);
8222         tcg_gen_extu_i32_tl(bcond, t0);
8223         goto not_likely;
8224     case OPC_BC1FL:
8225         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
8226         tcg_gen_not_i32(t0, t0);
8227         tcg_gen_andi_i32(t0, t0, 1);
8228         tcg_gen_extu_i32_tl(bcond, t0);
8229         goto likely;
8230     case OPC_BC1T:
8231         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
8232         tcg_gen_andi_i32(t0, t0, 1);
8233         tcg_gen_extu_i32_tl(bcond, t0);
8234         goto not_likely;
8235     case OPC_BC1TL:
8236         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
8237         tcg_gen_andi_i32(t0, t0, 1);
8238         tcg_gen_extu_i32_tl(bcond, t0);
8239     likely:
8240         ctx->hflags |= MIPS_HFLAG_BL;
8241         break;
8242     case OPC_BC1FANY2:
8243         {
8244             TCGv_i32 t1 = tcg_temp_new_i32();
8245             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
8246             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
8247             tcg_gen_nand_i32(t0, t0, t1);
8248             tcg_temp_free_i32(t1);
8249             tcg_gen_andi_i32(t0, t0, 1);
8250             tcg_gen_extu_i32_tl(bcond, t0);
8251         }
8252         goto not_likely;
8253     case OPC_BC1TANY2:
8254         {
8255             TCGv_i32 t1 = tcg_temp_new_i32();
8256             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
8257             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
8258             tcg_gen_or_i32(t0, t0, t1);
8259             tcg_temp_free_i32(t1);
8260             tcg_gen_andi_i32(t0, t0, 1);
8261             tcg_gen_extu_i32_tl(bcond, t0);
8262         }
8263         goto not_likely;
8264     case OPC_BC1FANY4:
8265         {
8266             TCGv_i32 t1 = tcg_temp_new_i32();
8267             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
8268             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
8269             tcg_gen_and_i32(t0, t0, t1);
8270             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+2));
8271             tcg_gen_and_i32(t0, t0, t1);
8272             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+3));
8273             tcg_gen_nand_i32(t0, t0, t1);
8274             tcg_temp_free_i32(t1);
8275             tcg_gen_andi_i32(t0, t0, 1);
8276             tcg_gen_extu_i32_tl(bcond, t0);
8277         }
8278         goto not_likely;
8279     case OPC_BC1TANY4:
8280         {
8281             TCGv_i32 t1 = tcg_temp_new_i32();
8282             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
8283             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
8284             tcg_gen_or_i32(t0, t0, t1);
8285             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+2));
8286             tcg_gen_or_i32(t0, t0, t1);
8287             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+3));
8288             tcg_gen_or_i32(t0, t0, t1);
8289             tcg_temp_free_i32(t1);
8290             tcg_gen_andi_i32(t0, t0, 1);
8291             tcg_gen_extu_i32_tl(bcond, t0);
8292         }
8293     not_likely:
8294         ctx->hflags |= MIPS_HFLAG_BC;
8295         break;
8296     default:
8297         MIPS_INVAL("cp1 cond branch");
8298         generate_exception_end(ctx, EXCP_RI);
8299         goto out;
8300     }
8301     ctx->btarget = btarget;
8302     ctx->hflags |= MIPS_HFLAG_BDS32;
8303  out:
8304     tcg_temp_free_i32(t0);
8305 }
8306
8307 /* R6 CP1 Branches */
8308 static void gen_compute_branch1_r6(DisasContext *ctx, uint32_t op,
8309                                    int32_t ft, int32_t offset,
8310                                    int delayslot_size)
8311 {
8312     target_ulong btarget;
8313     TCGv_i64 t0 = tcg_temp_new_i64();
8314
8315     if (ctx->hflags & MIPS_HFLAG_BMASK) {
8316 #ifdef MIPS_DEBUG_DISAS
8317         LOG_DISAS("Branch in delay / forbidden slot at PC 0x" TARGET_FMT_lx
8318                   "\n", ctx->pc);
8319 #endif
8320         generate_exception_end(ctx, EXCP_RI);
8321         goto out;
8322     }
8323
8324     gen_load_fpr64(ctx, t0, ft);
8325     tcg_gen_andi_i64(t0, t0, 1);
8326
8327     btarget = addr_add(ctx, ctx->pc + 4, offset);
8328
8329     switch (op) {
8330     case OPC_BC1EQZ:
8331         tcg_gen_xori_i64(t0, t0, 1);
8332         ctx->hflags |= MIPS_HFLAG_BC;
8333         break;
8334     case OPC_BC1NEZ:
8335         /* t0 already set */
8336         ctx->hflags |= MIPS_HFLAG_BC;
8337         break;
8338     default:
8339         MIPS_INVAL("cp1 cond branch");
8340         generate_exception_end(ctx, EXCP_RI);
8341         goto out;
8342     }
8343
8344     tcg_gen_trunc_i64_tl(bcond, t0);
8345
8346     ctx->btarget = btarget;
8347
8348     switch (delayslot_size) {
8349     case 2:
8350         ctx->hflags |= MIPS_HFLAG_BDS16;
8351         break;
8352     case 4:
8353         ctx->hflags |= MIPS_HFLAG_BDS32;
8354         break;
8355     }
8356
8357 out:
8358     tcg_temp_free_i64(t0);
8359 }
8360
8361 /* Coprocessor 1 (FPU) */
8362
8363 #define FOP(func, fmt) (((fmt) << 21) | (func))
8364
8365 enum fopcode {
8366     OPC_ADD_S = FOP(0, FMT_S),
8367     OPC_SUB_S = FOP(1, FMT_S),
8368     OPC_MUL_S = FOP(2, FMT_S),
8369     OPC_DIV_S = FOP(3, FMT_S),
8370     OPC_SQRT_S = FOP(4, FMT_S),
8371     OPC_ABS_S = FOP(5, FMT_S),
8372     OPC_MOV_S = FOP(6, FMT_S),
8373     OPC_NEG_S = FOP(7, FMT_S),
8374     OPC_ROUND_L_S = FOP(8, FMT_S),
8375     OPC_TRUNC_L_S = FOP(9, FMT_S),
8376     OPC_CEIL_L_S = FOP(10, FMT_S),
8377     OPC_FLOOR_L_S = FOP(11, FMT_S),
8378     OPC_ROUND_W_S = FOP(12, FMT_S),
8379     OPC_TRUNC_W_S = FOP(13, FMT_S),
8380     OPC_CEIL_W_S = FOP(14, FMT_S),
8381     OPC_FLOOR_W_S = FOP(15, FMT_S),
8382     OPC_SEL_S = FOP(16, FMT_S),
8383     OPC_MOVCF_S = FOP(17, FMT_S),
8384     OPC_MOVZ_S = FOP(18, FMT_S),
8385     OPC_MOVN_S = FOP(19, FMT_S),
8386     OPC_SELEQZ_S = FOP(20, FMT_S),
8387     OPC_RECIP_S = FOP(21, FMT_S),
8388     OPC_RSQRT_S = FOP(22, FMT_S),
8389     OPC_SELNEZ_S = FOP(23, FMT_S),
8390     OPC_MADDF_S = FOP(24, FMT_S),
8391     OPC_MSUBF_S = FOP(25, FMT_S),
8392     OPC_RINT_S = FOP(26, FMT_S),
8393     OPC_CLASS_S = FOP(27, FMT_S),
8394     OPC_MIN_S = FOP(28, FMT_S),
8395     OPC_RECIP2_S = FOP(28, FMT_S),
8396     OPC_MINA_S = FOP(29, FMT_S),
8397     OPC_RECIP1_S = FOP(29, FMT_S),
8398     OPC_MAX_S = FOP(30, FMT_S),
8399     OPC_RSQRT1_S = FOP(30, FMT_S),
8400     OPC_MAXA_S = FOP(31, FMT_S),
8401     OPC_RSQRT2_S = FOP(31, FMT_S),
8402     OPC_CVT_D_S = FOP(33, FMT_S),
8403     OPC_CVT_W_S = FOP(36, FMT_S),
8404     OPC_CVT_L_S = FOP(37, FMT_S),
8405     OPC_CVT_PS_S = FOP(38, FMT_S),
8406     OPC_CMP_F_S = FOP (48, FMT_S),
8407     OPC_CMP_UN_S = FOP (49, FMT_S),
8408     OPC_CMP_EQ_S = FOP (50, FMT_S),
8409     OPC_CMP_UEQ_S = FOP (51, FMT_S),
8410     OPC_CMP_OLT_S = FOP (52, FMT_S),
8411     OPC_CMP_ULT_S = FOP (53, FMT_S),
8412     OPC_CMP_OLE_S = FOP (54, FMT_S),
8413     OPC_CMP_ULE_S = FOP (55, FMT_S),
8414     OPC_CMP_SF_S = FOP (56, FMT_S),
8415     OPC_CMP_NGLE_S = FOP (57, FMT_S),
8416     OPC_CMP_SEQ_S = FOP (58, FMT_S),
8417     OPC_CMP_NGL_S = FOP (59, FMT_S),
8418     OPC_CMP_LT_S = FOP (60, FMT_S),
8419     OPC_CMP_NGE_S = FOP (61, FMT_S),
8420     OPC_CMP_LE_S = FOP (62, FMT_S),
8421     OPC_CMP_NGT_S = FOP (63, FMT_S),
8422
8423     OPC_ADD_D = FOP(0, FMT_D),
8424     OPC_SUB_D = FOP(1, FMT_D),
8425     OPC_MUL_D = FOP(2, FMT_D),
8426     OPC_DIV_D = FOP(3, FMT_D),
8427     OPC_SQRT_D = FOP(4, FMT_D),
8428     OPC_ABS_D = FOP(5, FMT_D),
8429     OPC_MOV_D = FOP(6, FMT_D),
8430     OPC_NEG_D = FOP(7, FMT_D),
8431     OPC_ROUND_L_D = FOP(8, FMT_D),
8432     OPC_TRUNC_L_D = FOP(9, FMT_D),
8433     OPC_CEIL_L_D = FOP(10, FMT_D),
8434     OPC_FLOOR_L_D = FOP(11, FMT_D),
8435     OPC_ROUND_W_D = FOP(12, FMT_D),
8436     OPC_TRUNC_W_D = FOP(13, FMT_D),
8437     OPC_CEIL_W_D = FOP(14, FMT_D),
8438     OPC_FLOOR_W_D = FOP(15, FMT_D),
8439     OPC_SEL_D = FOP(16, FMT_D),
8440     OPC_MOVCF_D = FOP(17, FMT_D),
8441     OPC_MOVZ_D = FOP(18, FMT_D),
8442     OPC_MOVN_D = FOP(19, FMT_D),
8443     OPC_SELEQZ_D = FOP(20, FMT_D),
8444     OPC_RECIP_D = FOP(21, FMT_D),
8445     OPC_RSQRT_D = FOP(22, FMT_D),
8446     OPC_SELNEZ_D = FOP(23, FMT_D),
8447     OPC_MADDF_D = FOP(24, FMT_D),
8448     OPC_MSUBF_D = FOP(25, FMT_D),
8449     OPC_RINT_D = FOP(26, FMT_D),
8450     OPC_CLASS_D = FOP(27, FMT_D),
8451     OPC_MIN_D = FOP(28, FMT_D),
8452     OPC_RECIP2_D = FOP(28, FMT_D),
8453     OPC_MINA_D = FOP(29, FMT_D),
8454     OPC_RECIP1_D = FOP(29, FMT_D),
8455     OPC_MAX_D = FOP(30, FMT_D),
8456     OPC_RSQRT1_D = FOP(30, FMT_D),
8457     OPC_MAXA_D = FOP(31, FMT_D),
8458     OPC_RSQRT2_D = FOP(31, FMT_D),
8459     OPC_CVT_S_D = FOP(32, FMT_D),
8460     OPC_CVT_W_D = FOP(36, FMT_D),
8461     OPC_CVT_L_D = FOP(37, FMT_D),
8462     OPC_CMP_F_D = FOP (48, FMT_D),
8463     OPC_CMP_UN_D = FOP (49, FMT_D),
8464     OPC_CMP_EQ_D = FOP (50, FMT_D),
8465     OPC_CMP_UEQ_D = FOP (51, FMT_D),
8466     OPC_CMP_OLT_D = FOP (52, FMT_D),
8467     OPC_CMP_ULT_D = FOP (53, FMT_D),
8468     OPC_CMP_OLE_D = FOP (54, FMT_D),
8469     OPC_CMP_ULE_D = FOP (55, FMT_D),
8470     OPC_CMP_SF_D = FOP (56, FMT_D),
8471     OPC_CMP_NGLE_D = FOP (57, FMT_D),
8472     OPC_CMP_SEQ_D = FOP (58, FMT_D),
8473     OPC_CMP_NGL_D = FOP (59, FMT_D),
8474     OPC_CMP_LT_D = FOP (60, FMT_D),
8475     OPC_CMP_NGE_D = FOP (61, FMT_D),
8476     OPC_CMP_LE_D = FOP (62, FMT_D),
8477     OPC_CMP_NGT_D = FOP (63, FMT_D),
8478
8479     OPC_CVT_S_W = FOP(32, FMT_W),
8480     OPC_CVT_D_W = FOP(33, FMT_W),
8481     OPC_CVT_S_L = FOP(32, FMT_L),
8482     OPC_CVT_D_L = FOP(33, FMT_L),
8483     OPC_CVT_PS_PW = FOP(38, FMT_W),
8484
8485     OPC_ADD_PS = FOP(0, FMT_PS),
8486     OPC_SUB_PS = FOP(1, FMT_PS),
8487     OPC_MUL_PS = FOP(2, FMT_PS),
8488     OPC_DIV_PS = FOP(3, FMT_PS),
8489     OPC_ABS_PS = FOP(5, FMT_PS),
8490     OPC_MOV_PS = FOP(6, FMT_PS),
8491     OPC_NEG_PS = FOP(7, FMT_PS),
8492     OPC_MOVCF_PS = FOP(17, FMT_PS),
8493     OPC_MOVZ_PS = FOP(18, FMT_PS),
8494     OPC_MOVN_PS = FOP(19, FMT_PS),
8495     OPC_ADDR_PS = FOP(24, FMT_PS),
8496     OPC_MULR_PS = FOP(26, FMT_PS),
8497     OPC_RECIP2_PS = FOP(28, FMT_PS),
8498     OPC_RECIP1_PS = FOP(29, FMT_PS),
8499     OPC_RSQRT1_PS = FOP(30, FMT_PS),
8500     OPC_RSQRT2_PS = FOP(31, FMT_PS),
8501
8502     OPC_CVT_S_PU = FOP(32, FMT_PS),
8503     OPC_CVT_PW_PS = FOP(36, FMT_PS),
8504     OPC_CVT_S_PL = FOP(40, FMT_PS),
8505     OPC_PLL_PS = FOP(44, FMT_PS),
8506     OPC_PLU_PS = FOP(45, FMT_PS),
8507     OPC_PUL_PS = FOP(46, FMT_PS),
8508     OPC_PUU_PS = FOP(47, FMT_PS),
8509     OPC_CMP_F_PS = FOP (48, FMT_PS),
8510     OPC_CMP_UN_PS = FOP (49, FMT_PS),
8511     OPC_CMP_EQ_PS = FOP (50, FMT_PS),
8512     OPC_CMP_UEQ_PS = FOP (51, FMT_PS),
8513     OPC_CMP_OLT_PS = FOP (52, FMT_PS),
8514     OPC_CMP_ULT_PS = FOP (53, FMT_PS),
8515     OPC_CMP_OLE_PS = FOP (54, FMT_PS),
8516     OPC_CMP_ULE_PS = FOP (55, FMT_PS),
8517     OPC_CMP_SF_PS = FOP (56, FMT_PS),
8518     OPC_CMP_NGLE_PS = FOP (57, FMT_PS),
8519     OPC_CMP_SEQ_PS = FOP (58, FMT_PS),
8520     OPC_CMP_NGL_PS = FOP (59, FMT_PS),
8521     OPC_CMP_LT_PS = FOP (60, FMT_PS),
8522     OPC_CMP_NGE_PS = FOP (61, FMT_PS),
8523     OPC_CMP_LE_PS = FOP (62, FMT_PS),
8524     OPC_CMP_NGT_PS = FOP (63, FMT_PS),
8525 };
8526
8527 enum r6_f_cmp_op {
8528     R6_OPC_CMP_AF_S   = FOP(0, FMT_W),
8529     R6_OPC_CMP_UN_S   = FOP(1, FMT_W),
8530     R6_OPC_CMP_EQ_S   = FOP(2, FMT_W),
8531     R6_OPC_CMP_UEQ_S  = FOP(3, FMT_W),
8532     R6_OPC_CMP_LT_S   = FOP(4, FMT_W),
8533     R6_OPC_CMP_ULT_S  = FOP(5, FMT_W),
8534     R6_OPC_CMP_LE_S   = FOP(6, FMT_W),
8535     R6_OPC_CMP_ULE_S  = FOP(7, FMT_W),
8536     R6_OPC_CMP_SAF_S  = FOP(8, FMT_W),
8537     R6_OPC_CMP_SUN_S  = FOP(9, FMT_W),
8538     R6_OPC_CMP_SEQ_S  = FOP(10, FMT_W),
8539     R6_OPC_CMP_SEUQ_S = FOP(11, FMT_W),
8540     R6_OPC_CMP_SLT_S  = FOP(12, FMT_W),
8541     R6_OPC_CMP_SULT_S = FOP(13, FMT_W),
8542     R6_OPC_CMP_SLE_S  = FOP(14, FMT_W),
8543     R6_OPC_CMP_SULE_S = FOP(15, FMT_W),
8544     R6_OPC_CMP_OR_S   = FOP(17, FMT_W),
8545     R6_OPC_CMP_UNE_S  = FOP(18, FMT_W),
8546     R6_OPC_CMP_NE_S   = FOP(19, FMT_W),
8547     R6_OPC_CMP_SOR_S  = FOP(25, FMT_W),
8548     R6_OPC_CMP_SUNE_S = FOP(26, FMT_W),
8549     R6_OPC_CMP_SNE_S  = FOP(27, FMT_W),
8550
8551     R6_OPC_CMP_AF_D   = FOP(0, FMT_L),
8552     R6_OPC_CMP_UN_D   = FOP(1, FMT_L),
8553     R6_OPC_CMP_EQ_D   = FOP(2, FMT_L),
8554     R6_OPC_CMP_UEQ_D  = FOP(3, FMT_L),
8555     R6_OPC_CMP_LT_D   = FOP(4, FMT_L),
8556     R6_OPC_CMP_ULT_D  = FOP(5, FMT_L),
8557     R6_OPC_CMP_LE_D   = FOP(6, FMT_L),
8558     R6_OPC_CMP_ULE_D  = FOP(7, FMT_L),
8559     R6_OPC_CMP_SAF_D  = FOP(8, FMT_L),
8560     R6_OPC_CMP_SUN_D  = FOP(9, FMT_L),
8561     R6_OPC_CMP_SEQ_D  = FOP(10, FMT_L),
8562     R6_OPC_CMP_SEUQ_D = FOP(11, FMT_L),
8563     R6_OPC_CMP_SLT_D  = FOP(12, FMT_L),
8564     R6_OPC_CMP_SULT_D = FOP(13, FMT_L),
8565     R6_OPC_CMP_SLE_D  = FOP(14, FMT_L),
8566     R6_OPC_CMP_SULE_D = FOP(15, FMT_L),
8567     R6_OPC_CMP_OR_D   = FOP(17, FMT_L),
8568     R6_OPC_CMP_UNE_D  = FOP(18, FMT_L),
8569     R6_OPC_CMP_NE_D   = FOP(19, FMT_L),
8570     R6_OPC_CMP_SOR_D  = FOP(25, FMT_L),
8571     R6_OPC_CMP_SUNE_D = FOP(26, FMT_L),
8572     R6_OPC_CMP_SNE_D  = FOP(27, FMT_L),
8573 };
8574 static void gen_cp1 (DisasContext *ctx, uint32_t opc, int rt, int fs)
8575 {
8576     TCGv t0 = tcg_temp_new();
8577
8578     switch (opc) {
8579     case OPC_MFC1:
8580         {
8581             TCGv_i32 fp0 = tcg_temp_new_i32();
8582
8583             gen_load_fpr32(ctx, fp0, fs);
8584             tcg_gen_ext_i32_tl(t0, fp0);
8585             tcg_temp_free_i32(fp0);
8586         }
8587         gen_store_gpr(t0, rt);
8588         break;
8589     case OPC_MTC1:
8590         gen_load_gpr(t0, rt);
8591         {
8592             TCGv_i32 fp0 = tcg_temp_new_i32();
8593
8594             tcg_gen_trunc_tl_i32(fp0, t0);
8595             gen_store_fpr32(ctx, fp0, fs);
8596             tcg_temp_free_i32(fp0);
8597         }
8598         break;
8599     case OPC_CFC1:
8600         gen_helper_1e0i(cfc1, t0, fs);
8601         gen_store_gpr(t0, rt);
8602         break;
8603     case OPC_CTC1:
8604         gen_load_gpr(t0, rt);
8605         save_cpu_state(ctx, 0);
8606         {
8607             TCGv_i32 fs_tmp = tcg_const_i32(fs);
8608
8609             gen_helper_0e2i(ctc1, t0, fs_tmp, rt);
8610             tcg_temp_free_i32(fs_tmp);
8611         }
8612         /* Stop translation as we may have changed hflags */
8613         ctx->bstate = BS_STOP;
8614         break;
8615 #if defined(TARGET_MIPS64)
8616     case OPC_DMFC1:
8617         gen_load_fpr64(ctx, t0, fs);
8618         gen_store_gpr(t0, rt);
8619         break;
8620     case OPC_DMTC1:
8621         gen_load_gpr(t0, rt);
8622         gen_store_fpr64(ctx, t0, fs);
8623         break;
8624 #endif
8625     case OPC_MFHC1:
8626         {
8627             TCGv_i32 fp0 = tcg_temp_new_i32();
8628
8629             gen_load_fpr32h(ctx, fp0, fs);
8630             tcg_gen_ext_i32_tl(t0, fp0);
8631             tcg_temp_free_i32(fp0);
8632         }
8633         gen_store_gpr(t0, rt);
8634         break;
8635     case OPC_MTHC1:
8636         gen_load_gpr(t0, rt);
8637         {
8638             TCGv_i32 fp0 = tcg_temp_new_i32();
8639
8640             tcg_gen_trunc_tl_i32(fp0, t0);
8641             gen_store_fpr32h(ctx, fp0, fs);
8642             tcg_temp_free_i32(fp0);
8643         }
8644         break;
8645     default:
8646         MIPS_INVAL("cp1 move");
8647         generate_exception_end(ctx, EXCP_RI);
8648         goto out;
8649     }
8650
8651  out:
8652     tcg_temp_free(t0);
8653 }
8654
8655 static void gen_movci (DisasContext *ctx, int rd, int rs, int cc, int tf)
8656 {
8657     TCGLabel *l1;
8658     TCGCond cond;
8659     TCGv_i32 t0;
8660
8661     if (rd == 0) {
8662         /* Treat as NOP. */
8663         return;
8664     }
8665
8666     if (tf)
8667         cond = TCG_COND_EQ;
8668     else
8669         cond = TCG_COND_NE;
8670
8671     l1 = gen_new_label();
8672     t0 = tcg_temp_new_i32();
8673     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
8674     tcg_gen_brcondi_i32(cond, t0, 0, l1);
8675     tcg_temp_free_i32(t0);
8676     if (rs == 0) {
8677         tcg_gen_movi_tl(cpu_gpr[rd], 0);
8678     } else {
8679         tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
8680     }
8681     gen_set_label(l1);
8682 }
8683
8684 static inline void gen_movcf_s(DisasContext *ctx, int fs, int fd, int cc,
8685                                int tf)
8686 {
8687     int cond;
8688     TCGv_i32 t0 = tcg_temp_new_i32();
8689     TCGLabel *l1 = gen_new_label();
8690
8691     if (tf)
8692         cond = TCG_COND_EQ;
8693     else
8694         cond = TCG_COND_NE;
8695
8696     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
8697     tcg_gen_brcondi_i32(cond, t0, 0, l1);
8698     gen_load_fpr32(ctx, t0, fs);
8699     gen_store_fpr32(ctx, t0, fd);
8700     gen_set_label(l1);
8701     tcg_temp_free_i32(t0);
8702 }
8703
8704 static inline void gen_movcf_d (DisasContext *ctx, int fs, int fd, int cc, int tf)
8705 {
8706     int cond;
8707     TCGv_i32 t0 = tcg_temp_new_i32();
8708     TCGv_i64 fp0;
8709     TCGLabel *l1 = gen_new_label();
8710
8711     if (tf)
8712         cond = TCG_COND_EQ;
8713     else
8714         cond = TCG_COND_NE;
8715
8716     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
8717     tcg_gen_brcondi_i32(cond, t0, 0, l1);
8718     tcg_temp_free_i32(t0);
8719     fp0 = tcg_temp_new_i64();
8720     gen_load_fpr64(ctx, fp0, fs);
8721     gen_store_fpr64(ctx, fp0, fd);
8722     tcg_temp_free_i64(fp0);
8723     gen_set_label(l1);
8724 }
8725
8726 static inline void gen_movcf_ps(DisasContext *ctx, int fs, int fd,
8727                                 int cc, int tf)
8728 {
8729     int cond;
8730     TCGv_i32 t0 = tcg_temp_new_i32();
8731     TCGLabel *l1 = gen_new_label();
8732     TCGLabel *l2 = gen_new_label();
8733
8734     if (tf)
8735         cond = TCG_COND_EQ;
8736     else
8737         cond = TCG_COND_NE;
8738
8739     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
8740     tcg_gen_brcondi_i32(cond, t0, 0, l1);
8741     gen_load_fpr32(ctx, t0, fs);
8742     gen_store_fpr32(ctx, t0, fd);
8743     gen_set_label(l1);
8744
8745     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc+1));
8746     tcg_gen_brcondi_i32(cond, t0, 0, l2);
8747     gen_load_fpr32h(ctx, t0, fs);
8748     gen_store_fpr32h(ctx, t0, fd);
8749     tcg_temp_free_i32(t0);
8750     gen_set_label(l2);
8751 }
8752
8753 static void gen_sel_s(DisasContext *ctx, enum fopcode op1, int fd, int ft,
8754                       int fs)
8755 {
8756     TCGv_i32 t1 = tcg_const_i32(0);
8757     TCGv_i32 fp0 = tcg_temp_new_i32();
8758     TCGv_i32 fp1 = tcg_temp_new_i32();
8759     TCGv_i32 fp2 = tcg_temp_new_i32();
8760     gen_load_fpr32(ctx, fp0, fd);
8761     gen_load_fpr32(ctx, fp1, ft);
8762     gen_load_fpr32(ctx, fp2, fs);
8763
8764     switch (op1) {
8765     case OPC_SEL_S:
8766         tcg_gen_andi_i32(fp0, fp0, 1);
8767         tcg_gen_movcond_i32(TCG_COND_NE, fp0, fp0, t1, fp1, fp2);
8768         break;
8769     case OPC_SELEQZ_S:
8770         tcg_gen_andi_i32(fp1, fp1, 1);
8771         tcg_gen_movcond_i32(TCG_COND_EQ, fp0, fp1, t1, fp2, t1);
8772         break;
8773     case OPC_SELNEZ_S:
8774         tcg_gen_andi_i32(fp1, fp1, 1);
8775         tcg_gen_movcond_i32(TCG_COND_NE, fp0, fp1, t1, fp2, t1);
8776         break;
8777     default:
8778         MIPS_INVAL("gen_sel_s");
8779         generate_exception_end(ctx, EXCP_RI);
8780         break;
8781     }
8782
8783     gen_store_fpr32(ctx, fp0, fd);
8784     tcg_temp_free_i32(fp2);
8785     tcg_temp_free_i32(fp1);
8786     tcg_temp_free_i32(fp0);
8787     tcg_temp_free_i32(t1);
8788 }
8789
8790 static void gen_sel_d(DisasContext *ctx, enum fopcode op1, int fd, int ft,
8791                       int fs)
8792 {
8793     TCGv_i64 t1 = tcg_const_i64(0);
8794     TCGv_i64 fp0 = tcg_temp_new_i64();
8795     TCGv_i64 fp1 = tcg_temp_new_i64();
8796     TCGv_i64 fp2 = tcg_temp_new_i64();
8797     gen_load_fpr64(ctx, fp0, fd);
8798     gen_load_fpr64(ctx, fp1, ft);
8799     gen_load_fpr64(ctx, fp2, fs);
8800
8801     switch (op1) {
8802     case OPC_SEL_D:
8803         tcg_gen_andi_i64(fp0, fp0, 1);
8804         tcg_gen_movcond_i64(TCG_COND_NE, fp0, fp0, t1, fp1, fp2);
8805         break;
8806     case OPC_SELEQZ_D:
8807         tcg_gen_andi_i64(fp1, fp1, 1);
8808         tcg_gen_movcond_i64(TCG_COND_EQ, fp0, fp1, t1, fp2, t1);
8809         break;
8810     case OPC_SELNEZ_D:
8811         tcg_gen_andi_i64(fp1, fp1, 1);
8812         tcg_gen_movcond_i64(TCG_COND_NE, fp0, fp1, t1, fp2, t1);
8813         break;
8814     default:
8815         MIPS_INVAL("gen_sel_d");
8816         generate_exception_end(ctx, EXCP_RI);
8817         break;
8818     }
8819
8820     gen_store_fpr64(ctx, fp0, fd);
8821     tcg_temp_free_i64(fp2);
8822     tcg_temp_free_i64(fp1);
8823     tcg_temp_free_i64(fp0);
8824     tcg_temp_free_i64(t1);
8825 }
8826
8827 static void gen_farith (DisasContext *ctx, enum fopcode op1,
8828                         int ft, int fs, int fd, int cc)
8829 {
8830     uint32_t func = ctx->opcode & 0x3f;
8831     switch (op1) {
8832     case OPC_ADD_S:
8833         {
8834             TCGv_i32 fp0 = tcg_temp_new_i32();
8835             TCGv_i32 fp1 = tcg_temp_new_i32();
8836
8837             gen_load_fpr32(ctx, fp0, fs);
8838             gen_load_fpr32(ctx, fp1, ft);
8839             gen_helper_float_add_s(fp0, cpu_env, fp0, fp1);
8840             tcg_temp_free_i32(fp1);
8841             gen_store_fpr32(ctx, fp0, fd);
8842             tcg_temp_free_i32(fp0);
8843         }
8844         break;
8845     case OPC_SUB_S:
8846         {
8847             TCGv_i32 fp0 = tcg_temp_new_i32();
8848             TCGv_i32 fp1 = tcg_temp_new_i32();
8849
8850             gen_load_fpr32(ctx, fp0, fs);
8851             gen_load_fpr32(ctx, fp1, ft);
8852             gen_helper_float_sub_s(fp0, cpu_env, fp0, fp1);
8853             tcg_temp_free_i32(fp1);
8854             gen_store_fpr32(ctx, fp0, fd);
8855             tcg_temp_free_i32(fp0);
8856         }
8857         break;
8858     case OPC_MUL_S:
8859         {
8860             TCGv_i32 fp0 = tcg_temp_new_i32();
8861             TCGv_i32 fp1 = tcg_temp_new_i32();
8862
8863             gen_load_fpr32(ctx, fp0, fs);
8864             gen_load_fpr32(ctx, fp1, ft);
8865             gen_helper_float_mul_s(fp0, cpu_env, fp0, fp1);
8866             tcg_temp_free_i32(fp1);
8867             gen_store_fpr32(ctx, fp0, fd);
8868             tcg_temp_free_i32(fp0);
8869         }
8870         break;
8871     case OPC_DIV_S:
8872         {
8873             TCGv_i32 fp0 = tcg_temp_new_i32();
8874             TCGv_i32 fp1 = tcg_temp_new_i32();
8875
8876             gen_load_fpr32(ctx, fp0, fs);
8877             gen_load_fpr32(ctx, fp1, ft);
8878             gen_helper_float_div_s(fp0, cpu_env, fp0, fp1);
8879             tcg_temp_free_i32(fp1);
8880             gen_store_fpr32(ctx, fp0, fd);
8881             tcg_temp_free_i32(fp0);
8882         }
8883         break;
8884     case OPC_SQRT_S:
8885         {
8886             TCGv_i32 fp0 = tcg_temp_new_i32();
8887
8888             gen_load_fpr32(ctx, fp0, fs);
8889             gen_helper_float_sqrt_s(fp0, cpu_env, fp0);
8890             gen_store_fpr32(ctx, fp0, fd);
8891             tcg_temp_free_i32(fp0);
8892         }
8893         break;
8894     case OPC_ABS_S:
8895         {
8896             TCGv_i32 fp0 = tcg_temp_new_i32();
8897
8898             gen_load_fpr32(ctx, fp0, fs);
8899             if (ctx->abs2008) {
8900                 tcg_gen_andi_i32(fp0, fp0, 0x7fffffffUL);
8901             } else {
8902                 gen_helper_float_abs_s(fp0, fp0);
8903             }
8904             gen_store_fpr32(ctx, fp0, fd);
8905             tcg_temp_free_i32(fp0);
8906         }
8907         break;
8908     case OPC_MOV_S:
8909         {
8910             TCGv_i32 fp0 = tcg_temp_new_i32();
8911
8912             gen_load_fpr32(ctx, fp0, fs);
8913             gen_store_fpr32(ctx, fp0, fd);
8914             tcg_temp_free_i32(fp0);
8915         }
8916         break;
8917     case OPC_NEG_S:
8918         {
8919             TCGv_i32 fp0 = tcg_temp_new_i32();
8920
8921             gen_load_fpr32(ctx, fp0, fs);
8922             if (ctx->abs2008) {
8923                 tcg_gen_xori_i32(fp0, fp0, 1UL << 31);
8924             } else {
8925                 gen_helper_float_chs_s(fp0, fp0);
8926             }
8927             gen_store_fpr32(ctx, fp0, fd);
8928             tcg_temp_free_i32(fp0);
8929         }
8930         break;
8931     case OPC_ROUND_L_S:
8932         check_cp1_64bitmode(ctx);
8933         {
8934             TCGv_i32 fp32 = tcg_temp_new_i32();
8935             TCGv_i64 fp64 = tcg_temp_new_i64();
8936
8937             gen_load_fpr32(ctx, fp32, fs);
8938             if (ctx->nan2008) {
8939                 gen_helper_float_round_2008_l_s(fp64, cpu_env, fp32);
8940             } else {
8941                 gen_helper_float_round_l_s(fp64, cpu_env, fp32);
8942             }
8943             tcg_temp_free_i32(fp32);
8944             gen_store_fpr64(ctx, fp64, fd);
8945             tcg_temp_free_i64(fp64);
8946         }
8947         break;
8948     case OPC_TRUNC_L_S:
8949         check_cp1_64bitmode(ctx);
8950         {
8951             TCGv_i32 fp32 = tcg_temp_new_i32();
8952             TCGv_i64 fp64 = tcg_temp_new_i64();
8953
8954             gen_load_fpr32(ctx, fp32, fs);
8955             if (ctx->nan2008) {
8956                 gen_helper_float_trunc_2008_l_s(fp64, cpu_env, fp32);
8957             } else {
8958                 gen_helper_float_trunc_l_s(fp64, cpu_env, fp32);
8959             }
8960             tcg_temp_free_i32(fp32);
8961             gen_store_fpr64(ctx, fp64, fd);
8962             tcg_temp_free_i64(fp64);
8963         }
8964         break;
8965     case OPC_CEIL_L_S:
8966         check_cp1_64bitmode(ctx);
8967         {
8968             TCGv_i32 fp32 = tcg_temp_new_i32();
8969             TCGv_i64 fp64 = tcg_temp_new_i64();
8970
8971             gen_load_fpr32(ctx, fp32, fs);
8972             if (ctx->nan2008) {
8973                 gen_helper_float_ceil_2008_l_s(fp64, cpu_env, fp32);
8974             } else {
8975                 gen_helper_float_ceil_l_s(fp64, cpu_env, fp32);
8976             }
8977             tcg_temp_free_i32(fp32);
8978             gen_store_fpr64(ctx, fp64, fd);
8979             tcg_temp_free_i64(fp64);
8980         }
8981         break;
8982     case OPC_FLOOR_L_S:
8983         check_cp1_64bitmode(ctx);
8984         {
8985             TCGv_i32 fp32 = tcg_temp_new_i32();
8986             TCGv_i64 fp64 = tcg_temp_new_i64();
8987
8988             gen_load_fpr32(ctx, fp32, fs);
8989             if (ctx->nan2008) {
8990                 gen_helper_float_floor_2008_l_s(fp64, cpu_env, fp32);
8991             } else {
8992                 gen_helper_float_floor_l_s(fp64, cpu_env, fp32);
8993             }
8994             tcg_temp_free_i32(fp32);
8995             gen_store_fpr64(ctx, fp64, fd);
8996             tcg_temp_free_i64(fp64);
8997         }
8998         break;
8999     case OPC_ROUND_W_S:
9000         {
9001             TCGv_i32 fp0 = tcg_temp_new_i32();
9002
9003             gen_load_fpr32(ctx, fp0, fs);
9004             if (ctx->nan2008) {
9005                 gen_helper_float_round_2008_w_s(fp0, cpu_env, fp0);
9006             } else {
9007                 gen_helper_float_round_w_s(fp0, cpu_env, fp0);
9008             }
9009             gen_store_fpr32(ctx, fp0, fd);
9010             tcg_temp_free_i32(fp0);
9011         }
9012         break;
9013     case OPC_TRUNC_W_S:
9014         {
9015             TCGv_i32 fp0 = tcg_temp_new_i32();
9016
9017             gen_load_fpr32(ctx, fp0, fs);
9018             if (ctx->nan2008) {
9019                 gen_helper_float_trunc_2008_w_s(fp0, cpu_env, fp0);
9020             } else {
9021                 gen_helper_float_trunc_w_s(fp0, cpu_env, fp0);
9022             }
9023             gen_store_fpr32(ctx, fp0, fd);
9024             tcg_temp_free_i32(fp0);
9025         }
9026         break;
9027     case OPC_CEIL_W_S:
9028         {
9029             TCGv_i32 fp0 = tcg_temp_new_i32();
9030
9031             gen_load_fpr32(ctx, fp0, fs);
9032             if (ctx->nan2008) {
9033                 gen_helper_float_ceil_2008_w_s(fp0, cpu_env, fp0);
9034             } else {
9035                 gen_helper_float_ceil_w_s(fp0, cpu_env, fp0);
9036             }
9037             gen_store_fpr32(ctx, fp0, fd);
9038             tcg_temp_free_i32(fp0);
9039         }
9040         break;
9041     case OPC_FLOOR_W_S:
9042         {
9043             TCGv_i32 fp0 = tcg_temp_new_i32();
9044
9045             gen_load_fpr32(ctx, fp0, fs);
9046             if (ctx->nan2008) {
9047                 gen_helper_float_floor_2008_w_s(fp0, cpu_env, fp0);
9048             } else {
9049                 gen_helper_float_floor_w_s(fp0, cpu_env, fp0);
9050             }
9051             gen_store_fpr32(ctx, fp0, fd);
9052             tcg_temp_free_i32(fp0);
9053         }
9054         break;
9055     case OPC_SEL_S:
9056         check_insn(ctx, ISA_MIPS32R6);
9057         gen_sel_s(ctx, op1, fd, ft, fs);
9058         break;
9059     case OPC_SELEQZ_S:
9060         check_insn(ctx, ISA_MIPS32R6);
9061         gen_sel_s(ctx, op1, fd, ft, fs);
9062         break;
9063     case OPC_SELNEZ_S:
9064         check_insn(ctx, ISA_MIPS32R6);
9065         gen_sel_s(ctx, op1, fd, ft, fs);
9066         break;
9067     case OPC_MOVCF_S:
9068         check_insn_opc_removed(ctx, ISA_MIPS32R6);
9069         gen_movcf_s(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1);
9070         break;
9071     case OPC_MOVZ_S:
9072         check_insn_opc_removed(ctx, ISA_MIPS32R6);
9073         {
9074             TCGLabel *l1 = gen_new_label();
9075             TCGv_i32 fp0;
9076
9077             if (ft != 0) {
9078                 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
9079             }
9080             fp0 = tcg_temp_new_i32();
9081             gen_load_fpr32(ctx, fp0, fs);
9082             gen_store_fpr32(ctx, fp0, fd);
9083             tcg_temp_free_i32(fp0);
9084             gen_set_label(l1);
9085         }
9086         break;
9087     case OPC_MOVN_S:
9088         check_insn_opc_removed(ctx, ISA_MIPS32R6);
9089         {
9090             TCGLabel *l1 = gen_new_label();
9091             TCGv_i32 fp0;
9092
9093             if (ft != 0) {
9094                 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
9095                 fp0 = tcg_temp_new_i32();
9096                 gen_load_fpr32(ctx, fp0, fs);
9097                 gen_store_fpr32(ctx, fp0, fd);
9098                 tcg_temp_free_i32(fp0);
9099                 gen_set_label(l1);
9100             }
9101         }
9102         break;
9103     case OPC_RECIP_S:
9104         {
9105             TCGv_i32 fp0 = tcg_temp_new_i32();
9106
9107             gen_load_fpr32(ctx, fp0, fs);
9108             gen_helper_float_recip_s(fp0, cpu_env, fp0);
9109             gen_store_fpr32(ctx, fp0, fd);
9110             tcg_temp_free_i32(fp0);
9111         }
9112         break;
9113     case OPC_RSQRT_S:
9114         {
9115             TCGv_i32 fp0 = tcg_temp_new_i32();
9116
9117             gen_load_fpr32(ctx, fp0, fs);
9118             gen_helper_float_rsqrt_s(fp0, cpu_env, fp0);
9119             gen_store_fpr32(ctx, fp0, fd);
9120             tcg_temp_free_i32(fp0);
9121         }
9122         break;
9123     case OPC_MADDF_S:
9124         check_insn(ctx, ISA_MIPS32R6);
9125         {
9126             TCGv_i32 fp0 = tcg_temp_new_i32();
9127             TCGv_i32 fp1 = tcg_temp_new_i32();
9128             TCGv_i32 fp2 = tcg_temp_new_i32();
9129             gen_load_fpr32(ctx, fp0, fs);
9130             gen_load_fpr32(ctx, fp1, ft);
9131             gen_load_fpr32(ctx, fp2, fd);
9132             gen_helper_float_maddf_s(fp2, cpu_env, fp0, fp1, fp2);
9133             gen_store_fpr32(ctx, fp2, fd);
9134             tcg_temp_free_i32(fp2);
9135             tcg_temp_free_i32(fp1);
9136             tcg_temp_free_i32(fp0);
9137         }
9138         break;
9139     case OPC_MSUBF_S:
9140         check_insn(ctx, ISA_MIPS32R6);
9141         {
9142             TCGv_i32 fp0 = tcg_temp_new_i32();
9143             TCGv_i32 fp1 = tcg_temp_new_i32();
9144             TCGv_i32 fp2 = tcg_temp_new_i32();
9145             gen_load_fpr32(ctx, fp0, fs);
9146             gen_load_fpr32(ctx, fp1, ft);
9147             gen_load_fpr32(ctx, fp2, fd);
9148             gen_helper_float_msubf_s(fp2, cpu_env, fp0, fp1, fp2);
9149             gen_store_fpr32(ctx, fp2, fd);
9150             tcg_temp_free_i32(fp2);
9151             tcg_temp_free_i32(fp1);
9152             tcg_temp_free_i32(fp0);
9153         }
9154         break;
9155     case OPC_RINT_S:
9156         check_insn(ctx, ISA_MIPS32R6);
9157         {
9158             TCGv_i32 fp0 = tcg_temp_new_i32();
9159             gen_load_fpr32(ctx, fp0, fs);
9160             gen_helper_float_rint_s(fp0, cpu_env, fp0);
9161             gen_store_fpr32(ctx, fp0, fd);
9162             tcg_temp_free_i32(fp0);
9163         }
9164         break;
9165     case OPC_CLASS_S:
9166         check_insn(ctx, ISA_MIPS32R6);
9167         {
9168             TCGv_i32 fp0 = tcg_temp_new_i32();
9169             gen_load_fpr32(ctx, fp0, fs);
9170             gen_helper_float_class_s(fp0, cpu_env, fp0);
9171             gen_store_fpr32(ctx, fp0, fd);
9172             tcg_temp_free_i32(fp0);
9173         }
9174         break;
9175     case OPC_MIN_S: /* OPC_RECIP2_S */
9176         if (ctx->insn_flags & ISA_MIPS32R6) {
9177             /* OPC_MIN_S */
9178             TCGv_i32 fp0 = tcg_temp_new_i32();
9179             TCGv_i32 fp1 = tcg_temp_new_i32();
9180             TCGv_i32 fp2 = tcg_temp_new_i32();
9181             gen_load_fpr32(ctx, fp0, fs);
9182             gen_load_fpr32(ctx, fp1, ft);
9183             gen_helper_float_min_s(fp2, cpu_env, fp0, fp1);
9184             gen_store_fpr32(ctx, fp2, fd);
9185             tcg_temp_free_i32(fp2);
9186             tcg_temp_free_i32(fp1);
9187             tcg_temp_free_i32(fp0);
9188         } else {
9189             /* OPC_RECIP2_S */
9190             check_cp1_64bitmode(ctx);
9191             {
9192                 TCGv_i32 fp0 = tcg_temp_new_i32();
9193                 TCGv_i32 fp1 = tcg_temp_new_i32();
9194
9195                 gen_load_fpr32(ctx, fp0, fs);
9196                 gen_load_fpr32(ctx, fp1, ft);
9197                 gen_helper_float_recip2_s(fp0, cpu_env, fp0, fp1);
9198                 tcg_temp_free_i32(fp1);
9199                 gen_store_fpr32(ctx, fp0, fd);
9200                 tcg_temp_free_i32(fp0);
9201             }
9202         }
9203         break;
9204     case OPC_MINA_S: /* OPC_RECIP1_S */
9205         if (ctx->insn_flags & ISA_MIPS32R6) {
9206             /* OPC_MINA_S */
9207             TCGv_i32 fp0 = tcg_temp_new_i32();
9208             TCGv_i32 fp1 = tcg_temp_new_i32();
9209             TCGv_i32 fp2 = tcg_temp_new_i32();
9210             gen_load_fpr32(ctx, fp0, fs);
9211             gen_load_fpr32(ctx, fp1, ft);
9212             gen_helper_float_mina_s(fp2, cpu_env, fp0, fp1);
9213             gen_store_fpr32(ctx, fp2, fd);
9214             tcg_temp_free_i32(fp2);
9215             tcg_temp_free_i32(fp1);
9216             tcg_temp_free_i32(fp0);
9217         } else {
9218             /* OPC_RECIP1_S */
9219             check_cp1_64bitmode(ctx);
9220             {
9221                 TCGv_i32 fp0 = tcg_temp_new_i32();
9222
9223                 gen_load_fpr32(ctx, fp0, fs);
9224                 gen_helper_float_recip1_s(fp0, cpu_env, fp0);
9225                 gen_store_fpr32(ctx, fp0, fd);
9226                 tcg_temp_free_i32(fp0);
9227             }
9228         }
9229         break;
9230     case OPC_MAX_S: /* OPC_RSQRT1_S */
9231         if (ctx->insn_flags & ISA_MIPS32R6) {
9232             /* OPC_MAX_S */
9233             TCGv_i32 fp0 = tcg_temp_new_i32();
9234             TCGv_i32 fp1 = tcg_temp_new_i32();
9235             gen_load_fpr32(ctx, fp0, fs);
9236             gen_load_fpr32(ctx, fp1, ft);
9237             gen_helper_float_max_s(fp1, cpu_env, fp0, fp1);
9238             gen_store_fpr32(ctx, fp1, fd);
9239             tcg_temp_free_i32(fp1);
9240             tcg_temp_free_i32(fp0);
9241         } else {
9242             /* OPC_RSQRT1_S */
9243             check_cp1_64bitmode(ctx);
9244             {
9245                 TCGv_i32 fp0 = tcg_temp_new_i32();
9246
9247                 gen_load_fpr32(ctx, fp0, fs);
9248                 gen_helper_float_rsqrt1_s(fp0, cpu_env, fp0);
9249                 gen_store_fpr32(ctx, fp0, fd);
9250                 tcg_temp_free_i32(fp0);
9251             }
9252         }
9253         break;
9254     case OPC_MAXA_S: /* OPC_RSQRT2_S */
9255         if (ctx->insn_flags & ISA_MIPS32R6) {
9256             /* OPC_MAXA_S */
9257             TCGv_i32 fp0 = tcg_temp_new_i32();
9258             TCGv_i32 fp1 = tcg_temp_new_i32();
9259             gen_load_fpr32(ctx, fp0, fs);
9260             gen_load_fpr32(ctx, fp1, ft);
9261             gen_helper_float_maxa_s(fp1, cpu_env, fp0, fp1);
9262             gen_store_fpr32(ctx, fp1, fd);
9263             tcg_temp_free_i32(fp1);
9264             tcg_temp_free_i32(fp0);
9265         } else {
9266             /* OPC_RSQRT2_S */
9267             check_cp1_64bitmode(ctx);
9268             {
9269                 TCGv_i32 fp0 = tcg_temp_new_i32();
9270                 TCGv_i32 fp1 = tcg_temp_new_i32();
9271
9272                 gen_load_fpr32(ctx, fp0, fs);
9273                 gen_load_fpr32(ctx, fp1, ft);
9274                 gen_helper_float_rsqrt2_s(fp0, cpu_env, fp0, fp1);
9275                 tcg_temp_free_i32(fp1);
9276                 gen_store_fpr32(ctx, fp0, fd);
9277                 tcg_temp_free_i32(fp0);
9278             }
9279         }
9280         break;
9281     case OPC_CVT_D_S:
9282         check_cp1_registers(ctx, fd);
9283         {
9284             TCGv_i32 fp32 = tcg_temp_new_i32();
9285             TCGv_i64 fp64 = tcg_temp_new_i64();
9286
9287             gen_load_fpr32(ctx, fp32, fs);
9288             gen_helper_float_cvtd_s(fp64, cpu_env, fp32);
9289             tcg_temp_free_i32(fp32);
9290             gen_store_fpr64(ctx, fp64, fd);
9291             tcg_temp_free_i64(fp64);
9292         }
9293         break;
9294     case OPC_CVT_W_S:
9295         {
9296             TCGv_i32 fp0 = tcg_temp_new_i32();
9297
9298             gen_load_fpr32(ctx, fp0, fs);
9299             if (ctx->nan2008) {
9300                 gen_helper_float_cvt_2008_w_s(fp0, cpu_env, fp0);
9301             } else {
9302                 gen_helper_float_cvt_w_s(fp0, cpu_env, fp0);
9303             }
9304             gen_store_fpr32(ctx, fp0, fd);
9305             tcg_temp_free_i32(fp0);
9306         }
9307         break;
9308     case OPC_CVT_L_S:
9309         check_cp1_64bitmode(ctx);
9310         {
9311             TCGv_i32 fp32 = tcg_temp_new_i32();
9312             TCGv_i64 fp64 = tcg_temp_new_i64();
9313
9314             gen_load_fpr32(ctx, fp32, fs);
9315             if (ctx->nan2008) {
9316                 gen_helper_float_cvt_2008_l_s(fp64, cpu_env, fp32);
9317             } else {
9318                 gen_helper_float_cvt_l_s(fp64, cpu_env, fp32);
9319             }
9320             tcg_temp_free_i32(fp32);
9321             gen_store_fpr64(ctx, fp64, fd);
9322             tcg_temp_free_i64(fp64);
9323         }
9324         break;
9325     case OPC_CVT_PS_S:
9326         check_ps(ctx);
9327         {
9328             TCGv_i64 fp64 = tcg_temp_new_i64();
9329             TCGv_i32 fp32_0 = tcg_temp_new_i32();
9330             TCGv_i32 fp32_1 = tcg_temp_new_i32();
9331
9332             gen_load_fpr32(ctx, fp32_0, fs);
9333             gen_load_fpr32(ctx, fp32_1, ft);
9334             tcg_gen_concat_i32_i64(fp64, fp32_1, fp32_0);
9335             tcg_temp_free_i32(fp32_1);
9336             tcg_temp_free_i32(fp32_0);
9337             gen_store_fpr64(ctx, fp64, fd);
9338             tcg_temp_free_i64(fp64);
9339         }
9340         break;
9341     case OPC_CMP_F_S:
9342     case OPC_CMP_UN_S:
9343     case OPC_CMP_EQ_S:
9344     case OPC_CMP_UEQ_S:
9345     case OPC_CMP_OLT_S:
9346     case OPC_CMP_ULT_S:
9347     case OPC_CMP_OLE_S:
9348     case OPC_CMP_ULE_S:
9349     case OPC_CMP_SF_S:
9350     case OPC_CMP_NGLE_S:
9351     case OPC_CMP_SEQ_S:
9352     case OPC_CMP_NGL_S:
9353     case OPC_CMP_LT_S:
9354     case OPC_CMP_NGE_S:
9355     case OPC_CMP_LE_S:
9356     case OPC_CMP_NGT_S:
9357         check_insn_opc_removed(ctx, ISA_MIPS32R6);
9358         if (ctx->opcode & (1 << 6)) {
9359             gen_cmpabs_s(ctx, func-48, ft, fs, cc);
9360         } else {
9361             gen_cmp_s(ctx, func-48, ft, fs, cc);
9362         }
9363         break;
9364     case OPC_ADD_D:
9365         check_cp1_registers(ctx, fs | ft | fd);
9366         {
9367             TCGv_i64 fp0 = tcg_temp_new_i64();
9368             TCGv_i64 fp1 = tcg_temp_new_i64();
9369
9370             gen_load_fpr64(ctx, fp0, fs);
9371             gen_load_fpr64(ctx, fp1, ft);
9372             gen_helper_float_add_d(fp0, cpu_env, fp0, fp1);
9373             tcg_temp_free_i64(fp1);
9374             gen_store_fpr64(ctx, fp0, fd);
9375             tcg_temp_free_i64(fp0);
9376         }
9377         break;
9378     case OPC_SUB_D:
9379         check_cp1_registers(ctx, fs | ft | fd);
9380         {
9381             TCGv_i64 fp0 = tcg_temp_new_i64();
9382             TCGv_i64 fp1 = tcg_temp_new_i64();
9383
9384             gen_load_fpr64(ctx, fp0, fs);
9385             gen_load_fpr64(ctx, fp1, ft);
9386             gen_helper_float_sub_d(fp0, cpu_env, fp0, fp1);
9387             tcg_temp_free_i64(fp1);
9388             gen_store_fpr64(ctx, fp0, fd);
9389             tcg_temp_free_i64(fp0);
9390         }
9391         break;
9392     case OPC_MUL_D:
9393         check_cp1_registers(ctx, fs | ft | fd);
9394         {
9395             TCGv_i64 fp0 = tcg_temp_new_i64();
9396             TCGv_i64 fp1 = tcg_temp_new_i64();
9397
9398             gen_load_fpr64(ctx, fp0, fs);
9399             gen_load_fpr64(ctx, fp1, ft);
9400             gen_helper_float_mul_d(fp0, cpu_env, fp0, fp1);
9401             tcg_temp_free_i64(fp1);
9402             gen_store_fpr64(ctx, fp0, fd);
9403             tcg_temp_free_i64(fp0);
9404         }
9405         break;
9406     case OPC_DIV_D:
9407         check_cp1_registers(ctx, fs | ft | fd);
9408         {
9409             TCGv_i64 fp0 = tcg_temp_new_i64();
9410             TCGv_i64 fp1 = tcg_temp_new_i64();
9411
9412             gen_load_fpr64(ctx, fp0, fs);
9413             gen_load_fpr64(ctx, fp1, ft);
9414             gen_helper_float_div_d(fp0, cpu_env, fp0, fp1);
9415             tcg_temp_free_i64(fp1);
9416             gen_store_fpr64(ctx, fp0, fd);
9417             tcg_temp_free_i64(fp0);
9418         }
9419         break;
9420     case OPC_SQRT_D:
9421         check_cp1_registers(ctx, fs | fd);
9422         {
9423             TCGv_i64 fp0 = tcg_temp_new_i64();
9424
9425             gen_load_fpr64(ctx, fp0, fs);
9426             gen_helper_float_sqrt_d(fp0, cpu_env, fp0);
9427             gen_store_fpr64(ctx, fp0, fd);
9428             tcg_temp_free_i64(fp0);
9429         }
9430         break;
9431     case OPC_ABS_D:
9432         check_cp1_registers(ctx, fs | fd);
9433         {
9434             TCGv_i64 fp0 = tcg_temp_new_i64();
9435
9436             gen_load_fpr64(ctx, fp0, fs);
9437             if (ctx->abs2008) {
9438                 tcg_gen_andi_i64(fp0, fp0, 0x7fffffffffffffffULL);
9439             } else {
9440                 gen_helper_float_abs_d(fp0, fp0);
9441             }
9442             gen_store_fpr64(ctx, fp0, fd);
9443             tcg_temp_free_i64(fp0);
9444         }
9445         break;
9446     case OPC_MOV_D:
9447         check_cp1_registers(ctx, fs | fd);
9448         {
9449             TCGv_i64 fp0 = tcg_temp_new_i64();
9450
9451             gen_load_fpr64(ctx, fp0, fs);
9452             gen_store_fpr64(ctx, fp0, fd);
9453             tcg_temp_free_i64(fp0);
9454         }
9455         break;
9456     case OPC_NEG_D:
9457         check_cp1_registers(ctx, fs | fd);
9458         {
9459             TCGv_i64 fp0 = tcg_temp_new_i64();
9460
9461             gen_load_fpr64(ctx, fp0, fs);
9462             if (ctx->abs2008) {
9463                 tcg_gen_xori_i64(fp0, fp0, 1ULL << 63);
9464             } else {
9465                 gen_helper_float_chs_d(fp0, fp0);
9466             }
9467             gen_store_fpr64(ctx, fp0, fd);
9468             tcg_temp_free_i64(fp0);
9469         }
9470         break;
9471     case OPC_ROUND_L_D:
9472         check_cp1_64bitmode(ctx);
9473         {
9474             TCGv_i64 fp0 = tcg_temp_new_i64();
9475
9476             gen_load_fpr64(ctx, fp0, fs);
9477             if (ctx->nan2008) {
9478                 gen_helper_float_round_2008_l_d(fp0, cpu_env, fp0);
9479             } else {
9480                 gen_helper_float_round_l_d(fp0, cpu_env, fp0);
9481             }
9482             gen_store_fpr64(ctx, fp0, fd);
9483             tcg_temp_free_i64(fp0);
9484         }
9485         break;
9486     case OPC_TRUNC_L_D:
9487         check_cp1_64bitmode(ctx);
9488         {
9489             TCGv_i64 fp0 = tcg_temp_new_i64();
9490
9491             gen_load_fpr64(ctx, fp0, fs);
9492             if (ctx->nan2008) {
9493                 gen_helper_float_trunc_2008_l_d(fp0, cpu_env, fp0);
9494             } else {
9495                 gen_helper_float_trunc_l_d(fp0, cpu_env, fp0);
9496             }
9497             gen_store_fpr64(ctx, fp0, fd);
9498             tcg_temp_free_i64(fp0);
9499         }
9500         break;
9501     case OPC_CEIL_L_D:
9502         check_cp1_64bitmode(ctx);
9503         {
9504             TCGv_i64 fp0 = tcg_temp_new_i64();
9505
9506             gen_load_fpr64(ctx, fp0, fs);
9507             if (ctx->nan2008) {
9508                 gen_helper_float_ceil_2008_l_d(fp0, cpu_env, fp0);
9509             } else {
9510                 gen_helper_float_ceil_l_d(fp0, cpu_env, fp0);
9511             }
9512             gen_store_fpr64(ctx, fp0, fd);
9513             tcg_temp_free_i64(fp0);
9514         }
9515         break;
9516     case OPC_FLOOR_L_D:
9517         check_cp1_64bitmode(ctx);
9518         {
9519             TCGv_i64 fp0 = tcg_temp_new_i64();
9520
9521             gen_load_fpr64(ctx, fp0, fs);
9522             if (ctx->nan2008) {
9523                 gen_helper_float_floor_2008_l_d(fp0, cpu_env, fp0);
9524             } else {
9525                 gen_helper_float_floor_l_d(fp0, cpu_env, fp0);
9526             }
9527             gen_store_fpr64(ctx, fp0, fd);
9528             tcg_temp_free_i64(fp0);
9529         }
9530         break;
9531     case OPC_ROUND_W_D:
9532         check_cp1_registers(ctx, fs);
9533         {
9534             TCGv_i32 fp32 = tcg_temp_new_i32();
9535             TCGv_i64 fp64 = tcg_temp_new_i64();
9536
9537             gen_load_fpr64(ctx, fp64, fs);
9538             if (ctx->nan2008) {
9539                 gen_helper_float_round_2008_w_d(fp32, cpu_env, fp64);
9540             } else {
9541                 gen_helper_float_round_w_d(fp32, cpu_env, fp64);
9542             }
9543             tcg_temp_free_i64(fp64);
9544             gen_store_fpr32(ctx, fp32, fd);
9545             tcg_temp_free_i32(fp32);
9546         }
9547         break;
9548     case OPC_TRUNC_W_D:
9549         check_cp1_registers(ctx, fs);
9550         {
9551             TCGv_i32 fp32 = tcg_temp_new_i32();
9552             TCGv_i64 fp64 = tcg_temp_new_i64();
9553
9554             gen_load_fpr64(ctx, fp64, fs);
9555             if (ctx->nan2008) {
9556                 gen_helper_float_trunc_2008_w_d(fp32, cpu_env, fp64);
9557             } else {
9558                 gen_helper_float_trunc_w_d(fp32, cpu_env, fp64);
9559             }
9560             tcg_temp_free_i64(fp64);
9561             gen_store_fpr32(ctx, fp32, fd);
9562             tcg_temp_free_i32(fp32);
9563         }
9564         break;
9565     case OPC_CEIL_W_D:
9566         check_cp1_registers(ctx, fs);
9567         {
9568             TCGv_i32 fp32 = tcg_temp_new_i32();
9569             TCGv_i64 fp64 = tcg_temp_new_i64();
9570
9571             gen_load_fpr64(ctx, fp64, fs);
9572             if (ctx->nan2008) {
9573                 gen_helper_float_ceil_2008_w_d(fp32, cpu_env, fp64);
9574             } else {
9575                 gen_helper_float_ceil_w_d(fp32, cpu_env, fp64);
9576             }
9577             tcg_temp_free_i64(fp64);
9578             gen_store_fpr32(ctx, fp32, fd);
9579             tcg_temp_free_i32(fp32);
9580         }
9581         break;
9582     case OPC_FLOOR_W_D:
9583         check_cp1_registers(ctx, fs);
9584         {
9585             TCGv_i32 fp32 = tcg_temp_new_i32();
9586             TCGv_i64 fp64 = tcg_temp_new_i64();
9587
9588             gen_load_fpr64(ctx, fp64, fs);
9589             if (ctx->nan2008) {
9590                 gen_helper_float_floor_2008_w_d(fp32, cpu_env, fp64);
9591             } else {
9592                 gen_helper_float_floor_w_d(fp32, cpu_env, fp64);
9593             }
9594             tcg_temp_free_i64(fp64);
9595             gen_store_fpr32(ctx, fp32, fd);
9596             tcg_temp_free_i32(fp32);
9597         }
9598         break;
9599     case OPC_SEL_D:
9600         check_insn(ctx, ISA_MIPS32R6);
9601         gen_sel_d(ctx, op1, fd, ft, fs);
9602         break;
9603     case OPC_SELEQZ_D:
9604         check_insn(ctx, ISA_MIPS32R6);
9605         gen_sel_d(ctx, op1, fd, ft, fs);
9606         break;
9607     case OPC_SELNEZ_D:
9608         check_insn(ctx, ISA_MIPS32R6);
9609         gen_sel_d(ctx, op1, fd, ft, fs);
9610         break;
9611     case OPC_MOVCF_D:
9612         check_insn_opc_removed(ctx, ISA_MIPS32R6);
9613         gen_movcf_d(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1);
9614         break;
9615     case OPC_MOVZ_D:
9616         check_insn_opc_removed(ctx, ISA_MIPS32R6);
9617         {
9618             TCGLabel *l1 = gen_new_label();
9619             TCGv_i64 fp0;
9620
9621             if (ft != 0) {
9622                 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
9623             }
9624             fp0 = tcg_temp_new_i64();
9625             gen_load_fpr64(ctx, fp0, fs);
9626             gen_store_fpr64(ctx, fp0, fd);
9627             tcg_temp_free_i64(fp0);
9628             gen_set_label(l1);
9629         }
9630         break;
9631     case OPC_MOVN_D:
9632         check_insn_opc_removed(ctx, ISA_MIPS32R6);
9633         {
9634             TCGLabel *l1 = gen_new_label();
9635             TCGv_i64 fp0;
9636
9637             if (ft != 0) {
9638                 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
9639                 fp0 = tcg_temp_new_i64();
9640                 gen_load_fpr64(ctx, fp0, fs);
9641                 gen_store_fpr64(ctx, fp0, fd);
9642                 tcg_temp_free_i64(fp0);
9643                 gen_set_label(l1);
9644             }
9645         }
9646         break;
9647     case OPC_RECIP_D:
9648         check_cp1_registers(ctx, fs | fd);
9649         {
9650             TCGv_i64 fp0 = tcg_temp_new_i64();
9651
9652             gen_load_fpr64(ctx, fp0, fs);
9653             gen_helper_float_recip_d(fp0, cpu_env, fp0);
9654             gen_store_fpr64(ctx, fp0, fd);
9655             tcg_temp_free_i64(fp0);
9656         }
9657         break;
9658     case OPC_RSQRT_D:
9659         check_cp1_registers(ctx, fs | fd);
9660         {
9661             TCGv_i64 fp0 = tcg_temp_new_i64();
9662
9663             gen_load_fpr64(ctx, fp0, fs);
9664             gen_helper_float_rsqrt_d(fp0, cpu_env, fp0);
9665             gen_store_fpr64(ctx, fp0, fd);
9666             tcg_temp_free_i64(fp0);
9667         }
9668         break;
9669     case OPC_MADDF_D:
9670         check_insn(ctx, ISA_MIPS32R6);
9671         {
9672             TCGv_i64 fp0 = tcg_temp_new_i64();
9673             TCGv_i64 fp1 = tcg_temp_new_i64();
9674             TCGv_i64 fp2 = tcg_temp_new_i64();
9675             gen_load_fpr64(ctx, fp0, fs);
9676             gen_load_fpr64(ctx, fp1, ft);
9677             gen_load_fpr64(ctx, fp2, fd);
9678             gen_helper_float_maddf_d(fp2, cpu_env, fp0, fp1, fp2);
9679             gen_store_fpr64(ctx, fp2, fd);
9680             tcg_temp_free_i64(fp2);
9681             tcg_temp_free_i64(fp1);
9682             tcg_temp_free_i64(fp0);
9683         }
9684         break;
9685     case OPC_MSUBF_D:
9686         check_insn(ctx, ISA_MIPS32R6);
9687         {
9688             TCGv_i64 fp0 = tcg_temp_new_i64();
9689             TCGv_i64 fp1 = tcg_temp_new_i64();
9690             TCGv_i64 fp2 = tcg_temp_new_i64();
9691             gen_load_fpr64(ctx, fp0, fs);
9692             gen_load_fpr64(ctx, fp1, ft);
9693             gen_load_fpr64(ctx, fp2, fd);
9694             gen_helper_float_msubf_d(fp2, cpu_env, fp0, fp1, fp2);
9695             gen_store_fpr64(ctx, fp2, fd);
9696             tcg_temp_free_i64(fp2);
9697             tcg_temp_free_i64(fp1);
9698             tcg_temp_free_i64(fp0);
9699         }
9700         break;
9701     case OPC_RINT_D:
9702         check_insn(ctx, ISA_MIPS32R6);
9703         {
9704             TCGv_i64 fp0 = tcg_temp_new_i64();
9705             gen_load_fpr64(ctx, fp0, fs);
9706             gen_helper_float_rint_d(fp0, cpu_env, fp0);
9707             gen_store_fpr64(ctx, fp0, fd);
9708             tcg_temp_free_i64(fp0);
9709         }
9710         break;
9711     case OPC_CLASS_D:
9712         check_insn(ctx, ISA_MIPS32R6);
9713         {
9714             TCGv_i64 fp0 = tcg_temp_new_i64();
9715             gen_load_fpr64(ctx, fp0, fs);
9716             gen_helper_float_class_d(fp0, cpu_env, fp0);
9717             gen_store_fpr64(ctx, fp0, fd);
9718             tcg_temp_free_i64(fp0);
9719         }
9720         break;
9721     case OPC_MIN_D: /* OPC_RECIP2_D */
9722         if (ctx->insn_flags & ISA_MIPS32R6) {
9723             /* OPC_MIN_D */
9724             TCGv_i64 fp0 = tcg_temp_new_i64();
9725             TCGv_i64 fp1 = tcg_temp_new_i64();
9726             gen_load_fpr64(ctx, fp0, fs);
9727             gen_load_fpr64(ctx, fp1, ft);
9728             gen_helper_float_min_d(fp1, cpu_env, fp0, fp1);
9729             gen_store_fpr64(ctx, fp1, fd);
9730             tcg_temp_free_i64(fp1);
9731             tcg_temp_free_i64(fp0);
9732         } else {
9733             /* OPC_RECIP2_D */
9734             check_cp1_64bitmode(ctx);
9735             {
9736                 TCGv_i64 fp0 = tcg_temp_new_i64();
9737                 TCGv_i64 fp1 = tcg_temp_new_i64();
9738
9739                 gen_load_fpr64(ctx, fp0, fs);
9740                 gen_load_fpr64(ctx, fp1, ft);
9741                 gen_helper_float_recip2_d(fp0, cpu_env, fp0, fp1);
9742                 tcg_temp_free_i64(fp1);
9743                 gen_store_fpr64(ctx, fp0, fd);
9744                 tcg_temp_free_i64(fp0);
9745             }
9746         }
9747         break;
9748     case OPC_MINA_D: /* OPC_RECIP1_D */
9749         if (ctx->insn_flags & ISA_MIPS32R6) {
9750             /* OPC_MINA_D */
9751             TCGv_i64 fp0 = tcg_temp_new_i64();
9752             TCGv_i64 fp1 = tcg_temp_new_i64();
9753             gen_load_fpr64(ctx, fp0, fs);
9754             gen_load_fpr64(ctx, fp1, ft);
9755             gen_helper_float_mina_d(fp1, cpu_env, fp0, fp1);
9756             gen_store_fpr64(ctx, fp1, fd);
9757             tcg_temp_free_i64(fp1);
9758             tcg_temp_free_i64(fp0);
9759         } else {
9760             /* OPC_RECIP1_D */
9761             check_cp1_64bitmode(ctx);
9762             {
9763                 TCGv_i64 fp0 = tcg_temp_new_i64();
9764
9765                 gen_load_fpr64(ctx, fp0, fs);
9766                 gen_helper_float_recip1_d(fp0, cpu_env, fp0);
9767                 gen_store_fpr64(ctx, fp0, fd);
9768                 tcg_temp_free_i64(fp0);
9769             }
9770         }
9771         break;
9772     case OPC_MAX_D: /*  OPC_RSQRT1_D */
9773         if (ctx->insn_flags & ISA_MIPS32R6) {
9774             /* OPC_MAX_D */
9775             TCGv_i64 fp0 = tcg_temp_new_i64();
9776             TCGv_i64 fp1 = tcg_temp_new_i64();
9777             gen_load_fpr64(ctx, fp0, fs);
9778             gen_load_fpr64(ctx, fp1, ft);
9779             gen_helper_float_max_d(fp1, cpu_env, fp0, fp1);
9780             gen_store_fpr64(ctx, fp1, fd);
9781             tcg_temp_free_i64(fp1);
9782             tcg_temp_free_i64(fp0);
9783         } else {
9784             /* OPC_RSQRT1_D */
9785             check_cp1_64bitmode(ctx);
9786             {
9787                 TCGv_i64 fp0 = tcg_temp_new_i64();
9788
9789                 gen_load_fpr64(ctx, fp0, fs);
9790                 gen_helper_float_rsqrt1_d(fp0, cpu_env, fp0);
9791                 gen_store_fpr64(ctx, fp0, fd);
9792                 tcg_temp_free_i64(fp0);
9793             }
9794         }
9795         break;
9796     case OPC_MAXA_D: /* OPC_RSQRT2_D */
9797         if (ctx->insn_flags & ISA_MIPS32R6) {
9798             /* OPC_MAXA_D */
9799             TCGv_i64 fp0 = tcg_temp_new_i64();
9800             TCGv_i64 fp1 = tcg_temp_new_i64();
9801             gen_load_fpr64(ctx, fp0, fs);
9802             gen_load_fpr64(ctx, fp1, ft);
9803             gen_helper_float_maxa_d(fp1, cpu_env, fp0, fp1);
9804             gen_store_fpr64(ctx, fp1, fd);
9805             tcg_temp_free_i64(fp1);
9806             tcg_temp_free_i64(fp0);
9807         } else {
9808             /* OPC_RSQRT2_D */
9809             check_cp1_64bitmode(ctx);
9810             {
9811                 TCGv_i64 fp0 = tcg_temp_new_i64();
9812                 TCGv_i64 fp1 = tcg_temp_new_i64();
9813
9814                 gen_load_fpr64(ctx, fp0, fs);
9815                 gen_load_fpr64(ctx, fp1, ft);
9816                 gen_helper_float_rsqrt2_d(fp0, cpu_env, fp0, fp1);
9817                 tcg_temp_free_i64(fp1);
9818                 gen_store_fpr64(ctx, fp0, fd);
9819                 tcg_temp_free_i64(fp0);
9820             }
9821         }
9822         break;
9823     case OPC_CMP_F_D:
9824     case OPC_CMP_UN_D:
9825     case OPC_CMP_EQ_D:
9826     case OPC_CMP_UEQ_D:
9827     case OPC_CMP_OLT_D:
9828     case OPC_CMP_ULT_D:
9829     case OPC_CMP_OLE_D:
9830     case OPC_CMP_ULE_D:
9831     case OPC_CMP_SF_D:
9832     case OPC_CMP_NGLE_D:
9833     case OPC_CMP_SEQ_D:
9834     case OPC_CMP_NGL_D:
9835     case OPC_CMP_LT_D:
9836     case OPC_CMP_NGE_D:
9837     case OPC_CMP_LE_D:
9838     case OPC_CMP_NGT_D:
9839         check_insn_opc_removed(ctx, ISA_MIPS32R6);
9840         if (ctx->opcode & (1 << 6)) {
9841             gen_cmpabs_d(ctx, func-48, ft, fs, cc);
9842         } else {
9843             gen_cmp_d(ctx, func-48, ft, fs, cc);
9844         }
9845         break;
9846     case OPC_CVT_S_D:
9847         check_cp1_registers(ctx, fs);
9848         {
9849             TCGv_i32 fp32 = tcg_temp_new_i32();
9850             TCGv_i64 fp64 = tcg_temp_new_i64();
9851
9852             gen_load_fpr64(ctx, fp64, fs);
9853             gen_helper_float_cvts_d(fp32, cpu_env, fp64);
9854             tcg_temp_free_i64(fp64);
9855             gen_store_fpr32(ctx, fp32, fd);
9856             tcg_temp_free_i32(fp32);
9857         }
9858         break;
9859     case OPC_CVT_W_D:
9860         check_cp1_registers(ctx, fs);
9861         {
9862             TCGv_i32 fp32 = tcg_temp_new_i32();
9863             TCGv_i64 fp64 = tcg_temp_new_i64();
9864
9865             gen_load_fpr64(ctx, fp64, fs);
9866             if (ctx->nan2008) {
9867                 gen_helper_float_cvt_2008_w_d(fp32, cpu_env, fp64);
9868             } else {
9869                 gen_helper_float_cvt_w_d(fp32, cpu_env, fp64);
9870             }
9871             tcg_temp_free_i64(fp64);
9872             gen_store_fpr32(ctx, fp32, fd);
9873             tcg_temp_free_i32(fp32);
9874         }
9875         break;
9876     case OPC_CVT_L_D:
9877         check_cp1_64bitmode(ctx);
9878         {
9879             TCGv_i64 fp0 = tcg_temp_new_i64();
9880
9881             gen_load_fpr64(ctx, fp0, fs);
9882             if (ctx->nan2008) {
9883                 gen_helper_float_cvt_2008_l_d(fp0, cpu_env, fp0);
9884             } else {
9885                 gen_helper_float_cvt_l_d(fp0, cpu_env, fp0);
9886             }
9887             gen_store_fpr64(ctx, fp0, fd);
9888             tcg_temp_free_i64(fp0);
9889         }
9890         break;
9891     case OPC_CVT_S_W:
9892         {
9893             TCGv_i32 fp0 = tcg_temp_new_i32();
9894
9895             gen_load_fpr32(ctx, fp0, fs);
9896             gen_helper_float_cvts_w(fp0, cpu_env, fp0);
9897             gen_store_fpr32(ctx, fp0, fd);
9898             tcg_temp_free_i32(fp0);
9899         }
9900         break;
9901     case OPC_CVT_D_W:
9902         check_cp1_registers(ctx, fd);
9903         {
9904             TCGv_i32 fp32 = tcg_temp_new_i32();
9905             TCGv_i64 fp64 = tcg_temp_new_i64();
9906
9907             gen_load_fpr32(ctx, fp32, fs);
9908             gen_helper_float_cvtd_w(fp64, cpu_env, fp32);
9909             tcg_temp_free_i32(fp32);
9910             gen_store_fpr64(ctx, fp64, fd);
9911             tcg_temp_free_i64(fp64);
9912         }
9913         break;
9914     case OPC_CVT_S_L:
9915         check_cp1_64bitmode(ctx);
9916         {
9917             TCGv_i32 fp32 = tcg_temp_new_i32();
9918             TCGv_i64 fp64 = tcg_temp_new_i64();
9919
9920             gen_load_fpr64(ctx, fp64, fs);
9921             gen_helper_float_cvts_l(fp32, cpu_env, fp64);
9922             tcg_temp_free_i64(fp64);
9923             gen_store_fpr32(ctx, fp32, fd);
9924             tcg_temp_free_i32(fp32);
9925         }
9926         break;
9927     case OPC_CVT_D_L:
9928         check_cp1_64bitmode(ctx);
9929         {
9930             TCGv_i64 fp0 = tcg_temp_new_i64();
9931
9932             gen_load_fpr64(ctx, fp0, fs);
9933             gen_helper_float_cvtd_l(fp0, cpu_env, fp0);
9934             gen_store_fpr64(ctx, fp0, fd);
9935             tcg_temp_free_i64(fp0);
9936         }
9937         break;
9938     case OPC_CVT_PS_PW:
9939         check_ps(ctx);
9940         {
9941             TCGv_i64 fp0 = tcg_temp_new_i64();
9942
9943             gen_load_fpr64(ctx, fp0, fs);
9944             gen_helper_float_cvtps_pw(fp0, cpu_env, fp0);
9945             gen_store_fpr64(ctx, fp0, fd);
9946             tcg_temp_free_i64(fp0);
9947         }
9948         break;
9949     case OPC_ADD_PS:
9950         check_ps(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, fs);
9956             gen_load_fpr64(ctx, fp1, ft);
9957             gen_helper_float_add_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         break;
9963     case OPC_SUB_PS:
9964         check_ps(ctx);
9965         {
9966             TCGv_i64 fp0 = tcg_temp_new_i64();
9967             TCGv_i64 fp1 = tcg_temp_new_i64();
9968
9969             gen_load_fpr64(ctx, fp0, fs);
9970             gen_load_fpr64(ctx, fp1, ft);
9971             gen_helper_float_sub_ps(fp0, cpu_env, fp0, fp1);
9972             tcg_temp_free_i64(fp1);
9973             gen_store_fpr64(ctx, fp0, fd);
9974             tcg_temp_free_i64(fp0);
9975         }
9976         break;
9977     case OPC_MUL_PS:
9978         check_ps(ctx);
9979         {
9980             TCGv_i64 fp0 = tcg_temp_new_i64();
9981             TCGv_i64 fp1 = tcg_temp_new_i64();
9982
9983             gen_load_fpr64(ctx, fp0, fs);
9984             gen_load_fpr64(ctx, fp1, ft);
9985             gen_helper_float_mul_ps(fp0, cpu_env, fp0, fp1);
9986             tcg_temp_free_i64(fp1);
9987             gen_store_fpr64(ctx, fp0, fd);
9988             tcg_temp_free_i64(fp0);
9989         }
9990         break;
9991     case OPC_ABS_PS:
9992         check_ps(ctx);
9993         {
9994             TCGv_i64 fp0 = tcg_temp_new_i64();
9995
9996             gen_load_fpr64(ctx, fp0, fs);
9997             gen_helper_float_abs_ps(fp0, fp0);
9998             gen_store_fpr64(ctx, fp0, fd);
9999             tcg_temp_free_i64(fp0);
10000         }
10001         break;
10002     case OPC_MOV_PS:
10003         check_ps(ctx);
10004         {
10005             TCGv_i64 fp0 = tcg_temp_new_i64();
10006
10007             gen_load_fpr64(ctx, fp0, fs);
10008             gen_store_fpr64(ctx, fp0, fd);
10009             tcg_temp_free_i64(fp0);
10010         }
10011         break;
10012     case OPC_NEG_PS:
10013         check_ps(ctx);
10014         {
10015             TCGv_i64 fp0 = tcg_temp_new_i64();
10016
10017             gen_load_fpr64(ctx, fp0, fs);
10018             gen_helper_float_chs_ps(fp0, fp0);
10019             gen_store_fpr64(ctx, fp0, fd);
10020             tcg_temp_free_i64(fp0);
10021         }
10022         break;
10023     case OPC_MOVCF_PS:
10024         check_ps(ctx);
10025         gen_movcf_ps(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1);
10026         break;
10027     case OPC_MOVZ_PS:
10028         check_ps(ctx);
10029         {
10030             TCGLabel *l1 = gen_new_label();
10031             TCGv_i64 fp0;
10032
10033             if (ft != 0)
10034                 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
10035             fp0 = tcg_temp_new_i64();
10036             gen_load_fpr64(ctx, fp0, fs);
10037             gen_store_fpr64(ctx, fp0, fd);
10038             tcg_temp_free_i64(fp0);
10039             gen_set_label(l1);
10040         }
10041         break;
10042     case OPC_MOVN_PS:
10043         check_ps(ctx);
10044         {
10045             TCGLabel *l1 = gen_new_label();
10046             TCGv_i64 fp0;
10047
10048             if (ft != 0) {
10049                 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
10050                 fp0 = tcg_temp_new_i64();
10051                 gen_load_fpr64(ctx, fp0, fs);
10052                 gen_store_fpr64(ctx, fp0, fd);
10053                 tcg_temp_free_i64(fp0);
10054                 gen_set_label(l1);
10055             }
10056         }
10057         break;
10058     case OPC_ADDR_PS:
10059         check_ps(ctx);
10060         {
10061             TCGv_i64 fp0 = tcg_temp_new_i64();
10062             TCGv_i64 fp1 = tcg_temp_new_i64();
10063
10064             gen_load_fpr64(ctx, fp0, ft);
10065             gen_load_fpr64(ctx, fp1, fs);
10066             gen_helper_float_addr_ps(fp0, cpu_env, fp0, fp1);
10067             tcg_temp_free_i64(fp1);
10068             gen_store_fpr64(ctx, fp0, fd);
10069             tcg_temp_free_i64(fp0);
10070         }
10071         break;
10072     case OPC_MULR_PS:
10073         check_ps(ctx);
10074         {
10075             TCGv_i64 fp0 = tcg_temp_new_i64();
10076             TCGv_i64 fp1 = tcg_temp_new_i64();
10077
10078             gen_load_fpr64(ctx, fp0, ft);
10079             gen_load_fpr64(ctx, fp1, fs);
10080             gen_helper_float_mulr_ps(fp0, cpu_env, fp0, fp1);
10081             tcg_temp_free_i64(fp1);
10082             gen_store_fpr64(ctx, fp0, fd);
10083             tcg_temp_free_i64(fp0);
10084         }
10085         break;
10086     case OPC_RECIP2_PS:
10087         check_ps(ctx);
10088         {
10089             TCGv_i64 fp0 = tcg_temp_new_i64();
10090             TCGv_i64 fp1 = tcg_temp_new_i64();
10091
10092             gen_load_fpr64(ctx, fp0, fs);
10093             gen_load_fpr64(ctx, fp1, ft);
10094             gen_helper_float_recip2_ps(fp0, cpu_env, fp0, fp1);
10095             tcg_temp_free_i64(fp1);
10096             gen_store_fpr64(ctx, fp0, fd);
10097             tcg_temp_free_i64(fp0);
10098         }
10099         break;
10100     case OPC_RECIP1_PS:
10101         check_ps(ctx);
10102         {
10103             TCGv_i64 fp0 = tcg_temp_new_i64();
10104
10105             gen_load_fpr64(ctx, fp0, fs);
10106             gen_helper_float_recip1_ps(fp0, cpu_env, fp0);
10107             gen_store_fpr64(ctx, fp0, fd);
10108             tcg_temp_free_i64(fp0);
10109         }
10110         break;
10111     case OPC_RSQRT1_PS:
10112         check_ps(ctx);
10113         {
10114             TCGv_i64 fp0 = tcg_temp_new_i64();
10115
10116             gen_load_fpr64(ctx, fp0, fs);
10117             gen_helper_float_rsqrt1_ps(fp0, cpu_env, fp0);
10118             gen_store_fpr64(ctx, fp0, fd);
10119             tcg_temp_free_i64(fp0);
10120         }
10121         break;
10122     case OPC_RSQRT2_PS:
10123         check_ps(ctx);
10124         {
10125             TCGv_i64 fp0 = tcg_temp_new_i64();
10126             TCGv_i64 fp1 = tcg_temp_new_i64();
10127
10128             gen_load_fpr64(ctx, fp0, fs);
10129             gen_load_fpr64(ctx, fp1, ft);
10130             gen_helper_float_rsqrt2_ps(fp0, cpu_env, fp0, fp1);
10131             tcg_temp_free_i64(fp1);
10132             gen_store_fpr64(ctx, fp0, fd);
10133             tcg_temp_free_i64(fp0);
10134         }
10135         break;
10136     case OPC_CVT_S_PU:
10137         check_cp1_64bitmode(ctx);
10138         {
10139             TCGv_i32 fp0 = tcg_temp_new_i32();
10140
10141             gen_load_fpr32h(ctx, fp0, fs);
10142             gen_helper_float_cvts_pu(fp0, cpu_env, fp0);
10143             gen_store_fpr32(ctx, fp0, fd);
10144             tcg_temp_free_i32(fp0);
10145         }
10146         break;
10147     case OPC_CVT_PW_PS:
10148         check_ps(ctx);
10149         {
10150             TCGv_i64 fp0 = tcg_temp_new_i64();
10151
10152             gen_load_fpr64(ctx, fp0, fs);
10153             gen_helper_float_cvtpw_ps(fp0, cpu_env, fp0);
10154             gen_store_fpr64(ctx, fp0, fd);
10155             tcg_temp_free_i64(fp0);
10156         }
10157         break;
10158     case OPC_CVT_S_PL:
10159         check_cp1_64bitmode(ctx);
10160         {
10161             TCGv_i32 fp0 = tcg_temp_new_i32();
10162
10163             gen_load_fpr32(ctx, fp0, fs);
10164             gen_helper_float_cvts_pl(fp0, cpu_env, fp0);
10165             gen_store_fpr32(ctx, fp0, fd);
10166             tcg_temp_free_i32(fp0);
10167         }
10168         break;
10169     case OPC_PLL_PS:
10170         check_ps(ctx);
10171         {
10172             TCGv_i32 fp0 = tcg_temp_new_i32();
10173             TCGv_i32 fp1 = tcg_temp_new_i32();
10174
10175             gen_load_fpr32(ctx, fp0, fs);
10176             gen_load_fpr32(ctx, fp1, ft);
10177             gen_store_fpr32h(ctx, fp0, fd);
10178             gen_store_fpr32(ctx, fp1, fd);
10179             tcg_temp_free_i32(fp0);
10180             tcg_temp_free_i32(fp1);
10181         }
10182         break;
10183     case OPC_PLU_PS:
10184         check_ps(ctx);
10185         {
10186             TCGv_i32 fp0 = tcg_temp_new_i32();
10187             TCGv_i32 fp1 = tcg_temp_new_i32();
10188
10189             gen_load_fpr32(ctx, fp0, fs);
10190             gen_load_fpr32h(ctx, fp1, ft);
10191             gen_store_fpr32(ctx, fp1, fd);
10192             gen_store_fpr32h(ctx, fp0, fd);
10193             tcg_temp_free_i32(fp0);
10194             tcg_temp_free_i32(fp1);
10195         }
10196         break;
10197     case OPC_PUL_PS:
10198         check_ps(ctx);
10199         {
10200             TCGv_i32 fp0 = tcg_temp_new_i32();
10201             TCGv_i32 fp1 = tcg_temp_new_i32();
10202
10203             gen_load_fpr32h(ctx, fp0, fs);
10204             gen_load_fpr32(ctx, fp1, ft);
10205             gen_store_fpr32(ctx, fp1, fd);
10206             gen_store_fpr32h(ctx, fp0, fd);
10207             tcg_temp_free_i32(fp0);
10208             tcg_temp_free_i32(fp1);
10209         }
10210         break;
10211     case OPC_PUU_PS:
10212         check_ps(ctx);
10213         {
10214             TCGv_i32 fp0 = tcg_temp_new_i32();
10215             TCGv_i32 fp1 = tcg_temp_new_i32();
10216
10217             gen_load_fpr32h(ctx, fp0, fs);
10218             gen_load_fpr32h(ctx, fp1, ft);
10219             gen_store_fpr32(ctx, fp1, fd);
10220             gen_store_fpr32h(ctx, fp0, fd);
10221             tcg_temp_free_i32(fp0);
10222             tcg_temp_free_i32(fp1);
10223         }
10224         break;
10225     case OPC_CMP_F_PS:
10226     case OPC_CMP_UN_PS:
10227     case OPC_CMP_EQ_PS:
10228     case OPC_CMP_UEQ_PS:
10229     case OPC_CMP_OLT_PS:
10230     case OPC_CMP_ULT_PS:
10231     case OPC_CMP_OLE_PS:
10232     case OPC_CMP_ULE_PS:
10233     case OPC_CMP_SF_PS:
10234     case OPC_CMP_NGLE_PS:
10235     case OPC_CMP_SEQ_PS:
10236     case OPC_CMP_NGL_PS:
10237     case OPC_CMP_LT_PS:
10238     case OPC_CMP_NGE_PS:
10239     case OPC_CMP_LE_PS:
10240     case OPC_CMP_NGT_PS:
10241         if (ctx->opcode & (1 << 6)) {
10242             gen_cmpabs_ps(ctx, func-48, ft, fs, cc);
10243         } else {
10244             gen_cmp_ps(ctx, func-48, ft, fs, cc);
10245         }
10246         break;
10247     default:
10248         MIPS_INVAL("farith");
10249         generate_exception_end(ctx, EXCP_RI);
10250         return;
10251     }
10252 }
10253
10254 /* Coprocessor 3 (FPU) */
10255 static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc,
10256                            int fd, int fs, int base, int index)
10257 {
10258     TCGv t0 = tcg_temp_new();
10259
10260     if (base == 0) {
10261         gen_load_gpr(t0, index);
10262     } else if (index == 0) {
10263         gen_load_gpr(t0, base);
10264     } else {
10265         gen_op_addr_add(ctx, t0, cpu_gpr[base], cpu_gpr[index]);
10266     }
10267     /* Don't do NOP if destination is zero: we must perform the actual
10268        memory access. */
10269     switch (opc) {
10270     case OPC_LWXC1:
10271         check_cop1x(ctx);
10272         {
10273             TCGv_i32 fp0 = tcg_temp_new_i32();
10274
10275             tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL);
10276             tcg_gen_trunc_tl_i32(fp0, t0);
10277             gen_store_fpr32(ctx, fp0, fd);
10278             tcg_temp_free_i32(fp0);
10279         }
10280         break;
10281     case OPC_LDXC1:
10282         check_cop1x(ctx);
10283         check_cp1_registers(ctx, fd);
10284         {
10285             TCGv_i64 fp0 = tcg_temp_new_i64();
10286             tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
10287             gen_store_fpr64(ctx, fp0, fd);
10288             tcg_temp_free_i64(fp0);
10289         }
10290         break;
10291     case OPC_LUXC1:
10292         check_cp1_64bitmode(ctx);
10293         tcg_gen_andi_tl(t0, t0, ~0x7);
10294         {
10295             TCGv_i64 fp0 = tcg_temp_new_i64();
10296
10297             tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
10298             gen_store_fpr64(ctx, fp0, fd);
10299             tcg_temp_free_i64(fp0);
10300         }
10301         break;
10302     case OPC_SWXC1:
10303         check_cop1x(ctx);
10304         {
10305             TCGv_i32 fp0 = tcg_temp_new_i32();
10306             gen_load_fpr32(ctx, fp0, fs);
10307             tcg_gen_qemu_st_i32(fp0, t0, ctx->mem_idx, MO_TEUL);
10308             tcg_temp_free_i32(fp0);
10309         }
10310         break;
10311     case OPC_SDXC1:
10312         check_cop1x(ctx);
10313         check_cp1_registers(ctx, fs);
10314         {
10315             TCGv_i64 fp0 = tcg_temp_new_i64();
10316             gen_load_fpr64(ctx, fp0, fs);
10317             tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
10318             tcg_temp_free_i64(fp0);
10319         }
10320         break;
10321     case OPC_SUXC1:
10322         check_cp1_64bitmode(ctx);
10323         tcg_gen_andi_tl(t0, t0, ~0x7);
10324         {
10325             TCGv_i64 fp0 = tcg_temp_new_i64();
10326             gen_load_fpr64(ctx, fp0, fs);
10327             tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
10328             tcg_temp_free_i64(fp0);
10329         }
10330         break;
10331     }
10332     tcg_temp_free(t0);
10333 }
10334
10335 static void gen_flt3_arith (DisasContext *ctx, uint32_t opc,
10336                             int fd, int fr, int fs, int ft)
10337 {
10338     switch (opc) {
10339     case OPC_ALNV_PS:
10340         check_ps(ctx);
10341         {
10342             TCGv t0 = tcg_temp_local_new();
10343             TCGv_i32 fp = tcg_temp_new_i32();
10344             TCGv_i32 fph = tcg_temp_new_i32();
10345             TCGLabel *l1 = gen_new_label();
10346             TCGLabel *l2 = gen_new_label();
10347
10348             gen_load_gpr(t0, fr);
10349             tcg_gen_andi_tl(t0, t0, 0x7);
10350
10351             tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0, l1);
10352             gen_load_fpr32(ctx, fp, fs);
10353             gen_load_fpr32h(ctx, fph, fs);
10354             gen_store_fpr32(ctx, fp, fd);
10355             gen_store_fpr32h(ctx, fph, fd);
10356             tcg_gen_br(l2);
10357             gen_set_label(l1);
10358             tcg_gen_brcondi_tl(TCG_COND_NE, t0, 4, l2);
10359             tcg_temp_free(t0);
10360 #ifdef TARGET_WORDS_BIGENDIAN
10361             gen_load_fpr32(ctx, fp, fs);
10362             gen_load_fpr32h(ctx, fph, ft);
10363             gen_store_fpr32h(ctx, fp, fd);
10364             gen_store_fpr32(ctx, fph, fd);
10365 #else
10366             gen_load_fpr32h(ctx, fph, fs);
10367             gen_load_fpr32(ctx, fp, ft);
10368             gen_store_fpr32(ctx, fph, fd);
10369             gen_store_fpr32h(ctx, fp, fd);
10370 #endif
10371             gen_set_label(l2);
10372             tcg_temp_free_i32(fp);
10373             tcg_temp_free_i32(fph);
10374         }
10375         break;
10376     case OPC_MADD_S:
10377         check_cop1x(ctx);
10378         {
10379             TCGv_i32 fp0 = tcg_temp_new_i32();
10380             TCGv_i32 fp1 = tcg_temp_new_i32();
10381             TCGv_i32 fp2 = tcg_temp_new_i32();
10382
10383             gen_load_fpr32(ctx, fp0, fs);
10384             gen_load_fpr32(ctx, fp1, ft);
10385             gen_load_fpr32(ctx, fp2, fr);
10386             gen_helper_float_madd_s(fp2, cpu_env, fp0, fp1, fp2);
10387             tcg_temp_free_i32(fp0);
10388             tcg_temp_free_i32(fp1);
10389             gen_store_fpr32(ctx, fp2, fd);
10390             tcg_temp_free_i32(fp2);
10391         }
10392         break;
10393     case OPC_MADD_D:
10394         check_cop1x(ctx);
10395         check_cp1_registers(ctx, fd | fs | ft | fr);
10396         {
10397             TCGv_i64 fp0 = tcg_temp_new_i64();
10398             TCGv_i64 fp1 = tcg_temp_new_i64();
10399             TCGv_i64 fp2 = tcg_temp_new_i64();
10400
10401             gen_load_fpr64(ctx, fp0, fs);
10402             gen_load_fpr64(ctx, fp1, ft);
10403             gen_load_fpr64(ctx, fp2, fr);
10404             gen_helper_float_madd_d(fp2, cpu_env, fp0, fp1, fp2);
10405             tcg_temp_free_i64(fp0);
10406             tcg_temp_free_i64(fp1);
10407             gen_store_fpr64(ctx, fp2, fd);
10408             tcg_temp_free_i64(fp2);
10409         }
10410         break;
10411     case OPC_MADD_PS:
10412         check_ps(ctx);
10413         {
10414             TCGv_i64 fp0 = tcg_temp_new_i64();
10415             TCGv_i64 fp1 = tcg_temp_new_i64();
10416             TCGv_i64 fp2 = tcg_temp_new_i64();
10417
10418             gen_load_fpr64(ctx, fp0, fs);
10419             gen_load_fpr64(ctx, fp1, ft);
10420             gen_load_fpr64(ctx, fp2, fr);
10421             gen_helper_float_madd_ps(fp2, cpu_env, fp0, fp1, fp2);
10422             tcg_temp_free_i64(fp0);
10423             tcg_temp_free_i64(fp1);
10424             gen_store_fpr64(ctx, fp2, fd);
10425             tcg_temp_free_i64(fp2);
10426         }
10427         break;
10428     case OPC_MSUB_S:
10429         check_cop1x(ctx);
10430         {
10431             TCGv_i32 fp0 = tcg_temp_new_i32();
10432             TCGv_i32 fp1 = tcg_temp_new_i32();
10433             TCGv_i32 fp2 = tcg_temp_new_i32();
10434
10435             gen_load_fpr32(ctx, fp0, fs);
10436             gen_load_fpr32(ctx, fp1, ft);
10437             gen_load_fpr32(ctx, fp2, fr);
10438             gen_helper_float_msub_s(fp2, cpu_env, fp0, fp1, fp2);
10439             tcg_temp_free_i32(fp0);
10440             tcg_temp_free_i32(fp1);
10441             gen_store_fpr32(ctx, fp2, fd);
10442             tcg_temp_free_i32(fp2);
10443         }
10444         break;
10445     case OPC_MSUB_D:
10446         check_cop1x(ctx);
10447         check_cp1_registers(ctx, fd | fs | ft | fr);
10448         {
10449             TCGv_i64 fp0 = tcg_temp_new_i64();
10450             TCGv_i64 fp1 = tcg_temp_new_i64();
10451             TCGv_i64 fp2 = tcg_temp_new_i64();
10452
10453             gen_load_fpr64(ctx, fp0, fs);
10454             gen_load_fpr64(ctx, fp1, ft);
10455             gen_load_fpr64(ctx, fp2, fr);
10456             gen_helper_float_msub_d(fp2, cpu_env, fp0, fp1, fp2);
10457             tcg_temp_free_i64(fp0);
10458             tcg_temp_free_i64(fp1);
10459             gen_store_fpr64(ctx, fp2, fd);
10460             tcg_temp_free_i64(fp2);
10461         }
10462         break;
10463     case OPC_MSUB_PS:
10464         check_ps(ctx);
10465         {
10466             TCGv_i64 fp0 = tcg_temp_new_i64();
10467             TCGv_i64 fp1 = tcg_temp_new_i64();
10468             TCGv_i64 fp2 = tcg_temp_new_i64();
10469
10470             gen_load_fpr64(ctx, fp0, fs);
10471             gen_load_fpr64(ctx, fp1, ft);
10472             gen_load_fpr64(ctx, fp2, fr);
10473             gen_helper_float_msub_ps(fp2, cpu_env, fp0, fp1, fp2);
10474             tcg_temp_free_i64(fp0);
10475             tcg_temp_free_i64(fp1);
10476             gen_store_fpr64(ctx, fp2, fd);
10477             tcg_temp_free_i64(fp2);
10478         }
10479         break;
10480     case OPC_NMADD_S:
10481         check_cop1x(ctx);
10482         {
10483             TCGv_i32 fp0 = tcg_temp_new_i32();
10484             TCGv_i32 fp1 = tcg_temp_new_i32();
10485             TCGv_i32 fp2 = tcg_temp_new_i32();
10486
10487             gen_load_fpr32(ctx, fp0, fs);
10488             gen_load_fpr32(ctx, fp1, ft);
10489             gen_load_fpr32(ctx, fp2, fr);
10490             gen_helper_float_nmadd_s(fp2, cpu_env, fp0, fp1, fp2);
10491             tcg_temp_free_i32(fp0);
10492             tcg_temp_free_i32(fp1);
10493             gen_store_fpr32(ctx, fp2, fd);
10494             tcg_temp_free_i32(fp2);
10495         }
10496         break;
10497     case OPC_NMADD_D:
10498         check_cop1x(ctx);
10499         check_cp1_registers(ctx, fd | fs | ft | fr);
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_nmadd_d(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         break;
10515     case OPC_NMADD_PS:
10516         check_ps(ctx);
10517         {
10518             TCGv_i64 fp0 = tcg_temp_new_i64();
10519             TCGv_i64 fp1 = tcg_temp_new_i64();
10520             TCGv_i64 fp2 = tcg_temp_new_i64();
10521
10522             gen_load_fpr64(ctx, fp0, fs);
10523             gen_load_fpr64(ctx, fp1, ft);
10524             gen_load_fpr64(ctx, fp2, fr);
10525             gen_helper_float_nmadd_ps(fp2, cpu_env, fp0, fp1, fp2);
10526             tcg_temp_free_i64(fp0);
10527             tcg_temp_free_i64(fp1);
10528             gen_store_fpr64(ctx, fp2, fd);
10529             tcg_temp_free_i64(fp2);
10530         }
10531         break;
10532     case OPC_NMSUB_S:
10533         check_cop1x(ctx);
10534         {
10535             TCGv_i32 fp0 = tcg_temp_new_i32();
10536             TCGv_i32 fp1 = tcg_temp_new_i32();
10537             TCGv_i32 fp2 = tcg_temp_new_i32();
10538
10539             gen_load_fpr32(ctx, fp0, fs);
10540             gen_load_fpr32(ctx, fp1, ft);
10541             gen_load_fpr32(ctx, fp2, fr);
10542             gen_helper_float_nmsub_s(fp2, cpu_env, fp0, fp1, fp2);
10543             tcg_temp_free_i32(fp0);
10544             tcg_temp_free_i32(fp1);
10545             gen_store_fpr32(ctx, fp2, fd);
10546             tcg_temp_free_i32(fp2);
10547         }
10548         break;
10549     case OPC_NMSUB_D:
10550         check_cop1x(ctx);
10551         check_cp1_registers(ctx, fd | fs | ft | fr);
10552         {
10553             TCGv_i64 fp0 = tcg_temp_new_i64();
10554             TCGv_i64 fp1 = tcg_temp_new_i64();
10555             TCGv_i64 fp2 = tcg_temp_new_i64();
10556
10557             gen_load_fpr64(ctx, fp0, fs);
10558             gen_load_fpr64(ctx, fp1, ft);
10559             gen_load_fpr64(ctx, fp2, fr);
10560             gen_helper_float_nmsub_d(fp2, cpu_env, fp0, fp1, fp2);
10561             tcg_temp_free_i64(fp0);
10562             tcg_temp_free_i64(fp1);
10563             gen_store_fpr64(ctx, fp2, fd);
10564             tcg_temp_free_i64(fp2);
10565         }
10566         break;
10567     case OPC_NMSUB_PS:
10568         check_ps(ctx);
10569         {
10570             TCGv_i64 fp0 = tcg_temp_new_i64();
10571             TCGv_i64 fp1 = tcg_temp_new_i64();
10572             TCGv_i64 fp2 = tcg_temp_new_i64();
10573
10574             gen_load_fpr64(ctx, fp0, fs);
10575             gen_load_fpr64(ctx, fp1, ft);
10576             gen_load_fpr64(ctx, fp2, fr);
10577             gen_helper_float_nmsub_ps(fp2, cpu_env, fp0, fp1, fp2);
10578             tcg_temp_free_i64(fp0);
10579             tcg_temp_free_i64(fp1);
10580             gen_store_fpr64(ctx, fp2, fd);
10581             tcg_temp_free_i64(fp2);
10582         }
10583         break;
10584     default:
10585         MIPS_INVAL("flt3_arith");
10586         generate_exception_end(ctx, EXCP_RI);
10587         return;
10588     }
10589 }
10590
10591 static void gen_rdhwr(DisasContext *ctx, int rt, int rd, int sel)
10592 {
10593     TCGv t0;
10594
10595 #if !defined(CONFIG_USER_ONLY)
10596     /* The Linux kernel will emulate rdhwr if it's not supported natively.
10597        Therefore only check the ISA in system mode.  */
10598     check_insn(ctx, ISA_MIPS32R2);
10599 #endif
10600     t0 = tcg_temp_new();
10601
10602     switch (rd) {
10603     case 0:
10604         gen_helper_rdhwr_cpunum(t0, cpu_env);
10605         gen_store_gpr(t0, rt);
10606         break;
10607     case 1:
10608         gen_helper_rdhwr_synci_step(t0, cpu_env);
10609         gen_store_gpr(t0, rt);
10610         break;
10611     case 2:
10612         gen_helper_rdhwr_cc(t0, cpu_env);
10613         gen_store_gpr(t0, rt);
10614         break;
10615     case 3:
10616         gen_helper_rdhwr_ccres(t0, cpu_env);
10617         gen_store_gpr(t0, rt);
10618         break;
10619     case 4:
10620         check_insn(ctx, ISA_MIPS32R6);
10621         if (sel != 0) {
10622             /* Performance counter registers are not implemented other than
10623              * control register 0.
10624              */
10625             generate_exception(ctx, EXCP_RI);
10626         }
10627         gen_helper_rdhwr_performance(t0, cpu_env);
10628         gen_store_gpr(t0, rt);
10629         break;
10630     case 5:
10631         check_insn(ctx, ISA_MIPS32R6);
10632         gen_helper_rdhwr_xnp(t0, cpu_env);
10633         gen_store_gpr(t0, rt);
10634         break;
10635     case 29:
10636 #if defined(CONFIG_USER_ONLY)
10637         tcg_gen_ld_tl(t0, cpu_env,
10638                       offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
10639         gen_store_gpr(t0, rt);
10640         break;
10641 #else
10642         if ((ctx->hflags & MIPS_HFLAG_CP0) ||
10643             (ctx->hflags & MIPS_HFLAG_HWRENA_ULR)) {
10644             tcg_gen_ld_tl(t0, cpu_env,
10645                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
10646             gen_store_gpr(t0, rt);
10647         } else {
10648             generate_exception_end(ctx, EXCP_RI);
10649         }
10650         break;
10651 #endif
10652     default:            /* Invalid */
10653         MIPS_INVAL("rdhwr");
10654         generate_exception_end(ctx, EXCP_RI);
10655         break;
10656     }
10657     tcg_temp_free(t0);
10658 }
10659
10660 static inline void clear_branch_hflags(DisasContext *ctx)
10661 {
10662     ctx->hflags &= ~MIPS_HFLAG_BMASK;
10663     if (ctx->bstate == BS_NONE) {
10664         save_cpu_state(ctx, 0);
10665     } else {
10666         /* it is not safe to save ctx->hflags as hflags may be changed
10667            in execution time by the instruction in delay / forbidden slot. */
10668         tcg_gen_andi_i32(hflags, hflags, ~MIPS_HFLAG_BMASK);
10669     }
10670 }
10671
10672 static void gen_branch(DisasContext *ctx, int insn_bytes)
10673 {
10674     if (ctx->hflags & MIPS_HFLAG_BMASK) {
10675         int proc_hflags = ctx->hflags & MIPS_HFLAG_BMASK;
10676         /* Branches completion */
10677         clear_branch_hflags(ctx);
10678         ctx->bstate = BS_BRANCH;
10679         /* FIXME: Need to clear can_do_io.  */
10680         switch (proc_hflags & MIPS_HFLAG_BMASK_BASE) {
10681         case MIPS_HFLAG_FBNSLOT:
10682             gen_goto_tb(ctx, 0, ctx->pc + insn_bytes);
10683             break;
10684         case MIPS_HFLAG_B:
10685             /* unconditional branch */
10686             if (proc_hflags & MIPS_HFLAG_BX) {
10687                 tcg_gen_xori_i32(hflags, hflags, MIPS_HFLAG_M16);
10688             }
10689             gen_goto_tb(ctx, 0, ctx->btarget);
10690             break;
10691         case MIPS_HFLAG_BL:
10692             /* blikely taken case */
10693             gen_goto_tb(ctx, 0, ctx->btarget);
10694             break;
10695         case MIPS_HFLAG_BC:
10696             /* Conditional branch */
10697             {
10698                 TCGLabel *l1 = gen_new_label();
10699
10700                 tcg_gen_brcondi_tl(TCG_COND_NE, bcond, 0, l1);
10701                 gen_goto_tb(ctx, 1, ctx->pc + insn_bytes);
10702                 gen_set_label(l1);
10703                 gen_goto_tb(ctx, 0, ctx->btarget);
10704             }
10705             break;
10706         case MIPS_HFLAG_BR:
10707             /* unconditional branch to register */
10708             if (ctx->insn_flags & (ASE_MIPS16 | ASE_MICROMIPS)) {
10709                 TCGv t0 = tcg_temp_new();
10710                 TCGv_i32 t1 = tcg_temp_new_i32();
10711
10712                 tcg_gen_andi_tl(t0, btarget, 0x1);
10713                 tcg_gen_trunc_tl_i32(t1, t0);
10714                 tcg_temp_free(t0);
10715                 tcg_gen_andi_i32(hflags, hflags, ~(uint32_t)MIPS_HFLAG_M16);
10716                 tcg_gen_shli_i32(t1, t1, MIPS_HFLAG_M16_SHIFT);
10717                 tcg_gen_or_i32(hflags, hflags, t1);
10718                 tcg_temp_free_i32(t1);
10719
10720                 tcg_gen_andi_tl(cpu_PC, btarget, ~(target_ulong)0x1);
10721             } else {
10722                 tcg_gen_mov_tl(cpu_PC, btarget);
10723             }
10724             if (ctx->singlestep_enabled) {
10725                 save_cpu_state(ctx, 0);
10726                 gen_helper_raise_exception_debug(cpu_env);
10727             }
10728             tcg_gen_exit_tb(0);
10729             break;
10730         default:
10731             fprintf(stderr, "unknown branch 0x%x\n", proc_hflags);
10732             abort();
10733         }
10734     }
10735 }
10736
10737 /* Compact Branches */
10738 static void gen_compute_compact_branch(DisasContext *ctx, uint32_t opc,
10739                                        int rs, int rt, int32_t offset)
10740 {
10741     int bcond_compute = 0;
10742     TCGv t0 = tcg_temp_new();
10743     TCGv t1 = tcg_temp_new();
10744     int m16_lowbit = (ctx->hflags & MIPS_HFLAG_M16) != 0;
10745
10746     if (ctx->hflags & MIPS_HFLAG_BMASK) {
10747 #ifdef MIPS_DEBUG_DISAS
10748         LOG_DISAS("Branch in delay / forbidden slot at PC 0x" TARGET_FMT_lx
10749                   "\n", ctx->pc);
10750 #endif
10751         generate_exception_end(ctx, EXCP_RI);
10752         goto out;
10753     }
10754
10755     /* Load needed operands and calculate btarget */
10756     switch (opc) {
10757     /* compact branch */
10758     case OPC_BOVC: /* OPC_BEQZALC, OPC_BEQC */
10759     case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC */
10760         gen_load_gpr(t0, rs);
10761         gen_load_gpr(t1, rt);
10762         bcond_compute = 1;
10763         ctx->btarget = addr_add(ctx, ctx->pc + 4, offset);
10764         if (rs <= rt && rs == 0) {
10765             /* OPC_BEQZALC, OPC_BNEZALC */
10766             tcg_gen_movi_tl(cpu_gpr[31], ctx->pc + 4 + m16_lowbit);
10767         }
10768         break;
10769     case OPC_BLEZC: /* OPC_BGEZC, OPC_BGEC */
10770     case OPC_BGTZC: /* OPC_BLTZC, OPC_BLTC */
10771         gen_load_gpr(t0, rs);
10772         gen_load_gpr(t1, rt);
10773         bcond_compute = 1;
10774         ctx->btarget = addr_add(ctx, ctx->pc + 4, offset);
10775         break;
10776     case OPC_BLEZALC: /* OPC_BGEZALC, OPC_BGEUC */
10777     case OPC_BGTZALC: /* OPC_BLTZALC, OPC_BLTUC */
10778         if (rs == 0 || rs == rt) {
10779             /* OPC_BLEZALC, OPC_BGEZALC */
10780             /* OPC_BGTZALC, OPC_BLTZALC */
10781             tcg_gen_movi_tl(cpu_gpr[31], ctx->pc + 4 + m16_lowbit);
10782         }
10783         gen_load_gpr(t0, rs);
10784         gen_load_gpr(t1, rt);
10785         bcond_compute = 1;
10786         ctx->btarget = addr_add(ctx, ctx->pc + 4, offset);
10787         break;
10788     case OPC_BC:
10789     case OPC_BALC:
10790         ctx->btarget = addr_add(ctx, ctx->pc + 4, offset);
10791         break;
10792     case OPC_BEQZC:
10793     case OPC_BNEZC:
10794         if (rs != 0) {
10795             /* OPC_BEQZC, OPC_BNEZC */
10796             gen_load_gpr(t0, rs);
10797             bcond_compute = 1;
10798             ctx->btarget = addr_add(ctx, ctx->pc + 4, offset);
10799         } else {
10800             /* OPC_JIC, OPC_JIALC */
10801             TCGv tbase = tcg_temp_new();
10802             TCGv toffset = tcg_temp_new();
10803
10804             gen_load_gpr(tbase, rt);
10805             tcg_gen_movi_tl(toffset, offset);
10806             gen_op_addr_add(ctx, btarget, tbase, toffset);
10807             tcg_temp_free(tbase);
10808             tcg_temp_free(toffset);
10809         }
10810         break;
10811     default:
10812         MIPS_INVAL("Compact branch/jump");
10813         generate_exception_end(ctx, EXCP_RI);
10814         goto out;
10815     }
10816
10817     if (bcond_compute == 0) {
10818         /* Uncoditional compact branch */
10819         switch (opc) {
10820         case OPC_JIALC:
10821             tcg_gen_movi_tl(cpu_gpr[31], ctx->pc + 4 + m16_lowbit);
10822             /* Fallthrough */
10823         case OPC_JIC:
10824             ctx->hflags |= MIPS_HFLAG_BR;
10825             break;
10826         case OPC_BALC:
10827             tcg_gen_movi_tl(cpu_gpr[31], ctx->pc + 4 + m16_lowbit);
10828             /* Fallthrough */
10829         case OPC_BC:
10830             ctx->hflags |= MIPS_HFLAG_B;
10831             break;
10832         default:
10833             MIPS_INVAL("Compact branch/jump");
10834             generate_exception_end(ctx, EXCP_RI);
10835             goto out;
10836         }
10837
10838         /* Generating branch here as compact branches don't have delay slot */
10839         gen_branch(ctx, 4);
10840     } else {
10841         /* Conditional compact branch */
10842         TCGLabel *fs = gen_new_label();
10843         save_cpu_state(ctx, 0);
10844
10845         switch (opc) {
10846         case OPC_BLEZALC: /* OPC_BGEZALC, OPC_BGEUC */
10847             if (rs == 0 && rt != 0) {
10848                 /* OPC_BLEZALC */
10849                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LE), t1, 0, fs);
10850             } else if (rs != 0 && rt != 0 && rs == rt) {
10851                 /* OPC_BGEZALC */
10852                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GE), t1, 0, fs);
10853             } else {
10854                 /* OPC_BGEUC */
10855                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_GEU), t0, t1, fs);
10856             }
10857             break;
10858         case OPC_BGTZALC: /* OPC_BLTZALC, OPC_BLTUC */
10859             if (rs == 0 && rt != 0) {
10860                 /* OPC_BGTZALC */
10861                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GT), t1, 0, fs);
10862             } else if (rs != 0 && rt != 0 && rs == rt) {
10863                 /* OPC_BLTZALC */
10864                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LT), t1, 0, fs);
10865             } else {
10866                 /* OPC_BLTUC */
10867                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_LTU), t0, t1, fs);
10868             }
10869             break;
10870         case OPC_BLEZC: /* OPC_BGEZC, OPC_BGEC */
10871             if (rs == 0 && rt != 0) {
10872                 /* OPC_BLEZC */
10873                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LE), t1, 0, fs);
10874             } else if (rs != 0 && rt != 0 && rs == rt) {
10875                 /* OPC_BGEZC */
10876                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GE), t1, 0, fs);
10877             } else {
10878                 /* OPC_BGEC */
10879                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_GE), t0, t1, fs);
10880             }
10881             break;
10882         case OPC_BGTZC: /* OPC_BLTZC, OPC_BLTC */
10883             if (rs == 0 && rt != 0) {
10884                 /* OPC_BGTZC */
10885                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GT), t1, 0, fs);
10886             } else if (rs != 0 && rt != 0 && rs == rt) {
10887                 /* OPC_BLTZC */
10888                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LT), t1, 0, fs);
10889             } else {
10890                 /* OPC_BLTC */
10891                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_LT), t0, t1, fs);
10892             }
10893             break;
10894         case OPC_BOVC: /* OPC_BEQZALC, OPC_BEQC */
10895         case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC */
10896             if (rs >= rt) {
10897                 /* OPC_BOVC, OPC_BNVC */
10898                 TCGv t2 = tcg_temp_new();
10899                 TCGv t3 = tcg_temp_new();
10900                 TCGv t4 = tcg_temp_new();
10901                 TCGv input_overflow = tcg_temp_new();
10902
10903                 gen_load_gpr(t0, rs);
10904                 gen_load_gpr(t1, rt);
10905                 tcg_gen_ext32s_tl(t2, t0);
10906                 tcg_gen_setcond_tl(TCG_COND_NE, input_overflow, t2, t0);
10907                 tcg_gen_ext32s_tl(t3, t1);
10908                 tcg_gen_setcond_tl(TCG_COND_NE, t4, t3, t1);
10909                 tcg_gen_or_tl(input_overflow, input_overflow, t4);
10910
10911                 tcg_gen_add_tl(t4, t2, t3);
10912                 tcg_gen_ext32s_tl(t4, t4);
10913                 tcg_gen_xor_tl(t2, t2, t3);
10914                 tcg_gen_xor_tl(t3, t4, t3);
10915                 tcg_gen_andc_tl(t2, t3, t2);
10916                 tcg_gen_setcondi_tl(TCG_COND_LT, t4, t2, 0);
10917                 tcg_gen_or_tl(t4, t4, input_overflow);
10918                 if (opc == OPC_BOVC) {
10919                     /* OPC_BOVC */
10920                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_NE), t4, 0, fs);
10921                 } else {
10922                     /* OPC_BNVC */
10923                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_EQ), t4, 0, fs);
10924                 }
10925                 tcg_temp_free(input_overflow);
10926                 tcg_temp_free(t4);
10927                 tcg_temp_free(t3);
10928                 tcg_temp_free(t2);
10929             } else if (rs < rt && rs == 0) {
10930                 /* OPC_BEQZALC, OPC_BNEZALC */
10931                 if (opc == OPC_BEQZALC) {
10932                     /* OPC_BEQZALC */
10933                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_EQ), t1, 0, fs);
10934                 } else {
10935                     /* OPC_BNEZALC */
10936                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_NE), t1, 0, fs);
10937                 }
10938             } else {
10939                 /* OPC_BEQC, OPC_BNEC */
10940                 if (opc == OPC_BEQC) {
10941                     /* OPC_BEQC */
10942                     tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_EQ), t0, t1, fs);
10943                 } else {
10944                     /* OPC_BNEC */
10945                     tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_NE), t0, t1, fs);
10946                 }
10947             }
10948             break;
10949         case OPC_BEQZC:
10950             tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_EQ), t0, 0, fs);
10951             break;
10952         case OPC_BNEZC:
10953             tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_NE), t0, 0, fs);
10954             break;
10955         default:
10956             MIPS_INVAL("Compact conditional branch/jump");
10957             generate_exception_end(ctx, EXCP_RI);
10958             goto out;
10959         }
10960
10961         /* Generating branch here as compact branches don't have delay slot */
10962         gen_goto_tb(ctx, 1, ctx->btarget);
10963         gen_set_label(fs);
10964
10965         ctx->hflags |= MIPS_HFLAG_FBNSLOT;
10966     }
10967
10968 out:
10969     tcg_temp_free(t0);
10970     tcg_temp_free(t1);
10971 }
10972
10973 /* ISA extensions (ASEs) */
10974 /* MIPS16 extension to MIPS32 */
10975
10976 /* MIPS16 major opcodes */
10977 enum {
10978   M16_OPC_ADDIUSP = 0x00,
10979   M16_OPC_ADDIUPC = 0x01,
10980   M16_OPC_B = 0x02,
10981   M16_OPC_JAL = 0x03,
10982   M16_OPC_BEQZ = 0x04,
10983   M16_OPC_BNEQZ = 0x05,
10984   M16_OPC_SHIFT = 0x06,
10985   M16_OPC_LD = 0x07,
10986   M16_OPC_RRIA = 0x08,
10987   M16_OPC_ADDIU8 = 0x09,
10988   M16_OPC_SLTI = 0x0a,
10989   M16_OPC_SLTIU = 0x0b,
10990   M16_OPC_I8 = 0x0c,
10991   M16_OPC_LI = 0x0d,
10992   M16_OPC_CMPI = 0x0e,
10993   M16_OPC_SD = 0x0f,
10994   M16_OPC_LB = 0x10,
10995   M16_OPC_LH = 0x11,
10996   M16_OPC_LWSP = 0x12,
10997   M16_OPC_LW = 0x13,
10998   M16_OPC_LBU = 0x14,
10999   M16_OPC_LHU = 0x15,
11000   M16_OPC_LWPC = 0x16,
11001   M16_OPC_LWU = 0x17,
11002   M16_OPC_SB = 0x18,
11003   M16_OPC_SH = 0x19,
11004   M16_OPC_SWSP = 0x1a,
11005   M16_OPC_SW = 0x1b,
11006   M16_OPC_RRR = 0x1c,
11007   M16_OPC_RR = 0x1d,
11008   M16_OPC_EXTEND = 0x1e,
11009   M16_OPC_I64 = 0x1f
11010 };
11011
11012 /* I8 funct field */
11013 enum {
11014   I8_BTEQZ = 0x0,
11015   I8_BTNEZ = 0x1,
11016   I8_SWRASP = 0x2,
11017   I8_ADJSP = 0x3,
11018   I8_SVRS = 0x4,
11019   I8_MOV32R = 0x5,
11020   I8_MOVR32 = 0x7
11021 };
11022
11023 /* RRR f field */
11024 enum {
11025   RRR_DADDU = 0x0,
11026   RRR_ADDU = 0x1,
11027   RRR_DSUBU = 0x2,
11028   RRR_SUBU = 0x3
11029 };
11030
11031 /* RR funct field */
11032 enum {
11033   RR_JR = 0x00,
11034   RR_SDBBP = 0x01,
11035   RR_SLT = 0x02,
11036   RR_SLTU = 0x03,
11037   RR_SLLV = 0x04,
11038   RR_BREAK = 0x05,
11039   RR_SRLV = 0x06,
11040   RR_SRAV = 0x07,
11041   RR_DSRL = 0x08,
11042   RR_CMP = 0x0a,
11043   RR_NEG = 0x0b,
11044   RR_AND = 0x0c,
11045   RR_OR = 0x0d,
11046   RR_XOR = 0x0e,
11047   RR_NOT = 0x0f,
11048   RR_MFHI = 0x10,
11049   RR_CNVT = 0x11,
11050   RR_MFLO = 0x12,
11051   RR_DSRA = 0x13,
11052   RR_DSLLV = 0x14,
11053   RR_DSRLV = 0x16,
11054   RR_DSRAV = 0x17,
11055   RR_MULT = 0x18,
11056   RR_MULTU = 0x19,
11057   RR_DIV = 0x1a,
11058   RR_DIVU = 0x1b,
11059   RR_DMULT = 0x1c,
11060   RR_DMULTU = 0x1d,
11061   RR_DDIV = 0x1e,
11062   RR_DDIVU = 0x1f
11063 };
11064
11065 /* I64 funct field */
11066 enum {
11067   I64_LDSP = 0x0,
11068   I64_SDSP = 0x1,
11069   I64_SDRASP = 0x2,
11070   I64_DADJSP = 0x3,
11071   I64_LDPC = 0x4,
11072   I64_DADDIU5 = 0x5,
11073   I64_DADDIUPC = 0x6,
11074   I64_DADDIUSP = 0x7
11075 };
11076
11077 /* RR ry field for CNVT */
11078 enum {
11079   RR_RY_CNVT_ZEB = 0x0,
11080   RR_RY_CNVT_ZEH = 0x1,
11081   RR_RY_CNVT_ZEW = 0x2,
11082   RR_RY_CNVT_SEB = 0x4,
11083   RR_RY_CNVT_SEH = 0x5,
11084   RR_RY_CNVT_SEW = 0x6,
11085 };
11086
11087 static int xlat (int r)
11088 {
11089   static int map[] = { 16, 17, 2, 3, 4, 5, 6, 7 };
11090
11091   return map[r];
11092 }
11093
11094 static void gen_mips16_save (DisasContext *ctx,
11095                              int xsregs, int aregs,
11096                              int do_ra, int do_s0, int do_s1,
11097                              int framesize)
11098 {
11099     TCGv t0 = tcg_temp_new();
11100     TCGv t1 = tcg_temp_new();
11101     TCGv t2 = tcg_temp_new();
11102     int args, astatic;
11103
11104     switch (aregs) {
11105     case 0:
11106     case 1:
11107     case 2:
11108     case 3:
11109     case 11:
11110         args = 0;
11111         break;
11112     case 4:
11113     case 5:
11114     case 6:
11115     case 7:
11116         args = 1;
11117         break;
11118     case 8:
11119     case 9:
11120     case 10:
11121         args = 2;
11122         break;
11123     case 12:
11124     case 13:
11125         args = 3;
11126         break;
11127     case 14:
11128         args = 4;
11129         break;
11130     default:
11131         generate_exception_end(ctx, EXCP_RI);
11132         return;
11133     }
11134
11135     switch (args) {
11136     case 4:
11137         gen_base_offset_addr(ctx, t0, 29, 12);
11138         gen_load_gpr(t1, 7);
11139         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
11140         /* Fall through */
11141     case 3:
11142         gen_base_offset_addr(ctx, t0, 29, 8);
11143         gen_load_gpr(t1, 6);
11144         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
11145         /* Fall through */
11146     case 2:
11147         gen_base_offset_addr(ctx, t0, 29, 4);
11148         gen_load_gpr(t1, 5);
11149         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
11150         /* Fall through */
11151     case 1:
11152         gen_base_offset_addr(ctx, t0, 29, 0);
11153         gen_load_gpr(t1, 4);
11154         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
11155     }
11156
11157     gen_load_gpr(t0, 29);
11158
11159 #define DECR_AND_STORE(reg) do {                                 \
11160         tcg_gen_movi_tl(t2, -4);                                 \
11161         gen_op_addr_add(ctx, t0, t0, t2);                        \
11162         gen_load_gpr(t1, reg);                                   \
11163         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL); \
11164     } while (0)
11165
11166     if (do_ra) {
11167         DECR_AND_STORE(31);
11168     }
11169
11170     switch (xsregs) {
11171     case 7:
11172         DECR_AND_STORE(30);
11173         /* Fall through */
11174     case 6:
11175         DECR_AND_STORE(23);
11176         /* Fall through */
11177     case 5:
11178         DECR_AND_STORE(22);
11179         /* Fall through */
11180     case 4:
11181         DECR_AND_STORE(21);
11182         /* Fall through */
11183     case 3:
11184         DECR_AND_STORE(20);
11185         /* Fall through */
11186     case 2:
11187         DECR_AND_STORE(19);
11188         /* Fall through */
11189     case 1:
11190         DECR_AND_STORE(18);
11191     }
11192
11193     if (do_s1) {
11194         DECR_AND_STORE(17);
11195     }
11196     if (do_s0) {
11197         DECR_AND_STORE(16);
11198     }
11199
11200     switch (aregs) {
11201     case 0:
11202     case 4:
11203     case 8:
11204     case 12:
11205     case 14:
11206         astatic = 0;
11207         break;
11208     case 1:
11209     case 5:
11210     case 9:
11211     case 13:
11212         astatic = 1;
11213         break;
11214     case 2:
11215     case 6:
11216     case 10:
11217         astatic = 2;
11218         break;
11219     case 3:
11220     case 7:
11221         astatic = 3;
11222         break;
11223     case 11:
11224         astatic = 4;
11225         break;
11226     default:
11227         generate_exception_end(ctx, EXCP_RI);
11228         return;
11229     }
11230
11231     if (astatic > 0) {
11232         DECR_AND_STORE(7);
11233         if (astatic > 1) {
11234             DECR_AND_STORE(6);
11235             if (astatic > 2) {
11236                 DECR_AND_STORE(5);
11237                 if (astatic > 3) {
11238                     DECR_AND_STORE(4);
11239                 }
11240             }
11241         }
11242     }
11243 #undef DECR_AND_STORE
11244
11245     tcg_gen_movi_tl(t2, -framesize);
11246     gen_op_addr_add(ctx, cpu_gpr[29], cpu_gpr[29], t2);
11247     tcg_temp_free(t0);
11248     tcg_temp_free(t1);
11249     tcg_temp_free(t2);
11250 }
11251
11252 static void gen_mips16_restore (DisasContext *ctx,
11253                                 int xsregs, int aregs,
11254                                 int do_ra, int do_s0, int do_s1,
11255                                 int framesize)
11256 {
11257     int astatic;
11258     TCGv t0 = tcg_temp_new();
11259     TCGv t1 = tcg_temp_new();
11260     TCGv t2 = tcg_temp_new();
11261
11262     tcg_gen_movi_tl(t2, framesize);
11263     gen_op_addr_add(ctx, t0, cpu_gpr[29], t2);
11264
11265 #define DECR_AND_LOAD(reg) do {                            \
11266         tcg_gen_movi_tl(t2, -4);                           \
11267         gen_op_addr_add(ctx, t0, t0, t2);                  \
11268         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL); \
11269         gen_store_gpr(t1, reg);                            \
11270     } while (0)
11271
11272     if (do_ra) {
11273         DECR_AND_LOAD(31);
11274     }
11275
11276     switch (xsregs) {
11277     case 7:
11278         DECR_AND_LOAD(30);
11279         /* Fall through */
11280     case 6:
11281         DECR_AND_LOAD(23);
11282         /* Fall through */
11283     case 5:
11284         DECR_AND_LOAD(22);
11285         /* Fall through */
11286     case 4:
11287         DECR_AND_LOAD(21);
11288         /* Fall through */
11289     case 3:
11290         DECR_AND_LOAD(20);
11291         /* Fall through */
11292     case 2:
11293         DECR_AND_LOAD(19);
11294         /* Fall through */
11295     case 1:
11296         DECR_AND_LOAD(18);
11297     }
11298
11299     if (do_s1) {
11300         DECR_AND_LOAD(17);
11301     }
11302     if (do_s0) {
11303         DECR_AND_LOAD(16);
11304     }
11305
11306     switch (aregs) {
11307     case 0:
11308     case 4:
11309     case 8:
11310     case 12:
11311     case 14:
11312         astatic = 0;
11313         break;
11314     case 1:
11315     case 5:
11316     case 9:
11317     case 13:
11318         astatic = 1;
11319         break;
11320     case 2:
11321     case 6:
11322     case 10:
11323         astatic = 2;
11324         break;
11325     case 3:
11326     case 7:
11327         astatic = 3;
11328         break;
11329     case 11:
11330         astatic = 4;
11331         break;
11332     default:
11333         generate_exception_end(ctx, EXCP_RI);
11334         return;
11335     }
11336
11337     if (astatic > 0) {
11338         DECR_AND_LOAD(7);
11339         if (astatic > 1) {
11340             DECR_AND_LOAD(6);
11341             if (astatic > 2) {
11342                 DECR_AND_LOAD(5);
11343                 if (astatic > 3) {
11344                     DECR_AND_LOAD(4);
11345                 }
11346             }
11347         }
11348     }
11349 #undef DECR_AND_LOAD
11350
11351     tcg_gen_movi_tl(t2, framesize);
11352     gen_op_addr_add(ctx, cpu_gpr[29], cpu_gpr[29], t2);
11353     tcg_temp_free(t0);
11354     tcg_temp_free(t1);
11355     tcg_temp_free(t2);
11356 }
11357
11358 static void gen_addiupc (DisasContext *ctx, int rx, int imm,
11359                          int is_64_bit, int extended)
11360 {
11361     TCGv t0;
11362
11363     if (extended && (ctx->hflags & MIPS_HFLAG_BMASK)) {
11364         generate_exception_end(ctx, EXCP_RI);
11365         return;
11366     }
11367
11368     t0 = tcg_temp_new();
11369
11370     tcg_gen_movi_tl(t0, pc_relative_pc(ctx));
11371     tcg_gen_addi_tl(cpu_gpr[rx], t0, imm);
11372     if (!is_64_bit) {
11373         tcg_gen_ext32s_tl(cpu_gpr[rx], cpu_gpr[rx]);
11374     }
11375
11376     tcg_temp_free(t0);
11377 }
11378
11379 static void gen_cache_operation(DisasContext *ctx, uint32_t op, int base,
11380                                 int16_t offset)
11381 {
11382     TCGv_i32 t0 = tcg_const_i32(op);
11383     TCGv t1 = tcg_temp_new();
11384     gen_base_offset_addr(ctx, t1, base, offset);
11385     gen_helper_cache(cpu_env, t1, t0);
11386 }
11387
11388 #if defined(TARGET_MIPS64)
11389 static void decode_i64_mips16 (DisasContext *ctx,
11390                                int ry, int funct, int16_t offset,
11391                                int extended)
11392 {
11393     switch (funct) {
11394     case I64_LDSP:
11395         check_insn(ctx, ISA_MIPS3);
11396         check_mips_64(ctx);
11397         offset = extended ? offset : offset << 3;
11398         gen_ld(ctx, OPC_LD, ry, 29, offset);
11399         break;
11400     case I64_SDSP:
11401         check_insn(ctx, ISA_MIPS3);
11402         check_mips_64(ctx);
11403         offset = extended ? offset : offset << 3;
11404         gen_st(ctx, OPC_SD, ry, 29, offset);
11405         break;
11406     case I64_SDRASP:
11407         check_insn(ctx, ISA_MIPS3);
11408         check_mips_64(ctx);
11409         offset = extended ? offset : (ctx->opcode & 0xff) << 3;
11410         gen_st(ctx, OPC_SD, 31, 29, offset);
11411         break;
11412     case I64_DADJSP:
11413         check_insn(ctx, ISA_MIPS3);
11414         check_mips_64(ctx);
11415         offset = extended ? offset : ((int8_t)ctx->opcode) << 3;
11416         gen_arith_imm(ctx, OPC_DADDIU, 29, 29, offset);
11417         break;
11418     case I64_LDPC:
11419         check_insn(ctx, ISA_MIPS3);
11420         check_mips_64(ctx);
11421         if (extended && (ctx->hflags & MIPS_HFLAG_BMASK)) {
11422             generate_exception_end(ctx, EXCP_RI);
11423         } else {
11424             offset = extended ? offset : offset << 3;
11425             gen_ld(ctx, OPC_LDPC, ry, 0, offset);
11426         }
11427         break;
11428     case I64_DADDIU5:
11429         check_insn(ctx, ISA_MIPS3);
11430         check_mips_64(ctx);
11431         offset = extended ? offset : ((int8_t)(offset << 3)) >> 3;
11432         gen_arith_imm(ctx, OPC_DADDIU, ry, ry, offset);
11433         break;
11434     case I64_DADDIUPC:
11435         check_insn(ctx, ISA_MIPS3);
11436         check_mips_64(ctx);
11437         offset = extended ? offset : offset << 2;
11438         gen_addiupc(ctx, ry, offset, 1, extended);
11439         break;
11440     case I64_DADDIUSP:
11441         check_insn(ctx, ISA_MIPS3);
11442         check_mips_64(ctx);
11443         offset = extended ? offset : offset << 2;
11444         gen_arith_imm(ctx, OPC_DADDIU, ry, 29, offset);
11445         break;
11446     }
11447 }
11448 #endif
11449
11450 static int decode_extended_mips16_opc (CPUMIPSState *env, DisasContext *ctx)
11451 {
11452     int extend = cpu_lduw_code(env, ctx->pc + 2);
11453     int op, rx, ry, funct, sa;
11454     int16_t imm, offset;
11455
11456     ctx->opcode = (ctx->opcode << 16) | extend;
11457     op = (ctx->opcode >> 11) & 0x1f;
11458     sa = (ctx->opcode >> 22) & 0x1f;
11459     funct = (ctx->opcode >> 8) & 0x7;
11460     rx = xlat((ctx->opcode >> 8) & 0x7);
11461     ry = xlat((ctx->opcode >> 5) & 0x7);
11462     offset = imm = (int16_t) (((ctx->opcode >> 16) & 0x1f) << 11
11463                               | ((ctx->opcode >> 21) & 0x3f) << 5
11464                               | (ctx->opcode & 0x1f));
11465
11466     /* The extended opcodes cleverly reuse the opcodes from their 16-bit
11467        counterparts.  */
11468     switch (op) {
11469     case M16_OPC_ADDIUSP:
11470         gen_arith_imm(ctx, OPC_ADDIU, rx, 29, imm);
11471         break;
11472     case M16_OPC_ADDIUPC:
11473         gen_addiupc(ctx, rx, imm, 0, 1);
11474         break;
11475     case M16_OPC_B:
11476         gen_compute_branch(ctx, OPC_BEQ, 4, 0, 0, offset << 1, 0);
11477         /* No delay slot, so just process as a normal instruction */
11478         break;
11479     case M16_OPC_BEQZ:
11480         gen_compute_branch(ctx, OPC_BEQ, 4, rx, 0, offset << 1, 0);
11481         /* No delay slot, so just process as a normal instruction */
11482         break;
11483     case M16_OPC_BNEQZ:
11484         gen_compute_branch(ctx, OPC_BNE, 4, rx, 0, offset << 1, 0);
11485         /* No delay slot, so just process as a normal instruction */
11486         break;
11487     case M16_OPC_SHIFT:
11488         switch (ctx->opcode & 0x3) {
11489         case 0x0:
11490             gen_shift_imm(ctx, OPC_SLL, rx, ry, sa);
11491             break;
11492         case 0x1:
11493 #if defined(TARGET_MIPS64)
11494             check_mips_64(ctx);
11495             gen_shift_imm(ctx, OPC_DSLL, rx, ry, sa);
11496 #else
11497             generate_exception_end(ctx, EXCP_RI);
11498 #endif
11499             break;
11500         case 0x2:
11501             gen_shift_imm(ctx, OPC_SRL, rx, ry, sa);
11502             break;
11503         case 0x3:
11504             gen_shift_imm(ctx, OPC_SRA, rx, ry, sa);
11505             break;
11506         }
11507         break;
11508 #if defined(TARGET_MIPS64)
11509     case M16_OPC_LD:
11510         check_insn(ctx, ISA_MIPS3);
11511         check_mips_64(ctx);
11512         gen_ld(ctx, OPC_LD, ry, rx, offset);
11513         break;
11514 #endif
11515     case M16_OPC_RRIA:
11516         imm = ctx->opcode & 0xf;
11517         imm = imm | ((ctx->opcode >> 20) & 0x7f) << 4;
11518         imm = imm | ((ctx->opcode >> 16) & 0xf) << 11;
11519         imm = (int16_t) (imm << 1) >> 1;
11520         if ((ctx->opcode >> 4) & 0x1) {
11521 #if defined(TARGET_MIPS64)
11522             check_mips_64(ctx);
11523             gen_arith_imm(ctx, OPC_DADDIU, ry, rx, imm);
11524 #else
11525             generate_exception_end(ctx, EXCP_RI);
11526 #endif
11527         } else {
11528             gen_arith_imm(ctx, OPC_ADDIU, ry, rx, imm);
11529         }
11530         break;
11531     case M16_OPC_ADDIU8:
11532         gen_arith_imm(ctx, OPC_ADDIU, rx, rx, imm);
11533         break;
11534     case M16_OPC_SLTI:
11535         gen_slt_imm(ctx, OPC_SLTI, 24, rx, imm);
11536         break;
11537     case M16_OPC_SLTIU:
11538         gen_slt_imm(ctx, OPC_SLTIU, 24, rx, imm);
11539         break;
11540     case M16_OPC_I8:
11541         switch (funct) {
11542         case I8_BTEQZ:
11543             gen_compute_branch(ctx, OPC_BEQ, 4, 24, 0, offset << 1, 0);
11544             break;
11545         case I8_BTNEZ:
11546             gen_compute_branch(ctx, OPC_BNE, 4, 24, 0, offset << 1, 0);
11547             break;
11548         case I8_SWRASP:
11549             gen_st(ctx, OPC_SW, 31, 29, imm);
11550             break;
11551         case I8_ADJSP:
11552             gen_arith_imm(ctx, OPC_ADDIU, 29, 29, imm);
11553             break;
11554         case I8_SVRS:
11555             check_insn(ctx, ISA_MIPS32);
11556             {
11557                 int xsregs = (ctx->opcode >> 24) & 0x7;
11558                 int aregs = (ctx->opcode >> 16) & 0xf;
11559                 int do_ra = (ctx->opcode >> 6) & 0x1;
11560                 int do_s0 = (ctx->opcode >> 5) & 0x1;
11561                 int do_s1 = (ctx->opcode >> 4) & 0x1;
11562                 int framesize = (((ctx->opcode >> 20) & 0xf) << 4
11563                                  | (ctx->opcode & 0xf)) << 3;
11564
11565                 if (ctx->opcode & (1 << 7)) {
11566                     gen_mips16_save(ctx, xsregs, aregs,
11567                                     do_ra, do_s0, do_s1,
11568                                     framesize);
11569                 } else {
11570                     gen_mips16_restore(ctx, xsregs, aregs,
11571                                        do_ra, do_s0, do_s1,
11572                                        framesize);
11573                 }
11574             }
11575             break;
11576         default:
11577             generate_exception_end(ctx, EXCP_RI);
11578             break;
11579         }
11580         break;
11581     case M16_OPC_LI:
11582         tcg_gen_movi_tl(cpu_gpr[rx], (uint16_t) imm);
11583         break;
11584     case M16_OPC_CMPI:
11585         tcg_gen_xori_tl(cpu_gpr[24], cpu_gpr[rx], (uint16_t) imm);
11586         break;
11587 #if defined(TARGET_MIPS64)
11588     case M16_OPC_SD:
11589         check_insn(ctx, ISA_MIPS3);
11590         check_mips_64(ctx);
11591         gen_st(ctx, OPC_SD, ry, rx, offset);
11592         break;
11593 #endif
11594     case M16_OPC_LB:
11595         gen_ld(ctx, OPC_LB, ry, rx, offset);
11596         break;
11597     case M16_OPC_LH:
11598         gen_ld(ctx, OPC_LH, ry, rx, offset);
11599         break;
11600     case M16_OPC_LWSP:
11601         gen_ld(ctx, OPC_LW, rx, 29, offset);
11602         break;
11603     case M16_OPC_LW:
11604         gen_ld(ctx, OPC_LW, ry, rx, offset);
11605         break;
11606     case M16_OPC_LBU:
11607         gen_ld(ctx, OPC_LBU, ry, rx, offset);
11608         break;
11609     case M16_OPC_LHU:
11610         gen_ld(ctx, OPC_LHU, ry, rx, offset);
11611         break;
11612     case M16_OPC_LWPC:
11613         gen_ld(ctx, OPC_LWPC, rx, 0, offset);
11614         break;
11615 #if defined(TARGET_MIPS64)
11616     case M16_OPC_LWU:
11617         check_insn(ctx, ISA_MIPS3);
11618         check_mips_64(ctx);
11619         gen_ld(ctx, OPC_LWU, ry, rx, offset);
11620         break;
11621 #endif
11622     case M16_OPC_SB:
11623         gen_st(ctx, OPC_SB, ry, rx, offset);
11624         break;
11625     case M16_OPC_SH:
11626         gen_st(ctx, OPC_SH, ry, rx, offset);
11627         break;
11628     case M16_OPC_SWSP:
11629         gen_st(ctx, OPC_SW, rx, 29, offset);
11630         break;
11631     case M16_OPC_SW:
11632         gen_st(ctx, OPC_SW, ry, rx, offset);
11633         break;
11634 #if defined(TARGET_MIPS64)
11635     case M16_OPC_I64:
11636         decode_i64_mips16(ctx, ry, funct, offset, 1);
11637         break;
11638 #endif
11639     default:
11640         generate_exception_end(ctx, EXCP_RI);
11641         break;
11642     }
11643
11644     return 4;
11645 }
11646
11647 static inline bool is_uhi(int sdbbp_code)
11648 {
11649 #ifdef CONFIG_USER_ONLY
11650     return false;
11651 #else
11652     return semihosting_enabled() && sdbbp_code == 1;
11653 #endif
11654 }
11655
11656 static int decode_mips16_opc (CPUMIPSState *env, DisasContext *ctx)
11657 {
11658     int rx, ry;
11659     int sa;
11660     int op, cnvt_op, op1, offset;
11661     int funct;
11662     int n_bytes;
11663
11664     op = (ctx->opcode >> 11) & 0x1f;
11665     sa = (ctx->opcode >> 2) & 0x7;
11666     sa = sa == 0 ? 8 : sa;
11667     rx = xlat((ctx->opcode >> 8) & 0x7);
11668     cnvt_op = (ctx->opcode >> 5) & 0x7;
11669     ry = xlat((ctx->opcode >> 5) & 0x7);
11670     op1 = offset = ctx->opcode & 0x1f;
11671
11672     n_bytes = 2;
11673
11674     switch (op) {
11675     case M16_OPC_ADDIUSP:
11676         {
11677             int16_t imm = ((uint8_t) ctx->opcode) << 2;
11678
11679             gen_arith_imm(ctx, OPC_ADDIU, rx, 29, imm);
11680         }
11681         break;
11682     case M16_OPC_ADDIUPC:
11683         gen_addiupc(ctx, rx, ((uint8_t) ctx->opcode) << 2, 0, 0);
11684         break;
11685     case M16_OPC_B:
11686         offset = (ctx->opcode & 0x7ff) << 1;
11687         offset = (int16_t)(offset << 4) >> 4;
11688         gen_compute_branch(ctx, OPC_BEQ, 2, 0, 0, offset, 0);
11689         /* No delay slot, so just process as a normal instruction */
11690         break;
11691     case M16_OPC_JAL:
11692         offset = cpu_lduw_code(env, ctx->pc + 2);
11693         offset = (((ctx->opcode & 0x1f) << 21)
11694                   | ((ctx->opcode >> 5) & 0x1f) << 16
11695                   | offset) << 2;
11696         op = ((ctx->opcode >> 10) & 0x1) ? OPC_JALX : OPC_JAL;
11697         gen_compute_branch(ctx, op, 4, rx, ry, offset, 2);
11698         n_bytes = 4;
11699         break;
11700     case M16_OPC_BEQZ:
11701         gen_compute_branch(ctx, OPC_BEQ, 2, rx, 0,
11702                            ((int8_t)ctx->opcode) << 1, 0);
11703         /* No delay slot, so just process as a normal instruction */
11704         break;
11705     case M16_OPC_BNEQZ:
11706         gen_compute_branch(ctx, OPC_BNE, 2, rx, 0,
11707                            ((int8_t)ctx->opcode) << 1, 0);
11708         /* No delay slot, so just process as a normal instruction */
11709         break;
11710     case M16_OPC_SHIFT:
11711         switch (ctx->opcode & 0x3) {
11712         case 0x0:
11713             gen_shift_imm(ctx, OPC_SLL, rx, ry, sa);
11714             break;
11715         case 0x1:
11716 #if defined(TARGET_MIPS64)
11717             check_insn(ctx, ISA_MIPS3);
11718             check_mips_64(ctx);
11719             gen_shift_imm(ctx, OPC_DSLL, rx, ry, sa);
11720 #else
11721             generate_exception_end(ctx, EXCP_RI);
11722 #endif
11723             break;
11724         case 0x2:
11725             gen_shift_imm(ctx, OPC_SRL, rx, ry, sa);
11726             break;
11727         case 0x3:
11728             gen_shift_imm(ctx, OPC_SRA, rx, ry, sa);
11729             break;
11730         }
11731         break;
11732 #if defined(TARGET_MIPS64)
11733     case M16_OPC_LD:
11734         check_insn(ctx, ISA_MIPS3);
11735         check_mips_64(ctx);
11736         gen_ld(ctx, OPC_LD, ry, rx, offset << 3);
11737         break;
11738 #endif
11739     case M16_OPC_RRIA:
11740         {
11741             int16_t imm = (int8_t)((ctx->opcode & 0xf) << 4) >> 4;
11742
11743             if ((ctx->opcode >> 4) & 1) {
11744 #if defined(TARGET_MIPS64)
11745                 check_insn(ctx, ISA_MIPS3);
11746                 check_mips_64(ctx);
11747                 gen_arith_imm(ctx, OPC_DADDIU, ry, rx, imm);
11748 #else
11749                 generate_exception_end(ctx, EXCP_RI);
11750 #endif
11751             } else {
11752                 gen_arith_imm(ctx, OPC_ADDIU, ry, rx, imm);
11753             }
11754         }
11755         break;
11756     case M16_OPC_ADDIU8:
11757         {
11758             int16_t imm = (int8_t) ctx->opcode;
11759
11760             gen_arith_imm(ctx, OPC_ADDIU, rx, rx, imm);
11761         }
11762         break;
11763     case M16_OPC_SLTI:
11764         {
11765             int16_t imm = (uint8_t) ctx->opcode;
11766             gen_slt_imm(ctx, OPC_SLTI, 24, rx, imm);
11767         }
11768         break;
11769     case M16_OPC_SLTIU:
11770         {
11771             int16_t imm = (uint8_t) ctx->opcode;
11772             gen_slt_imm(ctx, OPC_SLTIU, 24, rx, imm);
11773         }
11774         break;
11775     case M16_OPC_I8:
11776         {
11777             int reg32;
11778
11779             funct = (ctx->opcode >> 8) & 0x7;
11780             switch (funct) {
11781             case I8_BTEQZ:
11782                 gen_compute_branch(ctx, OPC_BEQ, 2, 24, 0,
11783                                    ((int8_t)ctx->opcode) << 1, 0);
11784                 break;
11785             case I8_BTNEZ:
11786                 gen_compute_branch(ctx, OPC_BNE, 2, 24, 0,
11787                                    ((int8_t)ctx->opcode) << 1, 0);
11788                 break;
11789             case I8_SWRASP:
11790                 gen_st(ctx, OPC_SW, 31, 29, (ctx->opcode & 0xff) << 2);
11791                 break;
11792             case I8_ADJSP:
11793                 gen_arith_imm(ctx, OPC_ADDIU, 29, 29,
11794                               ((int8_t)ctx->opcode) << 3);
11795                 break;
11796             case I8_SVRS:
11797                 check_insn(ctx, ISA_MIPS32);
11798                 {
11799                     int do_ra = ctx->opcode & (1 << 6);
11800                     int do_s0 = ctx->opcode & (1 << 5);
11801                     int do_s1 = ctx->opcode & (1 << 4);
11802                     int framesize = ctx->opcode & 0xf;
11803
11804                     if (framesize == 0) {
11805                         framesize = 128;
11806                     } else {
11807                         framesize = framesize << 3;
11808                     }
11809
11810                     if (ctx->opcode & (1 << 7)) {
11811                         gen_mips16_save(ctx, 0, 0,
11812                                         do_ra, do_s0, do_s1, framesize);
11813                     } else {
11814                         gen_mips16_restore(ctx, 0, 0,
11815                                            do_ra, do_s0, do_s1, framesize);
11816                     }
11817                 }
11818                 break;
11819             case I8_MOV32R:
11820                 {
11821                     int rz = xlat(ctx->opcode & 0x7);
11822
11823                     reg32 = (((ctx->opcode >> 3) & 0x3) << 3) |
11824                         ((ctx->opcode >> 5) & 0x7);
11825                     gen_arith(ctx, OPC_ADDU, reg32, rz, 0);
11826                 }
11827                 break;
11828             case I8_MOVR32:
11829                 reg32 = ctx->opcode & 0x1f;
11830                 gen_arith(ctx, OPC_ADDU, ry, reg32, 0);
11831                 break;
11832             default:
11833                 generate_exception_end(ctx, EXCP_RI);
11834                 break;
11835             }
11836         }
11837         break;
11838     case M16_OPC_LI:
11839         {
11840             int16_t imm = (uint8_t) ctx->opcode;
11841
11842             gen_arith_imm(ctx, OPC_ADDIU, rx, 0, imm);
11843         }
11844         break;
11845     case M16_OPC_CMPI:
11846         {
11847             int16_t imm = (uint8_t) ctx->opcode;
11848             gen_logic_imm(ctx, OPC_XORI, 24, rx, imm);
11849         }
11850         break;
11851 #if defined(TARGET_MIPS64)
11852     case M16_OPC_SD:
11853         check_insn(ctx, ISA_MIPS3);
11854         check_mips_64(ctx);
11855         gen_st(ctx, OPC_SD, ry, rx, offset << 3);
11856         break;
11857 #endif
11858     case M16_OPC_LB:
11859         gen_ld(ctx, OPC_LB, ry, rx, offset);
11860         break;
11861     case M16_OPC_LH:
11862         gen_ld(ctx, OPC_LH, ry, rx, offset << 1);
11863         break;
11864     case M16_OPC_LWSP:
11865         gen_ld(ctx, OPC_LW, rx, 29, ((uint8_t)ctx->opcode) << 2);
11866         break;
11867     case M16_OPC_LW:
11868         gen_ld(ctx, OPC_LW, ry, rx, offset << 2);
11869         break;
11870     case M16_OPC_LBU:
11871         gen_ld(ctx, OPC_LBU, ry, rx, offset);
11872         break;
11873     case M16_OPC_LHU:
11874         gen_ld(ctx, OPC_LHU, ry, rx, offset << 1);
11875         break;
11876     case M16_OPC_LWPC:
11877         gen_ld(ctx, OPC_LWPC, rx, 0, ((uint8_t)ctx->opcode) << 2);
11878         break;
11879 #if defined (TARGET_MIPS64)
11880     case M16_OPC_LWU:
11881         check_insn(ctx, ISA_MIPS3);
11882         check_mips_64(ctx);
11883         gen_ld(ctx, OPC_LWU, ry, rx, offset << 2);
11884         break;
11885 #endif
11886     case M16_OPC_SB:
11887         gen_st(ctx, OPC_SB, ry, rx, offset);
11888         break;
11889     case M16_OPC_SH:
11890         gen_st(ctx, OPC_SH, ry, rx, offset << 1);
11891         break;
11892     case M16_OPC_SWSP:
11893         gen_st(ctx, OPC_SW, rx, 29, ((uint8_t)ctx->opcode) << 2);
11894         break;
11895     case M16_OPC_SW:
11896         gen_st(ctx, OPC_SW, ry, rx, offset << 2);
11897         break;
11898     case M16_OPC_RRR:
11899         {
11900             int rz = xlat((ctx->opcode >> 2) & 0x7);
11901             int mips32_op;
11902
11903             switch (ctx->opcode & 0x3) {
11904             case RRR_ADDU:
11905                 mips32_op = OPC_ADDU;
11906                 break;
11907             case RRR_SUBU:
11908                 mips32_op = OPC_SUBU;
11909                 break;
11910 #if defined(TARGET_MIPS64)
11911             case RRR_DADDU:
11912                 mips32_op = OPC_DADDU;
11913                 check_insn(ctx, ISA_MIPS3);
11914                 check_mips_64(ctx);
11915                 break;
11916             case RRR_DSUBU:
11917                 mips32_op = OPC_DSUBU;
11918                 check_insn(ctx, ISA_MIPS3);
11919                 check_mips_64(ctx);
11920                 break;
11921 #endif
11922             default:
11923                 generate_exception_end(ctx, EXCP_RI);
11924                 goto done;
11925             }
11926
11927             gen_arith(ctx, mips32_op, rz, rx, ry);
11928         done:
11929             ;
11930         }
11931         break;
11932     case M16_OPC_RR:
11933         switch (op1) {
11934         case RR_JR:
11935             {
11936                 int nd = (ctx->opcode >> 7) & 0x1;
11937                 int link = (ctx->opcode >> 6) & 0x1;
11938                 int ra = (ctx->opcode >> 5) & 0x1;
11939
11940                 if (nd) {
11941                     check_insn(ctx, ISA_MIPS32);
11942                 }
11943
11944                 if (link) {
11945                     op = OPC_JALR;
11946                 } else {
11947                     op = OPC_JR;
11948                 }
11949
11950                 gen_compute_branch(ctx, op, 2, ra ? 31 : rx, 31, 0,
11951                                    (nd ? 0 : 2));
11952             }
11953             break;
11954         case RR_SDBBP:
11955             if (is_uhi(extract32(ctx->opcode, 5, 6))) {
11956                 gen_helper_do_semihosting(cpu_env);
11957             } else {
11958                 /* XXX: not clear which exception should be raised
11959                  *      when in debug mode...
11960                  */
11961                 check_insn(ctx, ISA_MIPS32);
11962                 generate_exception_end(ctx, EXCP_DBp);
11963             }
11964             break;
11965         case RR_SLT:
11966             gen_slt(ctx, OPC_SLT, 24, rx, ry);
11967             break;
11968         case RR_SLTU:
11969             gen_slt(ctx, OPC_SLTU, 24, rx, ry);
11970             break;
11971         case RR_BREAK:
11972             generate_exception_end(ctx, EXCP_BREAK);
11973             break;
11974         case RR_SLLV:
11975             gen_shift(ctx, OPC_SLLV, ry, rx, ry);
11976             break;
11977         case RR_SRLV:
11978             gen_shift(ctx, OPC_SRLV, ry, rx, ry);
11979             break;
11980         case RR_SRAV:
11981             gen_shift(ctx, OPC_SRAV, ry, rx, ry);
11982             break;
11983 #if defined (TARGET_MIPS64)
11984         case RR_DSRL:
11985             check_insn(ctx, ISA_MIPS3);
11986             check_mips_64(ctx);
11987             gen_shift_imm(ctx, OPC_DSRL, ry, ry, sa);
11988             break;
11989 #endif
11990         case RR_CMP:
11991             gen_logic(ctx, OPC_XOR, 24, rx, ry);
11992             break;
11993         case RR_NEG:
11994             gen_arith(ctx, OPC_SUBU, rx, 0, ry);
11995             break;
11996         case RR_AND:
11997             gen_logic(ctx, OPC_AND, rx, rx, ry);
11998             break;
11999         case RR_OR:
12000             gen_logic(ctx, OPC_OR, rx, rx, ry);
12001             break;
12002         case RR_XOR:
12003             gen_logic(ctx, OPC_XOR, rx, rx, ry);
12004             break;
12005         case RR_NOT:
12006             gen_logic(ctx, OPC_NOR, rx, ry, 0);
12007             break;
12008         case RR_MFHI:
12009             gen_HILO(ctx, OPC_MFHI, 0, rx);
12010             break;
12011         case RR_CNVT:
12012             check_insn(ctx, ISA_MIPS32);
12013             switch (cnvt_op) {
12014             case RR_RY_CNVT_ZEB:
12015                 tcg_gen_ext8u_tl(cpu_gpr[rx], cpu_gpr[rx]);
12016                 break;
12017             case RR_RY_CNVT_ZEH:
12018                 tcg_gen_ext16u_tl(cpu_gpr[rx], cpu_gpr[rx]);
12019                 break;
12020             case RR_RY_CNVT_SEB:
12021                 tcg_gen_ext8s_tl(cpu_gpr[rx], cpu_gpr[rx]);
12022                 break;
12023             case RR_RY_CNVT_SEH:
12024                 tcg_gen_ext16s_tl(cpu_gpr[rx], cpu_gpr[rx]);
12025                 break;
12026 #if defined (TARGET_MIPS64)
12027             case RR_RY_CNVT_ZEW:
12028                 check_insn(ctx, ISA_MIPS64);
12029                 check_mips_64(ctx);
12030                 tcg_gen_ext32u_tl(cpu_gpr[rx], cpu_gpr[rx]);
12031                 break;
12032             case RR_RY_CNVT_SEW:
12033                 check_insn(ctx, ISA_MIPS64);
12034                 check_mips_64(ctx);
12035                 tcg_gen_ext32s_tl(cpu_gpr[rx], cpu_gpr[rx]);
12036                 break;
12037 #endif
12038             default:
12039                 generate_exception_end(ctx, EXCP_RI);
12040                 break;
12041             }
12042             break;
12043         case RR_MFLO:
12044             gen_HILO(ctx, OPC_MFLO, 0, rx);
12045             break;
12046 #if defined (TARGET_MIPS64)
12047         case RR_DSRA:
12048             check_insn(ctx, ISA_MIPS3);
12049             check_mips_64(ctx);
12050             gen_shift_imm(ctx, OPC_DSRA, ry, ry, sa);
12051             break;
12052         case RR_DSLLV:
12053             check_insn(ctx, ISA_MIPS3);
12054             check_mips_64(ctx);
12055             gen_shift(ctx, OPC_DSLLV, ry, rx, ry);
12056             break;
12057         case RR_DSRLV:
12058             check_insn(ctx, ISA_MIPS3);
12059             check_mips_64(ctx);
12060             gen_shift(ctx, OPC_DSRLV, ry, rx, ry);
12061             break;
12062         case RR_DSRAV:
12063             check_insn(ctx, ISA_MIPS3);
12064             check_mips_64(ctx);
12065             gen_shift(ctx, OPC_DSRAV, ry, rx, ry);
12066             break;
12067 #endif
12068         case RR_MULT:
12069             gen_muldiv(ctx, OPC_MULT, 0, rx, ry);
12070             break;
12071         case RR_MULTU:
12072             gen_muldiv(ctx, OPC_MULTU, 0, rx, ry);
12073             break;
12074         case RR_DIV:
12075             gen_muldiv(ctx, OPC_DIV, 0, rx, ry);
12076             break;
12077         case RR_DIVU:
12078             gen_muldiv(ctx, OPC_DIVU, 0, rx, ry);
12079             break;
12080 #if defined (TARGET_MIPS64)
12081         case RR_DMULT:
12082             check_insn(ctx, ISA_MIPS3);
12083             check_mips_64(ctx);
12084             gen_muldiv(ctx, OPC_DMULT, 0, rx, ry);
12085             break;
12086         case RR_DMULTU:
12087             check_insn(ctx, ISA_MIPS3);
12088             check_mips_64(ctx);
12089             gen_muldiv(ctx, OPC_DMULTU, 0, rx, ry);
12090             break;
12091         case RR_DDIV:
12092             check_insn(ctx, ISA_MIPS3);
12093             check_mips_64(ctx);
12094             gen_muldiv(ctx, OPC_DDIV, 0, rx, ry);
12095             break;
12096         case RR_DDIVU:
12097             check_insn(ctx, ISA_MIPS3);
12098             check_mips_64(ctx);
12099             gen_muldiv(ctx, OPC_DDIVU, 0, rx, ry);
12100             break;
12101 #endif
12102         default:
12103             generate_exception_end(ctx, EXCP_RI);
12104             break;
12105         }
12106         break;
12107     case M16_OPC_EXTEND:
12108         decode_extended_mips16_opc(env, ctx);
12109         n_bytes = 4;
12110         break;
12111 #if defined(TARGET_MIPS64)
12112     case M16_OPC_I64:
12113         funct = (ctx->opcode >> 8) & 0x7;
12114         decode_i64_mips16(ctx, ry, funct, offset, 0);
12115         break;
12116 #endif
12117     default:
12118         generate_exception_end(ctx, EXCP_RI);
12119         break;
12120     }
12121
12122     return n_bytes;
12123 }
12124
12125 /* microMIPS extension to MIPS32/MIPS64 */
12126
12127 /*
12128  * microMIPS32/microMIPS64 major opcodes
12129  *
12130  * 1. MIPS Architecture for Programmers Volume II-B:
12131  *      The microMIPS32 Instruction Set (Revision 3.05)
12132  *
12133  *    Table 6.2 microMIPS32 Encoding of Major Opcode Field
12134  *
12135  * 2. MIPS Architecture For Programmers Volume II-A:
12136  *      The MIPS64 Instruction Set (Revision 3.51)
12137  */
12138
12139 enum {
12140     POOL32A = 0x00,
12141     POOL16A = 0x01,
12142     LBU16 = 0x02,
12143     MOVE16 = 0x03,
12144     ADDI32 = 0x04,
12145     R6_LUI = 0x04,
12146     AUI = 0x04,
12147     LBU32 = 0x05,
12148     SB32 = 0x06,
12149     LB32 = 0x07,
12150
12151     POOL32B = 0x08,
12152     POOL16B = 0x09,
12153     LHU16 = 0x0a,
12154     ANDI16 = 0x0b,
12155     ADDIU32 = 0x0c,
12156     LHU32 = 0x0d,
12157     SH32 = 0x0e,
12158     LH32 = 0x0f,
12159
12160     POOL32I = 0x10,
12161     POOL16C = 0x11,
12162     LWSP16 = 0x12,
12163     POOL16D = 0x13,
12164     ORI32 = 0x14,
12165     POOL32F = 0x15,
12166     POOL32S = 0x16,  /* MIPS64 */
12167     DADDIU32 = 0x17, /* MIPS64 */
12168
12169     POOL32C = 0x18,
12170     LWGP16 = 0x19,
12171     LW16 = 0x1a,
12172     POOL16E = 0x1b,
12173     XORI32 = 0x1c,
12174     JALS32 = 0x1d,
12175     BOVC = 0x1d,
12176     BEQC = 0x1d,
12177     BEQZALC = 0x1d,
12178     ADDIUPC = 0x1e,
12179     PCREL = 0x1e,
12180     BNVC = 0x1f,
12181     BNEC = 0x1f,
12182     BNEZALC = 0x1f,
12183
12184     R6_BEQZC = 0x20,
12185     JIC = 0x20,
12186     POOL16F = 0x21,
12187     SB16 = 0x22,
12188     BEQZ16 = 0x23,
12189     BEQZC16 = 0x23,
12190     SLTI32 = 0x24,
12191     BEQ32 = 0x25,
12192     BC = 0x25,
12193     SWC132 = 0x26,
12194     LWC132 = 0x27,
12195
12196     /* 0x29 is reserved */
12197     RES_29 = 0x29,
12198     R6_BNEZC = 0x28,
12199     JIALC = 0x28,
12200     SH16 = 0x2a,
12201     BNEZ16 = 0x2b,
12202     BNEZC16 = 0x2b,
12203     SLTIU32 = 0x2c,
12204     BNE32 = 0x2d,
12205     BALC = 0x2d,
12206     SDC132 = 0x2e,
12207     LDC132 = 0x2f,
12208
12209     /* 0x31 is reserved */
12210     RES_31 = 0x31,
12211     BLEZALC = 0x30,
12212     BGEZALC = 0x30,
12213     BGEUC = 0x30,
12214     SWSP16 = 0x32,
12215     B16 = 0x33,
12216     BC16 = 0x33,
12217     ANDI32 = 0x34,
12218     J32 = 0x35,
12219     BGTZC = 0x35,
12220     BLTZC = 0x35,
12221     BLTC = 0x35,
12222     SD32 = 0x36, /* MIPS64 */
12223     LD32 = 0x37, /* MIPS64 */
12224
12225     /* 0x39 is reserved */
12226     RES_39 = 0x39,
12227     BGTZALC = 0x38,
12228     BLTZALC = 0x38,
12229     BLTUC = 0x38,
12230     SW16 = 0x3a,
12231     LI16 = 0x3b,
12232     JALX32 = 0x3c,
12233     JAL32 = 0x3d,
12234     BLEZC = 0x3d,
12235     BGEZC = 0x3d,
12236     BGEC = 0x3d,
12237     SW32 = 0x3e,
12238     LW32 = 0x3f
12239 };
12240
12241 /* PCREL Instructions perform PC-Relative address calculation. bits 20..16 */
12242 enum {
12243     ADDIUPC_00 = 0x00,
12244     ADDIUPC_07 = 0x07,
12245     AUIPC = 0x1e,
12246     ALUIPC = 0x1f,
12247     LWPC_08 = 0x08,
12248     LWPC_0F = 0x0F,
12249 };
12250
12251 /* POOL32A encoding of minor opcode field */
12252
12253 enum {
12254     /* These opcodes are distinguished only by bits 9..6; those bits are
12255      * what are recorded below. */
12256     SLL32 = 0x0,
12257     SRL32 = 0x1,
12258     SRA = 0x2,
12259     ROTR = 0x3,
12260     SELEQZ = 0x5,
12261     SELNEZ = 0x6,
12262     R6_RDHWR = 0x7,
12263
12264     SLLV = 0x0,
12265     SRLV = 0x1,
12266     SRAV = 0x2,
12267     ROTRV = 0x3,
12268     ADD = 0x4,
12269     ADDU32 = 0x5,
12270     SUB = 0x6,
12271     SUBU32 = 0x7,
12272     MUL = 0x8,
12273     AND = 0x9,
12274     OR32 = 0xa,
12275     NOR = 0xb,
12276     XOR32 = 0xc,
12277     SLT = 0xd,
12278     SLTU = 0xe,
12279
12280     MOVN = 0x0,
12281     R6_MUL  = 0x0,
12282     MOVZ = 0x1,
12283     MUH  = 0x1,
12284     MULU = 0x2,
12285     MUHU = 0x3,
12286     LWXS = 0x4,
12287     R6_DIV  = 0x4,
12288     MOD  = 0x5,
12289     R6_DIVU = 0x6,
12290     MODU = 0x7,
12291
12292     /* The following can be distinguished by their lower 6 bits. */
12293     BREAK32 = 0x07,
12294     INS = 0x0c,
12295     LSA = 0x0f,
12296     ALIGN = 0x1f,
12297     EXT = 0x2c,
12298     POOL32AXF = 0x3c,
12299     SIGRIE = 0x3f
12300 };
12301
12302 /* POOL32AXF encoding of minor opcode field extension */
12303
12304 /*
12305  * 1. MIPS Architecture for Programmers Volume II-B:
12306  *      The microMIPS32 Instruction Set (Revision 3.05)
12307  *
12308  *    Table 6.5 POOL32Axf Encoding of Minor Opcode Extension Field
12309  *
12310  * 2. MIPS Architecture for Programmers VolumeIV-e:
12311  *      The MIPS DSP Application-Specific Extension
12312  *        to the microMIPS32 Architecture (Revision 2.34)
12313  *
12314  *    Table 5.5 POOL32Axf Encoding of Minor Opcode Extension Field
12315  */
12316
12317 enum {
12318     /* bits 11..6 */
12319     TEQ = 0x00,
12320     TGE = 0x08,
12321     TGEU = 0x10,
12322     TLT = 0x20,
12323     TLTU = 0x28,
12324     TNE = 0x30,
12325
12326     MFC0 = 0x03,
12327     MTC0 = 0x0b,
12328
12329     /* begin of microMIPS32 DSP */
12330
12331     /* bits 13..12 for 0x01 */
12332     MFHI_ACC = 0x0,
12333     MFLO_ACC = 0x1,
12334     MTHI_ACC = 0x2,
12335     MTLO_ACC = 0x3,
12336
12337     /* bits 13..12 for 0x2a */
12338     MADD_ACC = 0x0,
12339     MADDU_ACC = 0x1,
12340     MSUB_ACC = 0x2,
12341     MSUBU_ACC = 0x3,
12342
12343     /* bits 13..12 for 0x32 */
12344     MULT_ACC = 0x0,
12345     MULTU_ACC = 0x1,
12346
12347     /* end of microMIPS32 DSP */
12348
12349     /* bits 15..12 for 0x2c */
12350     BITSWAP = 0x0,
12351     SEB = 0x2,
12352     SEH = 0x3,
12353     CLO = 0x4,
12354     CLZ = 0x5,
12355     RDHWR = 0x6,
12356     WSBH = 0x7,
12357     MULT = 0x8,
12358     MULTU = 0x9,
12359     DIV = 0xa,
12360     DIVU = 0xb,
12361     MADD = 0xc,
12362     MADDU = 0xd,
12363     MSUB = 0xe,
12364     MSUBU = 0xf,
12365
12366     /* bits 15..12 for 0x34 */
12367     MFC2 = 0x4,
12368     MTC2 = 0x5,
12369     MFHC2 = 0x8,
12370     MTHC2 = 0x9,
12371     CFC2 = 0xc,
12372     CTC2 = 0xd,
12373
12374     /* bits 15..12 for 0x3c */
12375     JALR = 0x0,
12376     JR = 0x0,                   /* alias */
12377     JALRC = 0x0,
12378     JRC = 0x0,
12379     JALR_HB = 0x1,
12380     JALRC_HB = 0x1,
12381     JALRS = 0x4,
12382     JALRS_HB = 0x5,
12383
12384     /* bits 15..12 for 0x05 */
12385     RDPGPR = 0xe,
12386     WRPGPR = 0xf,
12387
12388     /* bits 15..12 for 0x0d */
12389     TLBP = 0x0,
12390     TLBR = 0x1,
12391     TLBWI = 0x2,
12392     TLBWR = 0x3,
12393     TLBINV = 0x4,
12394     TLBINVF = 0x5,
12395     WAIT = 0x9,
12396     IRET = 0xd,
12397     DERET = 0xe,
12398     ERET = 0xf,
12399
12400     /* bits 15..12 for 0x15 */
12401     DMT = 0x0,
12402     DVPE = 0x1,
12403     EMT = 0x2,
12404     EVPE = 0x3,
12405
12406     /* bits 15..12 for 0x1d */
12407     DI = 0x4,
12408     EI = 0x5,
12409
12410     /* bits 15..12 for 0x2d */
12411     SYNC = 0x6,
12412     SYSCALL = 0x8,
12413     SDBBP = 0xd,
12414
12415     /* bits 15..12 for 0x35 */
12416     MFHI32 = 0x0,
12417     MFLO32 = 0x1,
12418     MTHI32 = 0x2,
12419     MTLO32 = 0x3,
12420 };
12421
12422 /* POOL32B encoding of minor opcode field (bits 15..12) */
12423
12424 enum {
12425     LWC2 = 0x0,
12426     LWP = 0x1,
12427     LDP = 0x4,
12428     LWM32 = 0x5,
12429     CACHE = 0x6,
12430     LDM = 0x7,
12431     SWC2 = 0x8,
12432     SWP = 0x9,
12433     SDP = 0xc,
12434     SWM32 = 0xd,
12435     SDM = 0xf
12436 };
12437
12438 /* POOL32C encoding of minor opcode field (bits 15..12) */
12439
12440 enum {
12441     LWL = 0x0,
12442     SWL = 0x8,
12443     LWR = 0x1,
12444     SWR = 0x9,
12445     PREF = 0x2,
12446     /* 0xa is reserved */
12447     LL = 0x3,
12448     SC = 0xb,
12449     LDL = 0x4,
12450     SDL = 0xc,
12451     LDR = 0x5,
12452     SDR = 0xd,
12453     /* 0x6 is reserved */
12454     LWU = 0xe,
12455     LLD = 0x7,
12456     SCD = 0xf
12457 };
12458
12459 /* POOL32F encoding of minor opcode field (bits 5..0) */
12460
12461 enum {
12462     /* These are the bit 7..6 values */
12463     ADD_FMT = 0x0,
12464
12465     SUB_FMT = 0x1,
12466
12467     MUL_FMT = 0x2,
12468
12469     DIV_FMT = 0x3,
12470
12471     /* These are the bit 8..6 values */
12472     MOVN_FMT = 0x0,
12473     RSQRT2_FMT = 0x0,
12474     MOVF_FMT = 0x0,
12475     RINT_FMT = 0x0,
12476     SELNEZ_FMT = 0x0,
12477
12478     MOVZ_FMT = 0x1,
12479     LWXC1 = 0x1,
12480     MOVT_FMT = 0x1,
12481     CLASS_FMT = 0x1,
12482     SELEQZ_FMT = 0x1,
12483
12484     PLL_PS = 0x2,
12485     SWXC1 = 0x2,
12486     SEL_FMT = 0x2,
12487
12488     PLU_PS = 0x3,
12489     LDXC1 = 0x3,
12490
12491     MOVN_FMT_04 = 0x4,
12492     PUL_PS = 0x4,
12493     SDXC1 = 0x4,
12494     RECIP2_FMT = 0x4,
12495
12496     MOVZ_FMT_05 = 0x05,
12497     PUU_PS = 0x5,
12498     LUXC1 = 0x5,
12499
12500     CVT_PS_S = 0x6,
12501     SUXC1 = 0x6,
12502     ADDR_PS = 0x6,
12503     PREFX = 0x6,
12504     MADDF_FMT = 0x6,
12505
12506     MULR_PS = 0x7,
12507     MSUBF_FMT = 0x7,
12508
12509     MADD_S = 0x01,
12510     MADD_D = 0x09,
12511     MADD_PS = 0x11,
12512     ALNV_PS = 0x19,
12513     MSUB_S = 0x21,
12514     MSUB_D = 0x29,
12515     MSUB_PS = 0x31,
12516
12517     NMADD_S = 0x02,
12518     NMADD_D = 0x0a,
12519     NMADD_PS = 0x12,
12520     NMSUB_S = 0x22,
12521     NMSUB_D = 0x2a,
12522     NMSUB_PS = 0x32,
12523
12524     MIN_FMT = 0x3,
12525     MAX_FMT = 0xb,
12526     MINA_FMT = 0x23,
12527     MAXA_FMT = 0x2b,
12528     POOL32FXF = 0x3b,
12529
12530     CABS_COND_FMT = 0x1c,              /* MIPS3D */
12531     C_COND_FMT = 0x3c,
12532
12533     CMP_CONDN_S = 0x5,
12534     CMP_CONDN_D = 0x15
12535 };
12536
12537 /* POOL32Fxf encoding of minor opcode extension field */
12538
12539 enum {
12540     CVT_L = 0x04,
12541     RSQRT_FMT = 0x08,
12542     FLOOR_L = 0x0c,
12543     CVT_PW_PS = 0x1c,
12544     CVT_W = 0x24,
12545     SQRT_FMT = 0x28,
12546     FLOOR_W = 0x2c,
12547     CVT_PS_PW = 0x3c,
12548     CFC1 = 0x40,
12549     RECIP_FMT = 0x48,
12550     CEIL_L = 0x4c,
12551     CTC1 = 0x60,
12552     CEIL_W = 0x6c,
12553     MFC1 = 0x80,
12554     CVT_S_PL = 0x84,
12555     TRUNC_L = 0x8c,
12556     MTC1 = 0xa0,
12557     CVT_S_PU = 0xa4,
12558     TRUNC_W = 0xac,
12559     MFHC1 = 0xc0,
12560     ROUND_L = 0xcc,
12561     MTHC1 = 0xe0,
12562     ROUND_W = 0xec,
12563
12564     MOV_FMT = 0x01,
12565     MOVF = 0x05,
12566     ABS_FMT = 0x0d,
12567     RSQRT1_FMT = 0x1d,
12568     MOVT = 0x25,
12569     NEG_FMT = 0x2d,
12570     CVT_D = 0x4d,
12571     RECIP1_FMT = 0x5d,
12572     CVT_S = 0x6d
12573 };
12574
12575 /* POOL32I encoding of minor opcode field (bits 25..21) */
12576
12577 enum {
12578     BLTZ = 0x00,
12579     BLTZAL = 0x01,
12580     BGEZ = 0x02,
12581     BGEZAL = 0x03,
12582     BLEZ = 0x04,
12583     BNEZC = 0x05,
12584     BGTZ = 0x06,
12585     BEQZC = 0x07,
12586     TLTI = 0x08,
12587     BC1EQZC = 0x08,
12588     TGEI = 0x09,
12589     BC1NEZC = 0x09,
12590     TLTIU = 0x0a,
12591     BC2EQZC = 0x0a,
12592     TGEIU = 0x0b,
12593     BC2NEZC = 0x0a,
12594     TNEI = 0x0c,
12595     R6_SYNCI = 0x0c,
12596     LUI = 0x0d,
12597     TEQI = 0x0e,
12598     SYNCI = 0x10,
12599     BLTZALS = 0x11,
12600     BGEZALS = 0x13,
12601     BC2F = 0x14,
12602     BC2T = 0x15,
12603     BPOSGE64 = 0x1a,
12604     BPOSGE32 = 0x1b,
12605     /* These overlap and are distinguished by bit16 of the instruction */
12606     BC1F = 0x1c,
12607     BC1T = 0x1d,
12608     BC1ANY2F = 0x1c,
12609     BC1ANY2T = 0x1d,
12610     BC1ANY4F = 0x1e,
12611     BC1ANY4T = 0x1f
12612 };
12613
12614 /* POOL16A encoding of minor opcode field */
12615
12616 enum {
12617     ADDU16 = 0x0,
12618     SUBU16 = 0x1
12619 };
12620
12621 /* POOL16B encoding of minor opcode field */
12622
12623 enum {
12624     SLL16 = 0x0,
12625     SRL16 = 0x1
12626 };
12627
12628 /* POOL16C encoding of minor opcode field */
12629
12630 enum {
12631     NOT16 = 0x00,
12632     XOR16 = 0x04,
12633     AND16 = 0x08,
12634     OR16 = 0x0c,
12635     LWM16 = 0x10,
12636     SWM16 = 0x14,
12637     JR16 = 0x18,
12638     JRC16 = 0x1a,
12639     JALR16 = 0x1c,
12640     JALR16S = 0x1e,
12641     MFHI16 = 0x20,
12642     MFLO16 = 0x24,
12643     BREAK16 = 0x28,
12644     SDBBP16 = 0x2c,
12645     JRADDIUSP = 0x30
12646 };
12647
12648 /* R6 POOL16C encoding of minor opcode field (bits 0..5) */
12649
12650 enum {
12651     R6_NOT16    = 0x00,
12652     R6_AND16    = 0x01,
12653     R6_LWM16    = 0x02,
12654     R6_JRC16    = 0x03,
12655     MOVEP       = 0x04,
12656     MOVEP_07    = 0x07,
12657     R6_XOR16    = 0x08,
12658     R6_OR16     = 0x09,
12659     R6_SWM16    = 0x0a,
12660     JALRC16     = 0x0b,
12661     MOVEP_0C    = 0x0c,
12662     MOVEP_0F    = 0x0f,
12663     JRCADDIUSP  = 0x13,
12664     R6_BREAK16  = 0x1b,
12665     R6_SDBBP16  = 0x3b
12666 };
12667
12668 /* POOL16D encoding of minor opcode field */
12669
12670 enum {
12671     ADDIUS5 = 0x0,
12672     ADDIUSP = 0x1
12673 };
12674
12675 /* POOL16E encoding of minor opcode field */
12676
12677 enum {
12678     ADDIUR2 = 0x0,
12679     ADDIUR1SP = 0x1
12680 };
12681
12682 static int mmreg (int r)
12683 {
12684     static const int map[] = { 16, 17, 2, 3, 4, 5, 6, 7 };
12685
12686     return map[r];
12687 }
12688
12689 /* Used for 16-bit store instructions.  */
12690 static int mmreg2 (int r)
12691 {
12692     static const int map[] = { 0, 17, 2, 3, 4, 5, 6, 7 };
12693
12694     return map[r];
12695 }
12696
12697 #define uMIPS_RD(op) ((op >> 7) & 0x7)
12698 #define uMIPS_RS(op) ((op >> 4) & 0x7)
12699 #define uMIPS_RS2(op) uMIPS_RS(op)
12700 #define uMIPS_RS1(op) ((op >> 1) & 0x7)
12701 #define uMIPS_RD5(op) ((op >> 5) & 0x1f)
12702 #define uMIPS_RS5(op) (op & 0x1f)
12703
12704 /* Signed immediate */
12705 #define SIMM(op, start, width)                                          \
12706     ((int32_t)(((op >> start) & ((~0U) >> (32-width)))                 \
12707                << (32-width))                                           \
12708      >> (32-width))
12709 /* Zero-extended immediate */
12710 #define ZIMM(op, start, width) ((op >> start) & ((~0U) >> (32-width)))
12711
12712 static void gen_addiur1sp(DisasContext *ctx)
12713 {
12714     int rd = mmreg(uMIPS_RD(ctx->opcode));
12715
12716     gen_arith_imm(ctx, OPC_ADDIU, rd, 29, ((ctx->opcode >> 1) & 0x3f) << 2);
12717 }
12718
12719 static void gen_addiur2(DisasContext *ctx)
12720 {
12721     static const int decoded_imm[] = { 1, 4, 8, 12, 16, 20, 24, -1 };
12722     int rd = mmreg(uMIPS_RD(ctx->opcode));
12723     int rs = mmreg(uMIPS_RS(ctx->opcode));
12724
12725     gen_arith_imm(ctx, OPC_ADDIU, rd, rs, decoded_imm[ZIMM(ctx->opcode, 1, 3)]);
12726 }
12727
12728 static void gen_addiusp(DisasContext *ctx)
12729 {
12730     int encoded = ZIMM(ctx->opcode, 1, 9);
12731     int decoded;
12732
12733     if (encoded <= 1) {
12734         decoded = 256 + encoded;
12735     } else if (encoded <= 255) {
12736         decoded = encoded;
12737     } else if (encoded <= 509) {
12738         decoded = encoded - 512;
12739     } else {
12740         decoded = encoded - 768;
12741     }
12742
12743     gen_arith_imm(ctx, OPC_ADDIU, 29, 29, decoded << 2);
12744 }
12745
12746 static void gen_addius5(DisasContext *ctx)
12747 {
12748     int imm = SIMM(ctx->opcode, 1, 4);
12749     int rd = (ctx->opcode >> 5) & 0x1f;
12750
12751     gen_arith_imm(ctx, OPC_ADDIU, rd, rd, imm);
12752 }
12753
12754 static void gen_andi16(DisasContext *ctx)
12755 {
12756     static const int decoded_imm[] = { 128, 1, 2, 3, 4, 7, 8, 15, 16,
12757                                  31, 32, 63, 64, 255, 32768, 65535 };
12758     int rd = mmreg(uMIPS_RD(ctx->opcode));
12759     int rs = mmreg(uMIPS_RS(ctx->opcode));
12760     int encoded = ZIMM(ctx->opcode, 0, 4);
12761
12762     gen_logic_imm(ctx, OPC_ANDI, rd, rs, decoded_imm[encoded]);
12763 }
12764
12765 static void gen_ldst_multiple (DisasContext *ctx, uint32_t opc, int reglist,
12766                                int base, int16_t offset)
12767 {
12768     TCGv t0, t1;
12769     TCGv_i32 t2;
12770
12771     if (ctx->hflags & MIPS_HFLAG_BMASK) {
12772         generate_exception_end(ctx, EXCP_RI);
12773         return;
12774     }
12775
12776     t0 = tcg_temp_new();
12777
12778     gen_base_offset_addr(ctx, t0, base, offset);
12779
12780     t1 = tcg_const_tl(reglist);
12781     t2 = tcg_const_i32(ctx->mem_idx);
12782
12783     save_cpu_state(ctx, 1);
12784     switch (opc) {
12785     case LWM32:
12786         gen_helper_lwm(cpu_env, t0, t1, t2);
12787         break;
12788     case SWM32:
12789         gen_helper_swm(cpu_env, t0, t1, t2);
12790         break;
12791 #ifdef TARGET_MIPS64
12792     case LDM:
12793         gen_helper_ldm(cpu_env, t0, t1, t2);
12794         break;
12795     case SDM:
12796         gen_helper_sdm(cpu_env, t0, t1, t2);
12797         break;
12798 #endif
12799     }
12800     tcg_temp_free(t0);
12801     tcg_temp_free(t1);
12802     tcg_temp_free_i32(t2);
12803 }
12804
12805
12806 static void gen_pool16c_insn(DisasContext *ctx)
12807 {
12808     int rd = mmreg((ctx->opcode >> 3) & 0x7);
12809     int rs = mmreg(ctx->opcode & 0x7);
12810
12811     switch (((ctx->opcode) >> 4) & 0x3f) {
12812     case NOT16 + 0:
12813     case NOT16 + 1:
12814     case NOT16 + 2:
12815     case NOT16 + 3:
12816         gen_logic(ctx, OPC_NOR, rd, rs, 0);
12817         break;
12818     case XOR16 + 0:
12819     case XOR16 + 1:
12820     case XOR16 + 2:
12821     case XOR16 + 3:
12822         gen_logic(ctx, OPC_XOR, rd, rd, rs);
12823         break;
12824     case AND16 + 0:
12825     case AND16 + 1:
12826     case AND16 + 2:
12827     case AND16 + 3:
12828         gen_logic(ctx, OPC_AND, rd, rd, rs);
12829         break;
12830     case OR16 + 0:
12831     case OR16 + 1:
12832     case OR16 + 2:
12833     case OR16 + 3:
12834         gen_logic(ctx, OPC_OR, rd, rd, rs);
12835         break;
12836     case LWM16 + 0:
12837     case LWM16 + 1:
12838     case LWM16 + 2:
12839     case LWM16 + 3:
12840         {
12841             static const int lwm_convert[] = { 0x11, 0x12, 0x13, 0x14 };
12842             int offset = ZIMM(ctx->opcode, 0, 4);
12843
12844             gen_ldst_multiple(ctx, LWM32, lwm_convert[(ctx->opcode >> 4) & 0x3],
12845                               29, offset << 2);
12846         }
12847         break;
12848     case SWM16 + 0:
12849     case SWM16 + 1:
12850     case SWM16 + 2:
12851     case SWM16 + 3:
12852         {
12853             static const int swm_convert[] = { 0x11, 0x12, 0x13, 0x14 };
12854             int offset = ZIMM(ctx->opcode, 0, 4);
12855
12856             gen_ldst_multiple(ctx, SWM32, swm_convert[(ctx->opcode >> 4) & 0x3],
12857                               29, offset << 2);
12858         }
12859         break;
12860     case JR16 + 0:
12861     case JR16 + 1:
12862         {
12863             int reg = ctx->opcode & 0x1f;
12864
12865             gen_compute_branch(ctx, OPC_JR, 2, reg, 0, 0, 4);
12866         }
12867         break;
12868     case JRC16 + 0:
12869     case JRC16 + 1:
12870         {
12871             int reg = ctx->opcode & 0x1f;
12872             gen_compute_branch(ctx, OPC_JR, 2, reg, 0, 0, 0);
12873             /* Let normal delay slot handling in our caller take us
12874                to the branch target.  */
12875         }
12876         break;
12877     case JALR16 + 0:
12878     case JALR16 + 1:
12879         gen_compute_branch(ctx, OPC_JALR, 2, ctx->opcode & 0x1f, 31, 0, 4);
12880         ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
12881         break;
12882     case JALR16S + 0:
12883     case JALR16S + 1:
12884         gen_compute_branch(ctx, OPC_JALR, 2, ctx->opcode & 0x1f, 31, 0, 2);
12885         ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
12886         break;
12887     case MFHI16 + 0:
12888     case MFHI16 + 1:
12889         gen_HILO(ctx, OPC_MFHI, 0, uMIPS_RS5(ctx->opcode));
12890         break;
12891     case MFLO16 + 0:
12892     case MFLO16 + 1:
12893         gen_HILO(ctx, OPC_MFLO, 0, uMIPS_RS5(ctx->opcode));
12894         break;
12895     case BREAK16:
12896         generate_exception_end(ctx, EXCP_BREAK);
12897         break;
12898     case SDBBP16:
12899         if (is_uhi(extract32(ctx->opcode, 0, 4))) {
12900             gen_helper_do_semihosting(cpu_env);
12901         } else {
12902             /* XXX: not clear which exception should be raised
12903              *      when in debug mode...
12904              */
12905             check_insn(ctx, ISA_MIPS32);
12906             generate_exception_end(ctx, EXCP_DBp);
12907         }
12908         break;
12909     case JRADDIUSP + 0:
12910     case JRADDIUSP + 1:
12911         {
12912             int imm = ZIMM(ctx->opcode, 0, 5);
12913             gen_compute_branch(ctx, OPC_JR, 2, 31, 0, 0, 0);
12914             gen_arith_imm(ctx, OPC_ADDIU, 29, 29, imm << 2);
12915             /* Let normal delay slot handling in our caller take us
12916                to the branch target.  */
12917         }
12918         break;
12919     default:
12920         generate_exception_end(ctx, EXCP_RI);
12921         break;
12922     }
12923 }
12924
12925 static inline void gen_movep(DisasContext *ctx, int enc_dest, int enc_rt,
12926                              int enc_rs)
12927 {
12928     int rd, rs, re, rt;
12929     static const int rd_enc[] = { 5, 5, 6, 4, 4, 4, 4, 4 };
12930     static const int re_enc[] = { 6, 7, 7, 21, 22, 5, 6, 7 };
12931     static const int rs_rt_enc[] = { 0, 17, 2, 3, 16, 18, 19, 20 };
12932     rd = rd_enc[enc_dest];
12933     re = re_enc[enc_dest];
12934     rs = rs_rt_enc[enc_rs];
12935     rt = rs_rt_enc[enc_rt];
12936     if (rs) {
12937         tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
12938     } else {
12939         tcg_gen_movi_tl(cpu_gpr[rd], 0);
12940     }
12941     if (rt) {
12942         tcg_gen_mov_tl(cpu_gpr[re], cpu_gpr[rt]);
12943     } else {
12944         tcg_gen_movi_tl(cpu_gpr[re], 0);
12945     }
12946 }
12947
12948 static void gen_pool16c_r6_insn(DisasContext *ctx)
12949 {
12950     int rt = mmreg((ctx->opcode >> 7) & 0x7);
12951     int rs = mmreg((ctx->opcode >> 4) & 0x7);
12952
12953     switch (ctx->opcode & 0xf) {
12954     case R6_NOT16:
12955         gen_logic(ctx, OPC_NOR, rt, rs, 0);
12956         break;
12957     case R6_AND16:
12958         gen_logic(ctx, OPC_AND, rt, rt, rs);
12959         break;
12960     case R6_LWM16:
12961         {
12962             int lwm_converted = 0x11 + extract32(ctx->opcode, 8, 2);
12963             int offset = extract32(ctx->opcode, 4, 4);
12964             gen_ldst_multiple(ctx, LWM32, lwm_converted, 29, offset << 2);
12965         }
12966         break;
12967     case R6_JRC16: /* JRCADDIUSP */
12968         if ((ctx->opcode >> 4) & 1) {
12969             /* JRCADDIUSP */
12970             int imm = extract32(ctx->opcode, 5, 5);
12971             gen_compute_branch(ctx, OPC_JR, 2, 31, 0, 0, 0);
12972             gen_arith_imm(ctx, OPC_ADDIU, 29, 29, imm << 2);
12973         } else {
12974             /* JRC16 */
12975             int rs = extract32(ctx->opcode, 5, 5);
12976             gen_compute_branch(ctx, OPC_JR, 2, rs, 0, 0, 0);
12977         }
12978         break;
12979     case MOVEP ... MOVEP_07:
12980     case MOVEP_0C ... MOVEP_0F:
12981         {
12982             int enc_dest = uMIPS_RD(ctx->opcode);
12983             int enc_rt = uMIPS_RS2(ctx->opcode);
12984             int enc_rs = (ctx->opcode & 3) | ((ctx->opcode >> 1) & 4);
12985             gen_movep(ctx, enc_dest, enc_rt, enc_rs);
12986         }
12987         break;
12988     case R6_XOR16:
12989         gen_logic(ctx, OPC_XOR, rt, rt, rs);
12990         break;
12991     case R6_OR16:
12992         gen_logic(ctx, OPC_OR, rt, rt, rs);
12993         break;
12994     case R6_SWM16:
12995         {
12996             int swm_converted = 0x11 + extract32(ctx->opcode, 8, 2);
12997             int offset = extract32(ctx->opcode, 4, 4);
12998             gen_ldst_multiple(ctx, SWM32, swm_converted, 29, offset << 2);
12999         }
13000         break;
13001     case JALRC16: /* BREAK16, SDBBP16 */
13002         switch (ctx->opcode & 0x3f) {
13003         case JALRC16:
13004         case JALRC16 + 0x20:
13005             /* JALRC16 */
13006             gen_compute_branch(ctx, OPC_JALR, 2, (ctx->opcode >> 5) & 0x1f,
13007                                31, 0, 0);
13008             break;
13009         case R6_BREAK16:
13010             /* BREAK16 */
13011             generate_exception(ctx, EXCP_BREAK);
13012             break;
13013         case R6_SDBBP16:
13014             /* SDBBP16 */
13015             if (is_uhi(extract32(ctx->opcode, 6, 4))) {
13016                 gen_helper_do_semihosting(cpu_env);
13017             } else {
13018                 if (ctx->hflags & MIPS_HFLAG_SBRI) {
13019                     generate_exception(ctx, EXCP_RI);
13020                 } else {
13021                     generate_exception(ctx, EXCP_DBp);
13022                 }
13023             }
13024             break;
13025         }
13026         break;
13027     default:
13028         generate_exception(ctx, EXCP_RI);
13029         break;
13030     }
13031 }
13032
13033 static void gen_ldxs (DisasContext *ctx, int base, int index, int rd)
13034 {
13035     TCGv t0 = tcg_temp_new();
13036     TCGv t1 = tcg_temp_new();
13037
13038     gen_load_gpr(t0, base);
13039
13040     if (index != 0) {
13041         gen_load_gpr(t1, index);
13042         tcg_gen_shli_tl(t1, t1, 2);
13043         gen_op_addr_add(ctx, t0, t1, t0);
13044     }
13045
13046     tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL);
13047     gen_store_gpr(t1, rd);
13048
13049     tcg_temp_free(t0);
13050     tcg_temp_free(t1);
13051 }
13052
13053 static void gen_ldst_pair (DisasContext *ctx, uint32_t opc, int rd,
13054                            int base, int16_t offset)
13055 {
13056     TCGv t0, t1;
13057
13058     if (ctx->hflags & MIPS_HFLAG_BMASK || rd == 31) {
13059         generate_exception_end(ctx, EXCP_RI);
13060         return;
13061     }
13062
13063     t0 = tcg_temp_new();
13064     t1 = tcg_temp_new();
13065
13066     gen_base_offset_addr(ctx, t0, base, offset);
13067
13068     switch (opc) {
13069     case LWP:
13070         if (rd == base) {
13071             generate_exception_end(ctx, EXCP_RI);
13072             return;
13073         }
13074         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL);
13075         gen_store_gpr(t1, rd);
13076         tcg_gen_movi_tl(t1, 4);
13077         gen_op_addr_add(ctx, t0, t0, t1);
13078         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL);
13079         gen_store_gpr(t1, rd+1);
13080         break;
13081     case SWP:
13082         gen_load_gpr(t1, rd);
13083         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
13084         tcg_gen_movi_tl(t1, 4);
13085         gen_op_addr_add(ctx, t0, t0, t1);
13086         gen_load_gpr(t1, rd+1);
13087         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
13088         break;
13089 #ifdef TARGET_MIPS64
13090     case LDP:
13091         if (rd == base) {
13092             generate_exception_end(ctx, EXCP_RI);
13093             return;
13094         }
13095         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TEQ);
13096         gen_store_gpr(t1, rd);
13097         tcg_gen_movi_tl(t1, 8);
13098         gen_op_addr_add(ctx, t0, t0, t1);
13099         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TEQ);
13100         gen_store_gpr(t1, rd+1);
13101         break;
13102     case SDP:
13103         gen_load_gpr(t1, rd);
13104         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ);
13105         tcg_gen_movi_tl(t1, 8);
13106         gen_op_addr_add(ctx, t0, t0, t1);
13107         gen_load_gpr(t1, rd+1);
13108         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ);
13109         break;
13110 #endif
13111     }
13112     tcg_temp_free(t0);
13113     tcg_temp_free(t1);
13114 }
13115
13116 static void gen_sync(int stype)
13117 {
13118     TCGBar tcg_mo = TCG_BAR_SC;
13119
13120     switch (stype) {
13121     case 0x4: /* SYNC_WMB */
13122         tcg_mo |= TCG_MO_ST_ST;
13123         break;
13124     case 0x10: /* SYNC_MB */
13125         tcg_mo |= TCG_MO_ALL;
13126         break;
13127     case 0x11: /* SYNC_ACQUIRE */
13128         tcg_mo |= TCG_MO_LD_LD | TCG_MO_LD_ST;
13129         break;
13130     case 0x12: /* SYNC_RELEASE */
13131         tcg_mo |= TCG_MO_ST_ST | TCG_MO_LD_ST;
13132         break;
13133     case 0x13: /* SYNC_RMB */
13134         tcg_mo |= TCG_MO_LD_LD;
13135         break;
13136     default:
13137         tcg_mo |= TCG_MO_ALL;
13138         break;
13139     }
13140
13141     tcg_gen_mb(tcg_mo);
13142 }
13143
13144 static void gen_pool32axf (CPUMIPSState *env, DisasContext *ctx, int rt, int rs)
13145 {
13146     int extension = (ctx->opcode >> 6) & 0x3f;
13147     int minor = (ctx->opcode >> 12) & 0xf;
13148     uint32_t mips32_op;
13149
13150     switch (extension) {
13151     case TEQ:
13152         mips32_op = OPC_TEQ;
13153         goto do_trap;
13154     case TGE:
13155         mips32_op = OPC_TGE;
13156         goto do_trap;
13157     case TGEU:
13158         mips32_op = OPC_TGEU;
13159         goto do_trap;
13160     case TLT:
13161         mips32_op = OPC_TLT;
13162         goto do_trap;
13163     case TLTU:
13164         mips32_op = OPC_TLTU;
13165         goto do_trap;
13166     case TNE:
13167         mips32_op = OPC_TNE;
13168     do_trap:
13169         gen_trap(ctx, mips32_op, rs, rt, -1);
13170         break;
13171 #ifndef CONFIG_USER_ONLY
13172     case MFC0:
13173     case MFC0 + 32:
13174         check_cp0_enabled(ctx);
13175         if (rt == 0) {
13176             /* Treat as NOP. */
13177             break;
13178         }
13179         gen_mfc0(ctx, cpu_gpr[rt], rs, (ctx->opcode >> 11) & 0x7);
13180         break;
13181     case MTC0:
13182     case MTC0 + 32:
13183         check_cp0_enabled(ctx);
13184         {
13185             TCGv t0 = tcg_temp_new();
13186
13187             gen_load_gpr(t0, rt);
13188             gen_mtc0(ctx, t0, rs, (ctx->opcode >> 11) & 0x7);
13189             tcg_temp_free(t0);
13190         }
13191         break;
13192 #endif
13193     case 0x2a:
13194         switch (minor & 3) {
13195         case MADD_ACC:
13196             gen_muldiv(ctx, OPC_MADD, (ctx->opcode >> 14) & 3, rs, rt);
13197             break;
13198         case MADDU_ACC:
13199             gen_muldiv(ctx, OPC_MADDU, (ctx->opcode >> 14) & 3, rs, rt);
13200             break;
13201         case MSUB_ACC:
13202             gen_muldiv(ctx, OPC_MSUB, (ctx->opcode >> 14) & 3, rs, rt);
13203             break;
13204         case MSUBU_ACC:
13205             gen_muldiv(ctx, OPC_MSUBU, (ctx->opcode >> 14) & 3, rs, rt);
13206             break;
13207         default:
13208             goto pool32axf_invalid;
13209         }
13210         break;
13211     case 0x32:
13212         switch (minor & 3) {
13213         case MULT_ACC:
13214             gen_muldiv(ctx, OPC_MULT, (ctx->opcode >> 14) & 3, rs, rt);
13215             break;
13216         case MULTU_ACC:
13217             gen_muldiv(ctx, OPC_MULTU, (ctx->opcode >> 14) & 3, rs, rt);
13218             break;
13219         default:
13220             goto pool32axf_invalid;
13221         }
13222         break;
13223     case 0x2c:
13224         switch (minor) {
13225         case BITSWAP:
13226             check_insn(ctx, ISA_MIPS32R6);
13227             gen_bitswap(ctx, OPC_BITSWAP, rs, rt);
13228             break;
13229         case SEB:
13230             gen_bshfl(ctx, OPC_SEB, rs, rt);
13231             break;
13232         case SEH:
13233             gen_bshfl(ctx, OPC_SEH, rs, rt);
13234             break;
13235         case CLO:
13236             mips32_op = OPC_CLO;
13237             goto do_cl;
13238         case CLZ:
13239             mips32_op = OPC_CLZ;
13240         do_cl:
13241             check_insn(ctx, ISA_MIPS32);
13242             gen_cl(ctx, mips32_op, rt, rs);
13243             break;
13244         case RDHWR:
13245             check_insn_opc_removed(ctx, ISA_MIPS32R6);
13246             gen_rdhwr(ctx, rt, rs, 0);
13247             break;
13248         case WSBH:
13249             gen_bshfl(ctx, OPC_WSBH, rs, rt);
13250             break;
13251         case MULT:
13252             check_insn_opc_removed(ctx, ISA_MIPS32R6);
13253             mips32_op = OPC_MULT;
13254             goto do_mul;
13255         case MULTU:
13256             check_insn_opc_removed(ctx, ISA_MIPS32R6);
13257             mips32_op = OPC_MULTU;
13258             goto do_mul;
13259         case DIV:
13260             check_insn_opc_removed(ctx, ISA_MIPS32R6);
13261             mips32_op = OPC_DIV;
13262             goto do_div;
13263         case DIVU:
13264             check_insn_opc_removed(ctx, ISA_MIPS32R6);
13265             mips32_op = OPC_DIVU;
13266             goto do_div;
13267         do_div:
13268             check_insn(ctx, ISA_MIPS32);
13269             gen_muldiv(ctx, mips32_op, 0, rs, rt);
13270             break;
13271         case MADD:
13272             check_insn_opc_removed(ctx, ISA_MIPS32R6);
13273             mips32_op = OPC_MADD;
13274             goto do_mul;
13275         case MADDU:
13276             check_insn_opc_removed(ctx, ISA_MIPS32R6);
13277             mips32_op = OPC_MADDU;
13278             goto do_mul;
13279         case MSUB:
13280             check_insn_opc_removed(ctx, ISA_MIPS32R6);
13281             mips32_op = OPC_MSUB;
13282             goto do_mul;
13283         case MSUBU:
13284             check_insn_opc_removed(ctx, ISA_MIPS32R6);
13285             mips32_op = OPC_MSUBU;
13286         do_mul:
13287             check_insn(ctx, ISA_MIPS32);
13288             gen_muldiv(ctx, mips32_op, 0, rs, rt);
13289             break;
13290         default:
13291             goto pool32axf_invalid;
13292         }
13293         break;
13294     case 0x34:
13295         switch (minor) {
13296         case MFC2:
13297         case MTC2:
13298         case MFHC2:
13299         case MTHC2:
13300         case CFC2:
13301         case CTC2:
13302             generate_exception_err(ctx, EXCP_CpU, 2);
13303             break;
13304         default:
13305             goto pool32axf_invalid;
13306         }
13307         break;
13308     case 0x3c:
13309         switch (minor) {
13310         case JALR:    /* JALRC */
13311         case JALR_HB: /* JALRC_HB */
13312             if (ctx->insn_flags & ISA_MIPS32R6) {
13313                 /* JALRC, JALRC_HB */
13314                 gen_compute_branch(ctx, OPC_JALR, 4, rs, rt, 0, 0);
13315             } else {
13316                 /* JALR, JALR_HB */
13317                 gen_compute_branch(ctx, OPC_JALR, 4, rs, rt, 0, 4);
13318                 ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
13319             }
13320             break;
13321         case JALRS:
13322         case JALRS_HB:
13323             check_insn_opc_removed(ctx, ISA_MIPS32R6);
13324             gen_compute_branch(ctx, OPC_JALR, 4, rs, rt, 0, 2);
13325             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
13326             break;
13327         default:
13328             goto pool32axf_invalid;
13329         }
13330         break;
13331     case 0x05:
13332         switch (minor) {
13333         case RDPGPR:
13334             check_cp0_enabled(ctx);
13335             check_insn(ctx, ISA_MIPS32R2);
13336             gen_load_srsgpr(rs, rt);
13337             break;
13338         case WRPGPR:
13339             check_cp0_enabled(ctx);
13340             check_insn(ctx, ISA_MIPS32R2);
13341             gen_store_srsgpr(rs, rt);
13342             break;
13343         default:
13344             goto pool32axf_invalid;
13345         }
13346         break;
13347 #ifndef CONFIG_USER_ONLY
13348     case 0x0d:
13349         switch (minor) {
13350         case TLBP:
13351             mips32_op = OPC_TLBP;
13352             goto do_cp0;
13353         case TLBR:
13354             mips32_op = OPC_TLBR;
13355             goto do_cp0;
13356         case TLBWI:
13357             mips32_op = OPC_TLBWI;
13358             goto do_cp0;
13359         case TLBWR:
13360             mips32_op = OPC_TLBWR;
13361             goto do_cp0;
13362         case TLBINV:
13363             mips32_op = OPC_TLBINV;
13364             goto do_cp0;
13365         case TLBINVF:
13366             mips32_op = OPC_TLBINVF;
13367             goto do_cp0;
13368         case WAIT:
13369             mips32_op = OPC_WAIT;
13370             goto do_cp0;
13371         case DERET:
13372             mips32_op = OPC_DERET;
13373             goto do_cp0;
13374         case ERET:
13375             mips32_op = OPC_ERET;
13376         do_cp0:
13377             gen_cp0(env, ctx, mips32_op, rt, rs);
13378             break;
13379         default:
13380             goto pool32axf_invalid;
13381         }
13382         break;
13383     case 0x1d:
13384         switch (minor) {
13385         case DI:
13386             check_cp0_enabled(ctx);
13387             {
13388                 TCGv t0 = tcg_temp_new();
13389
13390                 save_cpu_state(ctx, 1);
13391                 gen_helper_di(t0, cpu_env);
13392                 gen_store_gpr(t0, rs);
13393                 /* Stop translation as we may have switched the execution mode */
13394                 ctx->bstate = BS_STOP;
13395                 tcg_temp_free(t0);
13396             }
13397             break;
13398         case EI:
13399             check_cp0_enabled(ctx);
13400             {
13401                 TCGv t0 = tcg_temp_new();
13402
13403                 save_cpu_state(ctx, 1);
13404                 gen_helper_ei(t0, cpu_env);
13405                 gen_store_gpr(t0, rs);
13406                 /* Stop translation as we may have switched the execution mode */
13407                 ctx->bstate = BS_STOP;
13408                 tcg_temp_free(t0);
13409             }
13410             break;
13411         default:
13412             goto pool32axf_invalid;
13413         }
13414         break;
13415 #endif
13416     case 0x2d:
13417         switch (minor) {
13418         case SYNC:
13419             gen_sync(extract32(ctx->opcode, 16, 5));
13420             break;
13421         case SYSCALL:
13422             generate_exception_end(ctx, EXCP_SYSCALL);
13423             break;
13424         case SDBBP:
13425             if (is_uhi(extract32(ctx->opcode, 16, 10))) {
13426                 gen_helper_do_semihosting(cpu_env);
13427             } else {
13428                 check_insn(ctx, ISA_MIPS32);
13429                 if (ctx->hflags & MIPS_HFLAG_SBRI) {
13430                     generate_exception_end(ctx, EXCP_RI);
13431                 } else {
13432                     generate_exception_end(ctx, EXCP_DBp);
13433                 }
13434             }
13435             break;
13436         default:
13437             goto pool32axf_invalid;
13438         }
13439         break;
13440     case 0x01:
13441         switch (minor & 3) {
13442         case MFHI_ACC:
13443             gen_HILO(ctx, OPC_MFHI, minor >> 2, rs);
13444             break;
13445         case MFLO_ACC:
13446             gen_HILO(ctx, OPC_MFLO, minor >> 2, rs);
13447             break;
13448         case MTHI_ACC:
13449             gen_HILO(ctx, OPC_MTHI, minor >> 2, rs);
13450             break;
13451         case MTLO_ACC:
13452             gen_HILO(ctx, OPC_MTLO, minor >> 2, rs);
13453             break;
13454         default:
13455             goto pool32axf_invalid;
13456         }
13457         break;
13458     case 0x35:
13459         check_insn_opc_removed(ctx, ISA_MIPS32R6);
13460         switch (minor) {
13461         case MFHI32:
13462             gen_HILO(ctx, OPC_MFHI, 0, rs);
13463             break;
13464         case MFLO32:
13465             gen_HILO(ctx, OPC_MFLO, 0, rs);
13466             break;
13467         case MTHI32:
13468             gen_HILO(ctx, OPC_MTHI, 0, rs);
13469             break;
13470         case MTLO32:
13471             gen_HILO(ctx, OPC_MTLO, 0, rs);
13472             break;
13473         default:
13474             goto pool32axf_invalid;
13475         }
13476         break;
13477     default:
13478     pool32axf_invalid:
13479         MIPS_INVAL("pool32axf");
13480         generate_exception_end(ctx, EXCP_RI);
13481         break;
13482     }
13483 }
13484
13485 /* Values for microMIPS fmt field.  Variable-width, depending on which
13486    formats the instruction supports.  */
13487
13488 enum {
13489     FMT_SD_S = 0,
13490     FMT_SD_D = 1,
13491
13492     FMT_SDPS_S = 0,
13493     FMT_SDPS_D = 1,
13494     FMT_SDPS_PS = 2,
13495
13496     FMT_SWL_S = 0,
13497     FMT_SWL_W = 1,
13498     FMT_SWL_L = 2,
13499
13500     FMT_DWL_D = 0,
13501     FMT_DWL_W = 1,
13502     FMT_DWL_L = 2
13503 };
13504
13505 static void gen_pool32fxf(DisasContext *ctx, int rt, int rs)
13506 {
13507     int extension = (ctx->opcode >> 6) & 0x3ff;
13508     uint32_t mips32_op;
13509
13510 #define FLOAT_1BIT_FMT(opc, fmt) (fmt << 8) | opc
13511 #define FLOAT_2BIT_FMT(opc, fmt) (fmt << 7) | opc
13512 #define COND_FLOAT_MOV(opc, cond) (cond << 7) | opc
13513
13514     switch (extension) {
13515     case FLOAT_1BIT_FMT(CFC1, 0):
13516         mips32_op = OPC_CFC1;
13517         goto do_cp1;
13518     case FLOAT_1BIT_FMT(CTC1, 0):
13519         mips32_op = OPC_CTC1;
13520         goto do_cp1;
13521     case FLOAT_1BIT_FMT(MFC1, 0):
13522         mips32_op = OPC_MFC1;
13523         goto do_cp1;
13524     case FLOAT_1BIT_FMT(MTC1, 0):
13525         mips32_op = OPC_MTC1;
13526         goto do_cp1;
13527     case FLOAT_1BIT_FMT(MFHC1, 0):
13528         mips32_op = OPC_MFHC1;
13529         goto do_cp1;
13530     case FLOAT_1BIT_FMT(MTHC1, 0):
13531         mips32_op = OPC_MTHC1;
13532     do_cp1:
13533         gen_cp1(ctx, mips32_op, rt, rs);
13534         break;
13535
13536         /* Reciprocal square root */
13537     case FLOAT_1BIT_FMT(RSQRT_FMT, FMT_SD_S):
13538         mips32_op = OPC_RSQRT_S;
13539         goto do_unaryfp;
13540     case FLOAT_1BIT_FMT(RSQRT_FMT, FMT_SD_D):
13541         mips32_op = OPC_RSQRT_D;
13542         goto do_unaryfp;
13543
13544         /* Square root */
13545     case FLOAT_1BIT_FMT(SQRT_FMT, FMT_SD_S):
13546         mips32_op = OPC_SQRT_S;
13547         goto do_unaryfp;
13548     case FLOAT_1BIT_FMT(SQRT_FMT, FMT_SD_D):
13549         mips32_op = OPC_SQRT_D;
13550         goto do_unaryfp;
13551
13552         /* Reciprocal */
13553     case FLOAT_1BIT_FMT(RECIP_FMT, FMT_SD_S):
13554         mips32_op = OPC_RECIP_S;
13555         goto do_unaryfp;
13556     case FLOAT_1BIT_FMT(RECIP_FMT, FMT_SD_D):
13557         mips32_op = OPC_RECIP_D;
13558         goto do_unaryfp;
13559
13560         /* Floor */
13561     case FLOAT_1BIT_FMT(FLOOR_L, FMT_SD_S):
13562         mips32_op = OPC_FLOOR_L_S;
13563         goto do_unaryfp;
13564     case FLOAT_1BIT_FMT(FLOOR_L, FMT_SD_D):
13565         mips32_op = OPC_FLOOR_L_D;
13566         goto do_unaryfp;
13567     case FLOAT_1BIT_FMT(FLOOR_W, FMT_SD_S):
13568         mips32_op = OPC_FLOOR_W_S;
13569         goto do_unaryfp;
13570     case FLOAT_1BIT_FMT(FLOOR_W, FMT_SD_D):
13571         mips32_op = OPC_FLOOR_W_D;
13572         goto do_unaryfp;
13573
13574         /* Ceiling */
13575     case FLOAT_1BIT_FMT(CEIL_L, FMT_SD_S):
13576         mips32_op = OPC_CEIL_L_S;
13577         goto do_unaryfp;
13578     case FLOAT_1BIT_FMT(CEIL_L, FMT_SD_D):
13579         mips32_op = OPC_CEIL_L_D;
13580         goto do_unaryfp;
13581     case FLOAT_1BIT_FMT(CEIL_W, FMT_SD_S):
13582         mips32_op = OPC_CEIL_W_S;
13583         goto do_unaryfp;
13584     case FLOAT_1BIT_FMT(CEIL_W, FMT_SD_D):
13585         mips32_op = OPC_CEIL_W_D;
13586         goto do_unaryfp;
13587
13588         /* Truncation */
13589     case FLOAT_1BIT_FMT(TRUNC_L, FMT_SD_S):
13590         mips32_op = OPC_TRUNC_L_S;
13591         goto do_unaryfp;
13592     case FLOAT_1BIT_FMT(TRUNC_L, FMT_SD_D):
13593         mips32_op = OPC_TRUNC_L_D;
13594         goto do_unaryfp;
13595     case FLOAT_1BIT_FMT(TRUNC_W, FMT_SD_S):
13596         mips32_op = OPC_TRUNC_W_S;
13597         goto do_unaryfp;
13598     case FLOAT_1BIT_FMT(TRUNC_W, FMT_SD_D):
13599         mips32_op = OPC_TRUNC_W_D;
13600         goto do_unaryfp;
13601
13602         /* Round */
13603     case FLOAT_1BIT_FMT(ROUND_L, FMT_SD_S):
13604         mips32_op = OPC_ROUND_L_S;
13605         goto do_unaryfp;
13606     case FLOAT_1BIT_FMT(ROUND_L, FMT_SD_D):
13607         mips32_op = OPC_ROUND_L_D;
13608         goto do_unaryfp;
13609     case FLOAT_1BIT_FMT(ROUND_W, FMT_SD_S):
13610         mips32_op = OPC_ROUND_W_S;
13611         goto do_unaryfp;
13612     case FLOAT_1BIT_FMT(ROUND_W, FMT_SD_D):
13613         mips32_op = OPC_ROUND_W_D;
13614         goto do_unaryfp;
13615
13616         /* Integer to floating-point conversion */
13617     case FLOAT_1BIT_FMT(CVT_L, FMT_SD_S):
13618         mips32_op = OPC_CVT_L_S;
13619         goto do_unaryfp;
13620     case FLOAT_1BIT_FMT(CVT_L, FMT_SD_D):
13621         mips32_op = OPC_CVT_L_D;
13622         goto do_unaryfp;
13623     case FLOAT_1BIT_FMT(CVT_W, FMT_SD_S):
13624         mips32_op = OPC_CVT_W_S;
13625         goto do_unaryfp;
13626     case FLOAT_1BIT_FMT(CVT_W, FMT_SD_D):
13627         mips32_op = OPC_CVT_W_D;
13628         goto do_unaryfp;
13629
13630         /* Paired-foo conversions */
13631     case FLOAT_1BIT_FMT(CVT_S_PL, 0):
13632         mips32_op = OPC_CVT_S_PL;
13633         goto do_unaryfp;
13634     case FLOAT_1BIT_FMT(CVT_S_PU, 0):
13635         mips32_op = OPC_CVT_S_PU;
13636         goto do_unaryfp;
13637     case FLOAT_1BIT_FMT(CVT_PW_PS, 0):
13638         mips32_op = OPC_CVT_PW_PS;
13639         goto do_unaryfp;
13640     case FLOAT_1BIT_FMT(CVT_PS_PW, 0):
13641         mips32_op = OPC_CVT_PS_PW;
13642         goto do_unaryfp;
13643
13644         /* Floating-point moves */
13645     case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_S):
13646         mips32_op = OPC_MOV_S;
13647         goto do_unaryfp;
13648     case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_D):
13649         mips32_op = OPC_MOV_D;
13650         goto do_unaryfp;
13651     case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_PS):
13652         mips32_op = OPC_MOV_PS;
13653         goto do_unaryfp;
13654
13655         /* Absolute value */
13656     case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_S):
13657         mips32_op = OPC_ABS_S;
13658         goto do_unaryfp;
13659     case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_D):
13660         mips32_op = OPC_ABS_D;
13661         goto do_unaryfp;
13662     case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_PS):
13663         mips32_op = OPC_ABS_PS;
13664         goto do_unaryfp;
13665
13666         /* Negation */
13667     case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_S):
13668         mips32_op = OPC_NEG_S;
13669         goto do_unaryfp;
13670     case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_D):
13671         mips32_op = OPC_NEG_D;
13672         goto do_unaryfp;
13673     case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_PS):
13674         mips32_op = OPC_NEG_PS;
13675         goto do_unaryfp;
13676
13677         /* Reciprocal square root step */
13678     case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_S):
13679         mips32_op = OPC_RSQRT1_S;
13680         goto do_unaryfp;
13681     case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_D):
13682         mips32_op = OPC_RSQRT1_D;
13683         goto do_unaryfp;
13684     case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_PS):
13685         mips32_op = OPC_RSQRT1_PS;
13686         goto do_unaryfp;
13687
13688         /* Reciprocal step */
13689     case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_S):
13690         mips32_op = OPC_RECIP1_S;
13691         goto do_unaryfp;
13692     case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_D):
13693         mips32_op = OPC_RECIP1_S;
13694         goto do_unaryfp;
13695     case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_PS):
13696         mips32_op = OPC_RECIP1_PS;
13697         goto do_unaryfp;
13698
13699         /* Conversions from double */
13700     case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_S):
13701         mips32_op = OPC_CVT_D_S;
13702         goto do_unaryfp;
13703     case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_W):
13704         mips32_op = OPC_CVT_D_W;
13705         goto do_unaryfp;
13706     case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_L):
13707         mips32_op = OPC_CVT_D_L;
13708         goto do_unaryfp;
13709
13710         /* Conversions from single */
13711     case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_D):
13712         mips32_op = OPC_CVT_S_D;
13713         goto do_unaryfp;
13714     case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_W):
13715         mips32_op = OPC_CVT_S_W;
13716         goto do_unaryfp;
13717     case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_L):
13718         mips32_op = OPC_CVT_S_L;
13719     do_unaryfp:
13720         gen_farith(ctx, mips32_op, -1, rs, rt, 0);
13721         break;
13722
13723         /* Conditional moves on floating-point codes */
13724     case COND_FLOAT_MOV(MOVT, 0):
13725     case COND_FLOAT_MOV(MOVT, 1):
13726     case COND_FLOAT_MOV(MOVT, 2):
13727     case COND_FLOAT_MOV(MOVT, 3):
13728     case COND_FLOAT_MOV(MOVT, 4):
13729     case COND_FLOAT_MOV(MOVT, 5):
13730     case COND_FLOAT_MOV(MOVT, 6):
13731     case COND_FLOAT_MOV(MOVT, 7):
13732         check_insn_opc_removed(ctx, ISA_MIPS32R6);
13733         gen_movci(ctx, rt, rs, (ctx->opcode >> 13) & 0x7, 1);
13734         break;
13735     case COND_FLOAT_MOV(MOVF, 0):
13736     case COND_FLOAT_MOV(MOVF, 1):
13737     case COND_FLOAT_MOV(MOVF, 2):
13738     case COND_FLOAT_MOV(MOVF, 3):
13739     case COND_FLOAT_MOV(MOVF, 4):
13740     case COND_FLOAT_MOV(MOVF, 5):
13741     case COND_FLOAT_MOV(MOVF, 6):
13742     case COND_FLOAT_MOV(MOVF, 7):
13743         check_insn_opc_removed(ctx, ISA_MIPS32R6);
13744         gen_movci(ctx, rt, rs, (ctx->opcode >> 13) & 0x7, 0);
13745         break;
13746     default:
13747         MIPS_INVAL("pool32fxf");
13748         generate_exception_end(ctx, EXCP_RI);
13749         break;
13750     }
13751 }
13752
13753 static void decode_micromips32_opc(CPUMIPSState *env, DisasContext *ctx)
13754 {
13755     int32_t offset;
13756     uint16_t insn;
13757     int rt, rs, rd, rr;
13758     int16_t imm;
13759     uint32_t op, minor, mips32_op;
13760     uint32_t cond, fmt, cc;
13761
13762     insn = cpu_lduw_code(env, ctx->pc + 2);
13763     ctx->opcode = (ctx->opcode << 16) | insn;
13764
13765     rt = (ctx->opcode >> 21) & 0x1f;
13766     rs = (ctx->opcode >> 16) & 0x1f;
13767     rd = (ctx->opcode >> 11) & 0x1f;
13768     rr = (ctx->opcode >> 6) & 0x1f;
13769     imm = (int16_t) ctx->opcode;
13770
13771     op = (ctx->opcode >> 26) & 0x3f;
13772     switch (op) {
13773     case POOL32A:
13774         minor = ctx->opcode & 0x3f;
13775         switch (minor) {
13776         case 0x00:
13777             minor = (ctx->opcode >> 6) & 0xf;
13778             switch (minor) {
13779             case SLL32:
13780                 mips32_op = OPC_SLL;
13781                 goto do_shifti;
13782             case SRA:
13783                 mips32_op = OPC_SRA;
13784                 goto do_shifti;
13785             case SRL32:
13786                 mips32_op = OPC_SRL;
13787                 goto do_shifti;
13788             case ROTR:
13789                 mips32_op = OPC_ROTR;
13790             do_shifti:
13791                 gen_shift_imm(ctx, mips32_op, rt, rs, rd);
13792                 break;
13793             case SELEQZ:
13794                 check_insn(ctx, ISA_MIPS32R6);
13795                 gen_cond_move(ctx, OPC_SELEQZ, rd, rs, rt);
13796                 break;
13797             case SELNEZ:
13798                 check_insn(ctx, ISA_MIPS32R6);
13799                 gen_cond_move(ctx, OPC_SELNEZ, rd, rs, rt);
13800                 break;
13801             case R6_RDHWR:
13802                 check_insn(ctx, ISA_MIPS32R6);
13803                 gen_rdhwr(ctx, rt, rs, extract32(ctx->opcode, 11, 3));
13804                 break;
13805             default:
13806                 goto pool32a_invalid;
13807             }
13808             break;
13809         case 0x10:
13810             minor = (ctx->opcode >> 6) & 0xf;
13811             switch (minor) {
13812                 /* Arithmetic */
13813             case ADD:
13814                 mips32_op = OPC_ADD;
13815                 goto do_arith;
13816             case ADDU32:
13817                 mips32_op = OPC_ADDU;
13818                 goto do_arith;
13819             case SUB:
13820                 mips32_op = OPC_SUB;
13821                 goto do_arith;
13822             case SUBU32:
13823                 mips32_op = OPC_SUBU;
13824                 goto do_arith;
13825             case MUL:
13826                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
13827                 mips32_op = OPC_MUL;
13828             do_arith:
13829                 gen_arith(ctx, mips32_op, rd, rs, rt);
13830                 break;
13831                 /* Shifts */
13832             case SLLV:
13833                 mips32_op = OPC_SLLV;
13834                 goto do_shift;
13835             case SRLV:
13836                 mips32_op = OPC_SRLV;
13837                 goto do_shift;
13838             case SRAV:
13839                 mips32_op = OPC_SRAV;
13840                 goto do_shift;
13841             case ROTRV:
13842                 mips32_op = OPC_ROTRV;
13843             do_shift:
13844                 gen_shift(ctx, mips32_op, rd, rs, rt);
13845                 break;
13846                 /* Logical operations */
13847             case AND:
13848                 mips32_op = OPC_AND;
13849                 goto do_logic;
13850             case OR32:
13851                 mips32_op = OPC_OR;
13852                 goto do_logic;
13853             case NOR:
13854                 mips32_op = OPC_NOR;
13855                 goto do_logic;
13856             case XOR32:
13857                 mips32_op = OPC_XOR;
13858             do_logic:
13859                 gen_logic(ctx, mips32_op, rd, rs, rt);
13860                 break;
13861                 /* Set less than */
13862             case SLT:
13863                 mips32_op = OPC_SLT;
13864                 goto do_slt;
13865             case SLTU:
13866                 mips32_op = OPC_SLTU;
13867             do_slt:
13868                 gen_slt(ctx, mips32_op, rd, rs, rt);
13869                 break;
13870             default:
13871                 goto pool32a_invalid;
13872             }
13873             break;
13874         case 0x18:
13875             minor = (ctx->opcode >> 6) & 0xf;
13876             switch (minor) {
13877                 /* Conditional moves */
13878             case MOVN: /* MUL */
13879                 if (ctx->insn_flags & ISA_MIPS32R6) {
13880                     /* MUL */
13881                     gen_r6_muldiv(ctx, R6_OPC_MUL, rd, rs, rt);
13882                 } else {
13883                     /* MOVN */
13884                     gen_cond_move(ctx, OPC_MOVN, rd, rs, rt);
13885                 }
13886                 break;
13887             case MOVZ: /* MUH */
13888                 if (ctx->insn_flags & ISA_MIPS32R6) {
13889                     /* MUH */
13890                     gen_r6_muldiv(ctx, R6_OPC_MUH, rd, rs, rt);
13891                 } else {
13892                     /* MOVZ */
13893                     gen_cond_move(ctx, OPC_MOVZ, rd, rs, rt);
13894                 }
13895                 break;
13896             case MULU:
13897                 check_insn(ctx, ISA_MIPS32R6);
13898                 gen_r6_muldiv(ctx, R6_OPC_MULU, rd, rs, rt);
13899                 break;
13900             case MUHU:
13901                 check_insn(ctx, ISA_MIPS32R6);
13902                 gen_r6_muldiv(ctx, R6_OPC_MUHU, rd, rs, rt);
13903                 break;
13904             case LWXS: /* DIV */
13905                 if (ctx->insn_flags & ISA_MIPS32R6) {
13906                     /* DIV */
13907                     gen_r6_muldiv(ctx, R6_OPC_DIV, rd, rs, rt);
13908                 } else {
13909                     /* LWXS */
13910                     gen_ldxs(ctx, rs, rt, rd);
13911                 }
13912                 break;
13913             case MOD:
13914                 check_insn(ctx, ISA_MIPS32R6);
13915                 gen_r6_muldiv(ctx, R6_OPC_MOD, rd, rs, rt);
13916                 break;
13917             case R6_DIVU:
13918                 check_insn(ctx, ISA_MIPS32R6);
13919                 gen_r6_muldiv(ctx, R6_OPC_DIVU, rd, rs, rt);
13920                 break;
13921             case MODU:
13922                 check_insn(ctx, ISA_MIPS32R6);
13923                 gen_r6_muldiv(ctx, R6_OPC_MODU, rd, rs, rt);
13924                 break;
13925             default:
13926                 goto pool32a_invalid;
13927             }
13928             break;
13929         case INS:
13930             gen_bitops(ctx, OPC_INS, rt, rs, rr, rd);
13931             return;
13932         case LSA:
13933             check_insn(ctx, ISA_MIPS32R6);
13934             gen_lsa(ctx, OPC_LSA, rd, rs, rt,
13935                     extract32(ctx->opcode, 9, 2));
13936             break;
13937         case ALIGN:
13938             check_insn(ctx, ISA_MIPS32R6);
13939             gen_align(ctx, OPC_ALIGN, rd, rs, rt,
13940                       extract32(ctx->opcode, 9, 2));
13941             break;
13942         case EXT:
13943             gen_bitops(ctx, OPC_EXT, rt, rs, rr, rd);
13944             return;
13945         case POOL32AXF:
13946             gen_pool32axf(env, ctx, rt, rs);
13947             break;
13948         case BREAK32:
13949             generate_exception_end(ctx, EXCP_BREAK);
13950             break;
13951         case SIGRIE:
13952             check_insn(ctx, ISA_MIPS32R6);
13953             generate_exception_end(ctx, EXCP_RI);
13954             break;
13955         default:
13956         pool32a_invalid:
13957                 MIPS_INVAL("pool32a");
13958                 generate_exception_end(ctx, EXCP_RI);
13959                 break;
13960         }
13961         break;
13962     case POOL32B:
13963         minor = (ctx->opcode >> 12) & 0xf;
13964         switch (minor) {
13965         case CACHE:
13966             check_cp0_enabled(ctx);
13967             if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
13968                 gen_cache_operation(ctx, rt, rs, imm);
13969             }
13970             break;
13971         case LWC2:
13972         case SWC2:
13973             /* COP2: Not implemented. */
13974             generate_exception_err(ctx, EXCP_CpU, 2);
13975             break;
13976 #ifdef TARGET_MIPS64
13977         case LDP:
13978         case SDP:
13979             check_insn(ctx, ISA_MIPS3);
13980             check_mips_64(ctx);
13981             /* Fallthrough */
13982 #endif
13983         case LWP:
13984         case SWP:
13985             gen_ldst_pair(ctx, minor, rt, rs, SIMM(ctx->opcode, 0, 12));
13986             break;
13987 #ifdef TARGET_MIPS64
13988         case LDM:
13989         case SDM:
13990             check_insn(ctx, ISA_MIPS3);
13991             check_mips_64(ctx);
13992             /* Fallthrough */
13993 #endif
13994         case LWM32:
13995         case SWM32:
13996             gen_ldst_multiple(ctx, minor, rt, rs, SIMM(ctx->opcode, 0, 12));
13997             break;
13998         default:
13999             MIPS_INVAL("pool32b");
14000             generate_exception_end(ctx, EXCP_RI);
14001             break;
14002         }
14003         break;
14004     case POOL32F:
14005         if (ctx->CP0_Config1 & (1 << CP0C1_FP)) {
14006             minor = ctx->opcode & 0x3f;
14007             check_cp1_enabled(ctx);
14008             switch (minor) {
14009             case ALNV_PS:
14010                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14011                 mips32_op = OPC_ALNV_PS;
14012                 goto do_madd;
14013             case MADD_S:
14014                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14015                 mips32_op = OPC_MADD_S;
14016                 goto do_madd;
14017             case MADD_D:
14018                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14019                 mips32_op = OPC_MADD_D;
14020                 goto do_madd;
14021             case MADD_PS:
14022                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14023                 mips32_op = OPC_MADD_PS;
14024                 goto do_madd;
14025             case MSUB_S:
14026                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14027                 mips32_op = OPC_MSUB_S;
14028                 goto do_madd;
14029             case MSUB_D:
14030                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14031                 mips32_op = OPC_MSUB_D;
14032                 goto do_madd;
14033             case MSUB_PS:
14034                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14035                 mips32_op = OPC_MSUB_PS;
14036                 goto do_madd;
14037             case NMADD_S:
14038                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14039                 mips32_op = OPC_NMADD_S;
14040                 goto do_madd;
14041             case NMADD_D:
14042                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14043                 mips32_op = OPC_NMADD_D;
14044                 goto do_madd;
14045             case NMADD_PS:
14046                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14047                 mips32_op = OPC_NMADD_PS;
14048                 goto do_madd;
14049             case NMSUB_S:
14050                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14051                 mips32_op = OPC_NMSUB_S;
14052                 goto do_madd;
14053             case NMSUB_D:
14054                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14055                 mips32_op = OPC_NMSUB_D;
14056                 goto do_madd;
14057             case NMSUB_PS:
14058                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14059                 mips32_op = OPC_NMSUB_PS;
14060             do_madd:
14061                 gen_flt3_arith(ctx, mips32_op, rd, rr, rs, rt);
14062                 break;
14063             case CABS_COND_FMT:
14064                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14065                 cond = (ctx->opcode >> 6) & 0xf;
14066                 cc = (ctx->opcode >> 13) & 0x7;
14067                 fmt = (ctx->opcode >> 10) & 0x3;
14068                 switch (fmt) {
14069                 case 0x0:
14070                     gen_cmpabs_s(ctx, cond, rt, rs, cc);
14071                     break;
14072                 case 0x1:
14073                     gen_cmpabs_d(ctx, cond, rt, rs, cc);
14074                     break;
14075                 case 0x2:
14076                     gen_cmpabs_ps(ctx, cond, rt, rs, cc);
14077                     break;
14078                 default:
14079                     goto pool32f_invalid;
14080                 }
14081                 break;
14082             case C_COND_FMT:
14083                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14084                 cond = (ctx->opcode >> 6) & 0xf;
14085                 cc = (ctx->opcode >> 13) & 0x7;
14086                 fmt = (ctx->opcode >> 10) & 0x3;
14087                 switch (fmt) {
14088                 case 0x0:
14089                     gen_cmp_s(ctx, cond, rt, rs, cc);
14090                     break;
14091                 case 0x1:
14092                     gen_cmp_d(ctx, cond, rt, rs, cc);
14093                     break;
14094                 case 0x2:
14095                     gen_cmp_ps(ctx, cond, rt, rs, cc);
14096                     break;
14097                 default:
14098                     goto pool32f_invalid;
14099                 }
14100                 break;
14101             case CMP_CONDN_S:
14102                 check_insn(ctx, ISA_MIPS32R6);
14103                 gen_r6_cmp_s(ctx, (ctx->opcode >> 6) & 0x1f, rt, rs, rd);
14104                 break;
14105             case CMP_CONDN_D:
14106                 check_insn(ctx, ISA_MIPS32R6);
14107                 gen_r6_cmp_d(ctx, (ctx->opcode >> 6) & 0x1f, rt, rs, rd);
14108                 break;
14109             case POOL32FXF:
14110                 gen_pool32fxf(ctx, rt, rs);
14111                 break;
14112             case 0x00:
14113                 /* PLL foo */
14114                 switch ((ctx->opcode >> 6) & 0x7) {
14115                 case PLL_PS:
14116                     mips32_op = OPC_PLL_PS;
14117                     goto do_ps;
14118                 case PLU_PS:
14119                     mips32_op = OPC_PLU_PS;
14120                     goto do_ps;
14121                 case PUL_PS:
14122                     mips32_op = OPC_PUL_PS;
14123                     goto do_ps;
14124                 case PUU_PS:
14125                     mips32_op = OPC_PUU_PS;
14126                     goto do_ps;
14127                 case CVT_PS_S:
14128                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
14129                     mips32_op = OPC_CVT_PS_S;
14130                 do_ps:
14131                     gen_farith(ctx, mips32_op, rt, rs, rd, 0);
14132                     break;
14133                 default:
14134                     goto pool32f_invalid;
14135                 }
14136                 break;
14137             case MIN_FMT:
14138                 check_insn(ctx, ISA_MIPS32R6);
14139                 switch ((ctx->opcode >> 9) & 0x3) {
14140                 case FMT_SDPS_S:
14141                     gen_farith(ctx, OPC_MIN_S, rt, rs, rd, 0);
14142                     break;
14143                 case FMT_SDPS_D:
14144                     gen_farith(ctx, OPC_MIN_D, rt, rs, rd, 0);
14145                     break;
14146                 default:
14147                     goto pool32f_invalid;
14148                 }
14149                 break;
14150             case 0x08:
14151                 /* [LS][WDU]XC1 */
14152                 switch ((ctx->opcode >> 6) & 0x7) {
14153                 case LWXC1:
14154                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
14155                     mips32_op = OPC_LWXC1;
14156                     goto do_ldst_cp1;
14157                 case SWXC1:
14158                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
14159                     mips32_op = OPC_SWXC1;
14160                     goto do_ldst_cp1;
14161                 case LDXC1:
14162                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
14163                     mips32_op = OPC_LDXC1;
14164                     goto do_ldst_cp1;
14165                 case SDXC1:
14166                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
14167                     mips32_op = OPC_SDXC1;
14168                     goto do_ldst_cp1;
14169                 case LUXC1:
14170                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
14171                     mips32_op = OPC_LUXC1;
14172                     goto do_ldst_cp1;
14173                 case SUXC1:
14174                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
14175                     mips32_op = OPC_SUXC1;
14176                 do_ldst_cp1:
14177                     gen_flt3_ldst(ctx, mips32_op, rd, rd, rt, rs);
14178                     break;
14179                 default:
14180                     goto pool32f_invalid;
14181                 }
14182                 break;
14183             case MAX_FMT:
14184                 check_insn(ctx, ISA_MIPS32R6);
14185                 switch ((ctx->opcode >> 9) & 0x3) {
14186                 case FMT_SDPS_S:
14187                     gen_farith(ctx, OPC_MAX_S, rt, rs, rd, 0);
14188                     break;
14189                 case FMT_SDPS_D:
14190                     gen_farith(ctx, OPC_MAX_D, rt, rs, rd, 0);
14191                     break;
14192                 default:
14193                     goto pool32f_invalid;
14194                 }
14195                 break;
14196             case 0x18:
14197                 /* 3D insns */
14198                 check_insn_opc_removed(ctx, ISA_MIPS32R6);
14199                 fmt = (ctx->opcode >> 9) & 0x3;
14200                 switch ((ctx->opcode >> 6) & 0x7) {
14201                 case RSQRT2_FMT:
14202                     switch (fmt) {
14203                     case FMT_SDPS_S:
14204                         mips32_op = OPC_RSQRT2_S;
14205                         goto do_3d;
14206                     case FMT_SDPS_D:
14207                         mips32_op = OPC_RSQRT2_D;
14208                         goto do_3d;
14209                     case FMT_SDPS_PS:
14210                         mips32_op = OPC_RSQRT2_PS;
14211                         goto do_3d;
14212                     default:
14213                         goto pool32f_invalid;
14214                     }
14215                     break;
14216                 case RECIP2_FMT:
14217                     switch (fmt) {
14218                     case FMT_SDPS_S:
14219                         mips32_op = OPC_RECIP2_S;
14220                         goto do_3d;
14221                     case FMT_SDPS_D:
14222                         mips32_op = OPC_RECIP2_D;
14223                         goto do_3d;
14224                     case FMT_SDPS_PS:
14225                         mips32_op = OPC_RECIP2_PS;
14226                         goto do_3d;
14227                     default:
14228                         goto pool32f_invalid;
14229                     }
14230                     break;
14231                 case ADDR_PS:
14232                     mips32_op = OPC_ADDR_PS;
14233                     goto do_3d;
14234                 case MULR_PS:
14235                     mips32_op = OPC_MULR_PS;
14236                 do_3d:
14237                     gen_farith(ctx, mips32_op, rt, rs, rd, 0);
14238                     break;
14239                 default:
14240                     goto pool32f_invalid;
14241                 }
14242                 break;
14243             case 0x20:
14244                 /* MOV[FT].fmt, PREFX, RINT.fmt, CLASS.fmt*/
14245                 cc = (ctx->opcode >> 13) & 0x7;
14246                 fmt = (ctx->opcode >> 9) & 0x3;
14247                 switch ((ctx->opcode >> 6) & 0x7) {
14248                 case MOVF_FMT: /* RINT_FMT */
14249                     if (ctx->insn_flags & ISA_MIPS32R6) {
14250                         /* RINT_FMT */
14251                         switch (fmt) {
14252                         case FMT_SDPS_S:
14253                             gen_farith(ctx, OPC_RINT_S, 0, rt, rs, 0);
14254                             break;
14255                         case FMT_SDPS_D:
14256                             gen_farith(ctx, OPC_RINT_D, 0, rt, rs, 0);
14257                             break;
14258                         default:
14259                             goto pool32f_invalid;
14260                         }
14261                     } else {
14262                         /* MOVF_FMT */
14263                         switch (fmt) {
14264                         case FMT_SDPS_S:
14265                             gen_movcf_s(ctx, rs, rt, cc, 0);
14266                             break;
14267                         case FMT_SDPS_D:
14268                             gen_movcf_d(ctx, rs, rt, cc, 0);
14269                             break;
14270                         case FMT_SDPS_PS:
14271                             check_ps(ctx);
14272                             gen_movcf_ps(ctx, rs, rt, cc, 0);
14273                             break;
14274                         default:
14275                             goto pool32f_invalid;
14276                         }
14277                     }
14278                     break;
14279                 case MOVT_FMT: /* CLASS_FMT */
14280                     if (ctx->insn_flags & ISA_MIPS32R6) {
14281                         /* CLASS_FMT */
14282                         switch (fmt) {
14283                         case FMT_SDPS_S:
14284                             gen_farith(ctx, OPC_CLASS_S, 0, rt, rs, 0);
14285                             break;
14286                         case FMT_SDPS_D:
14287                             gen_farith(ctx, OPC_CLASS_D, 0, rt, rs, 0);
14288                             break;
14289                         default:
14290                             goto pool32f_invalid;
14291                         }
14292                     } else {
14293                         /* MOVT_FMT */
14294                         switch (fmt) {
14295                         case FMT_SDPS_S:
14296                             gen_movcf_s(ctx, rs, rt, cc, 1);
14297                             break;
14298                         case FMT_SDPS_D:
14299                             gen_movcf_d(ctx, rs, rt, cc, 1);
14300                             break;
14301                         case FMT_SDPS_PS:
14302                             check_ps(ctx);
14303                             gen_movcf_ps(ctx, rs, rt, cc, 1);
14304                             break;
14305                         default:
14306                             goto pool32f_invalid;
14307                         }
14308                     }
14309                     break;
14310                 case PREFX:
14311                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
14312                     break;
14313                 default:
14314                     goto pool32f_invalid;
14315                 }
14316                 break;
14317 #define FINSN_3ARG_SDPS(prfx)                           \
14318                 switch ((ctx->opcode >> 8) & 0x3) {     \
14319                 case FMT_SDPS_S:                        \
14320                     mips32_op = OPC_##prfx##_S;         \
14321                     goto do_fpop;                       \
14322                 case FMT_SDPS_D:                        \
14323                     mips32_op = OPC_##prfx##_D;         \
14324                     goto do_fpop;                       \
14325                 case FMT_SDPS_PS:                       \
14326                     check_ps(ctx);                      \
14327                     mips32_op = OPC_##prfx##_PS;        \
14328                     goto do_fpop;                       \
14329                 default:                                \
14330                     goto pool32f_invalid;               \
14331                 }
14332             case MINA_FMT:
14333                 check_insn(ctx, ISA_MIPS32R6);
14334                 switch ((ctx->opcode >> 9) & 0x3) {
14335                 case FMT_SDPS_S:
14336                     gen_farith(ctx, OPC_MINA_S, rt, rs, rd, 0);
14337                     break;
14338                 case FMT_SDPS_D:
14339                     gen_farith(ctx, OPC_MINA_D, rt, rs, rd, 0);
14340                     break;
14341                 default:
14342                     goto pool32f_invalid;
14343                 }
14344                 break;
14345             case MAXA_FMT:
14346                 check_insn(ctx, ISA_MIPS32R6);
14347                 switch ((ctx->opcode >> 9) & 0x3) {
14348                 case FMT_SDPS_S:
14349                     gen_farith(ctx, OPC_MAXA_S, rt, rs, rd, 0);
14350                     break;
14351                 case FMT_SDPS_D:
14352                     gen_farith(ctx, OPC_MAXA_D, rt, rs, rd, 0);
14353                     break;
14354                 default:
14355                     goto pool32f_invalid;
14356                 }
14357                 break;
14358             case 0x30:
14359                 /* regular FP ops */
14360                 switch ((ctx->opcode >> 6) & 0x3) {
14361                 case ADD_FMT:
14362                     FINSN_3ARG_SDPS(ADD);
14363                     break;
14364                 case SUB_FMT:
14365                     FINSN_3ARG_SDPS(SUB);
14366                     break;
14367                 case MUL_FMT:
14368                     FINSN_3ARG_SDPS(MUL);
14369                     break;
14370                 case DIV_FMT:
14371                     fmt = (ctx->opcode >> 8) & 0x3;
14372                     if (fmt == 1) {
14373                         mips32_op = OPC_DIV_D;
14374                     } else if (fmt == 0) {
14375                         mips32_op = OPC_DIV_S;
14376                     } else {
14377                         goto pool32f_invalid;
14378                     }
14379                     goto do_fpop;
14380                 default:
14381                     goto pool32f_invalid;
14382                 }
14383                 break;
14384             case 0x38:
14385                 /* cmovs */
14386                 switch ((ctx->opcode >> 6) & 0x7) {
14387                 case MOVN_FMT: /* SELNEZ_FMT */
14388                     if (ctx->insn_flags & ISA_MIPS32R6) {
14389                         /* SELNEZ_FMT */
14390                         switch ((ctx->opcode >> 9) & 0x3) {
14391                         case FMT_SDPS_S:
14392                             gen_sel_s(ctx, OPC_SELNEZ_S, rd, rt, rs);
14393                             break;
14394                         case FMT_SDPS_D:
14395                             gen_sel_d(ctx, OPC_SELNEZ_D, rd, rt, rs);
14396                             break;
14397                         default:
14398                             goto pool32f_invalid;
14399                         }
14400                     } else {
14401                         /* MOVN_FMT */
14402                         FINSN_3ARG_SDPS(MOVN);
14403                     }
14404                     break;
14405                 case MOVN_FMT_04:
14406                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
14407                     FINSN_3ARG_SDPS(MOVN);
14408                     break;
14409                 case MOVZ_FMT: /* SELEQZ_FMT */
14410                     if (ctx->insn_flags & ISA_MIPS32R6) {
14411                         /* SELEQZ_FMT */
14412                         switch ((ctx->opcode >> 9) & 0x3) {
14413                         case FMT_SDPS_S:
14414                             gen_sel_s(ctx, OPC_SELEQZ_S, rd, rt, rs);
14415                             break;
14416                         case FMT_SDPS_D:
14417                             gen_sel_d(ctx, OPC_SELEQZ_D, rd, rt, rs);
14418                             break;
14419                         default:
14420                             goto pool32f_invalid;
14421                         }
14422                     } else {
14423                         /* MOVZ_FMT */
14424                         FINSN_3ARG_SDPS(MOVZ);
14425                     }
14426                     break;
14427                 case MOVZ_FMT_05:
14428                     check_insn_opc_removed(ctx, ISA_MIPS32R6);
14429                     FINSN_3ARG_SDPS(MOVZ);
14430                     break;
14431                 case SEL_FMT:
14432                     check_insn(ctx, ISA_MIPS32R6);
14433                     switch ((ctx->opcode >> 9) & 0x3) {
14434                     case FMT_SDPS_S:
14435                         gen_sel_s(ctx, OPC_SEL_S, rd, rt, rs);
14436                         break;
14437                     case FMT_SDPS_D:
14438                         gen_sel_d(ctx, OPC_SEL_D, rd, rt, rs);
14439                         break;
14440                     default:
14441                         goto pool32f_invalid;
14442                     }
14443                     break;
14444                 case MADDF_FMT:
14445                     check_insn(ctx, ISA_MIPS32R6);
14446                     switch ((ctx->opcode >> 9) & 0x3) {
14447                     case FMT_SDPS_S:
14448                         mips32_op = OPC_MADDF_S;
14449                         goto do_fpop;
14450                     case FMT_SDPS_D:
14451                         mips32_op = OPC_MADDF_D;
14452                         goto do_fpop;
14453                     default:
14454                         goto pool32f_invalid;
14455                     }
14456                     break;
14457                 case MSUBF_FMT:
14458                     check_insn(ctx, ISA_MIPS32R6);
14459                     switch ((ctx->opcode >> 9) & 0x3) {
14460                     case FMT_SDPS_S:
14461                         mips32_op = OPC_MSUBF_S;
14462                         goto do_fpop;
14463                     case FMT_SDPS_D:
14464                         mips32_op = OPC_MSUBF_D;
14465                         goto do_fpop;
14466                     default:
14467                         goto pool32f_invalid;
14468                     }
14469                     break;
14470                 default:
14471                     goto pool32f_invalid;
14472                 }
14473                 break;
14474             do_fpop:
14475                 gen_farith(ctx, mips32_op, rt, rs, rd, 0);
14476                 break;
14477             default:
14478             pool32f_invalid:
14479                 MIPS_INVAL("pool32f");
14480                 generate_exception_end(ctx, EXCP_RI);
14481                 break;
14482             }
14483         } else {
14484             generate_exception_err(ctx, EXCP_CpU, 1);
14485         }
14486         break;
14487     case POOL32I:
14488         minor = (ctx->opcode >> 21) & 0x1f;
14489         switch (minor) {
14490         case BLTZ:
14491             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14492             gen_compute_branch(ctx, OPC_BLTZ, 4, rs, -1, imm << 1, 4);
14493             break;
14494         case BLTZAL:
14495             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14496             gen_compute_branch(ctx, OPC_BLTZAL, 4, rs, -1, imm << 1, 4);
14497             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
14498             break;
14499         case BLTZALS:
14500             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14501             gen_compute_branch(ctx, OPC_BLTZAL, 4, rs, -1, imm << 1, 2);
14502             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
14503             break;
14504         case BGEZ:
14505             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14506             gen_compute_branch(ctx, OPC_BGEZ, 4, rs, -1, imm << 1, 4);
14507             break;
14508         case BGEZAL:
14509             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14510             gen_compute_branch(ctx, OPC_BGEZAL, 4, rs, -1, imm << 1, 4);
14511             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
14512             break;
14513         case BGEZALS:
14514             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14515             gen_compute_branch(ctx, OPC_BGEZAL, 4, rs, -1, imm << 1, 2);
14516             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
14517             break;
14518         case BLEZ:
14519             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14520             gen_compute_branch(ctx, OPC_BLEZ, 4, rs, -1, imm << 1, 4);
14521             break;
14522         case BGTZ:
14523             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14524             gen_compute_branch(ctx, OPC_BGTZ, 4, rs, -1, imm << 1, 4);
14525             break;
14526
14527             /* Traps */
14528         case TLTI: /* BC1EQZC */
14529             if (ctx->insn_flags & ISA_MIPS32R6) {
14530                 /* BC1EQZC */
14531                 check_cp1_enabled(ctx);
14532                 gen_compute_branch1_r6(ctx, OPC_BC1EQZ, rs, imm << 1, 0);
14533             } else {
14534                 /* TLTI */
14535                 mips32_op = OPC_TLTI;
14536                 goto do_trapi;
14537             }
14538             break;
14539         case TGEI: /* BC1NEZC */
14540             if (ctx->insn_flags & ISA_MIPS32R6) {
14541                 /* BC1NEZC */
14542                 check_cp1_enabled(ctx);
14543                 gen_compute_branch1_r6(ctx, OPC_BC1NEZ, rs, imm << 1, 0);
14544             } else {
14545                 /* TGEI */
14546                 mips32_op = OPC_TGEI;
14547                 goto do_trapi;
14548             }
14549             break;
14550         case TLTIU:
14551             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14552             mips32_op = OPC_TLTIU;
14553             goto do_trapi;
14554         case TGEIU:
14555             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14556             mips32_op = OPC_TGEIU;
14557             goto do_trapi;
14558         case TNEI: /* SYNCI */
14559             if (ctx->insn_flags & ISA_MIPS32R6) {
14560                 /* SYNCI */
14561                 /* Break the TB to be able to sync copied instructions
14562                    immediately */
14563                 ctx->bstate = BS_STOP;
14564             } else {
14565                 /* TNEI */
14566                 mips32_op = OPC_TNEI;
14567                 goto do_trapi;
14568             }
14569             break;
14570         case TEQI:
14571             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14572             mips32_op = OPC_TEQI;
14573         do_trapi:
14574             gen_trap(ctx, mips32_op, rs, -1, imm);
14575             break;
14576
14577         case BNEZC:
14578         case BEQZC:
14579             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14580             gen_compute_branch(ctx, minor == BNEZC ? OPC_BNE : OPC_BEQ,
14581                                4, rs, 0, imm << 1, 0);
14582             /* Compact branches don't have a delay slot, so just let
14583                the normal delay slot handling take us to the branch
14584                target. */
14585             break;
14586         case LUI:
14587             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14588             gen_logic_imm(ctx, OPC_LUI, rs, 0, imm);
14589             break;
14590         case SYNCI:
14591             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14592             /* Break the TB to be able to sync copied instructions
14593                immediately */
14594             ctx->bstate = BS_STOP;
14595             break;
14596         case BC2F:
14597         case BC2T:
14598             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14599             /* COP2: Not implemented. */
14600             generate_exception_err(ctx, EXCP_CpU, 2);
14601             break;
14602         case BC1F:
14603             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14604             mips32_op = (ctx->opcode & (1 << 16)) ? OPC_BC1FANY2 : OPC_BC1F;
14605             goto do_cp1branch;
14606         case BC1T:
14607             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14608             mips32_op = (ctx->opcode & (1 << 16)) ? OPC_BC1TANY2 : OPC_BC1T;
14609             goto do_cp1branch;
14610         case BC1ANY4F:
14611             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14612             mips32_op = OPC_BC1FANY4;
14613             goto do_cp1mips3d;
14614         case BC1ANY4T:
14615             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14616             mips32_op = OPC_BC1TANY4;
14617         do_cp1mips3d:
14618             check_cop1x(ctx);
14619             check_insn(ctx, ASE_MIPS3D);
14620             /* Fall through */
14621         do_cp1branch:
14622             if (env->CP0_Config1 & (1 << CP0C1_FP)) {
14623                 check_cp1_enabled(ctx);
14624                 gen_compute_branch1(ctx, mips32_op,
14625                                     (ctx->opcode >> 18) & 0x7, imm << 1);
14626             } else {
14627                 generate_exception_err(ctx, EXCP_CpU, 1);
14628             }
14629             break;
14630         case BPOSGE64:
14631         case BPOSGE32:
14632             /* MIPS DSP: not implemented */
14633             /* Fall through */
14634         default:
14635             MIPS_INVAL("pool32i");
14636             generate_exception_end(ctx, EXCP_RI);
14637             break;
14638         }
14639         break;
14640     case POOL32C:
14641         minor = (ctx->opcode >> 12) & 0xf;
14642         offset = sextract32(ctx->opcode, 0,
14643                             (ctx->insn_flags & ISA_MIPS32R6) ? 9 : 12);
14644         switch (minor) {
14645         case LWL:
14646             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14647             mips32_op = OPC_LWL;
14648             goto do_ld_lr;
14649         case SWL:
14650             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14651             mips32_op = OPC_SWL;
14652             goto do_st_lr;
14653         case LWR:
14654             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14655             mips32_op = OPC_LWR;
14656             goto do_ld_lr;
14657         case SWR:
14658             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14659             mips32_op = OPC_SWR;
14660             goto do_st_lr;
14661 #if defined(TARGET_MIPS64)
14662         case LDL:
14663             check_insn(ctx, ISA_MIPS3);
14664             check_mips_64(ctx);
14665             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14666             mips32_op = OPC_LDL;
14667             goto do_ld_lr;
14668         case SDL:
14669             check_insn(ctx, ISA_MIPS3);
14670             check_mips_64(ctx);
14671             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14672             mips32_op = OPC_SDL;
14673             goto do_st_lr;
14674         case LDR:
14675             check_insn(ctx, ISA_MIPS3);
14676             check_mips_64(ctx);
14677             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14678             mips32_op = OPC_LDR;
14679             goto do_ld_lr;
14680         case SDR:
14681             check_insn(ctx, ISA_MIPS3);
14682             check_mips_64(ctx);
14683             check_insn_opc_removed(ctx, ISA_MIPS32R6);
14684             mips32_op = OPC_SDR;
14685             goto do_st_lr;
14686         case LWU:
14687             check_insn(ctx, ISA_MIPS3);
14688             check_mips_64(ctx);
14689             mips32_op = OPC_LWU;
14690             goto do_ld_lr;
14691         case LLD:
14692             check_insn(ctx, ISA_MIPS3);
14693             check_mips_64(ctx);
14694             mips32_op = OPC_LLD;
14695             goto do_ld_lr;
14696 #endif
14697         case LL:
14698             mips32_op = OPC_LL;
14699             goto do_ld_lr;
14700         do_ld_lr:
14701             gen_ld(ctx, mips32_op, rt, rs, offset);
14702             break;
14703         do_st_lr:
14704             gen_st(ctx, mips32_op, rt, rs, SIMM(ctx->opcode, 0, 12));
14705             break;
14706         case SC:
14707             gen_st_cond(ctx, OPC_SC, rt, rs, offset);
14708             break;
14709 #if defined(TARGET_MIPS64)
14710         case SCD:
14711             check_insn(ctx, ISA_MIPS3);
14712             check_mips_64(ctx);
14713             gen_st_cond(ctx, OPC_SCD, rt, rs, offset);
14714             break;
14715 #endif
14716         case PREF:
14717             /* Treat as no-op */
14718             if ((ctx->insn_flags & ISA_MIPS32R6) && (rt >= 24)) {
14719                 /* hint codes 24-31 are reserved and signal RI */
14720                 generate_exception(ctx, EXCP_RI);
14721             }
14722             break;
14723         default:
14724             MIPS_INVAL("pool32c");
14725             generate_exception_end(ctx, EXCP_RI);
14726             break;
14727         }
14728         break;
14729     case ADDI32: /* AUI, LUI */
14730         if (ctx->insn_flags & ISA_MIPS32R6) {
14731             /* AUI, LUI */
14732             gen_logic_imm(ctx, OPC_LUI, rt, rs, imm);
14733         } else {
14734             /* ADDI32 */
14735             mips32_op = OPC_ADDI;
14736             goto do_addi;
14737         }
14738         break;
14739     case ADDIU32:
14740         mips32_op = OPC_ADDIU;
14741     do_addi:
14742         gen_arith_imm(ctx, mips32_op, rt, rs, imm);
14743         break;
14744
14745         /* Logical operations */
14746     case ORI32:
14747         mips32_op = OPC_ORI;
14748         goto do_logici;
14749     case XORI32:
14750         mips32_op = OPC_XORI;
14751         goto do_logici;
14752     case ANDI32:
14753         mips32_op = OPC_ANDI;
14754     do_logici:
14755         gen_logic_imm(ctx, mips32_op, rt, rs, imm);
14756         break;
14757
14758         /* Set less than immediate */
14759     case SLTI32:
14760         mips32_op = OPC_SLTI;
14761         goto do_slti;
14762     case SLTIU32:
14763         mips32_op = OPC_SLTIU;
14764     do_slti:
14765         gen_slt_imm(ctx, mips32_op, rt, rs, imm);
14766         break;
14767     case JALX32:
14768         check_insn_opc_removed(ctx, ISA_MIPS32R6);
14769         offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
14770         gen_compute_branch(ctx, OPC_JALX, 4, rt, rs, offset, 4);
14771         ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
14772         break;
14773     case JALS32: /* BOVC, BEQC, BEQZALC */
14774         if (ctx->insn_flags & ISA_MIPS32R6) {
14775             if (rs >= rt) {
14776                 /* BOVC */
14777                 mips32_op = OPC_BOVC;
14778             } else if (rs < rt && rs == 0) {
14779                 /* BEQZALC */
14780                 mips32_op = OPC_BEQZALC;
14781             } else {
14782                 /* BEQC */
14783                 mips32_op = OPC_BEQC;
14784             }
14785             gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
14786         } else {
14787             /* JALS32 */
14788             offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 1;
14789             gen_compute_branch(ctx, OPC_JAL, 4, rt, rs, offset, 2);
14790             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
14791         }
14792         break;
14793     case BEQ32: /* BC */
14794         if (ctx->insn_flags & ISA_MIPS32R6) {
14795             /* BC */
14796             gen_compute_compact_branch(ctx, OPC_BC, 0, 0,
14797                                        sextract32(ctx->opcode << 1, 0, 27));
14798         } else {
14799             /* BEQ32 */
14800             gen_compute_branch(ctx, OPC_BEQ, 4, rt, rs, imm << 1, 4);
14801         }
14802         break;
14803     case BNE32: /* BALC */
14804         if (ctx->insn_flags & ISA_MIPS32R6) {
14805             /* BALC */
14806             gen_compute_compact_branch(ctx, OPC_BALC, 0, 0,
14807                                        sextract32(ctx->opcode << 1, 0, 27));
14808         } else {
14809             /* BNE32 */
14810             gen_compute_branch(ctx, OPC_BNE, 4, rt, rs, imm << 1, 4);
14811         }
14812         break;
14813     case J32: /* BGTZC, BLTZC, BLTC */
14814         if (ctx->insn_flags & ISA_MIPS32R6) {
14815             if (rs == 0 && rt != 0) {
14816                 /* BGTZC */
14817                 mips32_op = OPC_BGTZC;
14818             } else if (rs != 0 && rt != 0 && rs == rt) {
14819                 /* BLTZC */
14820                 mips32_op = OPC_BLTZC;
14821             } else {
14822                 /* BLTC */
14823                 mips32_op = OPC_BLTC;
14824             }
14825             gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
14826         } else {
14827             /* J32 */
14828             gen_compute_branch(ctx, OPC_J, 4, rt, rs,
14829                                (int32_t)(ctx->opcode & 0x3FFFFFF) << 1, 4);
14830         }
14831         break;
14832     case JAL32: /* BLEZC, BGEZC, BGEC */
14833         if (ctx->insn_flags & ISA_MIPS32R6) {
14834             if (rs == 0 && rt != 0) {
14835                 /* BLEZC */
14836                 mips32_op = OPC_BLEZC;
14837             } else if (rs != 0 && rt != 0 && rs == rt) {
14838                 /* BGEZC */
14839                 mips32_op = OPC_BGEZC;
14840             } else {
14841                 /* BGEC */
14842                 mips32_op = OPC_BGEC;
14843             }
14844             gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
14845         } else {
14846             /* JAL32 */
14847             gen_compute_branch(ctx, OPC_JAL, 4, rt, rs,
14848                                (int32_t)(ctx->opcode & 0x3FFFFFF) << 1, 4);
14849             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
14850         }
14851         break;
14852         /* Floating point (COP1) */
14853     case LWC132:
14854         mips32_op = OPC_LWC1;
14855         goto do_cop1;
14856     case LDC132:
14857         mips32_op = OPC_LDC1;
14858         goto do_cop1;
14859     case SWC132:
14860         mips32_op = OPC_SWC1;
14861         goto do_cop1;
14862     case SDC132:
14863         mips32_op = OPC_SDC1;
14864     do_cop1:
14865         gen_cop1_ldst(ctx, mips32_op, rt, rs, imm);
14866         break;
14867     case ADDIUPC: /* PCREL: ADDIUPC, AUIPC, ALUIPC, LWPC */
14868         if (ctx->insn_flags & ISA_MIPS32R6) {
14869             /* PCREL: ADDIUPC, AUIPC, ALUIPC, LWPC */
14870             switch ((ctx->opcode >> 16) & 0x1f) {
14871             case ADDIUPC_00 ... ADDIUPC_07:
14872                 gen_pcrel(ctx, OPC_ADDIUPC, ctx->pc & ~0x3, rt);
14873                 break;
14874             case AUIPC:
14875                 gen_pcrel(ctx, OPC_AUIPC, ctx->pc, rt);
14876                 break;
14877             case ALUIPC:
14878                 gen_pcrel(ctx, OPC_ALUIPC, ctx->pc, rt);
14879                 break;
14880             case LWPC_08 ... LWPC_0F:
14881                 gen_pcrel(ctx, R6_OPC_LWPC, ctx->pc & ~0x3, rt);
14882                 break;
14883             default:
14884                 generate_exception(ctx, EXCP_RI);
14885                 break;
14886             }
14887         } else {
14888             /* ADDIUPC */
14889             int reg = mmreg(ZIMM(ctx->opcode, 23, 3));
14890             int offset = SIMM(ctx->opcode, 0, 23) << 2;
14891
14892             gen_addiupc(ctx, reg, offset, 0, 0);
14893         }
14894         break;
14895     case BNVC: /* BNEC, BNEZALC */
14896         check_insn(ctx, ISA_MIPS32R6);
14897         if (rs >= rt) {
14898             /* BNVC */
14899             mips32_op = OPC_BNVC;
14900         } else if (rs < rt && rs == 0) {
14901             /* BNEZALC */
14902             mips32_op = OPC_BNEZALC;
14903         } else {
14904             /* BNEC */
14905             mips32_op = OPC_BNEC;
14906         }
14907         gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
14908         break;
14909     case R6_BNEZC: /* JIALC */
14910         check_insn(ctx, ISA_MIPS32R6);
14911         if (rt != 0) {
14912             /* BNEZC */
14913             gen_compute_compact_branch(ctx, OPC_BNEZC, rt, 0,
14914                                        sextract32(ctx->opcode << 1, 0, 22));
14915         } else {
14916             /* JIALC */
14917             gen_compute_compact_branch(ctx, OPC_JIALC, 0, rs, imm);
14918         }
14919         break;
14920     case R6_BEQZC: /* JIC */
14921         check_insn(ctx, ISA_MIPS32R6);
14922         if (rt != 0) {
14923             /* BEQZC */
14924             gen_compute_compact_branch(ctx, OPC_BEQZC, rt, 0,
14925                                        sextract32(ctx->opcode << 1, 0, 22));
14926         } else {
14927             /* JIC */
14928             gen_compute_compact_branch(ctx, OPC_JIC, 0, rs, imm);
14929         }
14930         break;
14931     case BLEZALC: /* BGEZALC, BGEUC */
14932         check_insn(ctx, ISA_MIPS32R6);
14933         if (rs == 0 && rt != 0) {
14934             /* BLEZALC */
14935             mips32_op = OPC_BLEZALC;
14936         } else if (rs != 0 && rt != 0 && rs == rt) {
14937             /* BGEZALC */
14938             mips32_op = OPC_BGEZALC;
14939         } else {
14940             /* BGEUC */
14941             mips32_op = OPC_BGEUC;
14942         }
14943         gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
14944         break;
14945     case BGTZALC: /* BLTZALC, BLTUC */
14946         check_insn(ctx, ISA_MIPS32R6);
14947         if (rs == 0 && rt != 0) {
14948             /* BGTZALC */
14949             mips32_op = OPC_BGTZALC;
14950         } else if (rs != 0 && rt != 0 && rs == rt) {
14951             /* BLTZALC */
14952             mips32_op = OPC_BLTZALC;
14953         } else {
14954             /* BLTUC */
14955             mips32_op = OPC_BLTUC;
14956         }
14957         gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
14958         break;
14959         /* Loads and stores */
14960     case LB32:
14961         mips32_op = OPC_LB;
14962         goto do_ld;
14963     case LBU32:
14964         mips32_op = OPC_LBU;
14965         goto do_ld;
14966     case LH32:
14967         mips32_op = OPC_LH;
14968         goto do_ld;
14969     case LHU32:
14970         mips32_op = OPC_LHU;
14971         goto do_ld;
14972     case LW32:
14973         mips32_op = OPC_LW;
14974         goto do_ld;
14975 #ifdef TARGET_MIPS64
14976     case LD32:
14977         check_insn(ctx, ISA_MIPS3);
14978         check_mips_64(ctx);
14979         mips32_op = OPC_LD;
14980         goto do_ld;
14981     case SD32:
14982         check_insn(ctx, ISA_MIPS3);
14983         check_mips_64(ctx);
14984         mips32_op = OPC_SD;
14985         goto do_st;
14986 #endif
14987     case SB32:
14988         mips32_op = OPC_SB;
14989         goto do_st;
14990     case SH32:
14991         mips32_op = OPC_SH;
14992         goto do_st;
14993     case SW32:
14994         mips32_op = OPC_SW;
14995         goto do_st;
14996     do_ld:
14997         gen_ld(ctx, mips32_op, rt, rs, imm);
14998         break;
14999     do_st:
15000         gen_st(ctx, mips32_op, rt, rs, imm);
15001         break;
15002     default:
15003         generate_exception_end(ctx, EXCP_RI);
15004         break;
15005     }
15006 }
15007
15008 static int decode_micromips_opc (CPUMIPSState *env, DisasContext *ctx)
15009 {
15010     uint32_t op;
15011
15012     /* make sure instructions are on a halfword boundary */
15013     if (ctx->pc & 0x1) {
15014         env->CP0_BadVAddr = ctx->pc;
15015         generate_exception_end(ctx, EXCP_AdEL);
15016         return 2;
15017     }
15018
15019     op = (ctx->opcode >> 10) & 0x3f;
15020     /* Enforce properly-sized instructions in a delay slot */
15021     if (ctx->hflags & MIPS_HFLAG_BDS_STRICT) {
15022         switch (op & 0x7) { /* MSB-3..MSB-5 */
15023         case 0:
15024         /* POOL32A, POOL32B, POOL32I, POOL32C */
15025         case 4:
15026         /* ADDI32, ADDIU32, ORI32, XORI32, SLTI32, SLTIU32, ANDI32, JALX32 */
15027         case 5:
15028         /* LBU32, LHU32, POOL32F, JALS32, BEQ32, BNE32, J32, JAL32 */
15029         case 6:
15030         /* SB32, SH32, ADDIUPC, SWC132, SDC132, SW32 */
15031         case 7:
15032         /* LB32, LH32, LWC132, LDC132, LW32 */
15033             if (ctx->hflags & MIPS_HFLAG_BDS16) {
15034                 generate_exception_end(ctx, EXCP_RI);
15035                 return 2;
15036             }
15037             break;
15038         case 1:
15039         /* POOL16A, POOL16B, POOL16C, LWGP16, POOL16F */
15040         case 2:
15041         /* LBU16, LHU16, LWSP16, LW16, SB16, SH16, SWSP16, SW16 */
15042         case 3:
15043         /* MOVE16, ANDI16, POOL16D, POOL16E, BEQZ16, BNEZ16, B16, LI16 */
15044             if (ctx->hflags & MIPS_HFLAG_BDS32) {
15045                 generate_exception_end(ctx, EXCP_RI);
15046                 return 2;
15047             }
15048             break;
15049         }
15050     }
15051
15052     switch (op) {
15053     case POOL16A:
15054         {
15055             int rd = mmreg(uMIPS_RD(ctx->opcode));
15056             int rs1 = mmreg(uMIPS_RS1(ctx->opcode));
15057             int rs2 = mmreg(uMIPS_RS2(ctx->opcode));
15058             uint32_t opc = 0;
15059
15060             switch (ctx->opcode & 0x1) {
15061             case ADDU16:
15062                 opc = OPC_ADDU;
15063                 break;
15064             case SUBU16:
15065                 opc = OPC_SUBU;
15066                 break;
15067             }
15068             if (ctx->insn_flags & ISA_MIPS32R6) {
15069                 /* In the Release 6 the register number location in
15070                  * the instruction encoding has changed.
15071                  */
15072                 gen_arith(ctx, opc, rs1, rd, rs2);
15073             } else {
15074                 gen_arith(ctx, opc, rd, rs1, rs2);
15075             }
15076         }
15077         break;
15078     case POOL16B:
15079         {
15080             int rd = mmreg(uMIPS_RD(ctx->opcode));
15081             int rs = mmreg(uMIPS_RS(ctx->opcode));
15082             int amount = (ctx->opcode >> 1) & 0x7;
15083             uint32_t opc = 0;
15084             amount = amount == 0 ? 8 : amount;
15085
15086             switch (ctx->opcode & 0x1) {
15087             case SLL16:
15088                 opc = OPC_SLL;
15089                 break;
15090             case SRL16:
15091                 opc = OPC_SRL;
15092                 break;
15093             }
15094
15095             gen_shift_imm(ctx, opc, rd, rs, amount);
15096         }
15097         break;
15098     case POOL16C:
15099         if (ctx->insn_flags & ISA_MIPS32R6) {
15100             gen_pool16c_r6_insn(ctx);
15101         } else {
15102             gen_pool16c_insn(ctx);
15103         }
15104         break;
15105     case LWGP16:
15106         {
15107             int rd = mmreg(uMIPS_RD(ctx->opcode));
15108             int rb = 28;            /* GP */
15109             int16_t offset = SIMM(ctx->opcode, 0, 7) << 2;
15110
15111             gen_ld(ctx, OPC_LW, rd, rb, offset);
15112         }
15113         break;
15114     case POOL16F:
15115         check_insn_opc_removed(ctx, ISA_MIPS32R6);
15116         if (ctx->opcode & 1) {
15117             generate_exception_end(ctx, EXCP_RI);
15118         } else {
15119             /* MOVEP */
15120             int enc_dest = uMIPS_RD(ctx->opcode);
15121             int enc_rt = uMIPS_RS2(ctx->opcode);
15122             int enc_rs = uMIPS_RS1(ctx->opcode);
15123             gen_movep(ctx, enc_dest, enc_rt, enc_rs);
15124         }
15125         break;
15126     case LBU16:
15127         {
15128             int rd = mmreg(uMIPS_RD(ctx->opcode));
15129             int rb = mmreg(uMIPS_RS(ctx->opcode));
15130             int16_t offset = ZIMM(ctx->opcode, 0, 4);
15131             offset = (offset == 0xf ? -1 : offset);
15132
15133             gen_ld(ctx, OPC_LBU, rd, rb, offset);
15134         }
15135         break;
15136     case LHU16:
15137         {
15138             int rd = mmreg(uMIPS_RD(ctx->opcode));
15139             int rb = mmreg(uMIPS_RS(ctx->opcode));
15140             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 1;
15141
15142             gen_ld(ctx, OPC_LHU, rd, rb, offset);
15143         }
15144         break;
15145     case LWSP16:
15146         {
15147             int rd = (ctx->opcode >> 5) & 0x1f;
15148             int rb = 29;            /* SP */
15149             int16_t offset = ZIMM(ctx->opcode, 0, 5) << 2;
15150
15151             gen_ld(ctx, OPC_LW, rd, rb, offset);
15152         }
15153         break;
15154     case LW16:
15155         {
15156             int rd = mmreg(uMIPS_RD(ctx->opcode));
15157             int rb = mmreg(uMIPS_RS(ctx->opcode));
15158             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 2;
15159
15160             gen_ld(ctx, OPC_LW, rd, rb, offset);
15161         }
15162         break;
15163     case SB16:
15164         {
15165             int rd = mmreg2(uMIPS_RD(ctx->opcode));
15166             int rb = mmreg(uMIPS_RS(ctx->opcode));
15167             int16_t offset = ZIMM(ctx->opcode, 0, 4);
15168
15169             gen_st(ctx, OPC_SB, rd, rb, offset);
15170         }
15171         break;
15172     case SH16:
15173         {
15174             int rd = mmreg2(uMIPS_RD(ctx->opcode));
15175             int rb = mmreg(uMIPS_RS(ctx->opcode));
15176             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 1;
15177
15178             gen_st(ctx, OPC_SH, rd, rb, offset);
15179         }
15180         break;
15181     case SWSP16:
15182         {
15183             int rd = (ctx->opcode >> 5) & 0x1f;
15184             int rb = 29;            /* SP */
15185             int16_t offset = ZIMM(ctx->opcode, 0, 5) << 2;
15186
15187             gen_st(ctx, OPC_SW, rd, rb, offset);
15188         }
15189         break;
15190     case SW16:
15191         {
15192             int rd = mmreg2(uMIPS_RD(ctx->opcode));
15193             int rb = mmreg(uMIPS_RS(ctx->opcode));
15194             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 2;
15195
15196             gen_st(ctx, OPC_SW, rd, rb, offset);
15197         }
15198         break;
15199     case MOVE16:
15200         {
15201             int rd = uMIPS_RD5(ctx->opcode);
15202             int rs = uMIPS_RS5(ctx->opcode);
15203
15204             gen_arith(ctx, OPC_ADDU, rd, rs, 0);
15205         }
15206         break;
15207     case ANDI16:
15208         gen_andi16(ctx);
15209         break;
15210     case POOL16D:
15211         switch (ctx->opcode & 0x1) {
15212         case ADDIUS5:
15213             gen_addius5(ctx);
15214             break;
15215         case ADDIUSP:
15216             gen_addiusp(ctx);
15217             break;
15218         }
15219         break;
15220     case POOL16E:
15221         switch (ctx->opcode & 0x1) {
15222         case ADDIUR2:
15223             gen_addiur2(ctx);
15224             break;
15225         case ADDIUR1SP:
15226             gen_addiur1sp(ctx);
15227             break;
15228         }
15229         break;
15230     case B16: /* BC16 */
15231         gen_compute_branch(ctx, OPC_BEQ, 2, 0, 0,
15232                            sextract32(ctx->opcode, 0, 10) << 1,
15233                            (ctx->insn_flags & ISA_MIPS32R6) ? 0 : 4);
15234         break;
15235     case BNEZ16: /* BNEZC16 */
15236     case BEQZ16: /* BEQZC16 */
15237         gen_compute_branch(ctx, op == BNEZ16 ? OPC_BNE : OPC_BEQ, 2,
15238                            mmreg(uMIPS_RD(ctx->opcode)),
15239                            0, sextract32(ctx->opcode, 0, 7) << 1,
15240                            (ctx->insn_flags & ISA_MIPS32R6) ? 0 : 4);
15241
15242         break;
15243     case LI16:
15244         {
15245             int reg = mmreg(uMIPS_RD(ctx->opcode));
15246             int imm = ZIMM(ctx->opcode, 0, 7);
15247
15248             imm = (imm == 0x7f ? -1 : imm);
15249             tcg_gen_movi_tl(cpu_gpr[reg], imm);
15250         }
15251         break;
15252     case RES_29:
15253     case RES_31:
15254     case RES_39:
15255         generate_exception_end(ctx, EXCP_RI);
15256         break;
15257     default:
15258         decode_micromips32_opc(env, ctx);
15259         return 4;
15260     }
15261
15262     return 2;
15263 }
15264
15265 /* SmartMIPS extension to MIPS32 */
15266
15267 #if defined(TARGET_MIPS64)
15268
15269 /* MDMX extension to MIPS64 */
15270
15271 #endif
15272
15273 /* MIPSDSP functions. */
15274 static void gen_mipsdsp_ld(DisasContext *ctx, uint32_t opc,
15275                            int rd, int base, int offset)
15276 {
15277     TCGv t0;
15278
15279     check_dsp(ctx);
15280     t0 = tcg_temp_new();
15281
15282     if (base == 0) {
15283         gen_load_gpr(t0, offset);
15284     } else if (offset == 0) {
15285         gen_load_gpr(t0, base);
15286     } else {
15287         gen_op_addr_add(ctx, t0, cpu_gpr[base], cpu_gpr[offset]);
15288     }
15289
15290     switch (opc) {
15291     case OPC_LBUX:
15292         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_UB);
15293         gen_store_gpr(t0, rd);
15294         break;
15295     case OPC_LHX:
15296         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESW);
15297         gen_store_gpr(t0, rd);
15298         break;
15299     case OPC_LWX:
15300         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL);
15301         gen_store_gpr(t0, rd);
15302         break;
15303 #if defined(TARGET_MIPS64)
15304     case OPC_LDX:
15305         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ);
15306         gen_store_gpr(t0, rd);
15307         break;
15308 #endif
15309     }
15310     tcg_temp_free(t0);
15311 }
15312
15313 static void gen_mipsdsp_arith(DisasContext *ctx, uint32_t op1, uint32_t op2,
15314                               int ret, int v1, int v2)
15315 {
15316     TCGv v1_t;
15317     TCGv v2_t;
15318
15319     if (ret == 0) {
15320         /* Treat as NOP. */
15321         return;
15322     }
15323
15324     v1_t = tcg_temp_new();
15325     v2_t = tcg_temp_new();
15326
15327     gen_load_gpr(v1_t, v1);
15328     gen_load_gpr(v2_t, v2);
15329
15330     switch (op1) {
15331     /* OPC_MULT_G_2E is equal OPC_ADDUH_QB_DSP */
15332     case OPC_MULT_G_2E:
15333         check_dspr2(ctx);
15334         switch (op2) {
15335         case OPC_ADDUH_QB:
15336             gen_helper_adduh_qb(cpu_gpr[ret], v1_t, v2_t);
15337             break;
15338         case OPC_ADDUH_R_QB:
15339             gen_helper_adduh_r_qb(cpu_gpr[ret], v1_t, v2_t);
15340             break;
15341         case OPC_ADDQH_PH:
15342             gen_helper_addqh_ph(cpu_gpr[ret], v1_t, v2_t);
15343             break;
15344         case OPC_ADDQH_R_PH:
15345             gen_helper_addqh_r_ph(cpu_gpr[ret], v1_t, v2_t);
15346             break;
15347         case OPC_ADDQH_W:
15348             gen_helper_addqh_w(cpu_gpr[ret], v1_t, v2_t);
15349             break;
15350         case OPC_ADDQH_R_W:
15351             gen_helper_addqh_r_w(cpu_gpr[ret], v1_t, v2_t);
15352             break;
15353         case OPC_SUBUH_QB:
15354             gen_helper_subuh_qb(cpu_gpr[ret], v1_t, v2_t);
15355             break;
15356         case OPC_SUBUH_R_QB:
15357             gen_helper_subuh_r_qb(cpu_gpr[ret], v1_t, v2_t);
15358             break;
15359         case OPC_SUBQH_PH:
15360             gen_helper_subqh_ph(cpu_gpr[ret], v1_t, v2_t);
15361             break;
15362         case OPC_SUBQH_R_PH:
15363             gen_helper_subqh_r_ph(cpu_gpr[ret], v1_t, v2_t);
15364             break;
15365         case OPC_SUBQH_W:
15366             gen_helper_subqh_w(cpu_gpr[ret], v1_t, v2_t);
15367             break;
15368         case OPC_SUBQH_R_W:
15369             gen_helper_subqh_r_w(cpu_gpr[ret], v1_t, v2_t);
15370             break;
15371         }
15372         break;
15373     case OPC_ABSQ_S_PH_DSP:
15374         switch (op2) {
15375         case OPC_ABSQ_S_QB:
15376             check_dspr2(ctx);
15377             gen_helper_absq_s_qb(cpu_gpr[ret], v2_t, cpu_env);
15378             break;
15379         case OPC_ABSQ_S_PH:
15380             check_dsp(ctx);
15381             gen_helper_absq_s_ph(cpu_gpr[ret], v2_t, cpu_env);
15382             break;
15383         case OPC_ABSQ_S_W:
15384             check_dsp(ctx);
15385             gen_helper_absq_s_w(cpu_gpr[ret], v2_t, cpu_env);
15386             break;
15387         case OPC_PRECEQ_W_PHL:
15388             check_dsp(ctx);
15389             tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0xFFFF0000);
15390             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
15391             break;
15392         case OPC_PRECEQ_W_PHR:
15393             check_dsp(ctx);
15394             tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0x0000FFFF);
15395             tcg_gen_shli_tl(cpu_gpr[ret], cpu_gpr[ret], 16);
15396             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
15397             break;
15398         case OPC_PRECEQU_PH_QBL:
15399             check_dsp(ctx);
15400             gen_helper_precequ_ph_qbl(cpu_gpr[ret], v2_t);
15401             break;
15402         case OPC_PRECEQU_PH_QBR:
15403             check_dsp(ctx);
15404             gen_helper_precequ_ph_qbr(cpu_gpr[ret], v2_t);
15405             break;
15406         case OPC_PRECEQU_PH_QBLA:
15407             check_dsp(ctx);
15408             gen_helper_precequ_ph_qbla(cpu_gpr[ret], v2_t);
15409             break;
15410         case OPC_PRECEQU_PH_QBRA:
15411             check_dsp(ctx);
15412             gen_helper_precequ_ph_qbra(cpu_gpr[ret], v2_t);
15413             break;
15414         case OPC_PRECEU_PH_QBL:
15415             check_dsp(ctx);
15416             gen_helper_preceu_ph_qbl(cpu_gpr[ret], v2_t);
15417             break;
15418         case OPC_PRECEU_PH_QBR:
15419             check_dsp(ctx);
15420             gen_helper_preceu_ph_qbr(cpu_gpr[ret], v2_t);
15421             break;
15422         case OPC_PRECEU_PH_QBLA:
15423             check_dsp(ctx);
15424             gen_helper_preceu_ph_qbla(cpu_gpr[ret], v2_t);
15425             break;
15426         case OPC_PRECEU_PH_QBRA:
15427             check_dsp(ctx);
15428             gen_helper_preceu_ph_qbra(cpu_gpr[ret], v2_t);
15429             break;
15430         }
15431         break;
15432     case OPC_ADDU_QB_DSP:
15433         switch (op2) {
15434         case OPC_ADDQ_PH:
15435             check_dsp(ctx);
15436             gen_helper_addq_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15437             break;
15438         case OPC_ADDQ_S_PH:
15439             check_dsp(ctx);
15440             gen_helper_addq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15441             break;
15442         case OPC_ADDQ_S_W:
15443             check_dsp(ctx);
15444             gen_helper_addq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15445             break;
15446         case OPC_ADDU_QB:
15447             check_dsp(ctx);
15448             gen_helper_addu_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15449             break;
15450         case OPC_ADDU_S_QB:
15451             check_dsp(ctx);
15452             gen_helper_addu_s_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15453             break;
15454         case OPC_ADDU_PH:
15455             check_dspr2(ctx);
15456             gen_helper_addu_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15457             break;
15458         case OPC_ADDU_S_PH:
15459             check_dspr2(ctx);
15460             gen_helper_addu_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15461             break;
15462         case OPC_SUBQ_PH:
15463             check_dsp(ctx);
15464             gen_helper_subq_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15465             break;
15466         case OPC_SUBQ_S_PH:
15467             check_dsp(ctx);
15468             gen_helper_subq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15469             break;
15470         case OPC_SUBQ_S_W:
15471             check_dsp(ctx);
15472             gen_helper_subq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15473             break;
15474         case OPC_SUBU_QB:
15475             check_dsp(ctx);
15476             gen_helper_subu_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15477             break;
15478         case OPC_SUBU_S_QB:
15479             check_dsp(ctx);
15480             gen_helper_subu_s_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15481             break;
15482         case OPC_SUBU_PH:
15483             check_dspr2(ctx);
15484             gen_helper_subu_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15485             break;
15486         case OPC_SUBU_S_PH:
15487             check_dspr2(ctx);
15488             gen_helper_subu_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15489             break;
15490         case OPC_ADDSC:
15491             check_dsp(ctx);
15492             gen_helper_addsc(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15493             break;
15494         case OPC_ADDWC:
15495             check_dsp(ctx);
15496             gen_helper_addwc(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15497             break;
15498         case OPC_MODSUB:
15499             check_dsp(ctx);
15500             gen_helper_modsub(cpu_gpr[ret], v1_t, v2_t);
15501             break;
15502         case OPC_RADDU_W_QB:
15503             check_dsp(ctx);
15504             gen_helper_raddu_w_qb(cpu_gpr[ret], v1_t);
15505             break;
15506         }
15507         break;
15508     case OPC_CMPU_EQ_QB_DSP:
15509         switch (op2) {
15510         case OPC_PRECR_QB_PH:
15511             check_dspr2(ctx);
15512             gen_helper_precr_qb_ph(cpu_gpr[ret], v1_t, v2_t);
15513             break;
15514         case OPC_PRECRQ_QB_PH:
15515             check_dsp(ctx);
15516             gen_helper_precrq_qb_ph(cpu_gpr[ret], v1_t, v2_t);
15517             break;
15518         case OPC_PRECR_SRA_PH_W:
15519             check_dspr2(ctx);
15520             {
15521                 TCGv_i32 sa_t = tcg_const_i32(v2);
15522                 gen_helper_precr_sra_ph_w(cpu_gpr[ret], sa_t, v1_t,
15523                                           cpu_gpr[ret]);
15524                 tcg_temp_free_i32(sa_t);
15525                 break;
15526             }
15527         case OPC_PRECR_SRA_R_PH_W:
15528             check_dspr2(ctx);
15529             {
15530                 TCGv_i32 sa_t = tcg_const_i32(v2);
15531                 gen_helper_precr_sra_r_ph_w(cpu_gpr[ret], sa_t, v1_t,
15532                                             cpu_gpr[ret]);
15533                 tcg_temp_free_i32(sa_t);
15534                 break;
15535             }
15536         case OPC_PRECRQ_PH_W:
15537             check_dsp(ctx);
15538             gen_helper_precrq_ph_w(cpu_gpr[ret], v1_t, v2_t);
15539             break;
15540         case OPC_PRECRQ_RS_PH_W:
15541             check_dsp(ctx);
15542             gen_helper_precrq_rs_ph_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15543             break;
15544         case OPC_PRECRQU_S_QB_PH:
15545             check_dsp(ctx);
15546             gen_helper_precrqu_s_qb_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15547             break;
15548         }
15549         break;
15550 #ifdef TARGET_MIPS64
15551     case OPC_ABSQ_S_QH_DSP:
15552         switch (op2) {
15553         case OPC_PRECEQ_L_PWL:
15554             check_dsp(ctx);
15555             tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0xFFFFFFFF00000000ull);
15556             break;
15557         case OPC_PRECEQ_L_PWR:
15558             check_dsp(ctx);
15559             tcg_gen_shli_tl(cpu_gpr[ret], v2_t, 32);
15560             break;
15561         case OPC_PRECEQ_PW_QHL:
15562             check_dsp(ctx);
15563             gen_helper_preceq_pw_qhl(cpu_gpr[ret], v2_t);
15564             break;
15565         case OPC_PRECEQ_PW_QHR:
15566             check_dsp(ctx);
15567             gen_helper_preceq_pw_qhr(cpu_gpr[ret], v2_t);
15568             break;
15569         case OPC_PRECEQ_PW_QHLA:
15570             check_dsp(ctx);
15571             gen_helper_preceq_pw_qhla(cpu_gpr[ret], v2_t);
15572             break;
15573         case OPC_PRECEQ_PW_QHRA:
15574             check_dsp(ctx);
15575             gen_helper_preceq_pw_qhra(cpu_gpr[ret], v2_t);
15576             break;
15577         case OPC_PRECEQU_QH_OBL:
15578             check_dsp(ctx);
15579             gen_helper_precequ_qh_obl(cpu_gpr[ret], v2_t);
15580             break;
15581         case OPC_PRECEQU_QH_OBR:
15582             check_dsp(ctx);
15583             gen_helper_precequ_qh_obr(cpu_gpr[ret], v2_t);
15584             break;
15585         case OPC_PRECEQU_QH_OBLA:
15586             check_dsp(ctx);
15587             gen_helper_precequ_qh_obla(cpu_gpr[ret], v2_t);
15588             break;
15589         case OPC_PRECEQU_QH_OBRA:
15590             check_dsp(ctx);
15591             gen_helper_precequ_qh_obra(cpu_gpr[ret], v2_t);
15592             break;
15593         case OPC_PRECEU_QH_OBL:
15594             check_dsp(ctx);
15595             gen_helper_preceu_qh_obl(cpu_gpr[ret], v2_t);
15596             break;
15597         case OPC_PRECEU_QH_OBR:
15598             check_dsp(ctx);
15599             gen_helper_preceu_qh_obr(cpu_gpr[ret], v2_t);
15600             break;
15601         case OPC_PRECEU_QH_OBLA:
15602             check_dsp(ctx);
15603             gen_helper_preceu_qh_obla(cpu_gpr[ret], v2_t);
15604             break;
15605         case OPC_PRECEU_QH_OBRA:
15606             check_dsp(ctx);
15607             gen_helper_preceu_qh_obra(cpu_gpr[ret], v2_t);
15608             break;
15609         case OPC_ABSQ_S_OB:
15610             check_dspr2(ctx);
15611             gen_helper_absq_s_ob(cpu_gpr[ret], v2_t, cpu_env);
15612             break;
15613         case OPC_ABSQ_S_PW:
15614             check_dsp(ctx);
15615             gen_helper_absq_s_pw(cpu_gpr[ret], v2_t, cpu_env);
15616             break;
15617         case OPC_ABSQ_S_QH:
15618             check_dsp(ctx);
15619             gen_helper_absq_s_qh(cpu_gpr[ret], v2_t, cpu_env);
15620             break;
15621         }
15622         break;
15623     case OPC_ADDU_OB_DSP:
15624         switch (op2) {
15625         case OPC_RADDU_L_OB:
15626             check_dsp(ctx);
15627             gen_helper_raddu_l_ob(cpu_gpr[ret], v1_t);
15628             break;
15629         case OPC_SUBQ_PW:
15630             check_dsp(ctx);
15631             gen_helper_subq_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15632             break;
15633         case OPC_SUBQ_S_PW:
15634             check_dsp(ctx);
15635             gen_helper_subq_s_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15636             break;
15637         case OPC_SUBQ_QH:
15638             check_dsp(ctx);
15639             gen_helper_subq_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15640             break;
15641         case OPC_SUBQ_S_QH:
15642             check_dsp(ctx);
15643             gen_helper_subq_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15644             break;
15645         case OPC_SUBU_OB:
15646             check_dsp(ctx);
15647             gen_helper_subu_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15648             break;
15649         case OPC_SUBU_S_OB:
15650             check_dsp(ctx);
15651             gen_helper_subu_s_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15652             break;
15653         case OPC_SUBU_QH:
15654             check_dspr2(ctx);
15655             gen_helper_subu_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15656             break;
15657         case OPC_SUBU_S_QH:
15658             check_dspr2(ctx);
15659             gen_helper_subu_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15660             break;
15661         case OPC_SUBUH_OB:
15662             check_dspr2(ctx);
15663             gen_helper_subuh_ob(cpu_gpr[ret], v1_t, v2_t);
15664             break;
15665         case OPC_SUBUH_R_OB:
15666             check_dspr2(ctx);
15667             gen_helper_subuh_r_ob(cpu_gpr[ret], v1_t, v2_t);
15668             break;
15669         case OPC_ADDQ_PW:
15670             check_dsp(ctx);
15671             gen_helper_addq_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15672             break;
15673         case OPC_ADDQ_S_PW:
15674             check_dsp(ctx);
15675             gen_helper_addq_s_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15676             break;
15677         case OPC_ADDQ_QH:
15678             check_dsp(ctx);
15679             gen_helper_addq_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15680             break;
15681         case OPC_ADDQ_S_QH:
15682             check_dsp(ctx);
15683             gen_helper_addq_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15684             break;
15685         case OPC_ADDU_OB:
15686             check_dsp(ctx);
15687             gen_helper_addu_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15688             break;
15689         case OPC_ADDU_S_OB:
15690             check_dsp(ctx);
15691             gen_helper_addu_s_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15692             break;
15693         case OPC_ADDU_QH:
15694             check_dspr2(ctx);
15695             gen_helper_addu_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15696             break;
15697         case OPC_ADDU_S_QH:
15698             check_dspr2(ctx);
15699             gen_helper_addu_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15700             break;
15701         case OPC_ADDUH_OB:
15702             check_dspr2(ctx);
15703             gen_helper_adduh_ob(cpu_gpr[ret], v1_t, v2_t);
15704             break;
15705         case OPC_ADDUH_R_OB:
15706             check_dspr2(ctx);
15707             gen_helper_adduh_r_ob(cpu_gpr[ret], v1_t, v2_t);
15708             break;
15709         }
15710         break;
15711     case OPC_CMPU_EQ_OB_DSP:
15712         switch (op2) {
15713         case OPC_PRECR_OB_QH:
15714             check_dspr2(ctx);
15715             gen_helper_precr_ob_qh(cpu_gpr[ret], v1_t, v2_t);
15716             break;
15717         case OPC_PRECR_SRA_QH_PW:
15718             check_dspr2(ctx);
15719             {
15720                 TCGv_i32 ret_t = tcg_const_i32(ret);
15721                 gen_helper_precr_sra_qh_pw(v2_t, v1_t, v2_t, ret_t);
15722                 tcg_temp_free_i32(ret_t);
15723                 break;
15724             }
15725         case OPC_PRECR_SRA_R_QH_PW:
15726             check_dspr2(ctx);
15727             {
15728                 TCGv_i32 sa_v = tcg_const_i32(ret);
15729                 gen_helper_precr_sra_r_qh_pw(v2_t, v1_t, v2_t, sa_v);
15730                 tcg_temp_free_i32(sa_v);
15731                 break;
15732             }
15733         case OPC_PRECRQ_OB_QH:
15734             check_dsp(ctx);
15735             gen_helper_precrq_ob_qh(cpu_gpr[ret], v1_t, v2_t);
15736             break;
15737         case OPC_PRECRQ_PW_L:
15738             check_dsp(ctx);
15739             gen_helper_precrq_pw_l(cpu_gpr[ret], v1_t, v2_t);
15740             break;
15741         case OPC_PRECRQ_QH_PW:
15742             check_dsp(ctx);
15743             gen_helper_precrq_qh_pw(cpu_gpr[ret], v1_t, v2_t);
15744             break;
15745         case OPC_PRECRQ_RS_QH_PW:
15746             check_dsp(ctx);
15747             gen_helper_precrq_rs_qh_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15748             break;
15749         case OPC_PRECRQU_S_OB_QH:
15750             check_dsp(ctx);
15751             gen_helper_precrqu_s_ob_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15752             break;
15753         }
15754         break;
15755 #endif
15756     }
15757
15758     tcg_temp_free(v1_t);
15759     tcg_temp_free(v2_t);
15760 }
15761
15762 static void gen_mipsdsp_shift(DisasContext *ctx, uint32_t opc,
15763                               int ret, int v1, int v2)
15764 {
15765     uint32_t op2;
15766     TCGv t0;
15767     TCGv v1_t;
15768     TCGv v2_t;
15769
15770     if (ret == 0) {
15771         /* Treat as NOP. */
15772         return;
15773     }
15774
15775     t0 = tcg_temp_new();
15776     v1_t = tcg_temp_new();
15777     v2_t = tcg_temp_new();
15778
15779     tcg_gen_movi_tl(t0, v1);
15780     gen_load_gpr(v1_t, v1);
15781     gen_load_gpr(v2_t, v2);
15782
15783     switch (opc) {
15784     case OPC_SHLL_QB_DSP:
15785         {
15786             op2 = MASK_SHLL_QB(ctx->opcode);
15787             switch (op2) {
15788             case OPC_SHLL_QB:
15789                 check_dsp(ctx);
15790                 gen_helper_shll_qb(cpu_gpr[ret], t0, v2_t, cpu_env);
15791                 break;
15792             case OPC_SHLLV_QB:
15793                 check_dsp(ctx);
15794                 gen_helper_shll_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15795                 break;
15796             case OPC_SHLL_PH:
15797                 check_dsp(ctx);
15798                 gen_helper_shll_ph(cpu_gpr[ret], t0, v2_t, cpu_env);
15799                 break;
15800             case OPC_SHLLV_PH:
15801                 check_dsp(ctx);
15802                 gen_helper_shll_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15803                 break;
15804             case OPC_SHLL_S_PH:
15805                 check_dsp(ctx);
15806                 gen_helper_shll_s_ph(cpu_gpr[ret], t0, v2_t, cpu_env);
15807                 break;
15808             case OPC_SHLLV_S_PH:
15809                 check_dsp(ctx);
15810                 gen_helper_shll_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15811                 break;
15812             case OPC_SHLL_S_W:
15813                 check_dsp(ctx);
15814                 gen_helper_shll_s_w(cpu_gpr[ret], t0, v2_t, cpu_env);
15815                 break;
15816             case OPC_SHLLV_S_W:
15817                 check_dsp(ctx);
15818                 gen_helper_shll_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
15819                 break;
15820             case OPC_SHRL_QB:
15821                 check_dsp(ctx);
15822                 gen_helper_shrl_qb(cpu_gpr[ret], t0, v2_t);
15823                 break;
15824             case OPC_SHRLV_QB:
15825                 check_dsp(ctx);
15826                 gen_helper_shrl_qb(cpu_gpr[ret], v1_t, v2_t);
15827                 break;
15828             case OPC_SHRL_PH:
15829                 check_dspr2(ctx);
15830                 gen_helper_shrl_ph(cpu_gpr[ret], t0, v2_t);
15831                 break;
15832             case OPC_SHRLV_PH:
15833                 check_dspr2(ctx);
15834                 gen_helper_shrl_ph(cpu_gpr[ret], v1_t, v2_t);
15835                 break;
15836             case OPC_SHRA_QB:
15837                 check_dspr2(ctx);
15838                 gen_helper_shra_qb(cpu_gpr[ret], t0, v2_t);
15839                 break;
15840             case OPC_SHRA_R_QB:
15841                 check_dspr2(ctx);
15842                 gen_helper_shra_r_qb(cpu_gpr[ret], t0, v2_t);
15843                 break;
15844             case OPC_SHRAV_QB:
15845                 check_dspr2(ctx);
15846                 gen_helper_shra_qb(cpu_gpr[ret], v1_t, v2_t);
15847                 break;
15848             case OPC_SHRAV_R_QB:
15849                 check_dspr2(ctx);
15850                 gen_helper_shra_r_qb(cpu_gpr[ret], v1_t, v2_t);
15851                 break;
15852             case OPC_SHRA_PH:
15853                 check_dsp(ctx);
15854                 gen_helper_shra_ph(cpu_gpr[ret], t0, v2_t);
15855                 break;
15856             case OPC_SHRA_R_PH:
15857                 check_dsp(ctx);
15858                 gen_helper_shra_r_ph(cpu_gpr[ret], t0, v2_t);
15859                 break;
15860             case OPC_SHRAV_PH:
15861                 check_dsp(ctx);
15862                 gen_helper_shra_ph(cpu_gpr[ret], v1_t, v2_t);
15863                 break;
15864             case OPC_SHRAV_R_PH:
15865                 check_dsp(ctx);
15866                 gen_helper_shra_r_ph(cpu_gpr[ret], v1_t, v2_t);
15867                 break;
15868             case OPC_SHRA_R_W:
15869                 check_dsp(ctx);
15870                 gen_helper_shra_r_w(cpu_gpr[ret], t0, v2_t);
15871                 break;
15872             case OPC_SHRAV_R_W:
15873                 check_dsp(ctx);
15874                 gen_helper_shra_r_w(cpu_gpr[ret], v1_t, v2_t);
15875                 break;
15876             default:            /* Invalid */
15877                 MIPS_INVAL("MASK SHLL.QB");
15878                 generate_exception_end(ctx, EXCP_RI);
15879                 break;
15880             }
15881             break;
15882         }
15883 #ifdef TARGET_MIPS64
15884     case OPC_SHLL_OB_DSP:
15885         op2 = MASK_SHLL_OB(ctx->opcode);
15886         switch (op2) {
15887         case OPC_SHLL_PW:
15888             check_dsp(ctx);
15889             gen_helper_shll_pw(cpu_gpr[ret], v2_t, t0, cpu_env);
15890             break;
15891         case OPC_SHLLV_PW:
15892             check_dsp(ctx);
15893             gen_helper_shll_pw(cpu_gpr[ret], v2_t, v1_t, cpu_env);
15894             break;
15895         case OPC_SHLL_S_PW:
15896             check_dsp(ctx);
15897             gen_helper_shll_s_pw(cpu_gpr[ret], v2_t, t0, cpu_env);
15898             break;
15899         case OPC_SHLLV_S_PW:
15900             check_dsp(ctx);
15901             gen_helper_shll_s_pw(cpu_gpr[ret], v2_t, v1_t, cpu_env);
15902             break;
15903         case OPC_SHLL_OB:
15904             check_dsp(ctx);
15905             gen_helper_shll_ob(cpu_gpr[ret], v2_t, t0, cpu_env);
15906             break;
15907         case OPC_SHLLV_OB:
15908             check_dsp(ctx);
15909             gen_helper_shll_ob(cpu_gpr[ret], v2_t, v1_t, cpu_env);
15910             break;
15911         case OPC_SHLL_QH:
15912             check_dsp(ctx);
15913             gen_helper_shll_qh(cpu_gpr[ret], v2_t, t0, cpu_env);
15914             break;
15915         case OPC_SHLLV_QH:
15916             check_dsp(ctx);
15917             gen_helper_shll_qh(cpu_gpr[ret], v2_t, v1_t, cpu_env);
15918             break;
15919         case OPC_SHLL_S_QH:
15920             check_dsp(ctx);
15921             gen_helper_shll_s_qh(cpu_gpr[ret], v2_t, t0, cpu_env);
15922             break;
15923         case OPC_SHLLV_S_QH:
15924             check_dsp(ctx);
15925             gen_helper_shll_s_qh(cpu_gpr[ret], v2_t, v1_t, cpu_env);
15926             break;
15927         case OPC_SHRA_OB:
15928             check_dspr2(ctx);
15929             gen_helper_shra_ob(cpu_gpr[ret], v2_t, t0);
15930             break;
15931         case OPC_SHRAV_OB:
15932             check_dspr2(ctx);
15933             gen_helper_shra_ob(cpu_gpr[ret], v2_t, v1_t);
15934             break;
15935         case OPC_SHRA_R_OB:
15936             check_dspr2(ctx);
15937             gen_helper_shra_r_ob(cpu_gpr[ret], v2_t, t0);
15938             break;
15939         case OPC_SHRAV_R_OB:
15940             check_dspr2(ctx);
15941             gen_helper_shra_r_ob(cpu_gpr[ret], v2_t, v1_t);
15942             break;
15943         case OPC_SHRA_PW:
15944             check_dsp(ctx);
15945             gen_helper_shra_pw(cpu_gpr[ret], v2_t, t0);
15946             break;
15947         case OPC_SHRAV_PW:
15948             check_dsp(ctx);
15949             gen_helper_shra_pw(cpu_gpr[ret], v2_t, v1_t);
15950             break;
15951         case OPC_SHRA_R_PW:
15952             check_dsp(ctx);
15953             gen_helper_shra_r_pw(cpu_gpr[ret], v2_t, t0);
15954             break;
15955         case OPC_SHRAV_R_PW:
15956             check_dsp(ctx);
15957             gen_helper_shra_r_pw(cpu_gpr[ret], v2_t, v1_t);
15958             break;
15959         case OPC_SHRA_QH:
15960             check_dsp(ctx);
15961             gen_helper_shra_qh(cpu_gpr[ret], v2_t, t0);
15962             break;
15963         case OPC_SHRAV_QH:
15964             check_dsp(ctx);
15965             gen_helper_shra_qh(cpu_gpr[ret], v2_t, v1_t);
15966             break;
15967         case OPC_SHRA_R_QH:
15968             check_dsp(ctx);
15969             gen_helper_shra_r_qh(cpu_gpr[ret], v2_t, t0);
15970             break;
15971         case OPC_SHRAV_R_QH:
15972             check_dsp(ctx);
15973             gen_helper_shra_r_qh(cpu_gpr[ret], v2_t, v1_t);
15974             break;
15975         case OPC_SHRL_OB:
15976             check_dsp(ctx);
15977             gen_helper_shrl_ob(cpu_gpr[ret], v2_t, t0);
15978             break;
15979         case OPC_SHRLV_OB:
15980             check_dsp(ctx);
15981             gen_helper_shrl_ob(cpu_gpr[ret], v2_t, v1_t);
15982             break;
15983         case OPC_SHRL_QH:
15984             check_dspr2(ctx);
15985             gen_helper_shrl_qh(cpu_gpr[ret], v2_t, t0);
15986             break;
15987         case OPC_SHRLV_QH:
15988             check_dspr2(ctx);
15989             gen_helper_shrl_qh(cpu_gpr[ret], v2_t, v1_t);
15990             break;
15991         default:            /* Invalid */
15992             MIPS_INVAL("MASK SHLL.OB");
15993             generate_exception_end(ctx, EXCP_RI);
15994             break;
15995         }
15996         break;
15997 #endif
15998     }
15999
16000     tcg_temp_free(t0);
16001     tcg_temp_free(v1_t);
16002     tcg_temp_free(v2_t);
16003 }
16004
16005 static void gen_mipsdsp_multiply(DisasContext *ctx, uint32_t op1, uint32_t op2,
16006                                  int ret, int v1, int v2, int check_ret)
16007 {
16008     TCGv_i32 t0;
16009     TCGv v1_t;
16010     TCGv v2_t;
16011
16012     if ((ret == 0) && (check_ret == 1)) {
16013         /* Treat as NOP. */
16014         return;
16015     }
16016
16017     t0 = tcg_temp_new_i32();
16018     v1_t = tcg_temp_new();
16019     v2_t = tcg_temp_new();
16020
16021     tcg_gen_movi_i32(t0, ret);
16022     gen_load_gpr(v1_t, v1);
16023     gen_load_gpr(v2_t, v2);
16024
16025     switch (op1) {
16026     /* OPC_MULT_G_2E, OPC_ADDUH_QB_DSP, OPC_MUL_PH_DSP have
16027      * the same mask and op1. */
16028     case OPC_MULT_G_2E:
16029         check_dspr2(ctx);
16030         switch (op2) {
16031         case  OPC_MUL_PH:
16032             gen_helper_mul_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
16033             break;
16034         case  OPC_MUL_S_PH:
16035             gen_helper_mul_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
16036             break;
16037         case OPC_MULQ_S_W:
16038             gen_helper_mulq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
16039             break;
16040         case OPC_MULQ_RS_W:
16041             gen_helper_mulq_rs_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
16042             break;
16043         }
16044         break;
16045     case OPC_DPA_W_PH_DSP:
16046         switch (op2) {
16047         case OPC_DPAU_H_QBL:
16048             check_dsp(ctx);
16049             gen_helper_dpau_h_qbl(t0, v1_t, v2_t, cpu_env);
16050             break;
16051         case OPC_DPAU_H_QBR:
16052             check_dsp(ctx);
16053             gen_helper_dpau_h_qbr(t0, v1_t, v2_t, cpu_env);
16054             break;
16055         case OPC_DPSU_H_QBL:
16056             check_dsp(ctx);
16057             gen_helper_dpsu_h_qbl(t0, v1_t, v2_t, cpu_env);
16058             break;
16059         case OPC_DPSU_H_QBR:
16060             check_dsp(ctx);
16061             gen_helper_dpsu_h_qbr(t0, v1_t, v2_t, cpu_env);
16062             break;
16063         case OPC_DPA_W_PH:
16064             check_dspr2(ctx);
16065             gen_helper_dpa_w_ph(t0, v1_t, v2_t, cpu_env);
16066             break;
16067         case OPC_DPAX_W_PH:
16068             check_dspr2(ctx);
16069             gen_helper_dpax_w_ph(t0, v1_t, v2_t, cpu_env);
16070             break;
16071         case OPC_DPAQ_S_W_PH:
16072             check_dsp(ctx);
16073             gen_helper_dpaq_s_w_ph(t0, v1_t, v2_t, cpu_env);
16074             break;
16075         case OPC_DPAQX_S_W_PH:
16076             check_dspr2(ctx);
16077             gen_helper_dpaqx_s_w_ph(t0, v1_t, v2_t, cpu_env);
16078             break;
16079         case OPC_DPAQX_SA_W_PH:
16080             check_dspr2(ctx);
16081             gen_helper_dpaqx_sa_w_ph(t0, v1_t, v2_t, cpu_env);
16082             break;
16083         case OPC_DPS_W_PH:
16084             check_dspr2(ctx);
16085             gen_helper_dps_w_ph(t0, v1_t, v2_t, cpu_env);
16086             break;
16087         case OPC_DPSX_W_PH:
16088             check_dspr2(ctx);
16089             gen_helper_dpsx_w_ph(t0, v1_t, v2_t, cpu_env);
16090             break;
16091         case OPC_DPSQ_S_W_PH:
16092             check_dsp(ctx);
16093             gen_helper_dpsq_s_w_ph(t0, v1_t, v2_t, cpu_env);
16094             break;
16095         case OPC_DPSQX_S_W_PH:
16096             check_dspr2(ctx);
16097             gen_helper_dpsqx_s_w_ph(t0, v1_t, v2_t, cpu_env);
16098             break;
16099         case OPC_DPSQX_SA_W_PH:
16100             check_dspr2(ctx);
16101             gen_helper_dpsqx_sa_w_ph(t0, v1_t, v2_t, cpu_env);
16102             break;
16103         case OPC_MULSAQ_S_W_PH:
16104             check_dsp(ctx);
16105             gen_helper_mulsaq_s_w_ph(t0, v1_t, v2_t, cpu_env);
16106             break;
16107         case OPC_DPAQ_SA_L_W:
16108             check_dsp(ctx);
16109             gen_helper_dpaq_sa_l_w(t0, v1_t, v2_t, cpu_env);
16110             break;
16111         case OPC_DPSQ_SA_L_W:
16112             check_dsp(ctx);
16113             gen_helper_dpsq_sa_l_w(t0, v1_t, v2_t, cpu_env);
16114             break;
16115         case OPC_MAQ_S_W_PHL:
16116             check_dsp(ctx);
16117             gen_helper_maq_s_w_phl(t0, v1_t, v2_t, cpu_env);
16118             break;
16119         case OPC_MAQ_S_W_PHR:
16120             check_dsp(ctx);
16121             gen_helper_maq_s_w_phr(t0, v1_t, v2_t, cpu_env);
16122             break;
16123         case OPC_MAQ_SA_W_PHL:
16124             check_dsp(ctx);
16125             gen_helper_maq_sa_w_phl(t0, v1_t, v2_t, cpu_env);
16126             break;
16127         case OPC_MAQ_SA_W_PHR:
16128             check_dsp(ctx);
16129             gen_helper_maq_sa_w_phr(t0, v1_t, v2_t, cpu_env);
16130             break;
16131         case OPC_MULSA_W_PH:
16132             check_dspr2(ctx);
16133             gen_helper_mulsa_w_ph(t0, v1_t, v2_t, cpu_env);
16134             break;
16135         }
16136         break;
16137 #ifdef TARGET_MIPS64
16138     case OPC_DPAQ_W_QH_DSP:
16139         {
16140             int ac = ret & 0x03;
16141             tcg_gen_movi_i32(t0, ac);
16142
16143             switch (op2) {
16144             case OPC_DMADD:
16145                 check_dsp(ctx);
16146                 gen_helper_dmadd(v1_t, v2_t, t0, cpu_env);
16147                 break;
16148             case OPC_DMADDU:
16149                 check_dsp(ctx);
16150                 gen_helper_dmaddu(v1_t, v2_t, t0, cpu_env);
16151                 break;
16152             case OPC_DMSUB:
16153                 check_dsp(ctx);
16154                 gen_helper_dmsub(v1_t, v2_t, t0, cpu_env);
16155                 break;
16156             case OPC_DMSUBU:
16157                 check_dsp(ctx);
16158                 gen_helper_dmsubu(v1_t, v2_t, t0, cpu_env);
16159                 break;
16160             case OPC_DPA_W_QH:
16161                 check_dspr2(ctx);
16162                 gen_helper_dpa_w_qh(v1_t, v2_t, t0, cpu_env);
16163                 break;
16164             case OPC_DPAQ_S_W_QH:
16165                 check_dsp(ctx);
16166                 gen_helper_dpaq_s_w_qh(v1_t, v2_t, t0, cpu_env);
16167                 break;
16168             case OPC_DPAQ_SA_L_PW:
16169                 check_dsp(ctx);
16170                 gen_helper_dpaq_sa_l_pw(v1_t, v2_t, t0, cpu_env);
16171                 break;
16172             case OPC_DPAU_H_OBL:
16173                 check_dsp(ctx);
16174                 gen_helper_dpau_h_obl(v1_t, v2_t, t0, cpu_env);
16175                 break;
16176             case OPC_DPAU_H_OBR:
16177                 check_dsp(ctx);
16178                 gen_helper_dpau_h_obr(v1_t, v2_t, t0, cpu_env);
16179                 break;
16180             case OPC_DPS_W_QH:
16181                 check_dspr2(ctx);
16182                 gen_helper_dps_w_qh(v1_t, v2_t, t0, cpu_env);
16183                 break;
16184             case OPC_DPSQ_S_W_QH:
16185                 check_dsp(ctx);
16186                 gen_helper_dpsq_s_w_qh(v1_t, v2_t, t0, cpu_env);
16187                 break;
16188             case OPC_DPSQ_SA_L_PW:
16189                 check_dsp(ctx);
16190                 gen_helper_dpsq_sa_l_pw(v1_t, v2_t, t0, cpu_env);
16191                 break;
16192             case OPC_DPSU_H_OBL:
16193                 check_dsp(ctx);
16194                 gen_helper_dpsu_h_obl(v1_t, v2_t, t0, cpu_env);
16195                 break;
16196             case OPC_DPSU_H_OBR:
16197                 check_dsp(ctx);
16198                 gen_helper_dpsu_h_obr(v1_t, v2_t, t0, cpu_env);
16199                 break;
16200             case OPC_MAQ_S_L_PWL:
16201                 check_dsp(ctx);
16202                 gen_helper_maq_s_l_pwl(v1_t, v2_t, t0, cpu_env);
16203                 break;
16204             case OPC_MAQ_S_L_PWR:
16205                 check_dsp(ctx);
16206                 gen_helper_maq_s_l_pwr(v1_t, v2_t, t0, cpu_env);
16207                 break;
16208             case OPC_MAQ_S_W_QHLL:
16209                 check_dsp(ctx);
16210                 gen_helper_maq_s_w_qhll(v1_t, v2_t, t0, cpu_env);
16211                 break;
16212             case OPC_MAQ_SA_W_QHLL:
16213                 check_dsp(ctx);
16214                 gen_helper_maq_sa_w_qhll(v1_t, v2_t, t0, cpu_env);
16215                 break;
16216             case OPC_MAQ_S_W_QHLR:
16217                 check_dsp(ctx);
16218                 gen_helper_maq_s_w_qhlr(v1_t, v2_t, t0, cpu_env);
16219                 break;
16220             case OPC_MAQ_SA_W_QHLR:
16221                 check_dsp(ctx);
16222                 gen_helper_maq_sa_w_qhlr(v1_t, v2_t, t0, cpu_env);
16223                 break;
16224             case OPC_MAQ_S_W_QHRL:
16225                 check_dsp(ctx);
16226                 gen_helper_maq_s_w_qhrl(v1_t, v2_t, t0, cpu_env);
16227                 break;
16228             case OPC_MAQ_SA_W_QHRL:
16229                 check_dsp(ctx);
16230                 gen_helper_maq_sa_w_qhrl(v1_t, v2_t, t0, cpu_env);
16231                 break;
16232             case OPC_MAQ_S_W_QHRR:
16233                 check_dsp(ctx);
16234                 gen_helper_maq_s_w_qhrr(v1_t, v2_t, t0, cpu_env);
16235                 break;
16236             case OPC_MAQ_SA_W_QHRR:
16237                 check_dsp(ctx);
16238                 gen_helper_maq_sa_w_qhrr(v1_t, v2_t, t0, cpu_env);
16239                 break;
16240             case OPC_MULSAQ_S_L_PW:
16241                 check_dsp(ctx);
16242                 gen_helper_mulsaq_s_l_pw(v1_t, v2_t, t0, cpu_env);
16243                 break;
16244             case OPC_MULSAQ_S_W_QH:
16245                 check_dsp(ctx);
16246                 gen_helper_mulsaq_s_w_qh(v1_t, v2_t, t0, cpu_env);
16247                 break;
16248             }
16249         }
16250         break;
16251 #endif
16252     case OPC_ADDU_QB_DSP:
16253         switch (op2) {
16254         case OPC_MULEU_S_PH_QBL:
16255             check_dsp(ctx);
16256             gen_helper_muleu_s_ph_qbl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
16257             break;
16258         case OPC_MULEU_S_PH_QBR:
16259             check_dsp(ctx);
16260             gen_helper_muleu_s_ph_qbr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
16261             break;
16262         case OPC_MULQ_RS_PH:
16263             check_dsp(ctx);
16264             gen_helper_mulq_rs_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
16265             break;
16266         case OPC_MULEQ_S_W_PHL:
16267             check_dsp(ctx);
16268             gen_helper_muleq_s_w_phl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
16269             break;
16270         case OPC_MULEQ_S_W_PHR:
16271             check_dsp(ctx);
16272             gen_helper_muleq_s_w_phr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
16273             break;
16274         case OPC_MULQ_S_PH:
16275             check_dspr2(ctx);
16276             gen_helper_mulq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
16277             break;
16278         }
16279         break;
16280 #ifdef TARGET_MIPS64
16281     case OPC_ADDU_OB_DSP:
16282         switch (op2) {
16283         case OPC_MULEQ_S_PW_QHL:
16284             check_dsp(ctx);
16285             gen_helper_muleq_s_pw_qhl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
16286             break;
16287         case OPC_MULEQ_S_PW_QHR:
16288             check_dsp(ctx);
16289             gen_helper_muleq_s_pw_qhr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
16290             break;
16291         case OPC_MULEU_S_QH_OBL:
16292             check_dsp(ctx);
16293             gen_helper_muleu_s_qh_obl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
16294             break;
16295         case OPC_MULEU_S_QH_OBR:
16296             check_dsp(ctx);
16297             gen_helper_muleu_s_qh_obr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
16298             break;
16299         case OPC_MULQ_RS_QH:
16300             check_dsp(ctx);
16301             gen_helper_mulq_rs_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
16302             break;
16303         }
16304         break;
16305 #endif
16306     }
16307
16308     tcg_temp_free_i32(t0);
16309     tcg_temp_free(v1_t);
16310     tcg_temp_free(v2_t);
16311 }
16312
16313 static void gen_mipsdsp_bitinsn(DisasContext *ctx, uint32_t op1, uint32_t op2,
16314                                 int ret, int val)
16315 {
16316     int16_t imm;
16317     TCGv t0;
16318     TCGv val_t;
16319
16320     if (ret == 0) {
16321         /* Treat as NOP. */
16322         return;
16323     }
16324
16325     t0 = tcg_temp_new();
16326     val_t = tcg_temp_new();
16327     gen_load_gpr(val_t, val);
16328
16329     switch (op1) {
16330     case OPC_ABSQ_S_PH_DSP:
16331         switch (op2) {
16332         case OPC_BITREV:
16333             check_dsp(ctx);
16334             gen_helper_bitrev(cpu_gpr[ret], val_t);
16335             break;
16336         case OPC_REPL_QB:
16337             check_dsp(ctx);
16338             {
16339                 target_long result;
16340                 imm = (ctx->opcode >> 16) & 0xFF;
16341                 result = (uint32_t)imm << 24 |
16342                          (uint32_t)imm << 16 |
16343                          (uint32_t)imm << 8  |
16344                          (uint32_t)imm;
16345                 result = (int32_t)result;
16346                 tcg_gen_movi_tl(cpu_gpr[ret], result);
16347             }
16348             break;
16349         case OPC_REPLV_QB:
16350             check_dsp(ctx);
16351             tcg_gen_ext8u_tl(cpu_gpr[ret], val_t);
16352             tcg_gen_shli_tl(t0, cpu_gpr[ret], 8);
16353             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
16354             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
16355             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
16356             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
16357             break;
16358         case OPC_REPL_PH:
16359             check_dsp(ctx);
16360             {
16361                 imm = (ctx->opcode >> 16) & 0x03FF;
16362                 imm = (int16_t)(imm << 6) >> 6;
16363                 tcg_gen_movi_tl(cpu_gpr[ret], \
16364                                 (target_long)((int32_t)imm << 16 | \
16365                                 (uint16_t)imm));
16366             }
16367             break;
16368         case OPC_REPLV_PH:
16369             check_dsp(ctx);
16370             tcg_gen_ext16u_tl(cpu_gpr[ret], val_t);
16371             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
16372             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
16373             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
16374             break;
16375         }
16376         break;
16377 #ifdef TARGET_MIPS64
16378     case OPC_ABSQ_S_QH_DSP:
16379         switch (op2) {
16380         case OPC_REPL_OB:
16381             check_dsp(ctx);
16382             {
16383                 target_long temp;
16384
16385                 imm = (ctx->opcode >> 16) & 0xFF;
16386                 temp = ((uint64_t)imm << 8) | (uint64_t)imm;
16387                 temp = (temp << 16) | temp;
16388                 temp = (temp << 32) | temp;
16389                 tcg_gen_movi_tl(cpu_gpr[ret], temp);
16390                 break;
16391             }
16392         case OPC_REPL_PW:
16393             check_dsp(ctx);
16394             {
16395                 target_long temp;
16396
16397                 imm = (ctx->opcode >> 16) & 0x03FF;
16398                 imm = (int16_t)(imm << 6) >> 6;
16399                 temp = ((target_long)imm << 32) \
16400                        | ((target_long)imm & 0xFFFFFFFF);
16401                 tcg_gen_movi_tl(cpu_gpr[ret], temp);
16402                 break;
16403             }
16404         case OPC_REPL_QH:
16405             check_dsp(ctx);
16406             {
16407                 target_long temp;
16408
16409                 imm = (ctx->opcode >> 16) & 0x03FF;
16410                 imm = (int16_t)(imm << 6) >> 6;
16411
16412                 temp = ((uint64_t)(uint16_t)imm << 48) |
16413                        ((uint64_t)(uint16_t)imm << 32) |
16414                        ((uint64_t)(uint16_t)imm << 16) |
16415                        (uint64_t)(uint16_t)imm;
16416                 tcg_gen_movi_tl(cpu_gpr[ret], temp);
16417                 break;
16418             }
16419         case OPC_REPLV_OB:
16420             check_dsp(ctx);
16421             tcg_gen_ext8u_tl(cpu_gpr[ret], val_t);
16422             tcg_gen_shli_tl(t0, cpu_gpr[ret], 8);
16423             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
16424             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
16425             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
16426             tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
16427             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
16428             break;
16429         case OPC_REPLV_PW:
16430             check_dsp(ctx);
16431             tcg_gen_ext32u_i64(cpu_gpr[ret], val_t);
16432             tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
16433             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
16434             break;
16435         case OPC_REPLV_QH:
16436             check_dsp(ctx);
16437             tcg_gen_ext16u_tl(cpu_gpr[ret], val_t);
16438             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
16439             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
16440             tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
16441             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
16442             break;
16443         }
16444         break;
16445 #endif
16446     }
16447     tcg_temp_free(t0);
16448     tcg_temp_free(val_t);
16449 }
16450
16451 static void gen_mipsdsp_add_cmp_pick(DisasContext *ctx,
16452                                      uint32_t op1, uint32_t op2,
16453                                      int ret, int v1, int v2, int check_ret)
16454 {
16455     TCGv t1;
16456     TCGv v1_t;
16457     TCGv v2_t;
16458
16459     if ((ret == 0) && (check_ret == 1)) {
16460         /* Treat as NOP. */
16461         return;
16462     }
16463
16464     t1 = tcg_temp_new();
16465     v1_t = tcg_temp_new();
16466     v2_t = tcg_temp_new();
16467
16468     gen_load_gpr(v1_t, v1);
16469     gen_load_gpr(v2_t, v2);
16470
16471     switch (op1) {
16472     case OPC_CMPU_EQ_QB_DSP:
16473         switch (op2) {
16474         case OPC_CMPU_EQ_QB:
16475             check_dsp(ctx);
16476             gen_helper_cmpu_eq_qb(v1_t, v2_t, cpu_env);
16477             break;
16478         case OPC_CMPU_LT_QB:
16479             check_dsp(ctx);
16480             gen_helper_cmpu_lt_qb(v1_t, v2_t, cpu_env);
16481             break;
16482         case OPC_CMPU_LE_QB:
16483             check_dsp(ctx);
16484             gen_helper_cmpu_le_qb(v1_t, v2_t, cpu_env);
16485             break;
16486         case OPC_CMPGU_EQ_QB:
16487             check_dsp(ctx);
16488             gen_helper_cmpgu_eq_qb(cpu_gpr[ret], v1_t, v2_t);
16489             break;
16490         case OPC_CMPGU_LT_QB:
16491             check_dsp(ctx);
16492             gen_helper_cmpgu_lt_qb(cpu_gpr[ret], v1_t, v2_t);
16493             break;
16494         case OPC_CMPGU_LE_QB:
16495             check_dsp(ctx);
16496             gen_helper_cmpgu_le_qb(cpu_gpr[ret], v1_t, v2_t);
16497             break;
16498         case OPC_CMPGDU_EQ_QB:
16499             check_dspr2(ctx);
16500             gen_helper_cmpgu_eq_qb(t1, v1_t, v2_t);
16501             tcg_gen_mov_tl(cpu_gpr[ret], t1);
16502             tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
16503             tcg_gen_shli_tl(t1, t1, 24);
16504             tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
16505             break;
16506         case OPC_CMPGDU_LT_QB:
16507             check_dspr2(ctx);
16508             gen_helper_cmpgu_lt_qb(t1, v1_t, v2_t);
16509             tcg_gen_mov_tl(cpu_gpr[ret], t1);
16510             tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
16511             tcg_gen_shli_tl(t1, t1, 24);
16512             tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
16513             break;
16514         case OPC_CMPGDU_LE_QB:
16515             check_dspr2(ctx);
16516             gen_helper_cmpgu_le_qb(t1, v1_t, v2_t);
16517             tcg_gen_mov_tl(cpu_gpr[ret], t1);
16518             tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
16519             tcg_gen_shli_tl(t1, t1, 24);
16520             tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
16521             break;
16522         case OPC_CMP_EQ_PH:
16523             check_dsp(ctx);
16524             gen_helper_cmp_eq_ph(v1_t, v2_t, cpu_env);
16525             break;
16526         case OPC_CMP_LT_PH:
16527             check_dsp(ctx);
16528             gen_helper_cmp_lt_ph(v1_t, v2_t, cpu_env);
16529             break;
16530         case OPC_CMP_LE_PH:
16531             check_dsp(ctx);
16532             gen_helper_cmp_le_ph(v1_t, v2_t, cpu_env);
16533             break;
16534         case OPC_PICK_QB:
16535             check_dsp(ctx);
16536             gen_helper_pick_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
16537             break;
16538         case OPC_PICK_PH:
16539             check_dsp(ctx);
16540             gen_helper_pick_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
16541             break;
16542         case OPC_PACKRL_PH:
16543             check_dsp(ctx);
16544             gen_helper_packrl_ph(cpu_gpr[ret], v1_t, v2_t);
16545             break;
16546         }
16547         break;
16548 #ifdef TARGET_MIPS64
16549     case OPC_CMPU_EQ_OB_DSP:
16550         switch (op2) {
16551         case OPC_CMP_EQ_PW:
16552             check_dsp(ctx);
16553             gen_helper_cmp_eq_pw(v1_t, v2_t, cpu_env);
16554             break;
16555         case OPC_CMP_LT_PW:
16556             check_dsp(ctx);
16557             gen_helper_cmp_lt_pw(v1_t, v2_t, cpu_env);
16558             break;
16559         case OPC_CMP_LE_PW:
16560             check_dsp(ctx);
16561             gen_helper_cmp_le_pw(v1_t, v2_t, cpu_env);
16562             break;
16563         case OPC_CMP_EQ_QH:
16564             check_dsp(ctx);
16565             gen_helper_cmp_eq_qh(v1_t, v2_t, cpu_env);
16566             break;
16567         case OPC_CMP_LT_QH:
16568             check_dsp(ctx);
16569             gen_helper_cmp_lt_qh(v1_t, v2_t, cpu_env);
16570             break;
16571         case OPC_CMP_LE_QH:
16572             check_dsp(ctx);
16573             gen_helper_cmp_le_qh(v1_t, v2_t, cpu_env);
16574             break;
16575         case OPC_CMPGDU_EQ_OB:
16576             check_dspr2(ctx);
16577             gen_helper_cmpgdu_eq_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
16578             break;
16579         case OPC_CMPGDU_LT_OB:
16580             check_dspr2(ctx);
16581             gen_helper_cmpgdu_lt_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
16582             break;
16583         case OPC_CMPGDU_LE_OB:
16584             check_dspr2(ctx);
16585             gen_helper_cmpgdu_le_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
16586             break;
16587         case OPC_CMPGU_EQ_OB:
16588             check_dsp(ctx);
16589             gen_helper_cmpgu_eq_ob(cpu_gpr[ret], v1_t, v2_t);
16590             break;
16591         case OPC_CMPGU_LT_OB:
16592             check_dsp(ctx);
16593             gen_helper_cmpgu_lt_ob(cpu_gpr[ret], v1_t, v2_t);
16594             break;
16595         case OPC_CMPGU_LE_OB:
16596             check_dsp(ctx);
16597             gen_helper_cmpgu_le_ob(cpu_gpr[ret], v1_t, v2_t);
16598             break;
16599         case OPC_CMPU_EQ_OB:
16600             check_dsp(ctx);
16601             gen_helper_cmpu_eq_ob(v1_t, v2_t, cpu_env);
16602             break;
16603         case OPC_CMPU_LT_OB:
16604             check_dsp(ctx);
16605             gen_helper_cmpu_lt_ob(v1_t, v2_t, cpu_env);
16606             break;
16607         case OPC_CMPU_LE_OB:
16608             check_dsp(ctx);
16609             gen_helper_cmpu_le_ob(v1_t, v2_t, cpu_env);
16610             break;
16611         case OPC_PACKRL_PW:
16612             check_dsp(ctx);
16613             gen_helper_packrl_pw(cpu_gpr[ret], v1_t, v2_t);
16614             break;
16615         case OPC_PICK_OB:
16616             check_dsp(ctx);
16617             gen_helper_pick_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
16618             break;
16619         case OPC_PICK_PW:
16620             check_dsp(ctx);
16621             gen_helper_pick_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
16622             break;
16623         case OPC_PICK_QH:
16624             check_dsp(ctx);
16625             gen_helper_pick_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
16626             break;
16627         }
16628         break;
16629 #endif
16630     }
16631
16632     tcg_temp_free(t1);
16633     tcg_temp_free(v1_t);
16634     tcg_temp_free(v2_t);
16635 }
16636
16637 static void gen_mipsdsp_append(CPUMIPSState *env, DisasContext *ctx,
16638                                uint32_t op1, int rt, int rs, int sa)
16639 {
16640     TCGv t0;
16641
16642     check_dspr2(ctx);
16643
16644     if (rt == 0) {
16645         /* Treat as NOP. */
16646         return;
16647     }
16648
16649     t0 = tcg_temp_new();
16650     gen_load_gpr(t0, rs);
16651
16652     switch (op1) {
16653     case OPC_APPEND_DSP:
16654         switch (MASK_APPEND(ctx->opcode)) {
16655         case OPC_APPEND:
16656             if (sa != 0) {
16657                 tcg_gen_deposit_tl(cpu_gpr[rt], t0, cpu_gpr[rt], sa, 32 - sa);
16658             }
16659             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
16660             break;
16661         case OPC_PREPEND:
16662             if (sa != 0) {
16663                 tcg_gen_ext32u_tl(cpu_gpr[rt], cpu_gpr[rt]);
16664                 tcg_gen_shri_tl(cpu_gpr[rt], cpu_gpr[rt], sa);
16665                 tcg_gen_shli_tl(t0, t0, 32 - sa);
16666                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
16667             }
16668             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
16669             break;
16670         case OPC_BALIGN:
16671             sa &= 3;
16672             if (sa != 0 && sa != 2) {
16673                 tcg_gen_shli_tl(cpu_gpr[rt], cpu_gpr[rt], 8 * sa);
16674                 tcg_gen_ext32u_tl(t0, t0);
16675                 tcg_gen_shri_tl(t0, t0, 8 * (4 - sa));
16676                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
16677             }
16678             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
16679             break;
16680         default:            /* Invalid */
16681             MIPS_INVAL("MASK APPEND");
16682             generate_exception_end(ctx, EXCP_RI);
16683             break;
16684         }
16685         break;
16686 #ifdef TARGET_MIPS64
16687     case OPC_DAPPEND_DSP:
16688         switch (MASK_DAPPEND(ctx->opcode)) {
16689         case OPC_DAPPEND:
16690             if (sa != 0) {
16691                 tcg_gen_deposit_tl(cpu_gpr[rt], t0, cpu_gpr[rt], sa, 64 - sa);
16692             }
16693             break;
16694         case OPC_PREPENDD:
16695             tcg_gen_shri_tl(cpu_gpr[rt], cpu_gpr[rt], 0x20 | sa);
16696             tcg_gen_shli_tl(t0, t0, 64 - (0x20 | sa));
16697             tcg_gen_or_tl(cpu_gpr[rt], t0, t0);
16698             break;
16699         case OPC_PREPENDW:
16700             if (sa != 0) {
16701                 tcg_gen_shri_tl(cpu_gpr[rt], cpu_gpr[rt], sa);
16702                 tcg_gen_shli_tl(t0, t0, 64 - sa);
16703                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
16704             }
16705             break;
16706         case OPC_DBALIGN:
16707             sa &= 7;
16708             if (sa != 0 && sa != 2 && sa != 4) {
16709                 tcg_gen_shli_tl(cpu_gpr[rt], cpu_gpr[rt], 8 * sa);
16710                 tcg_gen_shri_tl(t0, t0, 8 * (8 - sa));
16711                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
16712             }
16713             break;
16714         default:            /* Invalid */
16715             MIPS_INVAL("MASK DAPPEND");
16716             generate_exception_end(ctx, EXCP_RI);
16717             break;
16718         }
16719         break;
16720 #endif
16721     }
16722     tcg_temp_free(t0);
16723 }
16724
16725 static void gen_mipsdsp_accinsn(DisasContext *ctx, uint32_t op1, uint32_t op2,
16726                                 int ret, int v1, int v2, int check_ret)
16727
16728 {
16729     TCGv t0;
16730     TCGv t1;
16731     TCGv v1_t;
16732     TCGv v2_t;
16733     int16_t imm;
16734
16735     if ((ret == 0) && (check_ret == 1)) {
16736         /* Treat as NOP. */
16737         return;
16738     }
16739
16740     t0 = tcg_temp_new();
16741     t1 = tcg_temp_new();
16742     v1_t = tcg_temp_new();
16743     v2_t = tcg_temp_new();
16744
16745     gen_load_gpr(v1_t, v1);
16746     gen_load_gpr(v2_t, v2);
16747
16748     switch (op1) {
16749     case OPC_EXTR_W_DSP:
16750         check_dsp(ctx);
16751         switch (op2) {
16752         case OPC_EXTR_W:
16753             tcg_gen_movi_tl(t0, v2);
16754             tcg_gen_movi_tl(t1, v1);
16755             gen_helper_extr_w(cpu_gpr[ret], t0, t1, cpu_env);
16756             break;
16757         case OPC_EXTR_R_W:
16758             tcg_gen_movi_tl(t0, v2);
16759             tcg_gen_movi_tl(t1, v1);
16760             gen_helper_extr_r_w(cpu_gpr[ret], t0, t1, cpu_env);
16761             break;
16762         case OPC_EXTR_RS_W:
16763             tcg_gen_movi_tl(t0, v2);
16764             tcg_gen_movi_tl(t1, v1);
16765             gen_helper_extr_rs_w(cpu_gpr[ret], t0, t1, cpu_env);
16766             break;
16767         case OPC_EXTR_S_H:
16768             tcg_gen_movi_tl(t0, v2);
16769             tcg_gen_movi_tl(t1, v1);
16770             gen_helper_extr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
16771             break;
16772         case OPC_EXTRV_S_H:
16773             tcg_gen_movi_tl(t0, v2);
16774             gen_helper_extr_s_h(cpu_gpr[ret], t0, v1_t, cpu_env);
16775             break;
16776         case OPC_EXTRV_W:
16777             tcg_gen_movi_tl(t0, v2);
16778             gen_helper_extr_w(cpu_gpr[ret], t0, v1_t, cpu_env);
16779             break;
16780         case OPC_EXTRV_R_W:
16781             tcg_gen_movi_tl(t0, v2);
16782             gen_helper_extr_r_w(cpu_gpr[ret], t0, v1_t, cpu_env);
16783             break;
16784         case OPC_EXTRV_RS_W:
16785             tcg_gen_movi_tl(t0, v2);
16786             gen_helper_extr_rs_w(cpu_gpr[ret], t0, v1_t, cpu_env);
16787             break;
16788         case OPC_EXTP:
16789             tcg_gen_movi_tl(t0, v2);
16790             tcg_gen_movi_tl(t1, v1);
16791             gen_helper_extp(cpu_gpr[ret], t0, t1, cpu_env);
16792             break;
16793         case OPC_EXTPV:
16794             tcg_gen_movi_tl(t0, v2);
16795             gen_helper_extp(cpu_gpr[ret], t0, v1_t, cpu_env);
16796             break;
16797         case OPC_EXTPDP:
16798             tcg_gen_movi_tl(t0, v2);
16799             tcg_gen_movi_tl(t1, v1);
16800             gen_helper_extpdp(cpu_gpr[ret], t0, t1, cpu_env);
16801             break;
16802         case OPC_EXTPDPV:
16803             tcg_gen_movi_tl(t0, v2);
16804             gen_helper_extpdp(cpu_gpr[ret], t0, v1_t, cpu_env);
16805             break;
16806         case OPC_SHILO:
16807             imm = (ctx->opcode >> 20) & 0x3F;
16808             tcg_gen_movi_tl(t0, ret);
16809             tcg_gen_movi_tl(t1, imm);
16810             gen_helper_shilo(t0, t1, cpu_env);
16811             break;
16812         case OPC_SHILOV:
16813             tcg_gen_movi_tl(t0, ret);
16814             gen_helper_shilo(t0, v1_t, cpu_env);
16815             break;
16816         case OPC_MTHLIP:
16817             tcg_gen_movi_tl(t0, ret);
16818             gen_helper_mthlip(t0, v1_t, cpu_env);
16819             break;
16820         case OPC_WRDSP:
16821             imm = (ctx->opcode >> 11) & 0x3FF;
16822             tcg_gen_movi_tl(t0, imm);
16823             gen_helper_wrdsp(v1_t, t0, cpu_env);
16824             break;
16825         case OPC_RDDSP:
16826             imm = (ctx->opcode >> 16) & 0x03FF;
16827             tcg_gen_movi_tl(t0, imm);
16828             gen_helper_rddsp(cpu_gpr[ret], t0, cpu_env);
16829             break;
16830         }
16831         break;
16832 #ifdef TARGET_MIPS64
16833     case OPC_DEXTR_W_DSP:
16834         check_dsp(ctx);
16835         switch (op2) {
16836         case OPC_DMTHLIP:
16837             tcg_gen_movi_tl(t0, ret);
16838             gen_helper_dmthlip(v1_t, t0, cpu_env);
16839             break;
16840         case OPC_DSHILO:
16841             {
16842                 int shift = (ctx->opcode >> 19) & 0x7F;
16843                 int ac = (ctx->opcode >> 11) & 0x03;
16844                 tcg_gen_movi_tl(t0, shift);
16845                 tcg_gen_movi_tl(t1, ac);
16846                 gen_helper_dshilo(t0, t1, cpu_env);
16847                 break;
16848             }
16849         case OPC_DSHILOV:
16850             {
16851                 int ac = (ctx->opcode >> 11) & 0x03;
16852                 tcg_gen_movi_tl(t0, ac);
16853                 gen_helper_dshilo(v1_t, t0, cpu_env);
16854                 break;
16855             }
16856         case OPC_DEXTP:
16857             tcg_gen_movi_tl(t0, v2);
16858             tcg_gen_movi_tl(t1, v1);
16859
16860             gen_helper_dextp(cpu_gpr[ret], t0, t1, cpu_env);
16861             break;
16862         case OPC_DEXTPV:
16863             tcg_gen_movi_tl(t0, v2);
16864             gen_helper_dextp(cpu_gpr[ret], t0, v1_t, cpu_env);
16865             break;
16866         case OPC_DEXTPDP:
16867             tcg_gen_movi_tl(t0, v2);
16868             tcg_gen_movi_tl(t1, v1);
16869             gen_helper_dextpdp(cpu_gpr[ret], t0, t1, cpu_env);
16870             break;
16871         case OPC_DEXTPDPV:
16872             tcg_gen_movi_tl(t0, v2);
16873             gen_helper_dextpdp(cpu_gpr[ret], t0, v1_t, cpu_env);
16874             break;
16875         case OPC_DEXTR_L:
16876             tcg_gen_movi_tl(t0, v2);
16877             tcg_gen_movi_tl(t1, v1);
16878             gen_helper_dextr_l(cpu_gpr[ret], t0, t1, cpu_env);
16879             break;
16880         case OPC_DEXTR_R_L:
16881             tcg_gen_movi_tl(t0, v2);
16882             tcg_gen_movi_tl(t1, v1);
16883             gen_helper_dextr_r_l(cpu_gpr[ret], t0, t1, cpu_env);
16884             break;
16885         case OPC_DEXTR_RS_L:
16886             tcg_gen_movi_tl(t0, v2);
16887             tcg_gen_movi_tl(t1, v1);
16888             gen_helper_dextr_rs_l(cpu_gpr[ret], t0, t1, cpu_env);
16889             break;
16890         case OPC_DEXTR_W:
16891             tcg_gen_movi_tl(t0, v2);
16892             tcg_gen_movi_tl(t1, v1);
16893             gen_helper_dextr_w(cpu_gpr[ret], t0, t1, cpu_env);
16894             break;
16895         case OPC_DEXTR_R_W:
16896             tcg_gen_movi_tl(t0, v2);
16897             tcg_gen_movi_tl(t1, v1);
16898             gen_helper_dextr_r_w(cpu_gpr[ret], t0, t1, cpu_env);
16899             break;
16900         case OPC_DEXTR_RS_W:
16901             tcg_gen_movi_tl(t0, v2);
16902             tcg_gen_movi_tl(t1, v1);
16903             gen_helper_dextr_rs_w(cpu_gpr[ret], t0, t1, cpu_env);
16904             break;
16905         case OPC_DEXTR_S_H:
16906             tcg_gen_movi_tl(t0, v2);
16907             tcg_gen_movi_tl(t1, v1);
16908             gen_helper_dextr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
16909             break;
16910         case OPC_DEXTRV_S_H:
16911             tcg_gen_movi_tl(t0, v2);
16912             tcg_gen_movi_tl(t1, v1);
16913             gen_helper_dextr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
16914             break;
16915         case OPC_DEXTRV_L:
16916             tcg_gen_movi_tl(t0, v2);
16917             gen_helper_dextr_l(cpu_gpr[ret], t0, v1_t, cpu_env);
16918             break;
16919         case OPC_DEXTRV_R_L:
16920             tcg_gen_movi_tl(t0, v2);
16921             gen_helper_dextr_r_l(cpu_gpr[ret], t0, v1_t, cpu_env);
16922             break;
16923         case OPC_DEXTRV_RS_L:
16924             tcg_gen_movi_tl(t0, v2);
16925             gen_helper_dextr_rs_l(cpu_gpr[ret], t0, v1_t, cpu_env);
16926             break;
16927         case OPC_DEXTRV_W:
16928             tcg_gen_movi_tl(t0, v2);
16929             gen_helper_dextr_w(cpu_gpr[ret], t0, v1_t, cpu_env);
16930             break;
16931         case OPC_DEXTRV_R_W:
16932             tcg_gen_movi_tl(t0, v2);
16933             gen_helper_dextr_r_w(cpu_gpr[ret], t0, v1_t, cpu_env);
16934             break;
16935         case OPC_DEXTRV_RS_W:
16936             tcg_gen_movi_tl(t0, v2);
16937             gen_helper_dextr_rs_w(cpu_gpr[ret], t0, v1_t, cpu_env);
16938             break;
16939         }
16940         break;
16941 #endif
16942     }
16943
16944     tcg_temp_free(t0);
16945     tcg_temp_free(t1);
16946     tcg_temp_free(v1_t);
16947     tcg_temp_free(v2_t);
16948 }
16949
16950 /* End MIPSDSP functions. */
16951
16952 static void decode_opc_special_r6(CPUMIPSState *env, DisasContext *ctx)
16953 {
16954     int rs, rt, rd, sa;
16955     uint32_t op1, op2;
16956
16957     rs = (ctx->opcode >> 21) & 0x1f;
16958     rt = (ctx->opcode >> 16) & 0x1f;
16959     rd = (ctx->opcode >> 11) & 0x1f;
16960     sa = (ctx->opcode >> 6) & 0x1f;
16961
16962     op1 = MASK_SPECIAL(ctx->opcode);
16963     switch (op1) {
16964     case OPC_LSA:
16965         gen_lsa(ctx, op1, rd, rs, rt, extract32(ctx->opcode, 6, 2));
16966         break;
16967     case OPC_MULT ... OPC_DIVU:
16968         op2 = MASK_R6_MULDIV(ctx->opcode);
16969         switch (op2) {
16970         case R6_OPC_MUL:
16971         case R6_OPC_MUH:
16972         case R6_OPC_MULU:
16973         case R6_OPC_MUHU:
16974         case R6_OPC_DIV:
16975         case R6_OPC_MOD:
16976         case R6_OPC_DIVU:
16977         case R6_OPC_MODU:
16978             gen_r6_muldiv(ctx, op2, rd, rs, rt);
16979             break;
16980         default:
16981             MIPS_INVAL("special_r6 muldiv");
16982             generate_exception_end(ctx, EXCP_RI);
16983             break;
16984         }
16985         break;
16986     case OPC_SELEQZ:
16987     case OPC_SELNEZ:
16988         gen_cond_move(ctx, op1, rd, rs, rt);
16989         break;
16990     case R6_OPC_CLO:
16991     case R6_OPC_CLZ:
16992         if (rt == 0 && sa == 1) {
16993             /* Major opcode and function field is shared with preR6 MFHI/MTHI.
16994                We need additionally to check other fields */
16995             gen_cl(ctx, op1, rd, rs);
16996         } else {
16997             generate_exception_end(ctx, EXCP_RI);
16998         }
16999         break;
17000     case R6_OPC_SDBBP:
17001         if (is_uhi(extract32(ctx->opcode, 6, 20))) {
17002             gen_helper_do_semihosting(cpu_env);
17003         } else {
17004             if (ctx->hflags & MIPS_HFLAG_SBRI) {
17005                 generate_exception_end(ctx, EXCP_RI);
17006             } else {
17007                 generate_exception_end(ctx, EXCP_DBp);
17008             }
17009         }
17010         break;
17011 #if defined(TARGET_MIPS64)
17012     case OPC_DLSA:
17013         check_mips_64(ctx);
17014         gen_lsa(ctx, op1, rd, rs, rt, extract32(ctx->opcode, 6, 2));
17015         break;
17016     case R6_OPC_DCLO:
17017     case R6_OPC_DCLZ:
17018         if (rt == 0 && sa == 1) {
17019             /* Major opcode and function field is shared with preR6 MFHI/MTHI.
17020                We need additionally to check other fields */
17021             check_mips_64(ctx);
17022             gen_cl(ctx, op1, rd, rs);
17023         } else {
17024             generate_exception_end(ctx, EXCP_RI);
17025         }
17026         break;
17027     case OPC_DMULT ... OPC_DDIVU:
17028         op2 = MASK_R6_MULDIV(ctx->opcode);
17029         switch (op2) {
17030         case R6_OPC_DMUL:
17031         case R6_OPC_DMUH:
17032         case R6_OPC_DMULU:
17033         case R6_OPC_DMUHU:
17034         case R6_OPC_DDIV:
17035         case R6_OPC_DMOD:
17036         case R6_OPC_DDIVU:
17037         case R6_OPC_DMODU:
17038             check_mips_64(ctx);
17039             gen_r6_muldiv(ctx, op2, rd, rs, rt);
17040             break;
17041         default:
17042             MIPS_INVAL("special_r6 muldiv");
17043             generate_exception_end(ctx, EXCP_RI);
17044             break;
17045         }
17046         break;
17047 #endif
17048     default:            /* Invalid */
17049         MIPS_INVAL("special_r6");
17050         generate_exception_end(ctx, EXCP_RI);
17051         break;
17052     }
17053 }
17054
17055 static void decode_opc_special_legacy(CPUMIPSState *env, DisasContext *ctx)
17056 {
17057     int rs, rt, rd, sa;
17058     uint32_t op1;
17059
17060     rs = (ctx->opcode >> 21) & 0x1f;
17061     rt = (ctx->opcode >> 16) & 0x1f;
17062     rd = (ctx->opcode >> 11) & 0x1f;
17063     sa = (ctx->opcode >> 6) & 0x1f;
17064
17065     op1 = MASK_SPECIAL(ctx->opcode);
17066     switch (op1) {
17067     case OPC_MOVN:         /* Conditional move */
17068     case OPC_MOVZ:
17069         check_insn(ctx, ISA_MIPS4 | ISA_MIPS32 |
17070                    INSN_LOONGSON2E | INSN_LOONGSON2F);
17071         gen_cond_move(ctx, op1, rd, rs, rt);
17072         break;
17073     case OPC_MFHI:          /* Move from HI/LO */
17074     case OPC_MFLO:
17075         gen_HILO(ctx, op1, rs & 3, rd);
17076         break;
17077     case OPC_MTHI:
17078     case OPC_MTLO:          /* Move to HI/LO */
17079         gen_HILO(ctx, op1, rd & 3, rs);
17080         break;
17081     case OPC_MOVCI:
17082         check_insn(ctx, ISA_MIPS4 | ISA_MIPS32);
17083         if (env->CP0_Config1 & (1 << CP0C1_FP)) {
17084             check_cp1_enabled(ctx);
17085             gen_movci(ctx, rd, rs, (ctx->opcode >> 18) & 0x7,
17086                       (ctx->opcode >> 16) & 1);
17087         } else {
17088             generate_exception_err(ctx, EXCP_CpU, 1);
17089         }
17090         break;
17091     case OPC_MULT:
17092     case OPC_MULTU:
17093         if (sa) {
17094             check_insn(ctx, INSN_VR54XX);
17095             op1 = MASK_MUL_VR54XX(ctx->opcode);
17096             gen_mul_vr54xx(ctx, op1, rd, rs, rt);
17097         } else {
17098             gen_muldiv(ctx, op1, rd & 3, rs, rt);
17099         }
17100         break;
17101     case OPC_DIV:
17102     case OPC_DIVU:
17103         gen_muldiv(ctx, op1, 0, rs, rt);
17104         break;
17105 #if defined(TARGET_MIPS64)
17106     case OPC_DMULT ... OPC_DDIVU:
17107         check_insn(ctx, ISA_MIPS3);
17108         check_mips_64(ctx);
17109         gen_muldiv(ctx, op1, 0, rs, rt);
17110         break;
17111 #endif
17112     case OPC_JR:
17113         gen_compute_branch(ctx, op1, 4, rs, rd, sa, 4);
17114         break;
17115     case OPC_SPIM:
17116 #ifdef MIPS_STRICT_STANDARD
17117         MIPS_INVAL("SPIM");
17118         generate_exception_end(ctx, EXCP_RI);
17119 #else
17120         /* Implemented as RI exception for now. */
17121         MIPS_INVAL("spim (unofficial)");
17122         generate_exception_end(ctx, EXCP_RI);
17123 #endif
17124         break;
17125     default:            /* Invalid */
17126         MIPS_INVAL("special_legacy");
17127         generate_exception_end(ctx, EXCP_RI);
17128         break;
17129     }
17130 }
17131
17132 static void decode_opc_special(CPUMIPSState *env, DisasContext *ctx)
17133 {
17134     int rs, rt, rd, sa;
17135     uint32_t op1;
17136
17137     rs = (ctx->opcode >> 21) & 0x1f;
17138     rt = (ctx->opcode >> 16) & 0x1f;
17139     rd = (ctx->opcode >> 11) & 0x1f;
17140     sa = (ctx->opcode >> 6) & 0x1f;
17141
17142     op1 = MASK_SPECIAL(ctx->opcode);
17143     switch (op1) {
17144     case OPC_SLL:          /* Shift with immediate */
17145         if (sa == 5 && rd == 0 &&
17146             rs == 0 && rt == 0) { /* PAUSE */
17147             if ((ctx->insn_flags & ISA_MIPS32R6) &&
17148                 (ctx->hflags & MIPS_HFLAG_BMASK)) {
17149                 generate_exception_end(ctx, EXCP_RI);
17150                 break;
17151             }
17152         }
17153         /* Fallthrough */
17154     case OPC_SRA:
17155         gen_shift_imm(ctx, op1, rd, rt, sa);
17156         break;
17157     case OPC_SRL:
17158         switch ((ctx->opcode >> 21) & 0x1f) {
17159         case 1:
17160             /* rotr is decoded as srl on non-R2 CPUs */
17161             if (ctx->insn_flags & ISA_MIPS32R2) {
17162                 op1 = OPC_ROTR;
17163             }
17164             /* Fallthrough */
17165         case 0:
17166             gen_shift_imm(ctx, op1, rd, rt, sa);
17167             break;
17168         default:
17169             generate_exception_end(ctx, EXCP_RI);
17170             break;
17171         }
17172         break;
17173     case OPC_ADD ... OPC_SUBU:
17174         gen_arith(ctx, op1, rd, rs, rt);
17175         break;
17176     case OPC_SLLV:         /* Shifts */
17177     case OPC_SRAV:
17178         gen_shift(ctx, op1, rd, rs, rt);
17179         break;
17180     case OPC_SRLV:
17181         switch ((ctx->opcode >> 6) & 0x1f) {
17182         case 1:
17183             /* rotrv is decoded as srlv on non-R2 CPUs */
17184             if (ctx->insn_flags & ISA_MIPS32R2) {
17185                 op1 = OPC_ROTRV;
17186             }
17187             /* Fallthrough */
17188         case 0:
17189             gen_shift(ctx, op1, rd, rs, rt);
17190             break;
17191         default:
17192             generate_exception_end(ctx, EXCP_RI);
17193             break;
17194         }
17195         break;
17196     case OPC_SLT:          /* Set on less than */
17197     case OPC_SLTU:
17198         gen_slt(ctx, op1, rd, rs, rt);
17199         break;
17200     case OPC_AND:          /* Logic*/
17201     case OPC_OR:
17202     case OPC_NOR:
17203     case OPC_XOR:
17204         gen_logic(ctx, op1, rd, rs, rt);
17205         break;
17206     case OPC_JALR:
17207         gen_compute_branch(ctx, op1, 4, rs, rd, sa, 4);
17208         break;
17209     case OPC_TGE ... OPC_TEQ: /* Traps */
17210     case OPC_TNE:
17211         check_insn(ctx, ISA_MIPS2);
17212         gen_trap(ctx, op1, rs, rt, -1);
17213         break;
17214     case OPC_LSA: /* OPC_PMON */
17215         if ((ctx->insn_flags & ISA_MIPS32R6) ||
17216             (env->CP0_Config3 & (1 << CP0C3_MSAP))) {
17217             decode_opc_special_r6(env, ctx);
17218         } else {
17219             /* Pmon entry point, also R4010 selsl */
17220 #ifdef MIPS_STRICT_STANDARD
17221             MIPS_INVAL("PMON / selsl");
17222             generate_exception_end(ctx, EXCP_RI);
17223 #else
17224             gen_helper_0e0i(pmon, sa);
17225 #endif
17226         }
17227         break;
17228     case OPC_SYSCALL:
17229         generate_exception_end(ctx, EXCP_SYSCALL);
17230         break;
17231     case OPC_BREAK:
17232         generate_exception_end(ctx, EXCP_BREAK);
17233         break;
17234     case OPC_SYNC:
17235         check_insn(ctx, ISA_MIPS2);
17236         gen_sync(extract32(ctx->opcode, 6, 5));
17237         break;
17238
17239 #if defined(TARGET_MIPS64)
17240         /* MIPS64 specific opcodes */
17241     case OPC_DSLL:
17242     case OPC_DSRA:
17243     case OPC_DSLL32:
17244     case OPC_DSRA32:
17245         check_insn(ctx, ISA_MIPS3);
17246         check_mips_64(ctx);
17247         gen_shift_imm(ctx, op1, rd, rt, sa);
17248         break;
17249     case OPC_DSRL:
17250         switch ((ctx->opcode >> 21) & 0x1f) {
17251         case 1:
17252             /* drotr is decoded as dsrl on non-R2 CPUs */
17253             if (ctx->insn_flags & ISA_MIPS32R2) {
17254                 op1 = OPC_DROTR;
17255             }
17256             /* Fallthrough */
17257         case 0:
17258             check_insn(ctx, ISA_MIPS3);
17259             check_mips_64(ctx);
17260             gen_shift_imm(ctx, op1, rd, rt, sa);
17261             break;
17262         default:
17263             generate_exception_end(ctx, EXCP_RI);
17264             break;
17265         }
17266         break;
17267     case OPC_DSRL32:
17268         switch ((ctx->opcode >> 21) & 0x1f) {
17269         case 1:
17270             /* drotr32 is decoded as dsrl32 on non-R2 CPUs */
17271             if (ctx->insn_flags & ISA_MIPS32R2) {
17272                 op1 = OPC_DROTR32;
17273             }
17274             /* Fallthrough */
17275         case 0:
17276             check_insn(ctx, ISA_MIPS3);
17277             check_mips_64(ctx);
17278             gen_shift_imm(ctx, op1, rd, rt, sa);
17279             break;
17280         default:
17281             generate_exception_end(ctx, EXCP_RI);
17282             break;
17283         }
17284         break;
17285     case OPC_DADD ... OPC_DSUBU:
17286         check_insn(ctx, ISA_MIPS3);
17287         check_mips_64(ctx);
17288         gen_arith(ctx, op1, rd, rs, rt);
17289         break;
17290     case OPC_DSLLV:
17291     case OPC_DSRAV:
17292         check_insn(ctx, ISA_MIPS3);
17293         check_mips_64(ctx);
17294         gen_shift(ctx, op1, rd, rs, rt);
17295         break;
17296     case OPC_DSRLV:
17297         switch ((ctx->opcode >> 6) & 0x1f) {
17298         case 1:
17299             /* drotrv is decoded as dsrlv on non-R2 CPUs */
17300             if (ctx->insn_flags & ISA_MIPS32R2) {
17301                 op1 = OPC_DROTRV;
17302             }
17303             /* Fallthrough */
17304         case 0:
17305             check_insn(ctx, ISA_MIPS3);
17306             check_mips_64(ctx);
17307             gen_shift(ctx, op1, rd, rs, rt);
17308             break;
17309         default:
17310             generate_exception_end(ctx, EXCP_RI);
17311             break;
17312         }
17313         break;
17314     case OPC_DLSA:
17315         if ((ctx->insn_flags & ISA_MIPS32R6) ||
17316             (env->CP0_Config3 & (1 << CP0C3_MSAP))) {
17317             decode_opc_special_r6(env, ctx);
17318         }
17319         break;
17320 #endif
17321     default:
17322         if (ctx->insn_flags & ISA_MIPS32R6) {
17323             decode_opc_special_r6(env, ctx);
17324         } else {
17325             decode_opc_special_legacy(env, ctx);
17326         }
17327     }
17328 }
17329
17330 static void decode_opc_special2_legacy(CPUMIPSState *env, DisasContext *ctx)
17331 {
17332     int rs, rt, rd;
17333     uint32_t op1;
17334
17335     check_insn_opc_removed(ctx, ISA_MIPS32R6);
17336
17337     rs = (ctx->opcode >> 21) & 0x1f;
17338     rt = (ctx->opcode >> 16) & 0x1f;
17339     rd = (ctx->opcode >> 11) & 0x1f;
17340
17341     op1 = MASK_SPECIAL2(ctx->opcode);
17342     switch (op1) {
17343     case OPC_MADD ... OPC_MADDU: /* Multiply and add/sub */
17344     case OPC_MSUB ... OPC_MSUBU:
17345         check_insn(ctx, ISA_MIPS32);
17346         gen_muldiv(ctx, op1, rd & 3, rs, rt);
17347         break;
17348     case OPC_MUL:
17349         gen_arith(ctx, op1, rd, rs, rt);
17350         break;
17351     case OPC_DIV_G_2F:
17352     case OPC_DIVU_G_2F:
17353     case OPC_MULT_G_2F:
17354     case OPC_MULTU_G_2F:
17355     case OPC_MOD_G_2F:
17356     case OPC_MODU_G_2F:
17357         check_insn(ctx, INSN_LOONGSON2F);
17358         gen_loongson_integer(ctx, op1, rd, rs, rt);
17359         break;
17360     case OPC_CLO:
17361     case OPC_CLZ:
17362         check_insn(ctx, ISA_MIPS32);
17363         gen_cl(ctx, op1, rd, rs);
17364         break;
17365     case OPC_SDBBP:
17366         if (is_uhi(extract32(ctx->opcode, 6, 20))) {
17367             gen_helper_do_semihosting(cpu_env);
17368         } else {
17369             /* XXX: not clear which exception should be raised
17370              *      when in debug mode...
17371              */
17372             check_insn(ctx, ISA_MIPS32);
17373             generate_exception_end(ctx, EXCP_DBp);
17374         }
17375         break;
17376 #if defined(TARGET_MIPS64)
17377     case OPC_DCLO:
17378     case OPC_DCLZ:
17379         check_insn(ctx, ISA_MIPS64);
17380         check_mips_64(ctx);
17381         gen_cl(ctx, op1, rd, rs);
17382         break;
17383     case OPC_DMULT_G_2F:
17384     case OPC_DMULTU_G_2F:
17385     case OPC_DDIV_G_2F:
17386     case OPC_DDIVU_G_2F:
17387     case OPC_DMOD_G_2F:
17388     case OPC_DMODU_G_2F:
17389         check_insn(ctx, INSN_LOONGSON2F);
17390         gen_loongson_integer(ctx, op1, rd, rs, rt);
17391         break;
17392 #endif
17393     default:            /* Invalid */
17394         MIPS_INVAL("special2_legacy");
17395         generate_exception_end(ctx, EXCP_RI);
17396         break;
17397     }
17398 }
17399
17400 static void decode_opc_special3_r6(CPUMIPSState *env, DisasContext *ctx)
17401 {
17402     int rs, rt, rd, sa;
17403     uint32_t op1, op2;
17404     int16_t imm;
17405
17406     rs = (ctx->opcode >> 21) & 0x1f;
17407     rt = (ctx->opcode >> 16) & 0x1f;
17408     rd = (ctx->opcode >> 11) & 0x1f;
17409     sa = (ctx->opcode >> 6) & 0x1f;
17410     imm = (int16_t)ctx->opcode >> 7;
17411
17412     op1 = MASK_SPECIAL3(ctx->opcode);
17413     switch (op1) {
17414     case R6_OPC_PREF:
17415         if (rt >= 24) {
17416             /* hint codes 24-31 are reserved and signal RI */
17417             generate_exception_end(ctx, EXCP_RI);
17418         }
17419         /* Treat as NOP. */
17420         break;
17421     case R6_OPC_CACHE:
17422         check_cp0_enabled(ctx);
17423         if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
17424             gen_cache_operation(ctx, rt, rs, imm);
17425         }
17426         break;
17427     case R6_OPC_SC:
17428         gen_st_cond(ctx, op1, rt, rs, imm);
17429         break;
17430     case R6_OPC_LL:
17431         gen_ld(ctx, op1, rt, rs, imm);
17432         break;
17433     case OPC_BSHFL:
17434         {
17435             if (rd == 0) {
17436                 /* Treat as NOP. */
17437                 break;
17438             }
17439             op2 = MASK_BSHFL(ctx->opcode);
17440             switch (op2) {
17441             case OPC_ALIGN ... OPC_ALIGN_END:
17442                 gen_align(ctx, OPC_ALIGN, rd, rs, rt, sa & 3);
17443                 break;
17444             case OPC_BITSWAP:
17445                 gen_bitswap(ctx, op2, rd, rt);
17446                 break;
17447             }
17448         }
17449         break;
17450 #if defined(TARGET_MIPS64)
17451     case R6_OPC_SCD:
17452         gen_st_cond(ctx, op1, rt, rs, imm);
17453         break;
17454     case R6_OPC_LLD:
17455         gen_ld(ctx, op1, rt, rs, imm);
17456         break;
17457     case OPC_DBSHFL:
17458         check_mips_64(ctx);
17459         {
17460             if (rd == 0) {
17461                 /* Treat as NOP. */
17462                 break;
17463             }
17464             op2 = MASK_DBSHFL(ctx->opcode);
17465             switch (op2) {
17466             case OPC_DALIGN ... OPC_DALIGN_END:
17467                 gen_align(ctx, OPC_DALIGN, rd, rs, rt, sa & 7);
17468                 break;
17469             case OPC_DBITSWAP:
17470                 gen_bitswap(ctx, op2, rd, rt);
17471                 break;
17472             }
17473
17474         }
17475         break;
17476 #endif
17477     default:            /* Invalid */
17478         MIPS_INVAL("special3_r6");
17479         generate_exception_end(ctx, EXCP_RI);
17480         break;
17481     }
17482 }
17483
17484 static void decode_opc_special3_legacy(CPUMIPSState *env, DisasContext *ctx)
17485 {
17486     int rs, rt, rd;
17487     uint32_t op1, op2;
17488
17489     rs = (ctx->opcode >> 21) & 0x1f;
17490     rt = (ctx->opcode >> 16) & 0x1f;
17491     rd = (ctx->opcode >> 11) & 0x1f;
17492
17493     op1 = MASK_SPECIAL3(ctx->opcode);
17494     switch (op1) {
17495     case OPC_DIV_G_2E ... OPC_DIVU_G_2E:
17496     case OPC_MOD_G_2E ... OPC_MODU_G_2E:
17497     case OPC_MULT_G_2E ... OPC_MULTU_G_2E:
17498         /* OPC_MULT_G_2E, OPC_ADDUH_QB_DSP, OPC_MUL_PH_DSP have
17499          * the same mask and op1. */
17500         if ((ctx->insn_flags & ASE_DSPR2) && (op1 == OPC_MULT_G_2E)) {
17501             op2 = MASK_ADDUH_QB(ctx->opcode);
17502             switch (op2) {
17503             case OPC_ADDUH_QB:
17504             case OPC_ADDUH_R_QB:
17505             case OPC_ADDQH_PH:
17506             case OPC_ADDQH_R_PH:
17507             case OPC_ADDQH_W:
17508             case OPC_ADDQH_R_W:
17509             case OPC_SUBUH_QB:
17510             case OPC_SUBUH_R_QB:
17511             case OPC_SUBQH_PH:
17512             case OPC_SUBQH_R_PH:
17513             case OPC_SUBQH_W:
17514             case OPC_SUBQH_R_W:
17515                 gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
17516                 break;
17517             case OPC_MUL_PH:
17518             case OPC_MUL_S_PH:
17519             case OPC_MULQ_S_W:
17520             case OPC_MULQ_RS_W:
17521                 gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
17522                 break;
17523             default:
17524                 MIPS_INVAL("MASK ADDUH.QB");
17525                 generate_exception_end(ctx, EXCP_RI);
17526                 break;
17527             }
17528         } else if (ctx->insn_flags & INSN_LOONGSON2E) {
17529             gen_loongson_integer(ctx, op1, rd, rs, rt);
17530         } else {
17531             generate_exception_end(ctx, EXCP_RI);
17532         }
17533         break;
17534     case OPC_LX_DSP:
17535         op2 = MASK_LX(ctx->opcode);
17536         switch (op2) {
17537 #if defined(TARGET_MIPS64)
17538         case OPC_LDX:
17539 #endif
17540         case OPC_LBUX:
17541         case OPC_LHX:
17542         case OPC_LWX:
17543             gen_mipsdsp_ld(ctx, op2, rd, rs, rt);
17544             break;
17545         default:            /* Invalid */
17546             MIPS_INVAL("MASK LX");
17547             generate_exception_end(ctx, EXCP_RI);
17548             break;
17549         }
17550         break;
17551     case OPC_ABSQ_S_PH_DSP:
17552         op2 = MASK_ABSQ_S_PH(ctx->opcode);
17553         switch (op2) {
17554         case OPC_ABSQ_S_QB:
17555         case OPC_ABSQ_S_PH:
17556         case OPC_ABSQ_S_W:
17557         case OPC_PRECEQ_W_PHL:
17558         case OPC_PRECEQ_W_PHR:
17559         case OPC_PRECEQU_PH_QBL:
17560         case OPC_PRECEQU_PH_QBR:
17561         case OPC_PRECEQU_PH_QBLA:
17562         case OPC_PRECEQU_PH_QBRA:
17563         case OPC_PRECEU_PH_QBL:
17564         case OPC_PRECEU_PH_QBR:
17565         case OPC_PRECEU_PH_QBLA:
17566         case OPC_PRECEU_PH_QBRA:
17567             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
17568             break;
17569         case OPC_BITREV:
17570         case OPC_REPL_QB:
17571         case OPC_REPLV_QB:
17572         case OPC_REPL_PH:
17573         case OPC_REPLV_PH:
17574             gen_mipsdsp_bitinsn(ctx, op1, op2, rd, rt);
17575             break;
17576         default:
17577             MIPS_INVAL("MASK ABSQ_S.PH");
17578             generate_exception_end(ctx, EXCP_RI);
17579             break;
17580         }
17581         break;
17582     case OPC_ADDU_QB_DSP:
17583         op2 = MASK_ADDU_QB(ctx->opcode);
17584         switch (op2) {
17585         case OPC_ADDQ_PH:
17586         case OPC_ADDQ_S_PH:
17587         case OPC_ADDQ_S_W:
17588         case OPC_ADDU_QB:
17589         case OPC_ADDU_S_QB:
17590         case OPC_ADDU_PH:
17591         case OPC_ADDU_S_PH:
17592         case OPC_SUBQ_PH:
17593         case OPC_SUBQ_S_PH:
17594         case OPC_SUBQ_S_W:
17595         case OPC_SUBU_QB:
17596         case OPC_SUBU_S_QB:
17597         case OPC_SUBU_PH:
17598         case OPC_SUBU_S_PH:
17599         case OPC_ADDSC:
17600         case OPC_ADDWC:
17601         case OPC_MODSUB:
17602         case OPC_RADDU_W_QB:
17603             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
17604             break;
17605         case OPC_MULEU_S_PH_QBL:
17606         case OPC_MULEU_S_PH_QBR:
17607         case OPC_MULQ_RS_PH:
17608         case OPC_MULEQ_S_W_PHL:
17609         case OPC_MULEQ_S_W_PHR:
17610         case OPC_MULQ_S_PH:
17611             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
17612             break;
17613         default:            /* Invalid */
17614             MIPS_INVAL("MASK ADDU.QB");
17615             generate_exception_end(ctx, EXCP_RI);
17616             break;
17617
17618         }
17619         break;
17620     case OPC_CMPU_EQ_QB_DSP:
17621         op2 = MASK_CMPU_EQ_QB(ctx->opcode);
17622         switch (op2) {
17623         case OPC_PRECR_SRA_PH_W:
17624         case OPC_PRECR_SRA_R_PH_W:
17625             gen_mipsdsp_arith(ctx, op1, op2, rt, rs, rd);
17626             break;
17627         case OPC_PRECR_QB_PH:
17628         case OPC_PRECRQ_QB_PH:
17629         case OPC_PRECRQ_PH_W:
17630         case OPC_PRECRQ_RS_PH_W:
17631         case OPC_PRECRQU_S_QB_PH:
17632             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
17633             break;
17634         case OPC_CMPU_EQ_QB:
17635         case OPC_CMPU_LT_QB:
17636         case OPC_CMPU_LE_QB:
17637         case OPC_CMP_EQ_PH:
17638         case OPC_CMP_LT_PH:
17639         case OPC_CMP_LE_PH:
17640             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 0);
17641             break;
17642         case OPC_CMPGU_EQ_QB:
17643         case OPC_CMPGU_LT_QB:
17644         case OPC_CMPGU_LE_QB:
17645         case OPC_CMPGDU_EQ_QB:
17646         case OPC_CMPGDU_LT_QB:
17647         case OPC_CMPGDU_LE_QB:
17648         case OPC_PICK_QB:
17649         case OPC_PICK_PH:
17650         case OPC_PACKRL_PH:
17651             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 1);
17652             break;
17653         default:            /* Invalid */
17654             MIPS_INVAL("MASK CMPU.EQ.QB");
17655             generate_exception_end(ctx, EXCP_RI);
17656             break;
17657         }
17658         break;
17659     case OPC_SHLL_QB_DSP:
17660         gen_mipsdsp_shift(ctx, op1, rd, rs, rt);
17661         break;
17662     case OPC_DPA_W_PH_DSP:
17663         op2 = MASK_DPA_W_PH(ctx->opcode);
17664         switch (op2) {
17665         case OPC_DPAU_H_QBL:
17666         case OPC_DPAU_H_QBR:
17667         case OPC_DPSU_H_QBL:
17668         case OPC_DPSU_H_QBR:
17669         case OPC_DPA_W_PH:
17670         case OPC_DPAX_W_PH:
17671         case OPC_DPAQ_S_W_PH:
17672         case OPC_DPAQX_S_W_PH:
17673         case OPC_DPAQX_SA_W_PH:
17674         case OPC_DPS_W_PH:
17675         case OPC_DPSX_W_PH:
17676         case OPC_DPSQ_S_W_PH:
17677         case OPC_DPSQX_S_W_PH:
17678         case OPC_DPSQX_SA_W_PH:
17679         case OPC_MULSAQ_S_W_PH:
17680         case OPC_DPAQ_SA_L_W:
17681         case OPC_DPSQ_SA_L_W:
17682         case OPC_MAQ_S_W_PHL:
17683         case OPC_MAQ_S_W_PHR:
17684         case OPC_MAQ_SA_W_PHL:
17685         case OPC_MAQ_SA_W_PHR:
17686         case OPC_MULSA_W_PH:
17687             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
17688             break;
17689         default:            /* Invalid */
17690             MIPS_INVAL("MASK DPAW.PH");
17691             generate_exception_end(ctx, EXCP_RI);
17692             break;
17693         }
17694         break;
17695     case OPC_INSV_DSP:
17696         op2 = MASK_INSV(ctx->opcode);
17697         switch (op2) {
17698         case OPC_INSV:
17699             check_dsp(ctx);
17700             {
17701                 TCGv t0, t1;
17702
17703                 if (rt == 0) {
17704                     break;
17705                 }
17706
17707                 t0 = tcg_temp_new();
17708                 t1 = tcg_temp_new();
17709
17710                 gen_load_gpr(t0, rt);
17711                 gen_load_gpr(t1, rs);
17712
17713                 gen_helper_insv(cpu_gpr[rt], cpu_env, t1, t0);
17714
17715                 tcg_temp_free(t0);
17716                 tcg_temp_free(t1);
17717                 break;
17718             }
17719         default:            /* Invalid */
17720             MIPS_INVAL("MASK INSV");
17721             generate_exception_end(ctx, EXCP_RI);
17722             break;
17723         }
17724         break;
17725     case OPC_APPEND_DSP:
17726         gen_mipsdsp_append(env, ctx, op1, rt, rs, rd);
17727         break;
17728     case OPC_EXTR_W_DSP:
17729         op2 = MASK_EXTR_W(ctx->opcode);
17730         switch (op2) {
17731         case OPC_EXTR_W:
17732         case OPC_EXTR_R_W:
17733         case OPC_EXTR_RS_W:
17734         case OPC_EXTR_S_H:
17735         case OPC_EXTRV_S_H:
17736         case OPC_EXTRV_W:
17737         case OPC_EXTRV_R_W:
17738         case OPC_EXTRV_RS_W:
17739         case OPC_EXTP:
17740         case OPC_EXTPV:
17741         case OPC_EXTPDP:
17742         case OPC_EXTPDPV:
17743             gen_mipsdsp_accinsn(ctx, op1, op2, rt, rs, rd, 1);
17744             break;
17745         case OPC_RDDSP:
17746             gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 1);
17747             break;
17748         case OPC_SHILO:
17749         case OPC_SHILOV:
17750         case OPC_MTHLIP:
17751         case OPC_WRDSP:
17752             gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 0);
17753             break;
17754         default:            /* Invalid */
17755             MIPS_INVAL("MASK EXTR.W");
17756             generate_exception_end(ctx, EXCP_RI);
17757             break;
17758         }
17759         break;
17760 #if defined(TARGET_MIPS64)
17761     case OPC_DDIV_G_2E ... OPC_DDIVU_G_2E:
17762     case OPC_DMULT_G_2E ... OPC_DMULTU_G_2E:
17763     case OPC_DMOD_G_2E ... OPC_DMODU_G_2E:
17764         check_insn(ctx, INSN_LOONGSON2E);
17765         gen_loongson_integer(ctx, op1, rd, rs, rt);
17766         break;
17767     case OPC_ABSQ_S_QH_DSP:
17768         op2 = MASK_ABSQ_S_QH(ctx->opcode);
17769         switch (op2) {
17770         case OPC_PRECEQ_L_PWL:
17771         case OPC_PRECEQ_L_PWR:
17772         case OPC_PRECEQ_PW_QHL:
17773         case OPC_PRECEQ_PW_QHR:
17774         case OPC_PRECEQ_PW_QHLA:
17775         case OPC_PRECEQ_PW_QHRA:
17776         case OPC_PRECEQU_QH_OBL:
17777         case OPC_PRECEQU_QH_OBR:
17778         case OPC_PRECEQU_QH_OBLA:
17779         case OPC_PRECEQU_QH_OBRA:
17780         case OPC_PRECEU_QH_OBL:
17781         case OPC_PRECEU_QH_OBR:
17782         case OPC_PRECEU_QH_OBLA:
17783         case OPC_PRECEU_QH_OBRA:
17784         case OPC_ABSQ_S_OB:
17785         case OPC_ABSQ_S_PW:
17786         case OPC_ABSQ_S_QH:
17787             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
17788             break;
17789         case OPC_REPL_OB:
17790         case OPC_REPL_PW:
17791         case OPC_REPL_QH:
17792         case OPC_REPLV_OB:
17793         case OPC_REPLV_PW:
17794         case OPC_REPLV_QH:
17795             gen_mipsdsp_bitinsn(ctx, op1, op2, rd, rt);
17796             break;
17797         default:            /* Invalid */
17798             MIPS_INVAL("MASK ABSQ_S.QH");
17799             generate_exception_end(ctx, EXCP_RI);
17800             break;
17801         }
17802         break;
17803     case OPC_ADDU_OB_DSP:
17804         op2 = MASK_ADDU_OB(ctx->opcode);
17805         switch (op2) {
17806         case OPC_RADDU_L_OB:
17807         case OPC_SUBQ_PW:
17808         case OPC_SUBQ_S_PW:
17809         case OPC_SUBQ_QH:
17810         case OPC_SUBQ_S_QH:
17811         case OPC_SUBU_OB:
17812         case OPC_SUBU_S_OB:
17813         case OPC_SUBU_QH:
17814         case OPC_SUBU_S_QH:
17815         case OPC_SUBUH_OB:
17816         case OPC_SUBUH_R_OB:
17817         case OPC_ADDQ_PW:
17818         case OPC_ADDQ_S_PW:
17819         case OPC_ADDQ_QH:
17820         case OPC_ADDQ_S_QH:
17821         case OPC_ADDU_OB:
17822         case OPC_ADDU_S_OB:
17823         case OPC_ADDU_QH:
17824         case OPC_ADDU_S_QH:
17825         case OPC_ADDUH_OB:
17826         case OPC_ADDUH_R_OB:
17827             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
17828             break;
17829         case OPC_MULEQ_S_PW_QHL:
17830         case OPC_MULEQ_S_PW_QHR:
17831         case OPC_MULEU_S_QH_OBL:
17832         case OPC_MULEU_S_QH_OBR:
17833         case OPC_MULQ_RS_QH:
17834             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
17835             break;
17836         default:            /* Invalid */
17837             MIPS_INVAL("MASK ADDU.OB");
17838             generate_exception_end(ctx, EXCP_RI);
17839             break;
17840         }
17841         break;
17842     case OPC_CMPU_EQ_OB_DSP:
17843         op2 = MASK_CMPU_EQ_OB(ctx->opcode);
17844         switch (op2) {
17845         case OPC_PRECR_SRA_QH_PW:
17846         case OPC_PRECR_SRA_R_QH_PW:
17847             /* Return value is rt. */
17848             gen_mipsdsp_arith(ctx, op1, op2, rt, rs, rd);
17849             break;
17850         case OPC_PRECR_OB_QH:
17851         case OPC_PRECRQ_OB_QH:
17852         case OPC_PRECRQ_PW_L:
17853         case OPC_PRECRQ_QH_PW:
17854         case OPC_PRECRQ_RS_QH_PW:
17855         case OPC_PRECRQU_S_OB_QH:
17856             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
17857             break;
17858         case OPC_CMPU_EQ_OB:
17859         case OPC_CMPU_LT_OB:
17860         case OPC_CMPU_LE_OB:
17861         case OPC_CMP_EQ_QH:
17862         case OPC_CMP_LT_QH:
17863         case OPC_CMP_LE_QH:
17864         case OPC_CMP_EQ_PW:
17865         case OPC_CMP_LT_PW:
17866         case OPC_CMP_LE_PW:
17867             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 0);
17868             break;
17869         case OPC_CMPGDU_EQ_OB:
17870         case OPC_CMPGDU_LT_OB:
17871         case OPC_CMPGDU_LE_OB:
17872         case OPC_CMPGU_EQ_OB:
17873         case OPC_CMPGU_LT_OB:
17874         case OPC_CMPGU_LE_OB:
17875         case OPC_PACKRL_PW:
17876         case OPC_PICK_OB:
17877         case OPC_PICK_PW:
17878         case OPC_PICK_QH:
17879             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 1);
17880             break;
17881         default:            /* Invalid */
17882             MIPS_INVAL("MASK CMPU_EQ.OB");
17883             generate_exception_end(ctx, EXCP_RI);
17884             break;
17885         }
17886         break;
17887     case OPC_DAPPEND_DSP:
17888         gen_mipsdsp_append(env, ctx, op1, rt, rs, rd);
17889         break;
17890     case OPC_DEXTR_W_DSP:
17891         op2 = MASK_DEXTR_W(ctx->opcode);
17892         switch (op2) {
17893         case OPC_DEXTP:
17894         case OPC_DEXTPDP:
17895         case OPC_DEXTPDPV:
17896         case OPC_DEXTPV:
17897         case OPC_DEXTR_L:
17898         case OPC_DEXTR_R_L:
17899         case OPC_DEXTR_RS_L:
17900         case OPC_DEXTR_W:
17901         case OPC_DEXTR_R_W:
17902         case OPC_DEXTR_RS_W:
17903         case OPC_DEXTR_S_H:
17904         case OPC_DEXTRV_L:
17905         case OPC_DEXTRV_R_L:
17906         case OPC_DEXTRV_RS_L:
17907         case OPC_DEXTRV_S_H:
17908         case OPC_DEXTRV_W:
17909         case OPC_DEXTRV_R_W:
17910         case OPC_DEXTRV_RS_W:
17911             gen_mipsdsp_accinsn(ctx, op1, op2, rt, rs, rd, 1);
17912             break;
17913         case OPC_DMTHLIP:
17914         case OPC_DSHILO:
17915         case OPC_DSHILOV:
17916             gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 0);
17917             break;
17918         default:            /* Invalid */
17919             MIPS_INVAL("MASK EXTR.W");
17920             generate_exception_end(ctx, EXCP_RI);
17921             break;
17922         }
17923         break;
17924     case OPC_DPAQ_W_QH_DSP:
17925         op2 = MASK_DPAQ_W_QH(ctx->opcode);
17926         switch (op2) {
17927         case OPC_DPAU_H_OBL:
17928         case OPC_DPAU_H_OBR:
17929         case OPC_DPSU_H_OBL:
17930         case OPC_DPSU_H_OBR:
17931         case OPC_DPA_W_QH:
17932         case OPC_DPAQ_S_W_QH:
17933         case OPC_DPS_W_QH:
17934         case OPC_DPSQ_S_W_QH:
17935         case OPC_MULSAQ_S_W_QH:
17936         case OPC_DPAQ_SA_L_PW:
17937         case OPC_DPSQ_SA_L_PW:
17938         case OPC_MULSAQ_S_L_PW:
17939             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
17940             break;
17941         case OPC_MAQ_S_W_QHLL:
17942         case OPC_MAQ_S_W_QHLR:
17943         case OPC_MAQ_S_W_QHRL:
17944         case OPC_MAQ_S_W_QHRR:
17945         case OPC_MAQ_SA_W_QHLL:
17946         case OPC_MAQ_SA_W_QHLR:
17947         case OPC_MAQ_SA_W_QHRL:
17948         case OPC_MAQ_SA_W_QHRR:
17949         case OPC_MAQ_S_L_PWL:
17950         case OPC_MAQ_S_L_PWR:
17951         case OPC_DMADD:
17952         case OPC_DMADDU:
17953         case OPC_DMSUB:
17954         case OPC_DMSUBU:
17955             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
17956             break;
17957         default:            /* Invalid */
17958             MIPS_INVAL("MASK DPAQ.W.QH");
17959             generate_exception_end(ctx, EXCP_RI);
17960             break;
17961         }
17962         break;
17963     case OPC_DINSV_DSP:
17964         op2 = MASK_INSV(ctx->opcode);
17965         switch (op2) {
17966         case OPC_DINSV:
17967         {
17968             TCGv t0, t1;
17969
17970             if (rt == 0) {
17971                 break;
17972             }
17973             check_dsp(ctx);
17974
17975             t0 = tcg_temp_new();
17976             t1 = tcg_temp_new();
17977
17978             gen_load_gpr(t0, rt);
17979             gen_load_gpr(t1, rs);
17980
17981             gen_helper_dinsv(cpu_gpr[rt], cpu_env, t1, t0);
17982
17983             tcg_temp_free(t0);
17984             tcg_temp_free(t1);
17985             break;
17986         }
17987         default:            /* Invalid */
17988             MIPS_INVAL("MASK DINSV");
17989             generate_exception_end(ctx, EXCP_RI);
17990             break;
17991         }
17992         break;
17993     case OPC_SHLL_OB_DSP:
17994         gen_mipsdsp_shift(ctx, op1, rd, rs, rt);
17995         break;
17996 #endif
17997     default:            /* Invalid */
17998         MIPS_INVAL("special3_legacy");
17999         generate_exception_end(ctx, EXCP_RI);
18000         break;
18001     }
18002 }
18003
18004 static void decode_opc_special3(CPUMIPSState *env, DisasContext *ctx)
18005 {
18006     int rs, rt, rd, sa;
18007     uint32_t op1, op2;
18008
18009     rs = (ctx->opcode >> 21) & 0x1f;
18010     rt = (ctx->opcode >> 16) & 0x1f;
18011     rd = (ctx->opcode >> 11) & 0x1f;
18012     sa = (ctx->opcode >> 6) & 0x1f;
18013
18014     op1 = MASK_SPECIAL3(ctx->opcode);
18015     switch (op1) {
18016     case OPC_EXT:
18017     case OPC_INS:
18018         check_insn(ctx, ISA_MIPS32R2);
18019         gen_bitops(ctx, op1, rt, rs, sa, rd);
18020         break;
18021     case OPC_BSHFL:
18022         op2 = MASK_BSHFL(ctx->opcode);
18023         switch (op2) {
18024         case OPC_ALIGN ... OPC_ALIGN_END:
18025         case OPC_BITSWAP:
18026             check_insn(ctx, ISA_MIPS32R6);
18027             decode_opc_special3_r6(env, ctx);
18028             break;
18029         default:
18030             check_insn(ctx, ISA_MIPS32R2);
18031             gen_bshfl(ctx, op2, rt, rd);
18032             break;
18033         }
18034         break;
18035 #if defined(TARGET_MIPS64)
18036     case OPC_DEXTM ... OPC_DEXT:
18037     case OPC_DINSM ... OPC_DINS:
18038         check_insn(ctx, ISA_MIPS64R2);
18039         check_mips_64(ctx);
18040         gen_bitops(ctx, op1, rt, rs, sa, rd);
18041         break;
18042     case OPC_DBSHFL:
18043         op2 = MASK_DBSHFL(ctx->opcode);
18044         switch (op2) {
18045         case OPC_DALIGN ... OPC_DALIGN_END:
18046         case OPC_DBITSWAP:
18047             check_insn(ctx, ISA_MIPS32R6);
18048             decode_opc_special3_r6(env, ctx);
18049             break;
18050         default:
18051             check_insn(ctx, ISA_MIPS64R2);
18052             check_mips_64(ctx);
18053             op2 = MASK_DBSHFL(ctx->opcode);
18054             gen_bshfl(ctx, op2, rt, rd);
18055             break;
18056         }
18057         break;
18058 #endif
18059     case OPC_RDHWR:
18060         gen_rdhwr(ctx, rt, rd, extract32(ctx->opcode, 6, 3));
18061         break;
18062     case OPC_FORK:
18063         check_insn(ctx, ASE_MT);
18064         {
18065             TCGv t0 = tcg_temp_new();
18066             TCGv t1 = tcg_temp_new();
18067
18068             gen_load_gpr(t0, rt);
18069             gen_load_gpr(t1, rs);
18070             gen_helper_fork(t0, t1);
18071             tcg_temp_free(t0);
18072             tcg_temp_free(t1);
18073         }
18074         break;
18075     case OPC_YIELD:
18076         check_insn(ctx, ASE_MT);
18077         {
18078             TCGv t0 = tcg_temp_new();
18079
18080             gen_load_gpr(t0, rs);
18081             gen_helper_yield(t0, cpu_env, t0);
18082             gen_store_gpr(t0, rd);
18083             tcg_temp_free(t0);
18084         }
18085         break;
18086     default:
18087         if (ctx->insn_flags & ISA_MIPS32R6) {
18088             decode_opc_special3_r6(env, ctx);
18089         } else {
18090             decode_opc_special3_legacy(env, ctx);
18091         }
18092     }
18093 }
18094
18095 /* MIPS SIMD Architecture (MSA)  */
18096 static inline int check_msa_access(DisasContext *ctx)
18097 {
18098     if (unlikely((ctx->hflags & MIPS_HFLAG_FPU) &&
18099                  !(ctx->hflags & MIPS_HFLAG_F64))) {
18100         generate_exception_end(ctx, EXCP_RI);
18101         return 0;
18102     }
18103
18104     if (unlikely(!(ctx->hflags & MIPS_HFLAG_MSA))) {
18105         if (ctx->insn_flags & ASE_MSA) {
18106             generate_exception_end(ctx, EXCP_MSADIS);
18107             return 0;
18108         } else {
18109             generate_exception_end(ctx, EXCP_RI);
18110             return 0;
18111         }
18112     }
18113     return 1;
18114 }
18115
18116 static void gen_check_zero_element(TCGv tresult, uint8_t df, uint8_t wt)
18117 {
18118     /* generates tcg ops to check if any element is 0 */
18119     /* Note this function only works with MSA_WRLEN = 128 */
18120     uint64_t eval_zero_or_big = 0;
18121     uint64_t eval_big = 0;
18122     TCGv_i64 t0 = tcg_temp_new_i64();
18123     TCGv_i64 t1 = tcg_temp_new_i64();
18124     switch (df) {
18125     case DF_BYTE:
18126         eval_zero_or_big = 0x0101010101010101ULL;
18127         eval_big = 0x8080808080808080ULL;
18128         break;
18129     case DF_HALF:
18130         eval_zero_or_big = 0x0001000100010001ULL;
18131         eval_big = 0x8000800080008000ULL;
18132         break;
18133     case DF_WORD:
18134         eval_zero_or_big = 0x0000000100000001ULL;
18135         eval_big = 0x8000000080000000ULL;
18136         break;
18137     case DF_DOUBLE:
18138         eval_zero_or_big = 0x0000000000000001ULL;
18139         eval_big = 0x8000000000000000ULL;
18140         break;
18141     }
18142     tcg_gen_subi_i64(t0, msa_wr_d[wt<<1], eval_zero_or_big);
18143     tcg_gen_andc_i64(t0, t0, msa_wr_d[wt<<1]);
18144     tcg_gen_andi_i64(t0, t0, eval_big);
18145     tcg_gen_subi_i64(t1, msa_wr_d[(wt<<1)+1], eval_zero_or_big);
18146     tcg_gen_andc_i64(t1, t1, msa_wr_d[(wt<<1)+1]);
18147     tcg_gen_andi_i64(t1, t1, eval_big);
18148     tcg_gen_or_i64(t0, t0, t1);
18149     /* if all bits are zero then all elements are not zero */
18150     /* if some bit is non-zero then some element is zero */
18151     tcg_gen_setcondi_i64(TCG_COND_NE, t0, t0, 0);
18152     tcg_gen_trunc_i64_tl(tresult, t0);
18153     tcg_temp_free_i64(t0);
18154     tcg_temp_free_i64(t1);
18155 }
18156
18157 static void gen_msa_branch(CPUMIPSState *env, DisasContext *ctx, uint32_t op1)
18158 {
18159     uint8_t df = (ctx->opcode >> 21) & 0x3;
18160     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
18161     int64_t s16 = (int16_t)ctx->opcode;
18162
18163     check_msa_access(ctx);
18164
18165     if (ctx->insn_flags & ISA_MIPS32R6 && ctx->hflags & MIPS_HFLAG_BMASK) {
18166         generate_exception_end(ctx, EXCP_RI);
18167         return;
18168     }
18169     switch (op1) {
18170     case OPC_BZ_V:
18171     case OPC_BNZ_V:
18172         {
18173             TCGv_i64 t0 = tcg_temp_new_i64();
18174             tcg_gen_or_i64(t0, msa_wr_d[wt<<1], msa_wr_d[(wt<<1)+1]);
18175             tcg_gen_setcondi_i64((op1 == OPC_BZ_V) ?
18176                     TCG_COND_EQ : TCG_COND_NE, t0, t0, 0);
18177             tcg_gen_trunc_i64_tl(bcond, t0);
18178             tcg_temp_free_i64(t0);
18179         }
18180         break;
18181     case OPC_BZ_B:
18182     case OPC_BZ_H:
18183     case OPC_BZ_W:
18184     case OPC_BZ_D:
18185         gen_check_zero_element(bcond, df, wt);
18186         break;
18187     case OPC_BNZ_B:
18188     case OPC_BNZ_H:
18189     case OPC_BNZ_W:
18190     case OPC_BNZ_D:
18191         gen_check_zero_element(bcond, df, wt);
18192         tcg_gen_setcondi_tl(TCG_COND_EQ, bcond, bcond, 0);
18193         break;
18194     }
18195
18196     ctx->btarget = ctx->pc + (s16 << 2) + 4;
18197
18198     ctx->hflags |= MIPS_HFLAG_BC;
18199     ctx->hflags |= MIPS_HFLAG_BDS32;
18200 }
18201
18202 static void gen_msa_i8(CPUMIPSState *env, DisasContext *ctx)
18203 {
18204 #define MASK_MSA_I8(op)    (MASK_MSA_MINOR(op) | (op & (0x03 << 24)))
18205     uint8_t i8 = (ctx->opcode >> 16) & 0xff;
18206     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
18207     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
18208
18209     TCGv_i32 twd = tcg_const_i32(wd);
18210     TCGv_i32 tws = tcg_const_i32(ws);
18211     TCGv_i32 ti8 = tcg_const_i32(i8);
18212
18213     switch (MASK_MSA_I8(ctx->opcode)) {
18214     case OPC_ANDI_B:
18215         gen_helper_msa_andi_b(cpu_env, twd, tws, ti8);
18216         break;
18217     case OPC_ORI_B:
18218         gen_helper_msa_ori_b(cpu_env, twd, tws, ti8);
18219         break;
18220     case OPC_NORI_B:
18221         gen_helper_msa_nori_b(cpu_env, twd, tws, ti8);
18222         break;
18223     case OPC_XORI_B:
18224         gen_helper_msa_xori_b(cpu_env, twd, tws, ti8);
18225         break;
18226     case OPC_BMNZI_B:
18227         gen_helper_msa_bmnzi_b(cpu_env, twd, tws, ti8);
18228         break;
18229     case OPC_BMZI_B:
18230         gen_helper_msa_bmzi_b(cpu_env, twd, tws, ti8);
18231         break;
18232     case OPC_BSELI_B:
18233         gen_helper_msa_bseli_b(cpu_env, twd, tws, ti8);
18234         break;
18235     case OPC_SHF_B:
18236     case OPC_SHF_H:
18237     case OPC_SHF_W:
18238         {
18239             uint8_t df = (ctx->opcode >> 24) & 0x3;
18240             if (df == DF_DOUBLE) {
18241                 generate_exception_end(ctx, EXCP_RI);
18242             } else {
18243                 TCGv_i32 tdf = tcg_const_i32(df);
18244                 gen_helper_msa_shf_df(cpu_env, tdf, twd, tws, ti8);
18245                 tcg_temp_free_i32(tdf);
18246             }
18247         }
18248         break;
18249     default:
18250         MIPS_INVAL("MSA instruction");
18251         generate_exception_end(ctx, EXCP_RI);
18252         break;
18253     }
18254
18255     tcg_temp_free_i32(twd);
18256     tcg_temp_free_i32(tws);
18257     tcg_temp_free_i32(ti8);
18258 }
18259
18260 static void gen_msa_i5(CPUMIPSState *env, DisasContext *ctx)
18261 {
18262 #define MASK_MSA_I5(op)    (MASK_MSA_MINOR(op) | (op & (0x7 << 23)))
18263     uint8_t df = (ctx->opcode >> 21) & 0x3;
18264     int8_t s5 = (int8_t) sextract32(ctx->opcode, 16, 5);
18265     uint8_t u5 = (ctx->opcode >> 16) & 0x1f;
18266     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
18267     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
18268
18269     TCGv_i32 tdf = tcg_const_i32(df);
18270     TCGv_i32 twd = tcg_const_i32(wd);
18271     TCGv_i32 tws = tcg_const_i32(ws);
18272     TCGv_i32 timm = tcg_temp_new_i32();
18273     tcg_gen_movi_i32(timm, u5);
18274
18275     switch (MASK_MSA_I5(ctx->opcode)) {
18276     case OPC_ADDVI_df:
18277         gen_helper_msa_addvi_df(cpu_env, tdf, twd, tws, timm);
18278         break;
18279     case OPC_SUBVI_df:
18280         gen_helper_msa_subvi_df(cpu_env, tdf, twd, tws, timm);
18281         break;
18282     case OPC_MAXI_S_df:
18283         tcg_gen_movi_i32(timm, s5);
18284         gen_helper_msa_maxi_s_df(cpu_env, tdf, twd, tws, timm);
18285         break;
18286     case OPC_MAXI_U_df:
18287         gen_helper_msa_maxi_u_df(cpu_env, tdf, twd, tws, timm);
18288         break;
18289     case OPC_MINI_S_df:
18290         tcg_gen_movi_i32(timm, s5);
18291         gen_helper_msa_mini_s_df(cpu_env, tdf, twd, tws, timm);
18292         break;
18293     case OPC_MINI_U_df:
18294         gen_helper_msa_mini_u_df(cpu_env, tdf, twd, tws, timm);
18295         break;
18296     case OPC_CEQI_df:
18297         tcg_gen_movi_i32(timm, s5);
18298         gen_helper_msa_ceqi_df(cpu_env, tdf, twd, tws, timm);
18299         break;
18300     case OPC_CLTI_S_df:
18301         tcg_gen_movi_i32(timm, s5);
18302         gen_helper_msa_clti_s_df(cpu_env, tdf, twd, tws, timm);
18303         break;
18304     case OPC_CLTI_U_df:
18305         gen_helper_msa_clti_u_df(cpu_env, tdf, twd, tws, timm);
18306         break;
18307     case OPC_CLEI_S_df:
18308         tcg_gen_movi_i32(timm, s5);
18309         gen_helper_msa_clei_s_df(cpu_env, tdf, twd, tws, timm);
18310         break;
18311     case OPC_CLEI_U_df:
18312         gen_helper_msa_clei_u_df(cpu_env, tdf, twd, tws, timm);
18313         break;
18314     case OPC_LDI_df:
18315         {
18316             int32_t s10 = sextract32(ctx->opcode, 11, 10);
18317             tcg_gen_movi_i32(timm, s10);
18318             gen_helper_msa_ldi_df(cpu_env, tdf, twd, timm);
18319         }
18320         break;
18321     default:
18322         MIPS_INVAL("MSA instruction");
18323         generate_exception_end(ctx, EXCP_RI);
18324         break;
18325     }
18326
18327     tcg_temp_free_i32(tdf);
18328     tcg_temp_free_i32(twd);
18329     tcg_temp_free_i32(tws);
18330     tcg_temp_free_i32(timm);
18331 }
18332
18333 static void gen_msa_bit(CPUMIPSState *env, DisasContext *ctx)
18334 {
18335 #define MASK_MSA_BIT(op)    (MASK_MSA_MINOR(op) | (op & (0x7 << 23)))
18336     uint8_t dfm = (ctx->opcode >> 16) & 0x7f;
18337     uint32_t df = 0, m = 0;
18338     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
18339     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
18340
18341     TCGv_i32 tdf;
18342     TCGv_i32 tm;
18343     TCGv_i32 twd;
18344     TCGv_i32 tws;
18345
18346     if ((dfm & 0x40) == 0x00) {
18347         m = dfm & 0x3f;
18348         df = DF_DOUBLE;
18349     } else if ((dfm & 0x60) == 0x40) {
18350         m = dfm & 0x1f;
18351         df = DF_WORD;
18352     } else if ((dfm & 0x70) == 0x60) {
18353         m = dfm & 0x0f;
18354         df = DF_HALF;
18355     } else if ((dfm & 0x78) == 0x70) {
18356         m = dfm & 0x7;
18357         df = DF_BYTE;
18358     } else {
18359         generate_exception_end(ctx, EXCP_RI);
18360         return;
18361     }
18362
18363     tdf = tcg_const_i32(df);
18364     tm  = tcg_const_i32(m);
18365     twd = tcg_const_i32(wd);
18366     tws = tcg_const_i32(ws);
18367
18368     switch (MASK_MSA_BIT(ctx->opcode)) {
18369     case OPC_SLLI_df:
18370         gen_helper_msa_slli_df(cpu_env, tdf, twd, tws, tm);
18371         break;
18372     case OPC_SRAI_df:
18373         gen_helper_msa_srai_df(cpu_env, tdf, twd, tws, tm);
18374         break;
18375     case OPC_SRLI_df:
18376         gen_helper_msa_srli_df(cpu_env, tdf, twd, tws, tm);
18377         break;
18378     case OPC_BCLRI_df:
18379         gen_helper_msa_bclri_df(cpu_env, tdf, twd, tws, tm);
18380         break;
18381     case OPC_BSETI_df:
18382         gen_helper_msa_bseti_df(cpu_env, tdf, twd, tws, tm);
18383         break;
18384     case OPC_BNEGI_df:
18385         gen_helper_msa_bnegi_df(cpu_env, tdf, twd, tws, tm);
18386         break;
18387     case OPC_BINSLI_df:
18388         gen_helper_msa_binsli_df(cpu_env, tdf, twd, tws, tm);
18389         break;
18390     case OPC_BINSRI_df:
18391         gen_helper_msa_binsri_df(cpu_env, tdf, twd, tws, tm);
18392         break;
18393     case OPC_SAT_S_df:
18394         gen_helper_msa_sat_s_df(cpu_env, tdf, twd, tws, tm);
18395         break;
18396     case OPC_SAT_U_df:
18397         gen_helper_msa_sat_u_df(cpu_env, tdf, twd, tws, tm);
18398         break;
18399     case OPC_SRARI_df:
18400         gen_helper_msa_srari_df(cpu_env, tdf, twd, tws, tm);
18401         break;
18402     case OPC_SRLRI_df:
18403         gen_helper_msa_srlri_df(cpu_env, tdf, twd, tws, tm);
18404         break;
18405     default:
18406         MIPS_INVAL("MSA instruction");
18407         generate_exception_end(ctx, EXCP_RI);
18408         break;
18409     }
18410
18411     tcg_temp_free_i32(tdf);
18412     tcg_temp_free_i32(tm);
18413     tcg_temp_free_i32(twd);
18414     tcg_temp_free_i32(tws);
18415 }
18416
18417 static void gen_msa_3r(CPUMIPSState *env, DisasContext *ctx)
18418 {
18419 #define MASK_MSA_3R(op)    (MASK_MSA_MINOR(op) | (op & (0x7 << 23)))
18420     uint8_t df = (ctx->opcode >> 21) & 0x3;
18421     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
18422     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
18423     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
18424
18425     TCGv_i32 tdf = tcg_const_i32(df);
18426     TCGv_i32 twd = tcg_const_i32(wd);
18427     TCGv_i32 tws = tcg_const_i32(ws);
18428     TCGv_i32 twt = tcg_const_i32(wt);
18429
18430     switch (MASK_MSA_3R(ctx->opcode)) {
18431     case OPC_SLL_df:
18432         gen_helper_msa_sll_df(cpu_env, tdf, twd, tws, twt);
18433         break;
18434     case OPC_ADDV_df:
18435         gen_helper_msa_addv_df(cpu_env, tdf, twd, tws, twt);
18436         break;
18437     case OPC_CEQ_df:
18438         gen_helper_msa_ceq_df(cpu_env, tdf, twd, tws, twt);
18439         break;
18440     case OPC_ADD_A_df:
18441         gen_helper_msa_add_a_df(cpu_env, tdf, twd, tws, twt);
18442         break;
18443     case OPC_SUBS_S_df:
18444         gen_helper_msa_subs_s_df(cpu_env, tdf, twd, tws, twt);
18445         break;
18446     case OPC_MULV_df:
18447         gen_helper_msa_mulv_df(cpu_env, tdf, twd, tws, twt);
18448         break;
18449     case OPC_SLD_df:
18450         gen_helper_msa_sld_df(cpu_env, tdf, twd, tws, twt);
18451         break;
18452     case OPC_VSHF_df:
18453         gen_helper_msa_vshf_df(cpu_env, tdf, twd, tws, twt);
18454         break;
18455     case OPC_SRA_df:
18456         gen_helper_msa_sra_df(cpu_env, tdf, twd, tws, twt);
18457         break;
18458     case OPC_SUBV_df:
18459         gen_helper_msa_subv_df(cpu_env, tdf, twd, tws, twt);
18460         break;
18461     case OPC_ADDS_A_df:
18462         gen_helper_msa_adds_a_df(cpu_env, tdf, twd, tws, twt);
18463         break;
18464     case OPC_SUBS_U_df:
18465         gen_helper_msa_subs_u_df(cpu_env, tdf, twd, tws, twt);
18466         break;
18467     case OPC_MADDV_df:
18468         gen_helper_msa_maddv_df(cpu_env, tdf, twd, tws, twt);
18469         break;
18470     case OPC_SPLAT_df:
18471         gen_helper_msa_splat_df(cpu_env, tdf, twd, tws, twt);
18472         break;
18473     case OPC_SRAR_df:
18474         gen_helper_msa_srar_df(cpu_env, tdf, twd, tws, twt);
18475         break;
18476     case OPC_SRL_df:
18477         gen_helper_msa_srl_df(cpu_env, tdf, twd, tws, twt);
18478         break;
18479     case OPC_MAX_S_df:
18480         gen_helper_msa_max_s_df(cpu_env, tdf, twd, tws, twt);
18481         break;
18482     case OPC_CLT_S_df:
18483         gen_helper_msa_clt_s_df(cpu_env, tdf, twd, tws, twt);
18484         break;
18485     case OPC_ADDS_S_df:
18486         gen_helper_msa_adds_s_df(cpu_env, tdf, twd, tws, twt);
18487         break;
18488     case OPC_SUBSUS_U_df:
18489         gen_helper_msa_subsus_u_df(cpu_env, tdf, twd, tws, twt);
18490         break;
18491     case OPC_MSUBV_df:
18492         gen_helper_msa_msubv_df(cpu_env, tdf, twd, tws, twt);
18493         break;
18494     case OPC_PCKEV_df:
18495         gen_helper_msa_pckev_df(cpu_env, tdf, twd, tws, twt);
18496         break;
18497     case OPC_SRLR_df:
18498         gen_helper_msa_srlr_df(cpu_env, tdf, twd, tws, twt);
18499         break;
18500     case OPC_BCLR_df:
18501         gen_helper_msa_bclr_df(cpu_env, tdf, twd, tws, twt);
18502         break;
18503     case OPC_MAX_U_df:
18504         gen_helper_msa_max_u_df(cpu_env, tdf, twd, tws, twt);
18505         break;
18506     case OPC_CLT_U_df:
18507         gen_helper_msa_clt_u_df(cpu_env, tdf, twd, tws, twt);
18508         break;
18509     case OPC_ADDS_U_df:
18510         gen_helper_msa_adds_u_df(cpu_env, tdf, twd, tws, twt);
18511         break;
18512     case OPC_SUBSUU_S_df:
18513         gen_helper_msa_subsuu_s_df(cpu_env, tdf, twd, tws, twt);
18514         break;
18515     case OPC_PCKOD_df:
18516         gen_helper_msa_pckod_df(cpu_env, tdf, twd, tws, twt);
18517         break;
18518     case OPC_BSET_df:
18519         gen_helper_msa_bset_df(cpu_env, tdf, twd, tws, twt);
18520         break;
18521     case OPC_MIN_S_df:
18522         gen_helper_msa_min_s_df(cpu_env, tdf, twd, tws, twt);
18523         break;
18524     case OPC_CLE_S_df:
18525         gen_helper_msa_cle_s_df(cpu_env, tdf, twd, tws, twt);
18526         break;
18527     case OPC_AVE_S_df:
18528         gen_helper_msa_ave_s_df(cpu_env, tdf, twd, tws, twt);
18529         break;
18530     case OPC_ASUB_S_df:
18531         gen_helper_msa_asub_s_df(cpu_env, tdf, twd, tws, twt);
18532         break;
18533     case OPC_DIV_S_df:
18534         gen_helper_msa_div_s_df(cpu_env, tdf, twd, tws, twt);
18535         break;
18536     case OPC_ILVL_df:
18537         gen_helper_msa_ilvl_df(cpu_env, tdf, twd, tws, twt);
18538         break;
18539     case OPC_BNEG_df:
18540         gen_helper_msa_bneg_df(cpu_env, tdf, twd, tws, twt);
18541         break;
18542     case OPC_MIN_U_df:
18543         gen_helper_msa_min_u_df(cpu_env, tdf, twd, tws, twt);
18544         break;
18545     case OPC_CLE_U_df:
18546         gen_helper_msa_cle_u_df(cpu_env, tdf, twd, tws, twt);
18547         break;
18548     case OPC_AVE_U_df:
18549         gen_helper_msa_ave_u_df(cpu_env, tdf, twd, tws, twt);
18550         break;
18551     case OPC_ASUB_U_df:
18552         gen_helper_msa_asub_u_df(cpu_env, tdf, twd, tws, twt);
18553         break;
18554     case OPC_DIV_U_df:
18555         gen_helper_msa_div_u_df(cpu_env, tdf, twd, tws, twt);
18556         break;
18557     case OPC_ILVR_df:
18558         gen_helper_msa_ilvr_df(cpu_env, tdf, twd, tws, twt);
18559         break;
18560     case OPC_BINSL_df:
18561         gen_helper_msa_binsl_df(cpu_env, tdf, twd, tws, twt);
18562         break;
18563     case OPC_MAX_A_df:
18564         gen_helper_msa_max_a_df(cpu_env, tdf, twd, tws, twt);
18565         break;
18566     case OPC_AVER_S_df:
18567         gen_helper_msa_aver_s_df(cpu_env, tdf, twd, tws, twt);
18568         break;
18569     case OPC_MOD_S_df:
18570         gen_helper_msa_mod_s_df(cpu_env, tdf, twd, tws, twt);
18571         break;
18572     case OPC_ILVEV_df:
18573         gen_helper_msa_ilvev_df(cpu_env, tdf, twd, tws, twt);
18574         break;
18575     case OPC_BINSR_df:
18576         gen_helper_msa_binsr_df(cpu_env, tdf, twd, tws, twt);
18577         break;
18578     case OPC_MIN_A_df:
18579         gen_helper_msa_min_a_df(cpu_env, tdf, twd, tws, twt);
18580         break;
18581     case OPC_AVER_U_df:
18582         gen_helper_msa_aver_u_df(cpu_env, tdf, twd, tws, twt);
18583         break;
18584     case OPC_MOD_U_df:
18585         gen_helper_msa_mod_u_df(cpu_env, tdf, twd, tws, twt);
18586         break;
18587     case OPC_ILVOD_df:
18588         gen_helper_msa_ilvod_df(cpu_env, tdf, twd, tws, twt);
18589         break;
18590
18591     case OPC_DOTP_S_df:
18592     case OPC_DOTP_U_df:
18593     case OPC_DPADD_S_df:
18594     case OPC_DPADD_U_df:
18595     case OPC_DPSUB_S_df:
18596     case OPC_HADD_S_df:
18597     case OPC_DPSUB_U_df:
18598     case OPC_HADD_U_df:
18599     case OPC_HSUB_S_df:
18600     case OPC_HSUB_U_df:
18601         if (df == DF_BYTE) {
18602             generate_exception_end(ctx, EXCP_RI);
18603             break;
18604         }
18605         switch (MASK_MSA_3R(ctx->opcode)) {
18606         case OPC_DOTP_S_df:
18607             gen_helper_msa_dotp_s_df(cpu_env, tdf, twd, tws, twt);
18608             break;
18609         case OPC_DOTP_U_df:
18610             gen_helper_msa_dotp_u_df(cpu_env, tdf, twd, tws, twt);
18611             break;
18612         case OPC_DPADD_S_df:
18613             gen_helper_msa_dpadd_s_df(cpu_env, tdf, twd, tws, twt);
18614             break;
18615         case OPC_DPADD_U_df:
18616             gen_helper_msa_dpadd_u_df(cpu_env, tdf, twd, tws, twt);
18617             break;
18618         case OPC_DPSUB_S_df:
18619             gen_helper_msa_dpsub_s_df(cpu_env, tdf, twd, tws, twt);
18620             break;
18621         case OPC_HADD_S_df:
18622             gen_helper_msa_hadd_s_df(cpu_env, tdf, twd, tws, twt);
18623             break;
18624         case OPC_DPSUB_U_df:
18625             gen_helper_msa_dpsub_u_df(cpu_env, tdf, twd, tws, twt);
18626             break;
18627         case OPC_HADD_U_df:
18628             gen_helper_msa_hadd_u_df(cpu_env, tdf, twd, tws, twt);
18629             break;
18630         case OPC_HSUB_S_df:
18631             gen_helper_msa_hsub_s_df(cpu_env, tdf, twd, tws, twt);
18632             break;
18633         case OPC_HSUB_U_df:
18634             gen_helper_msa_hsub_u_df(cpu_env, tdf, twd, tws, twt);
18635             break;
18636         }
18637         break;
18638     default:
18639         MIPS_INVAL("MSA instruction");
18640         generate_exception_end(ctx, EXCP_RI);
18641         break;
18642     }
18643     tcg_temp_free_i32(twd);
18644     tcg_temp_free_i32(tws);
18645     tcg_temp_free_i32(twt);
18646     tcg_temp_free_i32(tdf);
18647 }
18648
18649 static void gen_msa_elm_3e(CPUMIPSState *env, DisasContext *ctx)
18650 {
18651 #define MASK_MSA_ELM_DF3E(op)   (MASK_MSA_MINOR(op) | (op & (0x3FF << 16)))
18652     uint8_t source = (ctx->opcode >> 11) & 0x1f;
18653     uint8_t dest = (ctx->opcode >> 6) & 0x1f;
18654     TCGv telm = tcg_temp_new();
18655     TCGv_i32 tsr = tcg_const_i32(source);
18656     TCGv_i32 tdt = tcg_const_i32(dest);
18657
18658     switch (MASK_MSA_ELM_DF3E(ctx->opcode)) {
18659     case OPC_CTCMSA:
18660         gen_load_gpr(telm, source);
18661         gen_helper_msa_ctcmsa(cpu_env, telm, tdt);
18662         break;
18663     case OPC_CFCMSA:
18664         gen_helper_msa_cfcmsa(telm, cpu_env, tsr);
18665         gen_store_gpr(telm, dest);
18666         break;
18667     case OPC_MOVE_V:
18668         gen_helper_msa_move_v(cpu_env, tdt, tsr);
18669         break;
18670     default:
18671         MIPS_INVAL("MSA instruction");
18672         generate_exception_end(ctx, EXCP_RI);
18673         break;
18674     }
18675
18676     tcg_temp_free(telm);
18677     tcg_temp_free_i32(tdt);
18678     tcg_temp_free_i32(tsr);
18679 }
18680
18681 static void gen_msa_elm_df(CPUMIPSState *env, DisasContext *ctx, uint32_t df,
18682         uint32_t n)
18683 {
18684 #define MASK_MSA_ELM(op)    (MASK_MSA_MINOR(op) | (op & (0xf << 22)))
18685     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
18686     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
18687
18688     TCGv_i32 tws = tcg_const_i32(ws);
18689     TCGv_i32 twd = tcg_const_i32(wd);
18690     TCGv_i32 tn  = tcg_const_i32(n);
18691     TCGv_i32 tdf = tcg_const_i32(df);
18692
18693     switch (MASK_MSA_ELM(ctx->opcode)) {
18694     case OPC_SLDI_df:
18695         gen_helper_msa_sldi_df(cpu_env, tdf, twd, tws, tn);
18696         break;
18697     case OPC_SPLATI_df:
18698         gen_helper_msa_splati_df(cpu_env, tdf, twd, tws, tn);
18699         break;
18700     case OPC_INSVE_df:
18701         gen_helper_msa_insve_df(cpu_env, tdf, twd, tws, tn);
18702         break;
18703     case OPC_COPY_S_df:
18704     case OPC_COPY_U_df:
18705     case OPC_INSERT_df:
18706 #if !defined(TARGET_MIPS64)
18707         /* Double format valid only for MIPS64 */
18708         if (df == DF_DOUBLE) {
18709             generate_exception_end(ctx, EXCP_RI);
18710             break;
18711         }
18712 #endif
18713         switch (MASK_MSA_ELM(ctx->opcode)) {
18714         case OPC_COPY_S_df:
18715             gen_helper_msa_copy_s_df(cpu_env, tdf, twd, tws, tn);
18716             break;
18717         case OPC_COPY_U_df:
18718             gen_helper_msa_copy_u_df(cpu_env, tdf, twd, tws, tn);
18719             break;
18720         case OPC_INSERT_df:
18721             gen_helper_msa_insert_df(cpu_env, tdf, twd, tws, tn);
18722             break;
18723         }
18724         break;
18725     default:
18726         MIPS_INVAL("MSA instruction");
18727         generate_exception_end(ctx, EXCP_RI);
18728     }
18729     tcg_temp_free_i32(twd);
18730     tcg_temp_free_i32(tws);
18731     tcg_temp_free_i32(tn);
18732     tcg_temp_free_i32(tdf);
18733 }
18734
18735 static void gen_msa_elm(CPUMIPSState *env, DisasContext *ctx)
18736 {
18737     uint8_t dfn = (ctx->opcode >> 16) & 0x3f;
18738     uint32_t df = 0, n = 0;
18739
18740     if ((dfn & 0x30) == 0x00) {
18741         n = dfn & 0x0f;
18742         df = DF_BYTE;
18743     } else if ((dfn & 0x38) == 0x20) {
18744         n = dfn & 0x07;
18745         df = DF_HALF;
18746     } else if ((dfn & 0x3c) == 0x30) {
18747         n = dfn & 0x03;
18748         df = DF_WORD;
18749     } else if ((dfn & 0x3e) == 0x38) {
18750         n = dfn & 0x01;
18751         df = DF_DOUBLE;
18752     } else if (dfn == 0x3E) {
18753         /* CTCMSA, CFCMSA, MOVE.V */
18754         gen_msa_elm_3e(env, ctx);
18755         return;
18756     } else {
18757         generate_exception_end(ctx, EXCP_RI);
18758         return;
18759     }
18760
18761     gen_msa_elm_df(env, ctx, df, n);
18762 }
18763
18764 static void gen_msa_3rf(CPUMIPSState *env, DisasContext *ctx)
18765 {
18766 #define MASK_MSA_3RF(op)    (MASK_MSA_MINOR(op) | (op & (0xf << 22)))
18767     uint8_t df = (ctx->opcode >> 21) & 0x1;
18768     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
18769     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
18770     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
18771
18772     TCGv_i32 twd = tcg_const_i32(wd);
18773     TCGv_i32 tws = tcg_const_i32(ws);
18774     TCGv_i32 twt = tcg_const_i32(wt);
18775     TCGv_i32 tdf = tcg_temp_new_i32();
18776
18777     /* adjust df value for floating-point instruction */
18778     tcg_gen_movi_i32(tdf, df + 2);
18779
18780     switch (MASK_MSA_3RF(ctx->opcode)) {
18781     case OPC_FCAF_df:
18782         gen_helper_msa_fcaf_df(cpu_env, tdf, twd, tws, twt);
18783         break;
18784     case OPC_FADD_df:
18785         gen_helper_msa_fadd_df(cpu_env, tdf, twd, tws, twt);
18786         break;
18787     case OPC_FCUN_df:
18788         gen_helper_msa_fcun_df(cpu_env, tdf, twd, tws, twt);
18789         break;
18790     case OPC_FSUB_df:
18791         gen_helper_msa_fsub_df(cpu_env, tdf, twd, tws, twt);
18792         break;
18793     case OPC_FCOR_df:
18794         gen_helper_msa_fcor_df(cpu_env, tdf, twd, tws, twt);
18795         break;
18796     case OPC_FCEQ_df:
18797         gen_helper_msa_fceq_df(cpu_env, tdf, twd, tws, twt);
18798         break;
18799     case OPC_FMUL_df:
18800         gen_helper_msa_fmul_df(cpu_env, tdf, twd, tws, twt);
18801         break;
18802     case OPC_FCUNE_df:
18803         gen_helper_msa_fcune_df(cpu_env, tdf, twd, tws, twt);
18804         break;
18805     case OPC_FCUEQ_df:
18806         gen_helper_msa_fcueq_df(cpu_env, tdf, twd, tws, twt);
18807         break;
18808     case OPC_FDIV_df:
18809         gen_helper_msa_fdiv_df(cpu_env, tdf, twd, tws, twt);
18810         break;
18811     case OPC_FCNE_df:
18812         gen_helper_msa_fcne_df(cpu_env, tdf, twd, tws, twt);
18813         break;
18814     case OPC_FCLT_df:
18815         gen_helper_msa_fclt_df(cpu_env, tdf, twd, tws, twt);
18816         break;
18817     case OPC_FMADD_df:
18818         gen_helper_msa_fmadd_df(cpu_env, tdf, twd, tws, twt);
18819         break;
18820     case OPC_MUL_Q_df:
18821         tcg_gen_movi_i32(tdf, df + 1);
18822         gen_helper_msa_mul_q_df(cpu_env, tdf, twd, tws, twt);
18823         break;
18824     case OPC_FCULT_df:
18825         gen_helper_msa_fcult_df(cpu_env, tdf, twd, tws, twt);
18826         break;
18827     case OPC_FMSUB_df:
18828         gen_helper_msa_fmsub_df(cpu_env, tdf, twd, tws, twt);
18829         break;
18830     case OPC_MADD_Q_df:
18831         tcg_gen_movi_i32(tdf, df + 1);
18832         gen_helper_msa_madd_q_df(cpu_env, tdf, twd, tws, twt);
18833         break;
18834     case OPC_FCLE_df:
18835         gen_helper_msa_fcle_df(cpu_env, tdf, twd, tws, twt);
18836         break;
18837     case OPC_MSUB_Q_df:
18838         tcg_gen_movi_i32(tdf, df + 1);
18839         gen_helper_msa_msub_q_df(cpu_env, tdf, twd, tws, twt);
18840         break;
18841     case OPC_FCULE_df:
18842         gen_helper_msa_fcule_df(cpu_env, tdf, twd, tws, twt);
18843         break;
18844     case OPC_FEXP2_df:
18845         gen_helper_msa_fexp2_df(cpu_env, tdf, twd, tws, twt);
18846         break;
18847     case OPC_FSAF_df:
18848         gen_helper_msa_fsaf_df(cpu_env, tdf, twd, tws, twt);
18849         break;
18850     case OPC_FEXDO_df:
18851         gen_helper_msa_fexdo_df(cpu_env, tdf, twd, tws, twt);
18852         break;
18853     case OPC_FSUN_df:
18854         gen_helper_msa_fsun_df(cpu_env, tdf, twd, tws, twt);
18855         break;
18856     case OPC_FSOR_df:
18857         gen_helper_msa_fsor_df(cpu_env, tdf, twd, tws, twt);
18858         break;
18859     case OPC_FSEQ_df:
18860         gen_helper_msa_fseq_df(cpu_env, tdf, twd, tws, twt);
18861         break;
18862     case OPC_FTQ_df:
18863         gen_helper_msa_ftq_df(cpu_env, tdf, twd, tws, twt);
18864         break;
18865     case OPC_FSUNE_df:
18866         gen_helper_msa_fsune_df(cpu_env, tdf, twd, tws, twt);
18867         break;
18868     case OPC_FSUEQ_df:
18869         gen_helper_msa_fsueq_df(cpu_env, tdf, twd, tws, twt);
18870         break;
18871     case OPC_FSNE_df:
18872         gen_helper_msa_fsne_df(cpu_env, tdf, twd, tws, twt);
18873         break;
18874     case OPC_FSLT_df:
18875         gen_helper_msa_fslt_df(cpu_env, tdf, twd, tws, twt);
18876         break;
18877     case OPC_FMIN_df:
18878         gen_helper_msa_fmin_df(cpu_env, tdf, twd, tws, twt);
18879         break;
18880     case OPC_MULR_Q_df:
18881         tcg_gen_movi_i32(tdf, df + 1);
18882         gen_helper_msa_mulr_q_df(cpu_env, tdf, twd, tws, twt);
18883         break;
18884     case OPC_FSULT_df:
18885         gen_helper_msa_fsult_df(cpu_env, tdf, twd, tws, twt);
18886         break;
18887     case OPC_FMIN_A_df:
18888         gen_helper_msa_fmin_a_df(cpu_env, tdf, twd, tws, twt);
18889         break;
18890     case OPC_MADDR_Q_df:
18891         tcg_gen_movi_i32(tdf, df + 1);
18892         gen_helper_msa_maddr_q_df(cpu_env, tdf, twd, tws, twt);
18893         break;
18894     case OPC_FSLE_df:
18895         gen_helper_msa_fsle_df(cpu_env, tdf, twd, tws, twt);
18896         break;
18897     case OPC_FMAX_df:
18898         gen_helper_msa_fmax_df(cpu_env, tdf, twd, tws, twt);
18899         break;
18900     case OPC_MSUBR_Q_df:
18901         tcg_gen_movi_i32(tdf, df + 1);
18902         gen_helper_msa_msubr_q_df(cpu_env, tdf, twd, tws, twt);
18903         break;
18904     case OPC_FSULE_df:
18905         gen_helper_msa_fsule_df(cpu_env, tdf, twd, tws, twt);
18906         break;
18907     case OPC_FMAX_A_df:
18908         gen_helper_msa_fmax_a_df(cpu_env, tdf, twd, tws, twt);
18909         break;
18910     default:
18911         MIPS_INVAL("MSA instruction");
18912         generate_exception_end(ctx, EXCP_RI);
18913         break;
18914     }
18915
18916     tcg_temp_free_i32(twd);
18917     tcg_temp_free_i32(tws);
18918     tcg_temp_free_i32(twt);
18919     tcg_temp_free_i32(tdf);
18920 }
18921
18922 static void gen_msa_2r(CPUMIPSState *env, DisasContext *ctx)
18923 {
18924 #define MASK_MSA_2R(op)     (MASK_MSA_MINOR(op) | (op & (0x1f << 21)) | \
18925                             (op & (0x7 << 18)))
18926     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
18927     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
18928     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
18929     uint8_t df = (ctx->opcode >> 16) & 0x3;
18930     TCGv_i32 twd = tcg_const_i32(wd);
18931     TCGv_i32 tws = tcg_const_i32(ws);
18932     TCGv_i32 twt = tcg_const_i32(wt);
18933     TCGv_i32 tdf = tcg_const_i32(df);
18934
18935     switch (MASK_MSA_2R(ctx->opcode)) {
18936     case OPC_FILL_df:
18937 #if !defined(TARGET_MIPS64)
18938         /* Double format valid only for MIPS64 */
18939         if (df == DF_DOUBLE) {
18940             generate_exception_end(ctx, EXCP_RI);
18941             break;
18942         }
18943 #endif
18944         gen_helper_msa_fill_df(cpu_env, tdf, twd, tws); /* trs */
18945         break;
18946     case OPC_PCNT_df:
18947         gen_helper_msa_pcnt_df(cpu_env, tdf, twd, tws);
18948         break;
18949     case OPC_NLOC_df:
18950         gen_helper_msa_nloc_df(cpu_env, tdf, twd, tws);
18951         break;
18952     case OPC_NLZC_df:
18953         gen_helper_msa_nlzc_df(cpu_env, tdf, twd, tws);
18954         break;
18955     default:
18956         MIPS_INVAL("MSA instruction");
18957         generate_exception_end(ctx, EXCP_RI);
18958         break;
18959     }
18960
18961     tcg_temp_free_i32(twd);
18962     tcg_temp_free_i32(tws);
18963     tcg_temp_free_i32(twt);
18964     tcg_temp_free_i32(tdf);
18965 }
18966
18967 static void gen_msa_2rf(CPUMIPSState *env, DisasContext *ctx)
18968 {
18969 #define MASK_MSA_2RF(op)    (MASK_MSA_MINOR(op) | (op & (0x1f << 21)) | \
18970                             (op & (0xf << 17)))
18971     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
18972     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
18973     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
18974     uint8_t df = (ctx->opcode >> 16) & 0x1;
18975     TCGv_i32 twd = tcg_const_i32(wd);
18976     TCGv_i32 tws = tcg_const_i32(ws);
18977     TCGv_i32 twt = tcg_const_i32(wt);
18978     /* adjust df value for floating-point instruction */
18979     TCGv_i32 tdf = tcg_const_i32(df + 2);
18980
18981     switch (MASK_MSA_2RF(ctx->opcode)) {
18982     case OPC_FCLASS_df:
18983         gen_helper_msa_fclass_df(cpu_env, tdf, twd, tws);
18984         break;
18985     case OPC_FTRUNC_S_df:
18986         gen_helper_msa_ftrunc_s_df(cpu_env, tdf, twd, tws);
18987         break;
18988     case OPC_FTRUNC_U_df:
18989         gen_helper_msa_ftrunc_u_df(cpu_env, tdf, twd, tws);
18990         break;
18991     case OPC_FSQRT_df:
18992         gen_helper_msa_fsqrt_df(cpu_env, tdf, twd, tws);
18993         break;
18994     case OPC_FRSQRT_df:
18995         gen_helper_msa_frsqrt_df(cpu_env, tdf, twd, tws);
18996         break;
18997     case OPC_FRCP_df:
18998         gen_helper_msa_frcp_df(cpu_env, tdf, twd, tws);
18999         break;
19000     case OPC_FRINT_df:
19001         gen_helper_msa_frint_df(cpu_env, tdf, twd, tws);
19002         break;
19003     case OPC_FLOG2_df:
19004         gen_helper_msa_flog2_df(cpu_env, tdf, twd, tws);
19005         break;
19006     case OPC_FEXUPL_df:
19007         gen_helper_msa_fexupl_df(cpu_env, tdf, twd, tws);
19008         break;
19009     case OPC_FEXUPR_df:
19010         gen_helper_msa_fexupr_df(cpu_env, tdf, twd, tws);
19011         break;
19012     case OPC_FFQL_df:
19013         gen_helper_msa_ffql_df(cpu_env, tdf, twd, tws);
19014         break;
19015     case OPC_FFQR_df:
19016         gen_helper_msa_ffqr_df(cpu_env, tdf, twd, tws);
19017         break;
19018     case OPC_FTINT_S_df:
19019         gen_helper_msa_ftint_s_df(cpu_env, tdf, twd, tws);
19020         break;
19021     case OPC_FTINT_U_df:
19022         gen_helper_msa_ftint_u_df(cpu_env, tdf, twd, tws);
19023         break;
19024     case OPC_FFINT_S_df:
19025         gen_helper_msa_ffint_s_df(cpu_env, tdf, twd, tws);
19026         break;
19027     case OPC_FFINT_U_df:
19028         gen_helper_msa_ffint_u_df(cpu_env, tdf, twd, tws);
19029         break;
19030     }
19031
19032     tcg_temp_free_i32(twd);
19033     tcg_temp_free_i32(tws);
19034     tcg_temp_free_i32(twt);
19035     tcg_temp_free_i32(tdf);
19036 }
19037
19038 static void gen_msa_vec_v(CPUMIPSState *env, DisasContext *ctx)
19039 {
19040 #define MASK_MSA_VEC(op)    (MASK_MSA_MINOR(op) | (op & (0x1f << 21)))
19041     uint8_t wt = (ctx->opcode >> 16) & 0x1f;
19042     uint8_t ws = (ctx->opcode >> 11) & 0x1f;
19043     uint8_t wd = (ctx->opcode >> 6) & 0x1f;
19044     TCGv_i32 twd = tcg_const_i32(wd);
19045     TCGv_i32 tws = tcg_const_i32(ws);
19046     TCGv_i32 twt = tcg_const_i32(wt);
19047
19048     switch (MASK_MSA_VEC(ctx->opcode)) {
19049     case OPC_AND_V:
19050         gen_helper_msa_and_v(cpu_env, twd, tws, twt);
19051         break;
19052     case OPC_OR_V:
19053         gen_helper_msa_or_v(cpu_env, twd, tws, twt);
19054         break;
19055     case OPC_NOR_V:
19056         gen_helper_msa_nor_v(cpu_env, twd, tws, twt);
19057         break;
19058     case OPC_XOR_V:
19059         gen_helper_msa_xor_v(cpu_env, twd, tws, twt);
19060         break;
19061     case OPC_BMNZ_V:
19062         gen_helper_msa_bmnz_v(cpu_env, twd, tws, twt);
19063         break;
19064     case OPC_BMZ_V:
19065         gen_helper_msa_bmz_v(cpu_env, twd, tws, twt);
19066         break;
19067     case OPC_BSEL_V:
19068         gen_helper_msa_bsel_v(cpu_env, twd, tws, twt);
19069         break;
19070     default:
19071         MIPS_INVAL("MSA instruction");
19072         generate_exception_end(ctx, EXCP_RI);
19073         break;
19074     }
19075
19076     tcg_temp_free_i32(twd);
19077     tcg_temp_free_i32(tws);
19078     tcg_temp_free_i32(twt);
19079 }
19080
19081 static void gen_msa_vec(CPUMIPSState *env, DisasContext *ctx)
19082 {
19083     switch (MASK_MSA_VEC(ctx->opcode)) {
19084     case OPC_AND_V:
19085     case OPC_OR_V:
19086     case OPC_NOR_V:
19087     case OPC_XOR_V:
19088     case OPC_BMNZ_V:
19089     case OPC_BMZ_V:
19090     case OPC_BSEL_V:
19091         gen_msa_vec_v(env, ctx);
19092         break;
19093     case OPC_MSA_2R:
19094         gen_msa_2r(env, ctx);
19095         break;
19096     case OPC_MSA_2RF:
19097         gen_msa_2rf(env, ctx);
19098         break;
19099     default:
19100         MIPS_INVAL("MSA instruction");
19101         generate_exception_end(ctx, EXCP_RI);
19102         break;
19103     }
19104 }
19105
19106 static void gen_msa(CPUMIPSState *env, DisasContext *ctx)
19107 {
19108     uint32_t opcode = ctx->opcode;
19109     check_insn(ctx, ASE_MSA);
19110     check_msa_access(ctx);
19111
19112     switch (MASK_MSA_MINOR(opcode)) {
19113     case OPC_MSA_I8_00:
19114     case OPC_MSA_I8_01:
19115     case OPC_MSA_I8_02:
19116         gen_msa_i8(env, ctx);
19117         break;
19118     case OPC_MSA_I5_06:
19119     case OPC_MSA_I5_07:
19120         gen_msa_i5(env, ctx);
19121         break;
19122     case OPC_MSA_BIT_09:
19123     case OPC_MSA_BIT_0A:
19124         gen_msa_bit(env, ctx);
19125         break;
19126     case OPC_MSA_3R_0D:
19127     case OPC_MSA_3R_0E:
19128     case OPC_MSA_3R_0F:
19129     case OPC_MSA_3R_10:
19130     case OPC_MSA_3R_11:
19131     case OPC_MSA_3R_12:
19132     case OPC_MSA_3R_13:
19133     case OPC_MSA_3R_14:
19134     case OPC_MSA_3R_15:
19135         gen_msa_3r(env, ctx);
19136         break;
19137     case OPC_MSA_ELM:
19138         gen_msa_elm(env, ctx);
19139         break;
19140     case OPC_MSA_3RF_1A:
19141     case OPC_MSA_3RF_1B:
19142     case OPC_MSA_3RF_1C:
19143         gen_msa_3rf(env, ctx);
19144         break;
19145     case OPC_MSA_VEC:
19146         gen_msa_vec(env, ctx);
19147         break;
19148     case OPC_LD_B:
19149     case OPC_LD_H:
19150     case OPC_LD_W:
19151     case OPC_LD_D:
19152     case OPC_ST_B:
19153     case OPC_ST_H:
19154     case OPC_ST_W:
19155     case OPC_ST_D:
19156         {
19157             int32_t s10 = sextract32(ctx->opcode, 16, 10);
19158             uint8_t rs = (ctx->opcode >> 11) & 0x1f;
19159             uint8_t wd = (ctx->opcode >> 6) & 0x1f;
19160             uint8_t df = (ctx->opcode >> 0) & 0x3;
19161
19162             TCGv_i32 twd = tcg_const_i32(wd);
19163             TCGv taddr = tcg_temp_new();
19164             gen_base_offset_addr(ctx, taddr, rs, s10 << df);
19165
19166             switch (MASK_MSA_MINOR(opcode)) {
19167             case OPC_LD_B:
19168                 gen_helper_msa_ld_b(cpu_env, twd, taddr);
19169                 break;
19170             case OPC_LD_H:
19171                 gen_helper_msa_ld_h(cpu_env, twd, taddr);
19172                 break;
19173             case OPC_LD_W:
19174                 gen_helper_msa_ld_w(cpu_env, twd, taddr);
19175                 break;
19176             case OPC_LD_D:
19177                 gen_helper_msa_ld_d(cpu_env, twd, taddr);
19178                 break;
19179             case OPC_ST_B:
19180                 gen_helper_msa_st_b(cpu_env, twd, taddr);
19181                 break;
19182             case OPC_ST_H:
19183                 gen_helper_msa_st_h(cpu_env, twd, taddr);
19184                 break;
19185             case OPC_ST_W:
19186                 gen_helper_msa_st_w(cpu_env, twd, taddr);
19187                 break;
19188             case OPC_ST_D:
19189                 gen_helper_msa_st_d(cpu_env, twd, taddr);
19190                 break;
19191             }
19192
19193             tcg_temp_free_i32(twd);
19194             tcg_temp_free(taddr);
19195         }
19196         break;
19197     default:
19198         MIPS_INVAL("MSA instruction");
19199         generate_exception_end(ctx, EXCP_RI);
19200         break;
19201     }
19202
19203 }
19204
19205 static void decode_opc(CPUMIPSState *env, DisasContext *ctx)
19206 {
19207     int32_t offset;
19208     int rs, rt, rd, sa;
19209     uint32_t op, op1;
19210     int16_t imm;
19211
19212     /* make sure instructions are on a word boundary */
19213     if (ctx->pc & 0x3) {
19214         env->CP0_BadVAddr = ctx->pc;
19215         generate_exception_err(ctx, EXCP_AdEL, EXCP_INST_NOTAVAIL);
19216         return;
19217     }
19218
19219     /* Handle blikely not taken case */
19220     if ((ctx->hflags & MIPS_HFLAG_BMASK_BASE) == MIPS_HFLAG_BL) {
19221         TCGLabel *l1 = gen_new_label();
19222
19223         tcg_gen_brcondi_tl(TCG_COND_NE, bcond, 0, l1);
19224         tcg_gen_movi_i32(hflags, ctx->hflags & ~MIPS_HFLAG_BMASK);
19225         gen_goto_tb(ctx, 1, ctx->pc + 4);
19226         gen_set_label(l1);
19227     }
19228
19229     op = MASK_OP_MAJOR(ctx->opcode);
19230     rs = (ctx->opcode >> 21) & 0x1f;
19231     rt = (ctx->opcode >> 16) & 0x1f;
19232     rd = (ctx->opcode >> 11) & 0x1f;
19233     sa = (ctx->opcode >> 6) & 0x1f;
19234     imm = (int16_t)ctx->opcode;
19235     switch (op) {
19236     case OPC_SPECIAL:
19237         decode_opc_special(env, ctx);
19238         break;
19239     case OPC_SPECIAL2:
19240         decode_opc_special2_legacy(env, ctx);
19241         break;
19242     case OPC_SPECIAL3:
19243         decode_opc_special3(env, ctx);
19244         break;
19245     case OPC_REGIMM:
19246         op1 = MASK_REGIMM(ctx->opcode);
19247         switch (op1) {
19248         case OPC_BLTZL: /* REGIMM branches */
19249         case OPC_BGEZL:
19250         case OPC_BLTZALL:
19251         case OPC_BGEZALL:
19252             check_insn(ctx, ISA_MIPS2);
19253             check_insn_opc_removed(ctx, ISA_MIPS32R6);
19254             /* Fallthrough */
19255         case OPC_BLTZ:
19256         case OPC_BGEZ:
19257             gen_compute_branch(ctx, op1, 4, rs, -1, imm << 2, 4);
19258             break;
19259         case OPC_BLTZAL:
19260         case OPC_BGEZAL:
19261             if (ctx->insn_flags & ISA_MIPS32R6) {
19262                 if (rs == 0) {
19263                     /* OPC_NAL, OPC_BAL */
19264                     gen_compute_branch(ctx, op1, 4, 0, -1, imm << 2, 4);
19265                 } else {
19266                     generate_exception_end(ctx, EXCP_RI);
19267                 }
19268             } else {
19269                 gen_compute_branch(ctx, op1, 4, rs, -1, imm << 2, 4);
19270             }
19271             break;
19272         case OPC_TGEI ... OPC_TEQI: /* REGIMM traps */
19273         case OPC_TNEI:
19274             check_insn(ctx, ISA_MIPS2);
19275             check_insn_opc_removed(ctx, ISA_MIPS32R6);
19276             gen_trap(ctx, op1, rs, -1, imm);
19277             break;
19278         case OPC_SIGRIE:
19279             check_insn(ctx, ISA_MIPS32R6);
19280             generate_exception_end(ctx, EXCP_RI);
19281             break;
19282         case OPC_SYNCI:
19283             check_insn(ctx, ISA_MIPS32R2);
19284             /* Break the TB to be able to sync copied instructions
19285                immediately */
19286             ctx->bstate = BS_STOP;
19287             break;
19288         case OPC_BPOSGE32:    /* MIPS DSP branch */
19289 #if defined(TARGET_MIPS64)
19290         case OPC_BPOSGE64:
19291 #endif
19292             check_dsp(ctx);
19293             gen_compute_branch(ctx, op1, 4, -1, -2, (int32_t)imm << 2, 4);
19294             break;
19295 #if defined(TARGET_MIPS64)
19296         case OPC_DAHI:
19297             check_insn(ctx, ISA_MIPS32R6);
19298             check_mips_64(ctx);
19299             if (rs != 0) {
19300                 tcg_gen_addi_tl(cpu_gpr[rs], cpu_gpr[rs], (int64_t)imm << 32);
19301             }
19302             break;
19303         case OPC_DATI:
19304             check_insn(ctx, ISA_MIPS32R6);
19305             check_mips_64(ctx);
19306             if (rs != 0) {
19307                 tcg_gen_addi_tl(cpu_gpr[rs], cpu_gpr[rs], (int64_t)imm << 48);
19308             }
19309             break;
19310 #endif
19311         default:            /* Invalid */
19312             MIPS_INVAL("regimm");
19313             generate_exception_end(ctx, EXCP_RI);
19314             break;
19315         }
19316         break;
19317     case OPC_CP0:
19318         check_cp0_enabled(ctx);
19319         op1 = MASK_CP0(ctx->opcode);
19320         switch (op1) {
19321         case OPC_MFC0:
19322         case OPC_MTC0:
19323         case OPC_MFTR:
19324         case OPC_MTTR:
19325         case OPC_MFHC0:
19326         case OPC_MTHC0:
19327 #if defined(TARGET_MIPS64)
19328         case OPC_DMFC0:
19329         case OPC_DMTC0:
19330 #endif
19331 #ifndef CONFIG_USER_ONLY
19332             gen_cp0(env, ctx, op1, rt, rd);
19333 #endif /* !CONFIG_USER_ONLY */
19334             break;
19335         case OPC_C0_FIRST ... OPC_C0_LAST:
19336 #ifndef CONFIG_USER_ONLY
19337             gen_cp0(env, ctx, MASK_C0(ctx->opcode), rt, rd);
19338 #endif /* !CONFIG_USER_ONLY */
19339             break;
19340         case OPC_MFMC0:
19341 #ifndef CONFIG_USER_ONLY
19342             {
19343                 uint32_t op2;
19344                 TCGv t0 = tcg_temp_new();
19345
19346                 op2 = MASK_MFMC0(ctx->opcode);
19347                 switch (op2) {
19348                 case OPC_DMT:
19349                     check_insn(ctx, ASE_MT);
19350                     gen_helper_dmt(t0);
19351                     gen_store_gpr(t0, rt);
19352                     break;
19353                 case OPC_EMT:
19354                     check_insn(ctx, ASE_MT);
19355                     gen_helper_emt(t0);
19356                     gen_store_gpr(t0, rt);
19357                     break;
19358                 case OPC_DVPE:
19359                     check_insn(ctx, ASE_MT);
19360                     gen_helper_dvpe(t0, cpu_env);
19361                     gen_store_gpr(t0, rt);
19362                     break;
19363                 case OPC_EVPE:
19364                     check_insn(ctx, ASE_MT);
19365                     gen_helper_evpe(t0, cpu_env);
19366                     gen_store_gpr(t0, rt);
19367                     break;
19368                 case OPC_DVP:
19369                     check_insn(ctx, ISA_MIPS32R6);
19370                     if (ctx->vp) {
19371                         gen_helper_dvp(t0, cpu_env);
19372                         gen_store_gpr(t0, rt);
19373                     }
19374                     break;
19375                 case OPC_EVP:
19376                     check_insn(ctx, ISA_MIPS32R6);
19377                     if (ctx->vp) {
19378                         gen_helper_evp(t0, cpu_env);
19379                         gen_store_gpr(t0, rt);
19380                     }
19381                     break;
19382                 case OPC_DI:
19383                     check_insn(ctx, ISA_MIPS32R2);
19384                     save_cpu_state(ctx, 1);
19385                     gen_helper_di(t0, cpu_env);
19386                     gen_store_gpr(t0, rt);
19387                     /* Stop translation as we may have switched
19388                        the execution mode.  */
19389                     ctx->bstate = BS_STOP;
19390                     break;
19391                 case OPC_EI:
19392                     check_insn(ctx, ISA_MIPS32R2);
19393                     save_cpu_state(ctx, 1);
19394                     gen_helper_ei(t0, cpu_env);
19395                     gen_store_gpr(t0, rt);
19396                     /* Stop translation as we may have switched
19397                        the execution mode.  */
19398                     ctx->bstate = BS_STOP;
19399                     break;
19400                 default:            /* Invalid */
19401                     MIPS_INVAL("mfmc0");
19402                     generate_exception_end(ctx, EXCP_RI);
19403                     break;
19404                 }
19405                 tcg_temp_free(t0);
19406             }
19407 #endif /* !CONFIG_USER_ONLY */
19408             break;
19409         case OPC_RDPGPR:
19410             check_insn(ctx, ISA_MIPS32R2);
19411             gen_load_srsgpr(rt, rd);
19412             break;
19413         case OPC_WRPGPR:
19414             check_insn(ctx, ISA_MIPS32R2);
19415             gen_store_srsgpr(rt, rd);
19416             break;
19417         default:
19418             MIPS_INVAL("cp0");
19419             generate_exception_end(ctx, EXCP_RI);
19420             break;
19421         }
19422         break;
19423     case OPC_BOVC: /* OPC_BEQZALC, OPC_BEQC, OPC_ADDI */
19424         if (ctx->insn_flags & ISA_MIPS32R6) {
19425             /* OPC_BOVC, OPC_BEQZALC, OPC_BEQC */
19426             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
19427         } else {
19428             /* OPC_ADDI */
19429             /* Arithmetic with immediate opcode */
19430             gen_arith_imm(ctx, op, rt, rs, imm);
19431         }
19432         break;
19433     case OPC_ADDIU:
19434          gen_arith_imm(ctx, op, rt, rs, imm);
19435          break;
19436     case OPC_SLTI: /* Set on less than with immediate opcode */
19437     case OPC_SLTIU:
19438          gen_slt_imm(ctx, op, rt, rs, imm);
19439          break;
19440     case OPC_ANDI: /* Arithmetic with immediate opcode */
19441     case OPC_LUI: /* OPC_AUI */
19442     case OPC_ORI:
19443     case OPC_XORI:
19444          gen_logic_imm(ctx, op, rt, rs, imm);
19445          break;
19446     case OPC_J ... OPC_JAL: /* Jump */
19447          offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
19448          gen_compute_branch(ctx, op, 4, rs, rt, offset, 4);
19449          break;
19450     /* Branch */
19451     case OPC_BLEZC: /* OPC_BGEZC, OPC_BGEC, OPC_BLEZL */
19452         if (ctx->insn_flags & ISA_MIPS32R6) {
19453             if (rt == 0) {
19454                 generate_exception_end(ctx, EXCP_RI);
19455                 break;
19456             }
19457             /* OPC_BLEZC, OPC_BGEZC, OPC_BGEC */
19458             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
19459         } else {
19460             /* OPC_BLEZL */
19461             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
19462         }
19463         break;
19464     case OPC_BGTZC: /* OPC_BLTZC, OPC_BLTC, OPC_BGTZL */
19465         if (ctx->insn_flags & ISA_MIPS32R6) {
19466             if (rt == 0) {
19467                 generate_exception_end(ctx, EXCP_RI);
19468                 break;
19469             }
19470             /* OPC_BGTZC, OPC_BLTZC, OPC_BLTC */
19471             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
19472         } else {
19473             /* OPC_BGTZL */
19474             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
19475         }
19476         break;
19477     case OPC_BLEZALC: /* OPC_BGEZALC, OPC_BGEUC, OPC_BLEZ */
19478         if (rt == 0) {
19479             /* OPC_BLEZ */
19480             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
19481         } else {
19482             check_insn(ctx, ISA_MIPS32R6);
19483             /* OPC_BLEZALC, OPC_BGEZALC, OPC_BGEUC */
19484             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
19485         }
19486         break;
19487     case OPC_BGTZALC: /* OPC_BLTZALC, OPC_BLTUC, OPC_BGTZ */
19488         if (rt == 0) {
19489             /* OPC_BGTZ */
19490             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
19491         } else {
19492             check_insn(ctx, ISA_MIPS32R6);
19493             /* OPC_BGTZALC, OPC_BLTZALC, OPC_BLTUC */
19494             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
19495         }
19496         break;
19497     case OPC_BEQL:
19498     case OPC_BNEL:
19499         check_insn(ctx, ISA_MIPS2);
19500          check_insn_opc_removed(ctx, ISA_MIPS32R6);
19501         /* Fallthrough */
19502     case OPC_BEQ:
19503     case OPC_BNE:
19504          gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
19505          break;
19506     case OPC_LL: /* Load and stores */
19507         check_insn(ctx, ISA_MIPS2);
19508         /* Fallthrough */
19509     case OPC_LWL:
19510     case OPC_LWR:
19511         check_insn_opc_removed(ctx, ISA_MIPS32R6);
19512          /* Fallthrough */
19513     case OPC_LB ... OPC_LH:
19514     case OPC_LW ... OPC_LHU:
19515          gen_ld(ctx, op, rt, rs, imm);
19516          break;
19517     case OPC_SWL:
19518     case OPC_SWR:
19519         check_insn_opc_removed(ctx, ISA_MIPS32R6);
19520         /* fall through */
19521     case OPC_SB ... OPC_SH:
19522     case OPC_SW:
19523          gen_st(ctx, op, rt, rs, imm);
19524          break;
19525     case OPC_SC:
19526         check_insn(ctx, ISA_MIPS2);
19527          check_insn_opc_removed(ctx, ISA_MIPS32R6);
19528          gen_st_cond(ctx, op, rt, rs, imm);
19529          break;
19530     case OPC_CACHE:
19531         check_insn_opc_removed(ctx, ISA_MIPS32R6);
19532         check_cp0_enabled(ctx);
19533         check_insn(ctx, ISA_MIPS3 | ISA_MIPS32);
19534         if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
19535             gen_cache_operation(ctx, rt, rs, imm);
19536         }
19537         /* Treat as NOP. */
19538         break;
19539     case OPC_PREF:
19540         check_insn_opc_removed(ctx, ISA_MIPS32R6);
19541         check_insn(ctx, ISA_MIPS4 | ISA_MIPS32);
19542         /* Treat as NOP. */
19543         break;
19544
19545     /* Floating point (COP1). */
19546     case OPC_LWC1:
19547     case OPC_LDC1:
19548     case OPC_SWC1:
19549     case OPC_SDC1:
19550         gen_cop1_ldst(ctx, op, rt, rs, imm);
19551         break;
19552
19553     case OPC_CP1:
19554         op1 = MASK_CP1(ctx->opcode);
19555
19556         switch (op1) {
19557         case OPC_MFHC1:
19558         case OPC_MTHC1:
19559             check_cp1_enabled(ctx);
19560             check_insn(ctx, ISA_MIPS32R2);
19561         case OPC_MFC1:
19562         case OPC_CFC1:
19563         case OPC_MTC1:
19564         case OPC_CTC1:
19565             check_cp1_enabled(ctx);
19566             gen_cp1(ctx, op1, rt, rd);
19567             break;
19568 #if defined(TARGET_MIPS64)
19569         case OPC_DMFC1:
19570         case OPC_DMTC1:
19571             check_cp1_enabled(ctx);
19572             check_insn(ctx, ISA_MIPS3);
19573             check_mips_64(ctx);
19574             gen_cp1(ctx, op1, rt, rd);
19575             break;
19576 #endif
19577         case OPC_BC1EQZ: /* OPC_BC1ANY2 */
19578             check_cp1_enabled(ctx);
19579             if (ctx->insn_flags & ISA_MIPS32R6) {
19580                 /* OPC_BC1EQZ */
19581                 gen_compute_branch1_r6(ctx, MASK_CP1(ctx->opcode),
19582                                        rt, imm << 2, 4);
19583             } else {
19584                 /* OPC_BC1ANY2 */
19585                 check_cop1x(ctx);
19586                 check_insn(ctx, ASE_MIPS3D);
19587                 gen_compute_branch1(ctx, MASK_BC1(ctx->opcode),
19588                                     (rt >> 2) & 0x7, imm << 2);
19589             }
19590             break;
19591         case OPC_BC1NEZ:
19592             check_cp1_enabled(ctx);
19593             check_insn(ctx, ISA_MIPS32R6);
19594             gen_compute_branch1_r6(ctx, MASK_CP1(ctx->opcode),
19595                                    rt, imm << 2, 4);
19596             break;
19597         case OPC_BC1ANY4:
19598             check_cp1_enabled(ctx);
19599             check_insn_opc_removed(ctx, ISA_MIPS32R6);
19600             check_cop1x(ctx);
19601             check_insn(ctx, ASE_MIPS3D);
19602             /* fall through */
19603         case OPC_BC1:
19604             check_cp1_enabled(ctx);
19605             check_insn_opc_removed(ctx, ISA_MIPS32R6);
19606             gen_compute_branch1(ctx, MASK_BC1(ctx->opcode),
19607                                 (rt >> 2) & 0x7, imm << 2);
19608             break;
19609         case OPC_PS_FMT:
19610             check_ps(ctx);
19611             /* fall through */
19612         case OPC_S_FMT:
19613         case OPC_D_FMT:
19614             check_cp1_enabled(ctx);
19615             gen_farith(ctx, ctx->opcode & FOP(0x3f, 0x1f), rt, rd, sa,
19616                        (imm >> 8) & 0x7);
19617             break;
19618         case OPC_W_FMT:
19619         case OPC_L_FMT:
19620         {
19621             int r6_op = ctx->opcode & FOP(0x3f, 0x1f);
19622             check_cp1_enabled(ctx);
19623             if (ctx->insn_flags & ISA_MIPS32R6) {
19624                 switch (r6_op) {
19625                 case R6_OPC_CMP_AF_S:
19626                 case R6_OPC_CMP_UN_S:
19627                 case R6_OPC_CMP_EQ_S:
19628                 case R6_OPC_CMP_UEQ_S:
19629                 case R6_OPC_CMP_LT_S:
19630                 case R6_OPC_CMP_ULT_S:
19631                 case R6_OPC_CMP_LE_S:
19632                 case R6_OPC_CMP_ULE_S:
19633                 case R6_OPC_CMP_SAF_S:
19634                 case R6_OPC_CMP_SUN_S:
19635                 case R6_OPC_CMP_SEQ_S:
19636                 case R6_OPC_CMP_SEUQ_S:
19637                 case R6_OPC_CMP_SLT_S:
19638                 case R6_OPC_CMP_SULT_S:
19639                 case R6_OPC_CMP_SLE_S:
19640                 case R6_OPC_CMP_SULE_S:
19641                 case R6_OPC_CMP_OR_S:
19642                 case R6_OPC_CMP_UNE_S:
19643                 case R6_OPC_CMP_NE_S:
19644                 case R6_OPC_CMP_SOR_S:
19645                 case R6_OPC_CMP_SUNE_S:
19646                 case R6_OPC_CMP_SNE_S:
19647                     gen_r6_cmp_s(ctx, ctx->opcode & 0x1f, rt, rd, sa);
19648                     break;
19649                 case R6_OPC_CMP_AF_D:
19650                 case R6_OPC_CMP_UN_D:
19651                 case R6_OPC_CMP_EQ_D:
19652                 case R6_OPC_CMP_UEQ_D:
19653                 case R6_OPC_CMP_LT_D:
19654                 case R6_OPC_CMP_ULT_D:
19655                 case R6_OPC_CMP_LE_D:
19656                 case R6_OPC_CMP_ULE_D:
19657                 case R6_OPC_CMP_SAF_D:
19658                 case R6_OPC_CMP_SUN_D:
19659                 case R6_OPC_CMP_SEQ_D:
19660                 case R6_OPC_CMP_SEUQ_D:
19661                 case R6_OPC_CMP_SLT_D:
19662                 case R6_OPC_CMP_SULT_D:
19663                 case R6_OPC_CMP_SLE_D:
19664                 case R6_OPC_CMP_SULE_D:
19665                 case R6_OPC_CMP_OR_D:
19666                 case R6_OPC_CMP_UNE_D:
19667                 case R6_OPC_CMP_NE_D:
19668                 case R6_OPC_CMP_SOR_D:
19669                 case R6_OPC_CMP_SUNE_D:
19670                 case R6_OPC_CMP_SNE_D:
19671                     gen_r6_cmp_d(ctx, ctx->opcode & 0x1f, rt, rd, sa);
19672                     break;
19673                 default:
19674                     gen_farith(ctx, ctx->opcode & FOP(0x3f, 0x1f),
19675                                rt, rd, sa, (imm >> 8) & 0x7);
19676
19677                     break;
19678                 }
19679             } else {
19680                 gen_farith(ctx, ctx->opcode & FOP(0x3f, 0x1f), rt, rd, sa,
19681                            (imm >> 8) & 0x7);
19682             }
19683             break;
19684         }
19685         case OPC_BZ_V:
19686         case OPC_BNZ_V:
19687         case OPC_BZ_B:
19688         case OPC_BZ_H:
19689         case OPC_BZ_W:
19690         case OPC_BZ_D:
19691         case OPC_BNZ_B:
19692         case OPC_BNZ_H:
19693         case OPC_BNZ_W:
19694         case OPC_BNZ_D:
19695             check_insn(ctx, ASE_MSA);
19696             gen_msa_branch(env, ctx, op1);
19697             break;
19698         default:
19699             MIPS_INVAL("cp1");
19700             generate_exception_end(ctx, EXCP_RI);
19701             break;
19702         }
19703         break;
19704
19705     /* Compact branches [R6] and COP2 [non-R6] */
19706     case OPC_BC: /* OPC_LWC2 */
19707     case OPC_BALC: /* OPC_SWC2 */
19708         if (ctx->insn_flags & ISA_MIPS32R6) {
19709             /* OPC_BC, OPC_BALC */
19710             gen_compute_compact_branch(ctx, op, 0, 0,
19711                                        sextract32(ctx->opcode << 2, 0, 28));
19712         } else {
19713             /* OPC_LWC2, OPC_SWC2 */
19714             /* COP2: Not implemented. */
19715             generate_exception_err(ctx, EXCP_CpU, 2);
19716         }
19717         break;
19718     case OPC_BEQZC: /* OPC_JIC, OPC_LDC2 */
19719     case OPC_BNEZC: /* OPC_JIALC, OPC_SDC2 */
19720         if (ctx->insn_flags & ISA_MIPS32R6) {
19721             if (rs != 0) {
19722                 /* OPC_BEQZC, OPC_BNEZC */
19723                 gen_compute_compact_branch(ctx, op, rs, 0,
19724                                            sextract32(ctx->opcode << 2, 0, 23));
19725             } else {
19726                 /* OPC_JIC, OPC_JIALC */
19727                 gen_compute_compact_branch(ctx, op, 0, rt, imm);
19728             }
19729         } else {
19730             /* OPC_LWC2, OPC_SWC2 */
19731             /* COP2: Not implemented. */
19732             generate_exception_err(ctx, EXCP_CpU, 2);
19733         }
19734         break;
19735     case OPC_CP2:
19736         check_insn(ctx, INSN_LOONGSON2F);
19737         /* Note that these instructions use different fields.  */
19738         gen_loongson_multimedia(ctx, sa, rd, rt);
19739         break;
19740
19741     case OPC_CP3:
19742         check_insn_opc_removed(ctx, ISA_MIPS32R6);
19743         if (ctx->CP0_Config1 & (1 << CP0C1_FP)) {
19744             check_cp1_enabled(ctx);
19745             op1 = MASK_CP3(ctx->opcode);
19746             switch (op1) {
19747             case OPC_LUXC1:
19748             case OPC_SUXC1:
19749                 check_insn(ctx, ISA_MIPS5 | ISA_MIPS32R2);
19750                 /* Fallthrough */
19751             case OPC_LWXC1:
19752             case OPC_LDXC1:
19753             case OPC_SWXC1:
19754             case OPC_SDXC1:
19755                 check_insn(ctx, ISA_MIPS4 | ISA_MIPS32R2);
19756                 gen_flt3_ldst(ctx, op1, sa, rd, rs, rt);
19757                 break;
19758             case OPC_PREFX:
19759                 check_insn(ctx, ISA_MIPS4 | ISA_MIPS32R2);
19760                 /* Treat as NOP. */
19761                 break;
19762             case OPC_ALNV_PS:
19763                 check_insn(ctx, ISA_MIPS5 | ISA_MIPS32R2);
19764                 /* Fallthrough */
19765             case OPC_MADD_S:
19766             case OPC_MADD_D:
19767             case OPC_MADD_PS:
19768             case OPC_MSUB_S:
19769             case OPC_MSUB_D:
19770             case OPC_MSUB_PS:
19771             case OPC_NMADD_S:
19772             case OPC_NMADD_D:
19773             case OPC_NMADD_PS:
19774             case OPC_NMSUB_S:
19775             case OPC_NMSUB_D:
19776             case OPC_NMSUB_PS:
19777                 check_insn(ctx, ISA_MIPS4 | ISA_MIPS32R2);
19778                 gen_flt3_arith(ctx, op1, sa, rs, rd, rt);
19779                 break;
19780             default:
19781                 MIPS_INVAL("cp3");
19782                 generate_exception_end(ctx, EXCP_RI);
19783                 break;
19784             }
19785         } else {
19786             generate_exception_err(ctx, EXCP_CpU, 1);
19787         }
19788         break;
19789
19790 #if defined(TARGET_MIPS64)
19791     /* MIPS64 opcodes */
19792     case OPC_LDL ... OPC_LDR:
19793     case OPC_LLD:
19794         check_insn_opc_removed(ctx, ISA_MIPS32R6);
19795         /* fall through */
19796     case OPC_LWU:
19797     case OPC_LD:
19798         check_insn(ctx, ISA_MIPS3);
19799         check_mips_64(ctx);
19800         gen_ld(ctx, op, rt, rs, imm);
19801         break;
19802     case OPC_SDL ... OPC_SDR:
19803         check_insn_opc_removed(ctx, ISA_MIPS32R6);
19804         /* fall through */
19805     case OPC_SD:
19806         check_insn(ctx, ISA_MIPS3);
19807         check_mips_64(ctx);
19808         gen_st(ctx, op, rt, rs, imm);
19809         break;
19810     case OPC_SCD:
19811         check_insn_opc_removed(ctx, ISA_MIPS32R6);
19812         check_insn(ctx, ISA_MIPS3);
19813         check_mips_64(ctx);
19814         gen_st_cond(ctx, op, rt, rs, imm);
19815         break;
19816     case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC, OPC_DADDI */
19817         if (ctx->insn_flags & ISA_MIPS32R6) {
19818             /* OPC_BNVC, OPC_BNEZALC, OPC_BNEC */
19819             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
19820         } else {
19821             /* OPC_DADDI */
19822             check_insn(ctx, ISA_MIPS3);
19823             check_mips_64(ctx);
19824             gen_arith_imm(ctx, op, rt, rs, imm);
19825         }
19826         break;
19827     case OPC_DADDIU:
19828         check_insn(ctx, ISA_MIPS3);
19829         check_mips_64(ctx);
19830         gen_arith_imm(ctx, op, rt, rs, imm);
19831         break;
19832 #else
19833     case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC */
19834         if (ctx->insn_flags & ISA_MIPS32R6) {
19835             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
19836         } else {
19837             MIPS_INVAL("major opcode");
19838             generate_exception_end(ctx, EXCP_RI);
19839         }
19840         break;
19841 #endif
19842     case OPC_DAUI: /* OPC_JALX */
19843         if (ctx->insn_flags & ISA_MIPS32R6) {
19844 #if defined(TARGET_MIPS64)
19845             /* OPC_DAUI */
19846             check_mips_64(ctx);
19847             if (rs == 0) {
19848                 generate_exception(ctx, EXCP_RI);
19849             } else if (rt != 0) {
19850                 TCGv t0 = tcg_temp_new();
19851                 gen_load_gpr(t0, rs);
19852                 tcg_gen_addi_tl(cpu_gpr[rt], t0, imm << 16);
19853                 tcg_temp_free(t0);
19854             }
19855 #else
19856             generate_exception_end(ctx, EXCP_RI);
19857             MIPS_INVAL("major opcode");
19858 #endif
19859         } else {
19860             /* OPC_JALX */
19861             check_insn(ctx, ASE_MIPS16 | ASE_MICROMIPS);
19862             offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
19863             gen_compute_branch(ctx, op, 4, rs, rt, offset, 4);
19864         }
19865         break;
19866     case OPC_MSA: /* OPC_MDMX */
19867         /* MDMX: Not implemented. */
19868         gen_msa(env, ctx);
19869         break;
19870     case OPC_PCREL:
19871         check_insn(ctx, ISA_MIPS32R6);
19872         gen_pcrel(ctx, ctx->opcode, ctx->pc, rs);
19873         break;
19874     default:            /* Invalid */
19875         MIPS_INVAL("major opcode");
19876         generate_exception_end(ctx, EXCP_RI);
19877         break;
19878     }
19879 }
19880
19881 void gen_intermediate_code(CPUMIPSState *env, struct TranslationBlock *tb)
19882 {
19883     MIPSCPU *cpu = mips_env_get_cpu(env);
19884     CPUState *cs = CPU(cpu);
19885     DisasContext ctx;
19886     target_ulong pc_start;
19887     target_ulong next_page_start;
19888     int num_insns;
19889     int max_insns;
19890     int insn_bytes;
19891     int is_slot;
19892
19893     pc_start = tb->pc;
19894     next_page_start = (pc_start & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE;
19895     ctx.pc = pc_start;
19896     ctx.saved_pc = -1;
19897     ctx.singlestep_enabled = cs->singlestep_enabled;
19898     ctx.insn_flags = env->insn_flags;
19899     ctx.CP0_Config1 = env->CP0_Config1;
19900     ctx.tb = tb;
19901     ctx.bstate = BS_NONE;
19902     ctx.btarget = 0;
19903     ctx.kscrexist = (env->CP0_Config4 >> CP0C4_KScrExist) & 0xff;
19904     ctx.rxi = (env->CP0_Config3 >> CP0C3_RXI) & 1;
19905     ctx.ie = (env->CP0_Config4 >> CP0C4_IE) & 3;
19906     ctx.bi = (env->CP0_Config3 >> CP0C3_BI) & 1;
19907     ctx.bp = (env->CP0_Config3 >> CP0C3_BP) & 1;
19908     ctx.PAMask = env->PAMask;
19909     ctx.mvh = (env->CP0_Config5 >> CP0C5_MVH) & 1;
19910     ctx.CP0_LLAddr_shift = env->CP0_LLAddr_shift;
19911     ctx.cmgcr = (env->CP0_Config3 >> CP0C3_CMGCR) & 1;
19912     /* Restore delay slot state from the tb context.  */
19913     ctx.hflags = (uint32_t)tb->flags; /* FIXME: maybe use 64 bits here? */
19914     ctx.ulri = (env->CP0_Config3 >> CP0C3_ULRI) & 1;
19915     ctx.ps = ((env->active_fpu.fcr0 >> FCR0_PS) & 1) ||
19916              (env->insn_flags & (INSN_LOONGSON2E | INSN_LOONGSON2F));
19917     ctx.vp = (env->CP0_Config5 >> CP0C5_VP) & 1;
19918     ctx.mrp = (env->CP0_Config5 >> CP0C5_MRP) & 1;
19919     ctx.nan2008 = (env->active_fpu.fcr31 >> FCR31_NAN2008) & 1;
19920     ctx.abs2008 = (env->active_fpu.fcr31 >> FCR31_ABS2008) & 1;
19921     restore_cpu_state(env, &ctx);
19922 #ifdef CONFIG_USER_ONLY
19923         ctx.mem_idx = MIPS_HFLAG_UM;
19924 #else
19925         ctx.mem_idx = ctx.hflags & MIPS_HFLAG_KSU;
19926 #endif
19927     ctx.default_tcg_memop_mask = (ctx.insn_flags & ISA_MIPS32R6) ?
19928                                  MO_UNALN : MO_ALIGN;
19929     num_insns = 0;
19930     max_insns = tb->cflags & CF_COUNT_MASK;
19931     if (max_insns == 0) {
19932         max_insns = CF_COUNT_MASK;
19933     }
19934     if (max_insns > TCG_MAX_INSNS) {
19935         max_insns = TCG_MAX_INSNS;
19936     }
19937
19938     LOG_DISAS("\ntb %p idx %d hflags %04x\n", tb, ctx.mem_idx, ctx.hflags);
19939     gen_tb_start(tb);
19940     while (ctx.bstate == BS_NONE) {
19941         tcg_gen_insn_start(ctx.pc, ctx.hflags & MIPS_HFLAG_BMASK, ctx.btarget);
19942         num_insns++;
19943
19944         if (unlikely(cpu_breakpoint_test(cs, ctx.pc, BP_ANY))) {
19945             save_cpu_state(&ctx, 1);
19946             ctx.bstate = BS_BRANCH;
19947             gen_helper_raise_exception_debug(cpu_env);
19948             /* The address covered by the breakpoint must be included in
19949                [tb->pc, tb->pc + tb->size) in order to for it to be
19950                properly cleared -- thus we increment the PC here so that
19951                the logic setting tb->size below does the right thing.  */
19952             ctx.pc += 4;
19953             goto done_generating;
19954         }
19955
19956         if (num_insns == max_insns && (tb->cflags & CF_LAST_IO)) {
19957             gen_io_start();
19958         }
19959
19960         is_slot = ctx.hflags & MIPS_HFLAG_BMASK;
19961         if (!(ctx.hflags & MIPS_HFLAG_M16)) {
19962             ctx.opcode = cpu_ldl_code(env, ctx.pc);
19963             insn_bytes = 4;
19964             decode_opc(env, &ctx);
19965         } else if (ctx.insn_flags & ASE_MICROMIPS) {
19966             ctx.opcode = cpu_lduw_code(env, ctx.pc);
19967             insn_bytes = decode_micromips_opc(env, &ctx);
19968         } else if (ctx.insn_flags & ASE_MIPS16) {
19969             ctx.opcode = cpu_lduw_code(env, ctx.pc);
19970             insn_bytes = decode_mips16_opc(env, &ctx);
19971         } else {
19972             generate_exception_end(&ctx, EXCP_RI);
19973             break;
19974         }
19975
19976         if (ctx.hflags & MIPS_HFLAG_BMASK) {
19977             if (!(ctx.hflags & (MIPS_HFLAG_BDS16 | MIPS_HFLAG_BDS32 |
19978                                 MIPS_HFLAG_FBNSLOT))) {
19979                 /* force to generate branch as there is neither delay nor
19980                    forbidden slot */
19981                 is_slot = 1;
19982             }
19983             if ((ctx.hflags & MIPS_HFLAG_M16) &&
19984                 (ctx.hflags & MIPS_HFLAG_FBNSLOT)) {
19985                 /* Force to generate branch as microMIPS R6 doesn't restrict
19986                    branches in the forbidden slot. */
19987                 is_slot = 1;
19988             }
19989         }
19990         if (is_slot) {
19991             gen_branch(&ctx, insn_bytes);
19992         }
19993         ctx.pc += insn_bytes;
19994
19995         /* Execute a branch and its delay slot as a single instruction.
19996            This is what GDB expects and is consistent with what the
19997            hardware does (e.g. if a delay slot instruction faults, the
19998            reported PC is the PC of the branch).  */
19999         if (cs->singlestep_enabled && (ctx.hflags & MIPS_HFLAG_BMASK) == 0) {
20000             break;
20001         }
20002
20003         if (ctx.pc >= next_page_start) {
20004             break;
20005         }
20006
20007         if (tcg_op_buf_full()) {
20008             break;
20009         }
20010
20011         if (num_insns >= max_insns)
20012             break;
20013
20014         if (singlestep)
20015             break;
20016     }
20017     if (tb->cflags & CF_LAST_IO) {
20018         gen_io_end();
20019     }
20020     if (cs->singlestep_enabled && ctx.bstate != BS_BRANCH) {
20021         save_cpu_state(&ctx, ctx.bstate != BS_EXCP);
20022         gen_helper_raise_exception_debug(cpu_env);
20023     } else {
20024         switch (ctx.bstate) {
20025         case BS_STOP:
20026             gen_goto_tb(&ctx, 0, ctx.pc);
20027             break;
20028         case BS_NONE:
20029             save_cpu_state(&ctx, 0);
20030             gen_goto_tb(&ctx, 0, ctx.pc);
20031             break;
20032         case BS_EXCP:
20033             tcg_gen_exit_tb(0);
20034             break;
20035         case BS_BRANCH:
20036         default:
20037             break;
20038         }
20039     }
20040 done_generating:
20041     gen_tb_end(tb, num_insns);
20042
20043     tb->size = ctx.pc - pc_start;
20044     tb->icount = num_insns;
20045
20046 #ifdef DEBUG_DISAS
20047     LOG_DISAS("\n");
20048     if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)
20049         && qemu_log_in_addr_range(pc_start)) {
20050         qemu_log_lock();
20051         qemu_log("IN: %s\n", lookup_symbol(pc_start));
20052         log_target_disas(cs, pc_start, ctx.pc - pc_start, 0);
20053         qemu_log("\n");
20054         qemu_log_unlock();
20055     }
20056 #endif
20057 }
20058
20059 static void fpu_dump_state(CPUMIPSState *env, FILE *f, fprintf_function fpu_fprintf,
20060                            int flags)
20061 {
20062     int i;
20063     int is_fpu64 = !!(env->hflags & MIPS_HFLAG_F64);
20064
20065 #define printfpr(fp)                                                    \
20066     do {                                                                \
20067         if (is_fpu64)                                                   \
20068             fpu_fprintf(f, "w:%08x d:%016" PRIx64                       \
20069                         " fd:%13g fs:%13g psu: %13g\n",                 \
20070                         (fp)->w[FP_ENDIAN_IDX], (fp)->d,                \
20071                         (double)(fp)->fd,                               \
20072                         (double)(fp)->fs[FP_ENDIAN_IDX],                \
20073                         (double)(fp)->fs[!FP_ENDIAN_IDX]);              \
20074         else {                                                          \
20075             fpr_t tmp;                                                  \
20076             tmp.w[FP_ENDIAN_IDX] = (fp)->w[FP_ENDIAN_IDX];              \
20077             tmp.w[!FP_ENDIAN_IDX] = ((fp) + 1)->w[FP_ENDIAN_IDX];       \
20078             fpu_fprintf(f, "w:%08x d:%016" PRIx64                       \
20079                         " fd:%13g fs:%13g psu:%13g\n",                  \
20080                         tmp.w[FP_ENDIAN_IDX], tmp.d,                    \
20081                         (double)tmp.fd,                                 \
20082                         (double)tmp.fs[FP_ENDIAN_IDX],                  \
20083                         (double)tmp.fs[!FP_ENDIAN_IDX]);                \
20084         }                                                               \
20085     } while(0)
20086
20087
20088     fpu_fprintf(f, "CP1 FCR0 0x%08x  FCR31 0x%08x  SR.FR %d  fp_status 0x%02x\n",
20089                 env->active_fpu.fcr0, env->active_fpu.fcr31, is_fpu64,
20090                 get_float_exception_flags(&env->active_fpu.fp_status));
20091     for (i = 0; i < 32; (is_fpu64) ? i++ : (i += 2)) {
20092         fpu_fprintf(f, "%3s: ", fregnames[i]);
20093         printfpr(&env->active_fpu.fpr[i]);
20094     }
20095
20096 #undef printfpr
20097 }
20098
20099 void mips_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
20100                          int flags)
20101 {
20102     MIPSCPU *cpu = MIPS_CPU(cs);
20103     CPUMIPSState *env = &cpu->env;
20104     int i;
20105
20106     cpu_fprintf(f, "pc=0x" TARGET_FMT_lx " HI=0x" TARGET_FMT_lx
20107                 " LO=0x" TARGET_FMT_lx " ds %04x "
20108                 TARGET_FMT_lx " " TARGET_FMT_ld "\n",
20109                 env->active_tc.PC, env->active_tc.HI[0], env->active_tc.LO[0],
20110                 env->hflags, env->btarget, env->bcond);
20111     for (i = 0; i < 32; i++) {
20112         if ((i & 3) == 0)
20113             cpu_fprintf(f, "GPR%02d:", i);
20114         cpu_fprintf(f, " %s " TARGET_FMT_lx, regnames[i], env->active_tc.gpr[i]);
20115         if ((i & 3) == 3)
20116             cpu_fprintf(f, "\n");
20117     }
20118
20119     cpu_fprintf(f, "CP0 Status  0x%08x Cause   0x%08x EPC    0x" TARGET_FMT_lx "\n",
20120                 env->CP0_Status, env->CP0_Cause, env->CP0_EPC);
20121     cpu_fprintf(f, "    Config0 0x%08x Config1 0x%08x LLAddr 0x%016"
20122                 PRIx64 "\n",
20123                 env->CP0_Config0, env->CP0_Config1, env->lladdr);
20124     cpu_fprintf(f, "    Config2 0x%08x Config3 0x%08x\n",
20125                 env->CP0_Config2, env->CP0_Config3);
20126     cpu_fprintf(f, "    Config4 0x%08x Config5 0x%08x\n",
20127                 env->CP0_Config4, env->CP0_Config5);
20128     if (env->hflags & MIPS_HFLAG_FPU)
20129         fpu_dump_state(env, f, cpu_fprintf, flags);
20130 }
20131
20132 void mips_tcg_init(void)
20133 {
20134     int i;
20135     static int inited;
20136
20137     /* Initialize various static tables. */
20138     if (inited)
20139         return;
20140
20141     cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env");
20142     tcg_ctx.tcg_env = cpu_env;
20143
20144     TCGV_UNUSED(cpu_gpr[0]);
20145     for (i = 1; i < 32; i++)
20146         cpu_gpr[i] = tcg_global_mem_new(cpu_env,
20147                                         offsetof(CPUMIPSState, active_tc.gpr[i]),
20148                                         regnames[i]);
20149
20150     for (i = 0; i < 32; i++) {
20151         int off = offsetof(CPUMIPSState, active_fpu.fpr[i].wr.d[0]);
20152         msa_wr_d[i * 2] =
20153                 tcg_global_mem_new_i64(cpu_env, off, msaregnames[i * 2]);
20154         /* The scalar floating-point unit (FPU) registers are mapped on
20155          * the MSA vector registers. */
20156         fpu_f64[i] = msa_wr_d[i * 2];
20157         off = offsetof(CPUMIPSState, active_fpu.fpr[i].wr.d[1]);
20158         msa_wr_d[i * 2 + 1] =
20159                 tcg_global_mem_new_i64(cpu_env, off, msaregnames[i * 2 + 1]);
20160     }
20161
20162     cpu_PC = tcg_global_mem_new(cpu_env,
20163                                 offsetof(CPUMIPSState, active_tc.PC), "PC");
20164     for (i = 0; i < MIPS_DSP_ACC; i++) {
20165         cpu_HI[i] = tcg_global_mem_new(cpu_env,
20166                                        offsetof(CPUMIPSState, active_tc.HI[i]),
20167                                        regnames_HI[i]);
20168         cpu_LO[i] = tcg_global_mem_new(cpu_env,
20169                                        offsetof(CPUMIPSState, active_tc.LO[i]),
20170                                        regnames_LO[i]);
20171     }
20172     cpu_dspctrl = tcg_global_mem_new(cpu_env,
20173                                      offsetof(CPUMIPSState, active_tc.DSPControl),
20174                                      "DSPControl");
20175     bcond = tcg_global_mem_new(cpu_env,
20176                                offsetof(CPUMIPSState, bcond), "bcond");
20177     btarget = tcg_global_mem_new(cpu_env,
20178                                  offsetof(CPUMIPSState, btarget), "btarget");
20179     hflags = tcg_global_mem_new_i32(cpu_env,
20180                                     offsetof(CPUMIPSState, hflags), "hflags");
20181
20182     fpu_fcr0 = tcg_global_mem_new_i32(cpu_env,
20183                                       offsetof(CPUMIPSState, active_fpu.fcr0),
20184                                       "fcr0");
20185     fpu_fcr31 = tcg_global_mem_new_i32(cpu_env,
20186                                        offsetof(CPUMIPSState, active_fpu.fcr31),
20187                                        "fcr31");
20188
20189     inited = 1;
20190 }
20191
20192 #include "translate_init.c"
20193
20194 MIPSCPU *cpu_mips_init(const char *cpu_model)
20195 {
20196     MIPSCPU *cpu;
20197     CPUMIPSState *env;
20198     const mips_def_t *def;
20199
20200     def = cpu_mips_find_by_name(cpu_model);
20201     if (!def)
20202         return NULL;
20203     cpu = MIPS_CPU(object_new(TYPE_MIPS_CPU));
20204     env = &cpu->env;
20205     env->cpu_model = def;
20206     env->exception_base = (int32_t)0xBFC00000;
20207
20208 #ifndef CONFIG_USER_ONLY
20209     mmu_init(env, def);
20210 #endif
20211     fpu_init(env, def);
20212     mvp_init(env, def);
20213
20214     object_property_set_bool(OBJECT(cpu), true, "realized", NULL);
20215
20216     return cpu;
20217 }
20218
20219 bool cpu_supports_cps_smp(const char *cpu_model)
20220 {
20221     const mips_def_t *def = cpu_mips_find_by_name(cpu_model);
20222     if (!def) {
20223         return false;
20224     }
20225
20226     return (def->CP0_Config3 & (1 << CP0C3_CMGCR)) != 0;
20227 }
20228
20229 void cpu_set_exception_base(int vp_index, target_ulong address)
20230 {
20231     MIPSCPU *vp = MIPS_CPU(qemu_get_cpu(vp_index));
20232     vp->env.exception_base = address;
20233 }
20234
20235 void cpu_state_reset(CPUMIPSState *env)
20236 {
20237     MIPSCPU *cpu = mips_env_get_cpu(env);
20238     CPUState *cs = CPU(cpu);
20239
20240     /* Reset registers to their default values */
20241     env->CP0_PRid = env->cpu_model->CP0_PRid;
20242     env->CP0_Config0 = env->cpu_model->CP0_Config0;
20243 #ifdef TARGET_WORDS_BIGENDIAN
20244     env->CP0_Config0 |= (1 << CP0C0_BE);
20245 #endif
20246     env->CP0_Config1 = env->cpu_model->CP0_Config1;
20247     env->CP0_Config2 = env->cpu_model->CP0_Config2;
20248     env->CP0_Config3 = env->cpu_model->CP0_Config3;
20249     env->CP0_Config4 = env->cpu_model->CP0_Config4;
20250     env->CP0_Config4_rw_bitmask = env->cpu_model->CP0_Config4_rw_bitmask;
20251     env->CP0_Config5 = env->cpu_model->CP0_Config5;
20252     env->CP0_Config5_rw_bitmask = env->cpu_model->CP0_Config5_rw_bitmask;
20253     env->CP0_Config6 = env->cpu_model->CP0_Config6;
20254     env->CP0_Config7 = env->cpu_model->CP0_Config7;
20255     env->CP0_LLAddr_rw_bitmask = env->cpu_model->CP0_LLAddr_rw_bitmask
20256                                  << env->cpu_model->CP0_LLAddr_shift;
20257     env->CP0_LLAddr_shift = env->cpu_model->CP0_LLAddr_shift;
20258     env->SYNCI_Step = env->cpu_model->SYNCI_Step;
20259     env->CCRes = env->cpu_model->CCRes;
20260     env->CP0_Status_rw_bitmask = env->cpu_model->CP0_Status_rw_bitmask;
20261     env->CP0_TCStatus_rw_bitmask = env->cpu_model->CP0_TCStatus_rw_bitmask;
20262     env->CP0_SRSCtl = env->cpu_model->CP0_SRSCtl;
20263     env->current_tc = 0;
20264     env->SEGBITS = env->cpu_model->SEGBITS;
20265     env->SEGMask = (target_ulong)((1ULL << env->cpu_model->SEGBITS) - 1);
20266 #if defined(TARGET_MIPS64)
20267     if (env->cpu_model->insn_flags & ISA_MIPS3) {
20268         env->SEGMask |= 3ULL << 62;
20269     }
20270 #endif
20271     env->PABITS = env->cpu_model->PABITS;
20272     env->CP0_SRSConf0_rw_bitmask = env->cpu_model->CP0_SRSConf0_rw_bitmask;
20273     env->CP0_SRSConf0 = env->cpu_model->CP0_SRSConf0;
20274     env->CP0_SRSConf1_rw_bitmask = env->cpu_model->CP0_SRSConf1_rw_bitmask;
20275     env->CP0_SRSConf1 = env->cpu_model->CP0_SRSConf1;
20276     env->CP0_SRSConf2_rw_bitmask = env->cpu_model->CP0_SRSConf2_rw_bitmask;
20277     env->CP0_SRSConf2 = env->cpu_model->CP0_SRSConf2;
20278     env->CP0_SRSConf3_rw_bitmask = env->cpu_model->CP0_SRSConf3_rw_bitmask;
20279     env->CP0_SRSConf3 = env->cpu_model->CP0_SRSConf3;
20280     env->CP0_SRSConf4_rw_bitmask = env->cpu_model->CP0_SRSConf4_rw_bitmask;
20281     env->CP0_SRSConf4 = env->cpu_model->CP0_SRSConf4;
20282     env->CP0_PageGrain_rw_bitmask = env->cpu_model->CP0_PageGrain_rw_bitmask;
20283     env->CP0_PageGrain = env->cpu_model->CP0_PageGrain;
20284     env->active_fpu.fcr0 = env->cpu_model->CP1_fcr0;
20285     env->active_fpu.fcr31_rw_bitmask = env->cpu_model->CP1_fcr31_rw_bitmask;
20286     env->active_fpu.fcr31 = env->cpu_model->CP1_fcr31;
20287     env->msair = env->cpu_model->MSAIR;
20288     env->insn_flags = env->cpu_model->insn_flags;
20289
20290 #if defined(CONFIG_USER_ONLY)
20291     env->CP0_Status = (MIPS_HFLAG_UM << CP0St_KSU);
20292 # ifdef TARGET_MIPS64
20293     /* Enable 64-bit register mode.  */
20294     env->CP0_Status |= (1 << CP0St_PX);
20295 # endif
20296 # ifdef TARGET_ABI_MIPSN64
20297     /* Enable 64-bit address mode.  */
20298     env->CP0_Status |= (1 << CP0St_UX);
20299 # endif
20300     /* Enable access to the CPUNum, SYNCI_Step, CC, and CCRes RDHWR
20301        hardware registers.  */
20302     env->CP0_HWREna |= 0x0000000F;
20303     if (env->CP0_Config1 & (1 << CP0C1_FP)) {
20304         env->CP0_Status |= (1 << CP0St_CU1);
20305     }
20306     if (env->CP0_Config3 & (1 << CP0C3_DSPP)) {
20307         env->CP0_Status |= (1 << CP0St_MX);
20308     }
20309 # if defined(TARGET_MIPS64)
20310     /* For MIPS64, init FR bit to 1 if FPU unit is there and bit is writable. */
20311     if ((env->CP0_Config1 & (1 << CP0C1_FP)) &&
20312         (env->CP0_Status_rw_bitmask & (1 << CP0St_FR))) {
20313         env->CP0_Status |= (1 << CP0St_FR);
20314     }
20315 # endif
20316 #else
20317     if (env->hflags & MIPS_HFLAG_BMASK) {
20318         /* If the exception was raised from a delay slot,
20319            come back to the jump.  */
20320         env->CP0_ErrorEPC = (env->active_tc.PC
20321                              - (env->hflags & MIPS_HFLAG_B16 ? 2 : 4));
20322     } else {
20323         env->CP0_ErrorEPC = env->active_tc.PC;
20324     }
20325     env->active_tc.PC = env->exception_base;
20326     env->CP0_Random = env->tlb->nb_tlb - 1;
20327     env->tlb->tlb_in_use = env->tlb->nb_tlb;
20328     env->CP0_Wired = 0;
20329     env->CP0_GlobalNumber = (cs->cpu_index & 0xFF) << CP0GN_VPId;
20330     env->CP0_EBase = (cs->cpu_index & 0x3FF);
20331     if (kvm_enabled()) {
20332         env->CP0_EBase |= 0x40000000;
20333     } else {
20334         env->CP0_EBase |= 0x80000000;
20335     }
20336     if (env->CP0_Config3 & (1 << CP0C3_CMGCR)) {
20337         env->CP0_CMGCRBase = 0x1fbf8000 >> 4;
20338     }
20339     env->CP0_EntryHi_ASID_mask = (env->CP0_Config4 & (1 << CP0C4_AE)) ?
20340                                  0x3ff : 0xff;
20341     env->CP0_Status = (1 << CP0St_BEV) | (1 << CP0St_ERL);
20342     /* vectored interrupts not implemented, timer on int 7,
20343        no performance counters. */
20344     env->CP0_IntCtl = 0xe0000000;
20345     {
20346         int i;
20347
20348         for (i = 0; i < 7; i++) {
20349             env->CP0_WatchLo[i] = 0;
20350             env->CP0_WatchHi[i] = 0x80000000;
20351         }
20352         env->CP0_WatchLo[7] = 0;
20353         env->CP0_WatchHi[7] = 0;
20354     }
20355     /* Count register increments in debug mode, EJTAG version 1 */
20356     env->CP0_Debug = (1 << CP0DB_CNT) | (0x1 << CP0DB_VER);
20357
20358     cpu_mips_store_count(env, 1);
20359
20360     if (env->CP0_Config3 & (1 << CP0C3_MT)) {
20361         int i;
20362
20363         /* Only TC0 on VPE 0 starts as active.  */
20364         for (i = 0; i < ARRAY_SIZE(env->tcs); i++) {
20365             env->tcs[i].CP0_TCBind = cs->cpu_index << CP0TCBd_CurVPE;
20366             env->tcs[i].CP0_TCHalt = 1;
20367         }
20368         env->active_tc.CP0_TCHalt = 1;
20369         cs->halted = 1;
20370
20371         if (cs->cpu_index == 0) {
20372             /* VPE0 starts up enabled.  */
20373             env->mvp->CP0_MVPControl |= (1 << CP0MVPCo_EVP);
20374             env->CP0_VPEConf0 |= (1 << CP0VPEC0_MVP) | (1 << CP0VPEC0_VPA);
20375
20376             /* TC0 starts up unhalted.  */
20377             cs->halted = 0;
20378             env->active_tc.CP0_TCHalt = 0;
20379             env->tcs[0].CP0_TCHalt = 0;
20380             /* With thread 0 active.  */
20381             env->active_tc.CP0_TCStatus = (1 << CP0TCSt_A);
20382             env->tcs[0].CP0_TCStatus = (1 << CP0TCSt_A);
20383         }
20384     }
20385 #endif
20386     if ((env->insn_flags & ISA_MIPS32R6) &&
20387         (env->active_fpu.fcr0 & (1 << FCR0_F64))) {
20388         /* Status.FR = 0 mode in 64-bit FPU not allowed in R6 */
20389         env->CP0_Status |= (1 << CP0St_FR);
20390     }
20391
20392     /* MSA */
20393     if (env->CP0_Config3 & (1 << CP0C3_MSAP)) {
20394         msa_reset(env);
20395     }
20396
20397     compute_hflags(env);
20398     restore_fp_status(env);
20399     restore_pamask(env);
20400     cs->exception_index = EXCP_NONE;
20401
20402     if (semihosting_get_argc()) {
20403         /* UHI interface can be used to obtain argc and argv */
20404         env->active_tc.gpr[4] = -1;
20405     }
20406 }
20407
20408 void restore_state_to_opc(CPUMIPSState *env, TranslationBlock *tb,
20409                           target_ulong *data)
20410 {
20411     env->active_tc.PC = data[0];
20412     env->hflags &= ~MIPS_HFLAG_BMASK;
20413     env->hflags |= data[1];
20414     switch (env->hflags & MIPS_HFLAG_BMASK_BASE) {
20415     case MIPS_HFLAG_BR:
20416         break;
20417     case MIPS_HFLAG_BC:
20418     case MIPS_HFLAG_BL:
20419     case MIPS_HFLAG_B:
20420         env->btarget = data[2];
20421         break;
20422     }
20423 }