target-mips: remove #if defined(TARGET_MIPS64) in opcode enums
[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 "cpu.h"
25 #include "disas.h"
26 #include "tcg-op.h"
27
28 #include "helper.h"
29 #define GEN_HELPER 1
30 #include "helper.h"
31
32 #define MIPS_DEBUG_DISAS 0
33 //#define MIPS_DEBUG_SIGN_EXTENSIONS
34
35 /* MIPS major opcodes */
36 #define MASK_OP_MAJOR(op)  (op & (0x3F << 26))
37
38 enum {
39     /* indirect opcode tables */
40     OPC_SPECIAL  = (0x00 << 26),
41     OPC_REGIMM   = (0x01 << 26),
42     OPC_CP0      = (0x10 << 26),
43     OPC_CP1      = (0x11 << 26),
44     OPC_CP2      = (0x12 << 26),
45     OPC_CP3      = (0x13 << 26),
46     OPC_SPECIAL2 = (0x1C << 26),
47     OPC_SPECIAL3 = (0x1F << 26),
48     /* arithmetic with immediate */
49     OPC_ADDI     = (0x08 << 26),
50     OPC_ADDIU    = (0x09 << 26),
51     OPC_SLTI     = (0x0A << 26),
52     OPC_SLTIU    = (0x0B << 26),
53     /* logic with immediate */
54     OPC_ANDI     = (0x0C << 26),
55     OPC_ORI      = (0x0D << 26),
56     OPC_XORI     = (0x0E << 26),
57     OPC_LUI      = (0x0F << 26),
58     /* arithmetic with immediate */
59     OPC_DADDI    = (0x18 << 26),
60     OPC_DADDIU   = (0x19 << 26),
61     /* Jump and branches */
62     OPC_J        = (0x02 << 26),
63     OPC_JAL      = (0x03 << 26),
64     OPC_JALS     = OPC_JAL | 0x5,
65     OPC_BEQ      = (0x04 << 26),  /* Unconditional if rs = rt = 0 (B) */
66     OPC_BEQL     = (0x14 << 26),
67     OPC_BNE      = (0x05 << 26),
68     OPC_BNEL     = (0x15 << 26),
69     OPC_BLEZ     = (0x06 << 26),
70     OPC_BLEZL    = (0x16 << 26),
71     OPC_BGTZ     = (0x07 << 26),
72     OPC_BGTZL    = (0x17 << 26),
73     OPC_JALX     = (0x1D << 26),  /* MIPS 16 only */
74     OPC_JALXS    = OPC_JALX | 0x5,
75     /* Load and stores */
76     OPC_LDL      = (0x1A << 26),
77     OPC_LDR      = (0x1B << 26),
78     OPC_LB       = (0x20 << 26),
79     OPC_LH       = (0x21 << 26),
80     OPC_LWL      = (0x22 << 26),
81     OPC_LW       = (0x23 << 26),
82     OPC_LWPC     = OPC_LW | 0x5,
83     OPC_LBU      = (0x24 << 26),
84     OPC_LHU      = (0x25 << 26),
85     OPC_LWR      = (0x26 << 26),
86     OPC_LWU      = (0x27 << 26),
87     OPC_SB       = (0x28 << 26),
88     OPC_SH       = (0x29 << 26),
89     OPC_SWL      = (0x2A << 26),
90     OPC_SW       = (0x2B << 26),
91     OPC_SDL      = (0x2C << 26),
92     OPC_SDR      = (0x2D << 26),
93     OPC_SWR      = (0x2E << 26),
94     OPC_LL       = (0x30 << 26),
95     OPC_LLD      = (0x34 << 26),
96     OPC_LD       = (0x37 << 26),
97     OPC_LDPC     = OPC_LD | 0x5,
98     OPC_SC       = (0x38 << 26),
99     OPC_SCD      = (0x3C << 26),
100     OPC_SD       = (0x3F << 26),
101     /* Floating point load/store */
102     OPC_LWC1     = (0x31 << 26),
103     OPC_LWC2     = (0x32 << 26),
104     OPC_LDC1     = (0x35 << 26),
105     OPC_LDC2     = (0x36 << 26),
106     OPC_SWC1     = (0x39 << 26),
107     OPC_SWC2     = (0x3A << 26),
108     OPC_SDC1     = (0x3D << 26),
109     OPC_SDC2     = (0x3E << 26),
110     /* MDMX ASE specific */
111     OPC_MDMX     = (0x1E << 26),
112     /* Cache and prefetch */
113     OPC_CACHE    = (0x2F << 26),
114     OPC_PREF     = (0x33 << 26),
115     /* Reserved major opcode */
116     OPC_MAJOR3B_RESERVED = (0x3B << 26),
117 };
118
119 /* MIPS special opcodes */
120 #define MASK_SPECIAL(op)   MASK_OP_MAJOR(op) | (op & 0x3F)
121
122 enum {
123     /* Shifts */
124     OPC_SLL      = 0x00 | OPC_SPECIAL,
125     /* NOP is SLL r0, r0, 0   */
126     /* SSNOP is SLL r0, r0, 1 */
127     /* EHB is SLL r0, r0, 3 */
128     OPC_SRL      = 0x02 | OPC_SPECIAL, /* also ROTR */
129     OPC_ROTR     = OPC_SRL | (1 << 21),
130     OPC_SRA      = 0x03 | OPC_SPECIAL,
131     OPC_SLLV     = 0x04 | OPC_SPECIAL,
132     OPC_SRLV     = 0x06 | OPC_SPECIAL, /* also ROTRV */
133     OPC_ROTRV    = OPC_SRLV | (1 << 6),
134     OPC_SRAV     = 0x07 | OPC_SPECIAL,
135     OPC_DSLLV    = 0x14 | OPC_SPECIAL,
136     OPC_DSRLV    = 0x16 | OPC_SPECIAL, /* also DROTRV */
137     OPC_DROTRV   = OPC_DSRLV | (1 << 6),
138     OPC_DSRAV    = 0x17 | OPC_SPECIAL,
139     OPC_DSLL     = 0x38 | OPC_SPECIAL,
140     OPC_DSRL     = 0x3A | OPC_SPECIAL, /* also DROTR */
141     OPC_DROTR    = OPC_DSRL | (1 << 21),
142     OPC_DSRA     = 0x3B | OPC_SPECIAL,
143     OPC_DSLL32   = 0x3C | OPC_SPECIAL,
144     OPC_DSRL32   = 0x3E | OPC_SPECIAL, /* also DROTR32 */
145     OPC_DROTR32  = OPC_DSRL32 | (1 << 21),
146     OPC_DSRA32   = 0x3F | OPC_SPECIAL,
147     /* Multiplication / division */
148     OPC_MULT     = 0x18 | OPC_SPECIAL,
149     OPC_MULTU    = 0x19 | OPC_SPECIAL,
150     OPC_DIV      = 0x1A | OPC_SPECIAL,
151     OPC_DIVU     = 0x1B | OPC_SPECIAL,
152     OPC_DMULT    = 0x1C | OPC_SPECIAL,
153     OPC_DMULTU   = 0x1D | OPC_SPECIAL,
154     OPC_DDIV     = 0x1E | OPC_SPECIAL,
155     OPC_DDIVU    = 0x1F | OPC_SPECIAL,
156     /* 2 registers arithmetic / logic */
157     OPC_ADD      = 0x20 | OPC_SPECIAL,
158     OPC_ADDU     = 0x21 | OPC_SPECIAL,
159     OPC_SUB      = 0x22 | OPC_SPECIAL,
160     OPC_SUBU     = 0x23 | OPC_SPECIAL,
161     OPC_AND      = 0x24 | OPC_SPECIAL,
162     OPC_OR       = 0x25 | OPC_SPECIAL,
163     OPC_XOR      = 0x26 | OPC_SPECIAL,
164     OPC_NOR      = 0x27 | OPC_SPECIAL,
165     OPC_SLT      = 0x2A | OPC_SPECIAL,
166     OPC_SLTU     = 0x2B | OPC_SPECIAL,
167     OPC_DADD     = 0x2C | OPC_SPECIAL,
168     OPC_DADDU    = 0x2D | OPC_SPECIAL,
169     OPC_DSUB     = 0x2E | OPC_SPECIAL,
170     OPC_DSUBU    = 0x2F | OPC_SPECIAL,
171     /* Jumps */
172     OPC_JR       = 0x08 | OPC_SPECIAL, /* Also JR.HB */
173     OPC_JALR     = 0x09 | OPC_SPECIAL, /* Also JALR.HB */
174     OPC_JALRC    = OPC_JALR | (0x5 << 6),
175     OPC_JALRS    = 0x10 | OPC_SPECIAL | (0x5 << 6),
176     /* Traps */
177     OPC_TGE      = 0x30 | OPC_SPECIAL,
178     OPC_TGEU     = 0x31 | OPC_SPECIAL,
179     OPC_TLT      = 0x32 | OPC_SPECIAL,
180     OPC_TLTU     = 0x33 | OPC_SPECIAL,
181     OPC_TEQ      = 0x34 | OPC_SPECIAL,
182     OPC_TNE      = 0x36 | OPC_SPECIAL,
183     /* HI / LO registers load & stores */
184     OPC_MFHI     = 0x10 | OPC_SPECIAL,
185     OPC_MTHI     = 0x11 | OPC_SPECIAL,
186     OPC_MFLO     = 0x12 | OPC_SPECIAL,
187     OPC_MTLO     = 0x13 | OPC_SPECIAL,
188     /* Conditional moves */
189     OPC_MOVZ     = 0x0A | OPC_SPECIAL,
190     OPC_MOVN     = 0x0B | OPC_SPECIAL,
191
192     OPC_MOVCI    = 0x01 | OPC_SPECIAL,
193
194     /* Special */
195     OPC_PMON     = 0x05 | OPC_SPECIAL, /* unofficial */
196     OPC_SYSCALL  = 0x0C | OPC_SPECIAL,
197     OPC_BREAK    = 0x0D | OPC_SPECIAL,
198     OPC_SPIM     = 0x0E | OPC_SPECIAL, /* unofficial */
199     OPC_SYNC     = 0x0F | OPC_SPECIAL,
200
201     OPC_SPECIAL15_RESERVED = 0x15 | OPC_SPECIAL,
202     OPC_SPECIAL28_RESERVED = 0x28 | OPC_SPECIAL,
203     OPC_SPECIAL29_RESERVED = 0x29 | OPC_SPECIAL,
204     OPC_SPECIAL35_RESERVED = 0x35 | OPC_SPECIAL,
205     OPC_SPECIAL37_RESERVED = 0x37 | OPC_SPECIAL,
206     OPC_SPECIAL39_RESERVED = 0x39 | OPC_SPECIAL,
207     OPC_SPECIAL3D_RESERVED = 0x3D | OPC_SPECIAL,
208 };
209
210 /* Multiplication variants of the vr54xx. */
211 #define MASK_MUL_VR54XX(op)   MASK_SPECIAL(op) | (op & (0x1F << 6))
212
213 enum {
214     OPC_VR54XX_MULS    = (0x03 << 6) | OPC_MULT,
215     OPC_VR54XX_MULSU   = (0x03 << 6) | OPC_MULTU,
216     OPC_VR54XX_MACC    = (0x05 << 6) | OPC_MULT,
217     OPC_VR54XX_MACCU   = (0x05 << 6) | OPC_MULTU,
218     OPC_VR54XX_MSAC    = (0x07 << 6) | OPC_MULT,
219     OPC_VR54XX_MSACU   = (0x07 << 6) | OPC_MULTU,
220     OPC_VR54XX_MULHI   = (0x09 << 6) | OPC_MULT,
221     OPC_VR54XX_MULHIU  = (0x09 << 6) | OPC_MULTU,
222     OPC_VR54XX_MULSHI  = (0x0B << 6) | OPC_MULT,
223     OPC_VR54XX_MULSHIU = (0x0B << 6) | OPC_MULTU,
224     OPC_VR54XX_MACCHI  = (0x0D << 6) | OPC_MULT,
225     OPC_VR54XX_MACCHIU = (0x0D << 6) | OPC_MULTU,
226     OPC_VR54XX_MSACHI  = (0x0F << 6) | OPC_MULT,
227     OPC_VR54XX_MSACHIU = (0x0F << 6) | OPC_MULTU,
228 };
229
230 /* REGIMM (rt field) opcodes */
231 #define MASK_REGIMM(op)    MASK_OP_MAJOR(op) | (op & (0x1F << 16))
232
233 enum {
234     OPC_BLTZ     = (0x00 << 16) | OPC_REGIMM,
235     OPC_BLTZL    = (0x02 << 16) | OPC_REGIMM,
236     OPC_BGEZ     = (0x01 << 16) | OPC_REGIMM,
237     OPC_BGEZL    = (0x03 << 16) | OPC_REGIMM,
238     OPC_BLTZAL   = (0x10 << 16) | OPC_REGIMM,
239     OPC_BLTZALS  = OPC_BLTZAL | 0x5, /* microMIPS */
240     OPC_BLTZALL  = (0x12 << 16) | OPC_REGIMM,
241     OPC_BGEZAL   = (0x11 << 16) | OPC_REGIMM,
242     OPC_BGEZALS  = OPC_BGEZAL | 0x5, /* microMIPS */
243     OPC_BGEZALL  = (0x13 << 16) | OPC_REGIMM,
244     OPC_TGEI     = (0x08 << 16) | OPC_REGIMM,
245     OPC_TGEIU    = (0x09 << 16) | OPC_REGIMM,
246     OPC_TLTI     = (0x0A << 16) | OPC_REGIMM,
247     OPC_TLTIU    = (0x0B << 16) | OPC_REGIMM,
248     OPC_TEQI     = (0x0C << 16) | OPC_REGIMM,
249     OPC_TNEI     = (0x0E << 16) | OPC_REGIMM,
250     OPC_SYNCI    = (0x1F << 16) | OPC_REGIMM,
251 };
252
253 /* Special2 opcodes */
254 #define MASK_SPECIAL2(op)  MASK_OP_MAJOR(op) | (op & 0x3F)
255
256 enum {
257     /* Multiply & xxx operations */
258     OPC_MADD     = 0x00 | OPC_SPECIAL2,
259     OPC_MADDU    = 0x01 | OPC_SPECIAL2,
260     OPC_MUL      = 0x02 | OPC_SPECIAL2,
261     OPC_MSUB     = 0x04 | OPC_SPECIAL2,
262     OPC_MSUBU    = 0x05 | OPC_SPECIAL2,
263     /* Loongson 2F */
264     OPC_MULT_G_2F   = 0x10 | OPC_SPECIAL2,
265     OPC_DMULT_G_2F  = 0x11 | OPC_SPECIAL2,
266     OPC_MULTU_G_2F  = 0x12 | OPC_SPECIAL2,
267     OPC_DMULTU_G_2F = 0x13 | OPC_SPECIAL2,
268     OPC_DIV_G_2F    = 0x14 | OPC_SPECIAL2,
269     OPC_DDIV_G_2F   = 0x15 | OPC_SPECIAL2,
270     OPC_DIVU_G_2F   = 0x16 | OPC_SPECIAL2,
271     OPC_DDIVU_G_2F  = 0x17 | OPC_SPECIAL2,
272     OPC_MOD_G_2F    = 0x1c | OPC_SPECIAL2,
273     OPC_DMOD_G_2F   = 0x1d | OPC_SPECIAL2,
274     OPC_MODU_G_2F   = 0x1e | OPC_SPECIAL2,
275     OPC_DMODU_G_2F  = 0x1f | OPC_SPECIAL2,
276     /* Misc */
277     OPC_CLZ      = 0x20 | OPC_SPECIAL2,
278     OPC_CLO      = 0x21 | OPC_SPECIAL2,
279     OPC_DCLZ     = 0x24 | OPC_SPECIAL2,
280     OPC_DCLO     = 0x25 | OPC_SPECIAL2,
281     /* Special */
282     OPC_SDBBP    = 0x3F | OPC_SPECIAL2,
283 };
284
285 /* Special3 opcodes */
286 #define MASK_SPECIAL3(op)  MASK_OP_MAJOR(op) | (op & 0x3F)
287
288 enum {
289     OPC_EXT      = 0x00 | OPC_SPECIAL3,
290     OPC_DEXTM    = 0x01 | OPC_SPECIAL3,
291     OPC_DEXTU    = 0x02 | OPC_SPECIAL3,
292     OPC_DEXT     = 0x03 | OPC_SPECIAL3,
293     OPC_INS      = 0x04 | OPC_SPECIAL3,
294     OPC_DINSM    = 0x05 | OPC_SPECIAL3,
295     OPC_DINSU    = 0x06 | OPC_SPECIAL3,
296     OPC_DINS     = 0x07 | OPC_SPECIAL3,
297     OPC_FORK     = 0x08 | OPC_SPECIAL3,
298     OPC_YIELD    = 0x09 | OPC_SPECIAL3,
299     OPC_BSHFL    = 0x20 | OPC_SPECIAL3,
300     OPC_DBSHFL   = 0x24 | OPC_SPECIAL3,
301     OPC_RDHWR    = 0x3B | OPC_SPECIAL3,
302
303     /* Loongson 2E */
304     OPC_MULT_G_2E   = 0x18 | OPC_SPECIAL3,
305     OPC_MULTU_G_2E  = 0x19 | OPC_SPECIAL3,
306     OPC_DIV_G_2E    = 0x1A | OPC_SPECIAL3,
307     OPC_DIVU_G_2E   = 0x1B | OPC_SPECIAL3,
308     OPC_DMULT_G_2E  = 0x1C | OPC_SPECIAL3,
309     OPC_DMULTU_G_2E = 0x1D | OPC_SPECIAL3,
310     OPC_DDIV_G_2E   = 0x1E | OPC_SPECIAL3,
311     OPC_DDIVU_G_2E  = 0x1F | OPC_SPECIAL3,
312     OPC_MOD_G_2E    = 0x22 | OPC_SPECIAL3,
313     OPC_MODU_G_2E   = 0x23 | OPC_SPECIAL3,
314     OPC_DMOD_G_2E   = 0x26 | OPC_SPECIAL3,
315     OPC_DMODU_G_2E  = 0x27 | OPC_SPECIAL3,
316
317     /* MIPS DSP Load */
318     OPC_LX_DSP         = 0x0A | OPC_SPECIAL3,
319     /* MIPS DSP Arithmetic */
320     OPC_ADDU_QB_DSP    = 0x10 | OPC_SPECIAL3,
321     OPC_ADDU_OB_DSP    = 0x14 | OPC_SPECIAL3,
322     OPC_ABSQ_S_PH_DSP  = 0x12 | OPC_SPECIAL3,
323     OPC_ABSQ_S_QH_DSP  = 0x16 | OPC_SPECIAL3,
324     /* OPC_ADDUH_QB_DSP is same as OPC_MULT_G_2E.  */
325     /* OPC_ADDUH_QB_DSP   = 0x18 | OPC_SPECIAL3,  */
326     OPC_CMPU_EQ_QB_DSP = 0x11 | OPC_SPECIAL3,
327     OPC_CMPU_EQ_OB_DSP = 0x15 | OPC_SPECIAL3,
328     /* MIPS DSP GPR-Based Shift Sub-class */
329     OPC_SHLL_QB_DSP    = 0x13 | OPC_SPECIAL3,
330     OPC_SHLL_OB_DSP    = 0x17 | OPC_SPECIAL3,
331     /* MIPS DSP Multiply Sub-class insns */
332     /* OPC_MUL_PH_DSP is same as OPC_ADDUH_QB_DSP.  */
333     /* OPC_MUL_PH_DSP     = 0x18 | OPC_SPECIAL3,  */
334     OPC_DPA_W_PH_DSP   = 0x30 | OPC_SPECIAL3,
335     OPC_DPAQ_W_QH_DSP  = 0x34 | OPC_SPECIAL3,
336     /* DSP Bit/Manipulation Sub-class */
337     OPC_INSV_DSP       = 0x0C | OPC_SPECIAL3,
338     OPC_DINSV_DSP      = 0x0D | OPC_SPECIAL3,
339     /* MIPS DSP Compare-Pick Sub-class */
340     OPC_APPEND_DSP     = 0x31 | OPC_SPECIAL3,
341     OPC_DAPPEND_DSP    = 0x35 | OPC_SPECIAL3,
342     /* MIPS DSP Accumulator and DSPControl Access Sub-class */
343     OPC_EXTR_W_DSP     = 0x38 | OPC_SPECIAL3,
344     OPC_DEXTR_W_DSP    = 0x3C | OPC_SPECIAL3,
345 };
346
347 /* BSHFL opcodes */
348 #define MASK_BSHFL(op)     MASK_SPECIAL3(op) | (op & (0x1F << 6))
349
350 enum {
351     OPC_WSBH     = (0x02 << 6) | OPC_BSHFL,
352     OPC_SEB      = (0x10 << 6) | OPC_BSHFL,
353     OPC_SEH      = (0x18 << 6) | OPC_BSHFL,
354 };
355
356 /* DBSHFL opcodes */
357 #define MASK_DBSHFL(op)    MASK_SPECIAL3(op) | (op & (0x1F << 6))
358
359 enum {
360     OPC_DSBH     = (0x02 << 6) | OPC_DBSHFL,
361     OPC_DSHD     = (0x05 << 6) | OPC_DBSHFL,
362 };
363
364 /* MIPS DSP REGIMM opcodes */
365 enum {
366     OPC_BPOSGE32 = (0x1C << 16) | OPC_REGIMM,
367     OPC_BPOSGE64 = (0x1D << 16) | OPC_REGIMM,
368 };
369
370 #define MASK_LX(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
371 /* MIPS DSP Load */
372 enum {
373     OPC_LBUX = (0x06 << 6) | OPC_LX_DSP,
374     OPC_LHX  = (0x04 << 6) | OPC_LX_DSP,
375     OPC_LWX  = (0x00 << 6) | OPC_LX_DSP,
376     OPC_LDX = (0x08 << 6) | OPC_LX_DSP,
377 };
378
379 #define MASK_ADDU_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
380 enum {
381     /* MIPS DSP Arithmetic Sub-class */
382     OPC_ADDQ_PH        = (0x0A << 6) | OPC_ADDU_QB_DSP,
383     OPC_ADDQ_S_PH      = (0x0E << 6) | OPC_ADDU_QB_DSP,
384     OPC_ADDQ_S_W       = (0x16 << 6) | OPC_ADDU_QB_DSP,
385     OPC_ADDU_QB        = (0x00 << 6) | OPC_ADDU_QB_DSP,
386     OPC_ADDU_S_QB      = (0x04 << 6) | OPC_ADDU_QB_DSP,
387     OPC_ADDU_PH        = (0x08 << 6) | OPC_ADDU_QB_DSP,
388     OPC_ADDU_S_PH      = (0x0C << 6) | OPC_ADDU_QB_DSP,
389     OPC_SUBQ_PH        = (0x0B << 6) | OPC_ADDU_QB_DSP,
390     OPC_SUBQ_S_PH      = (0x0F << 6) | OPC_ADDU_QB_DSP,
391     OPC_SUBQ_S_W       = (0x17 << 6) | OPC_ADDU_QB_DSP,
392     OPC_SUBU_QB        = (0x01 << 6) | OPC_ADDU_QB_DSP,
393     OPC_SUBU_S_QB      = (0x05 << 6) | OPC_ADDU_QB_DSP,
394     OPC_SUBU_PH        = (0x09 << 6) | OPC_ADDU_QB_DSP,
395     OPC_SUBU_S_PH      = (0x0D << 6) | OPC_ADDU_QB_DSP,
396     OPC_ADDSC          = (0x10 << 6) | OPC_ADDU_QB_DSP,
397     OPC_ADDWC          = (0x11 << 6) | OPC_ADDU_QB_DSP,
398     OPC_MODSUB         = (0x12 << 6) | OPC_ADDU_QB_DSP,
399     OPC_RADDU_W_QB     = (0x14 << 6) | OPC_ADDU_QB_DSP,
400     /* MIPS DSP Multiply Sub-class insns */
401     OPC_MULEU_S_PH_QBL = (0x06 << 6) | OPC_ADDU_QB_DSP,
402     OPC_MULEU_S_PH_QBR = (0x07 << 6) | OPC_ADDU_QB_DSP,
403     OPC_MULQ_RS_PH     = (0x1F << 6) | OPC_ADDU_QB_DSP,
404     OPC_MULEQ_S_W_PHL  = (0x1C << 6) | OPC_ADDU_QB_DSP,
405     OPC_MULEQ_S_W_PHR  = (0x1D << 6) | OPC_ADDU_QB_DSP,
406     OPC_MULQ_S_PH      = (0x1E << 6) | OPC_ADDU_QB_DSP,
407 };
408
409 #define OPC_ADDUH_QB_DSP OPC_MULT_G_2E
410 #define MASK_ADDUH_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
411 enum {
412     /* MIPS DSP Arithmetic Sub-class */
413     OPC_ADDUH_QB   = (0x00 << 6) | OPC_ADDUH_QB_DSP,
414     OPC_ADDUH_R_QB = (0x02 << 6) | OPC_ADDUH_QB_DSP,
415     OPC_ADDQH_PH   = (0x08 << 6) | OPC_ADDUH_QB_DSP,
416     OPC_ADDQH_R_PH = (0x0A << 6) | OPC_ADDUH_QB_DSP,
417     OPC_ADDQH_W    = (0x10 << 6) | OPC_ADDUH_QB_DSP,
418     OPC_ADDQH_R_W  = (0x12 << 6) | OPC_ADDUH_QB_DSP,
419     OPC_SUBUH_QB   = (0x01 << 6) | OPC_ADDUH_QB_DSP,
420     OPC_SUBUH_R_QB = (0x03 << 6) | OPC_ADDUH_QB_DSP,
421     OPC_SUBQH_PH   = (0x09 << 6) | OPC_ADDUH_QB_DSP,
422     OPC_SUBQH_R_PH = (0x0B << 6) | OPC_ADDUH_QB_DSP,
423     OPC_SUBQH_W    = (0x11 << 6) | OPC_ADDUH_QB_DSP,
424     OPC_SUBQH_R_W  = (0x13 << 6) | OPC_ADDUH_QB_DSP,
425     /* MIPS DSP Multiply Sub-class insns */
426     OPC_MUL_PH     = (0x0C << 6) | OPC_ADDUH_QB_DSP,
427     OPC_MUL_S_PH   = (0x0E << 6) | OPC_ADDUH_QB_DSP,
428     OPC_MULQ_S_W   = (0x16 << 6) | OPC_ADDUH_QB_DSP,
429     OPC_MULQ_RS_W  = (0x17 << 6) | OPC_ADDUH_QB_DSP,
430 };
431
432 #define MASK_ABSQ_S_PH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
433 enum {
434     /* MIPS DSP Arithmetic Sub-class */
435     OPC_ABSQ_S_QB       = (0x01 << 6) | OPC_ABSQ_S_PH_DSP,
436     OPC_ABSQ_S_PH       = (0x09 << 6) | OPC_ABSQ_S_PH_DSP,
437     OPC_ABSQ_S_W        = (0x11 << 6) | OPC_ABSQ_S_PH_DSP,
438     OPC_PRECEQ_W_PHL    = (0x0C << 6) | OPC_ABSQ_S_PH_DSP,
439     OPC_PRECEQ_W_PHR    = (0x0D << 6) | OPC_ABSQ_S_PH_DSP,
440     OPC_PRECEQU_PH_QBL  = (0x04 << 6) | OPC_ABSQ_S_PH_DSP,
441     OPC_PRECEQU_PH_QBR  = (0x05 << 6) | OPC_ABSQ_S_PH_DSP,
442     OPC_PRECEQU_PH_QBLA = (0x06 << 6) | OPC_ABSQ_S_PH_DSP,
443     OPC_PRECEQU_PH_QBRA = (0x07 << 6) | OPC_ABSQ_S_PH_DSP,
444     OPC_PRECEU_PH_QBL   = (0x1C << 6) | OPC_ABSQ_S_PH_DSP,
445     OPC_PRECEU_PH_QBR   = (0x1D << 6) | OPC_ABSQ_S_PH_DSP,
446     OPC_PRECEU_PH_QBLA  = (0x1E << 6) | OPC_ABSQ_S_PH_DSP,
447     OPC_PRECEU_PH_QBRA  = (0x1F << 6) | OPC_ABSQ_S_PH_DSP,
448     /* DSP Bit/Manipulation Sub-class */
449     OPC_BITREV          = (0x1B << 6) | OPC_ABSQ_S_PH_DSP,
450     OPC_REPL_QB         = (0x02 << 6) | OPC_ABSQ_S_PH_DSP,
451     OPC_REPLV_QB        = (0x03 << 6) | OPC_ABSQ_S_PH_DSP,
452     OPC_REPL_PH         = (0x0A << 6) | OPC_ABSQ_S_PH_DSP,
453     OPC_REPLV_PH        = (0x0B << 6) | OPC_ABSQ_S_PH_DSP,
454 };
455
456 #define MASK_CMPU_EQ_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
457 enum {
458     /* MIPS DSP Arithmetic Sub-class */
459     OPC_PRECR_QB_PH      = (0x0D << 6) | OPC_CMPU_EQ_QB_DSP,
460     OPC_PRECRQ_QB_PH     = (0x0C << 6) | OPC_CMPU_EQ_QB_DSP,
461     OPC_PRECR_SRA_PH_W   = (0x1E << 6) | OPC_CMPU_EQ_QB_DSP,
462     OPC_PRECR_SRA_R_PH_W = (0x1F << 6) | OPC_CMPU_EQ_QB_DSP,
463     OPC_PRECRQ_PH_W      = (0x14 << 6) | OPC_CMPU_EQ_QB_DSP,
464     OPC_PRECRQ_RS_PH_W   = (0x15 << 6) | OPC_CMPU_EQ_QB_DSP,
465     OPC_PRECRQU_S_QB_PH  = (0x0F << 6) | OPC_CMPU_EQ_QB_DSP,
466     /* DSP Compare-Pick Sub-class */
467     OPC_CMPU_EQ_QB       = (0x00 << 6) | OPC_CMPU_EQ_QB_DSP,
468     OPC_CMPU_LT_QB       = (0x01 << 6) | OPC_CMPU_EQ_QB_DSP,
469     OPC_CMPU_LE_QB       = (0x02 << 6) | OPC_CMPU_EQ_QB_DSP,
470     OPC_CMPGU_EQ_QB      = (0x04 << 6) | OPC_CMPU_EQ_QB_DSP,
471     OPC_CMPGU_LT_QB      = (0x05 << 6) | OPC_CMPU_EQ_QB_DSP,
472     OPC_CMPGU_LE_QB      = (0x06 << 6) | OPC_CMPU_EQ_QB_DSP,
473     OPC_CMPGDU_EQ_QB     = (0x18 << 6) | OPC_CMPU_EQ_QB_DSP,
474     OPC_CMPGDU_LT_QB     = (0x19 << 6) | OPC_CMPU_EQ_QB_DSP,
475     OPC_CMPGDU_LE_QB     = (0x1A << 6) | OPC_CMPU_EQ_QB_DSP,
476     OPC_CMP_EQ_PH        = (0x08 << 6) | OPC_CMPU_EQ_QB_DSP,
477     OPC_CMP_LT_PH        = (0x09 << 6) | OPC_CMPU_EQ_QB_DSP,
478     OPC_CMP_LE_PH        = (0x0A << 6) | OPC_CMPU_EQ_QB_DSP,
479     OPC_PICK_QB          = (0x03 << 6) | OPC_CMPU_EQ_QB_DSP,
480     OPC_PICK_PH          = (0x0B << 6) | OPC_CMPU_EQ_QB_DSP,
481     OPC_PACKRL_PH        = (0x0E << 6) | OPC_CMPU_EQ_QB_DSP,
482 };
483
484 #define MASK_SHLL_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
485 enum {
486     /* MIPS DSP GPR-Based Shift Sub-class */
487     OPC_SHLL_QB    = (0x00 << 6) | OPC_SHLL_QB_DSP,
488     OPC_SHLLV_QB   = (0x02 << 6) | OPC_SHLL_QB_DSP,
489     OPC_SHLL_PH    = (0x08 << 6) | OPC_SHLL_QB_DSP,
490     OPC_SHLLV_PH   = (0x0A << 6) | OPC_SHLL_QB_DSP,
491     OPC_SHLL_S_PH  = (0x0C << 6) | OPC_SHLL_QB_DSP,
492     OPC_SHLLV_S_PH = (0x0E << 6) | OPC_SHLL_QB_DSP,
493     OPC_SHLL_S_W   = (0x14 << 6) | OPC_SHLL_QB_DSP,
494     OPC_SHLLV_S_W  = (0x16 << 6) | OPC_SHLL_QB_DSP,
495     OPC_SHRL_QB    = (0x01 << 6) | OPC_SHLL_QB_DSP,
496     OPC_SHRLV_QB   = (0x03 << 6) | OPC_SHLL_QB_DSP,
497     OPC_SHRL_PH    = (0x19 << 6) | OPC_SHLL_QB_DSP,
498     OPC_SHRLV_PH   = (0x1B << 6) | OPC_SHLL_QB_DSP,
499     OPC_SHRA_QB    = (0x04 << 6) | OPC_SHLL_QB_DSP,
500     OPC_SHRA_R_QB  = (0x05 << 6) | OPC_SHLL_QB_DSP,
501     OPC_SHRAV_QB   = (0x06 << 6) | OPC_SHLL_QB_DSP,
502     OPC_SHRAV_R_QB = (0x07 << 6) | OPC_SHLL_QB_DSP,
503     OPC_SHRA_PH    = (0x09 << 6) | OPC_SHLL_QB_DSP,
504     OPC_SHRAV_PH   = (0x0B << 6) | OPC_SHLL_QB_DSP,
505     OPC_SHRA_R_PH  = (0x0D << 6) | OPC_SHLL_QB_DSP,
506     OPC_SHRAV_R_PH = (0x0F << 6) | OPC_SHLL_QB_DSP,
507     OPC_SHRA_R_W   = (0x15 << 6) | OPC_SHLL_QB_DSP,
508     OPC_SHRAV_R_W  = (0x17 << 6) | OPC_SHLL_QB_DSP,
509 };
510
511 #define MASK_DPA_W_PH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
512 enum {
513     /* MIPS DSP Multiply Sub-class insns */
514     OPC_DPAU_H_QBL    = (0x03 << 6) | OPC_DPA_W_PH_DSP,
515     OPC_DPAU_H_QBR    = (0x07 << 6) | OPC_DPA_W_PH_DSP,
516     OPC_DPSU_H_QBL    = (0x0B << 6) | OPC_DPA_W_PH_DSP,
517     OPC_DPSU_H_QBR    = (0x0F << 6) | OPC_DPA_W_PH_DSP,
518     OPC_DPA_W_PH      = (0x00 << 6) | OPC_DPA_W_PH_DSP,
519     OPC_DPAX_W_PH     = (0x08 << 6) | OPC_DPA_W_PH_DSP,
520     OPC_DPAQ_S_W_PH   = (0x04 << 6) | OPC_DPA_W_PH_DSP,
521     OPC_DPAQX_S_W_PH  = (0x18 << 6) | OPC_DPA_W_PH_DSP,
522     OPC_DPAQX_SA_W_PH = (0x1A << 6) | OPC_DPA_W_PH_DSP,
523     OPC_DPS_W_PH      = (0x01 << 6) | OPC_DPA_W_PH_DSP,
524     OPC_DPSX_W_PH     = (0x09 << 6) | OPC_DPA_W_PH_DSP,
525     OPC_DPSQ_S_W_PH   = (0x05 << 6) | OPC_DPA_W_PH_DSP,
526     OPC_DPSQX_S_W_PH  = (0x19 << 6) | OPC_DPA_W_PH_DSP,
527     OPC_DPSQX_SA_W_PH = (0x1B << 6) | OPC_DPA_W_PH_DSP,
528     OPC_MULSAQ_S_W_PH = (0x06 << 6) | OPC_DPA_W_PH_DSP,
529     OPC_DPAQ_SA_L_W   = (0x0C << 6) | OPC_DPA_W_PH_DSP,
530     OPC_DPSQ_SA_L_W   = (0x0D << 6) | OPC_DPA_W_PH_DSP,
531     OPC_MAQ_S_W_PHL   = (0x14 << 6) | OPC_DPA_W_PH_DSP,
532     OPC_MAQ_S_W_PHR   = (0x16 << 6) | OPC_DPA_W_PH_DSP,
533     OPC_MAQ_SA_W_PHL  = (0x10 << 6) | OPC_DPA_W_PH_DSP,
534     OPC_MAQ_SA_W_PHR  = (0x12 << 6) | OPC_DPA_W_PH_DSP,
535     OPC_MULSA_W_PH    = (0x02 << 6) | OPC_DPA_W_PH_DSP,
536 };
537
538 #define MASK_INSV(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
539 enum {
540     /* DSP Bit/Manipulation Sub-class */
541     OPC_INSV = (0x00 << 6) | OPC_INSV_DSP,
542 };
543
544 #define MASK_APPEND(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
545 enum {
546     /* MIPS DSP Compare-Pick Sub-class */
547     OPC_APPEND  = (0x00 << 6) | OPC_APPEND_DSP,
548     OPC_PREPEND = (0x01 << 6) | OPC_APPEND_DSP,
549     OPC_BALIGN  = (0x10 << 6) | OPC_APPEND_DSP,
550 };
551
552 #define MASK_EXTR_W(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
553 enum {
554     /* MIPS DSP Accumulator and DSPControl Access Sub-class */
555     OPC_EXTR_W     = (0x00 << 6) | OPC_EXTR_W_DSP,
556     OPC_EXTR_R_W   = (0x04 << 6) | OPC_EXTR_W_DSP,
557     OPC_EXTR_RS_W  = (0x06 << 6) | OPC_EXTR_W_DSP,
558     OPC_EXTR_S_H   = (0x0E << 6) | OPC_EXTR_W_DSP,
559     OPC_EXTRV_S_H  = (0x0F << 6) | OPC_EXTR_W_DSP,
560     OPC_EXTRV_W    = (0x01 << 6) | OPC_EXTR_W_DSP,
561     OPC_EXTRV_R_W  = (0x05 << 6) | OPC_EXTR_W_DSP,
562     OPC_EXTRV_RS_W = (0x07 << 6) | OPC_EXTR_W_DSP,
563     OPC_EXTP       = (0x02 << 6) | OPC_EXTR_W_DSP,
564     OPC_EXTPV      = (0x03 << 6) | OPC_EXTR_W_DSP,
565     OPC_EXTPDP     = (0x0A << 6) | OPC_EXTR_W_DSP,
566     OPC_EXTPDPV    = (0x0B << 6) | OPC_EXTR_W_DSP,
567     OPC_SHILO      = (0x1A << 6) | OPC_EXTR_W_DSP,
568     OPC_SHILOV     = (0x1B << 6) | OPC_EXTR_W_DSP,
569     OPC_MTHLIP     = (0x1F << 6) | OPC_EXTR_W_DSP,
570     OPC_WRDSP      = (0x13 << 6) | OPC_EXTR_W_DSP,
571     OPC_RDDSP      = (0x12 << 6) | OPC_EXTR_W_DSP,
572 };
573
574 #define MASK_ABSQ_S_QH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
575 enum {
576     /* MIPS DSP Arithmetic Sub-class */
577     OPC_PRECEQ_L_PWL    = (0x14 << 6) | OPC_ABSQ_S_QH_DSP,
578     OPC_PRECEQ_L_PWR    = (0x15 << 6) | OPC_ABSQ_S_QH_DSP,
579     OPC_PRECEQ_PW_QHL   = (0x0C << 6) | OPC_ABSQ_S_QH_DSP,
580     OPC_PRECEQ_PW_QHR   = (0x0D << 6) | OPC_ABSQ_S_QH_DSP,
581     OPC_PRECEQ_PW_QHLA  = (0x0E << 6) | OPC_ABSQ_S_QH_DSP,
582     OPC_PRECEQ_PW_QHRA  = (0x0F << 6) | OPC_ABSQ_S_QH_DSP,
583     OPC_PRECEQU_QH_OBL  = (0x04 << 6) | OPC_ABSQ_S_QH_DSP,
584     OPC_PRECEQU_QH_OBR  = (0x05 << 6) | OPC_ABSQ_S_QH_DSP,
585     OPC_PRECEQU_QH_OBLA = (0x06 << 6) | OPC_ABSQ_S_QH_DSP,
586     OPC_PRECEQU_QH_OBRA = (0x07 << 6) | OPC_ABSQ_S_QH_DSP,
587     OPC_PRECEU_QH_OBL   = (0x1C << 6) | OPC_ABSQ_S_QH_DSP,
588     OPC_PRECEU_QH_OBR   = (0x1D << 6) | OPC_ABSQ_S_QH_DSP,
589     OPC_PRECEU_QH_OBLA  = (0x1E << 6) | OPC_ABSQ_S_QH_DSP,
590     OPC_PRECEU_QH_OBRA  = (0x1F << 6) | OPC_ABSQ_S_QH_DSP,
591     OPC_ABSQ_S_OB       = (0x01 << 6) | OPC_ABSQ_S_QH_DSP,
592     OPC_ABSQ_S_PW       = (0x11 << 6) | OPC_ABSQ_S_QH_DSP,
593     OPC_ABSQ_S_QH       = (0x09 << 6) | OPC_ABSQ_S_QH_DSP,
594     /* DSP Bit/Manipulation Sub-class */
595     OPC_REPL_OB         = (0x02 << 6) | OPC_ABSQ_S_QH_DSP,
596     OPC_REPL_PW         = (0x12 << 6) | OPC_ABSQ_S_QH_DSP,
597     OPC_REPL_QH         = (0x0A << 6) | OPC_ABSQ_S_QH_DSP,
598     OPC_REPLV_OB        = (0x03 << 6) | OPC_ABSQ_S_QH_DSP,
599     OPC_REPLV_PW        = (0x13 << 6) | OPC_ABSQ_S_QH_DSP,
600     OPC_REPLV_QH        = (0x0B << 6) | OPC_ABSQ_S_QH_DSP,
601 };
602
603 #define MASK_ADDU_OB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
604 enum {
605     /* MIPS DSP Multiply Sub-class insns */
606     OPC_MULEQ_S_PW_QHL = (0x1C << 6) | OPC_ADDU_OB_DSP,
607     OPC_MULEQ_S_PW_QHR = (0x1D << 6) | OPC_ADDU_OB_DSP,
608     OPC_MULEU_S_QH_OBL = (0x06 << 6) | OPC_ADDU_OB_DSP,
609     OPC_MULEU_S_QH_OBR = (0x07 << 6) | OPC_ADDU_OB_DSP,
610     OPC_MULQ_RS_QH     = (0x1F << 6) | OPC_ADDU_OB_DSP,
611     /* MIPS DSP Arithmetic Sub-class */
612     OPC_RADDU_L_OB     = (0x14 << 6) | OPC_ADDU_OB_DSP,
613     OPC_SUBQ_PW        = (0x13 << 6) | OPC_ADDU_OB_DSP,
614     OPC_SUBQ_S_PW      = (0x17 << 6) | OPC_ADDU_OB_DSP,
615     OPC_SUBQ_QH        = (0x0B << 6) | OPC_ADDU_OB_DSP,
616     OPC_SUBQ_S_QH      = (0x0F << 6) | OPC_ADDU_OB_DSP,
617     OPC_SUBU_OB        = (0x01 << 6) | OPC_ADDU_OB_DSP,
618     OPC_SUBU_S_OB      = (0x05 << 6) | OPC_ADDU_OB_DSP,
619     OPC_SUBU_QH        = (0x09 << 6) | OPC_ADDU_OB_DSP,
620     OPC_SUBU_S_QH      = (0x0D << 6) | OPC_ADDU_OB_DSP,
621     OPC_SUBUH_OB       = (0x19 << 6) | OPC_ADDU_OB_DSP,
622     OPC_SUBUH_R_OB     = (0x1B << 6) | OPC_ADDU_OB_DSP,
623     OPC_ADDQ_PW        = (0x12 << 6) | OPC_ADDU_OB_DSP,
624     OPC_ADDQ_S_PW      = (0x16 << 6) | OPC_ADDU_OB_DSP,
625     OPC_ADDQ_QH        = (0x0A << 6) | OPC_ADDU_OB_DSP,
626     OPC_ADDQ_S_QH      = (0x0E << 6) | OPC_ADDU_OB_DSP,
627     OPC_ADDU_OB        = (0x00 << 6) | OPC_ADDU_OB_DSP,
628     OPC_ADDU_S_OB      = (0x04 << 6) | OPC_ADDU_OB_DSP,
629     OPC_ADDU_QH        = (0x08 << 6) | OPC_ADDU_OB_DSP,
630     OPC_ADDU_S_QH      = (0x0C << 6) | OPC_ADDU_OB_DSP,
631     OPC_ADDUH_OB       = (0x18 << 6) | OPC_ADDU_OB_DSP,
632     OPC_ADDUH_R_OB     = (0x1A << 6) | OPC_ADDU_OB_DSP,
633 };
634
635 #define MASK_CMPU_EQ_OB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
636 enum {
637     /* DSP Compare-Pick Sub-class */
638     OPC_CMP_EQ_PW         = (0x10 << 6) | OPC_CMPU_EQ_OB_DSP,
639     OPC_CMP_LT_PW         = (0x11 << 6) | OPC_CMPU_EQ_OB_DSP,
640     OPC_CMP_LE_PW         = (0x12 << 6) | OPC_CMPU_EQ_OB_DSP,
641     OPC_CMP_EQ_QH         = (0x08 << 6) | OPC_CMPU_EQ_OB_DSP,
642     OPC_CMP_LT_QH         = (0x09 << 6) | OPC_CMPU_EQ_OB_DSP,
643     OPC_CMP_LE_QH         = (0x0A << 6) | OPC_CMPU_EQ_OB_DSP,
644     OPC_CMPGDU_EQ_OB      = (0x18 << 6) | OPC_CMPU_EQ_OB_DSP,
645     OPC_CMPGDU_LT_OB      = (0x19 << 6) | OPC_CMPU_EQ_OB_DSP,
646     OPC_CMPGDU_LE_OB      = (0x1A << 6) | OPC_CMPU_EQ_OB_DSP,
647     OPC_CMPGU_EQ_OB       = (0x04 << 6) | OPC_CMPU_EQ_OB_DSP,
648     OPC_CMPGU_LT_OB       = (0x05 << 6) | OPC_CMPU_EQ_OB_DSP,
649     OPC_CMPGU_LE_OB       = (0x06 << 6) | OPC_CMPU_EQ_OB_DSP,
650     OPC_CMPU_EQ_OB        = (0x00 << 6) | OPC_CMPU_EQ_OB_DSP,
651     OPC_CMPU_LT_OB        = (0x01 << 6) | OPC_CMPU_EQ_OB_DSP,
652     OPC_CMPU_LE_OB        = (0x02 << 6) | OPC_CMPU_EQ_OB_DSP,
653     OPC_PACKRL_PW         = (0x0E << 6) | OPC_CMPU_EQ_OB_DSP,
654     OPC_PICK_OB           = (0x03 << 6) | OPC_CMPU_EQ_OB_DSP,
655     OPC_PICK_PW           = (0x13 << 6) | OPC_CMPU_EQ_OB_DSP,
656     OPC_PICK_QH           = (0x0B << 6) | OPC_CMPU_EQ_OB_DSP,
657     /* MIPS DSP Arithmetic Sub-class */
658     OPC_PRECR_OB_QH       = (0x0D << 6) | OPC_CMPU_EQ_OB_DSP,
659     OPC_PRECR_SRA_QH_PW   = (0x1E << 6) | OPC_CMPU_EQ_OB_DSP,
660     OPC_PRECR_SRA_R_QH_PW = (0x1F << 6) | OPC_CMPU_EQ_OB_DSP,
661     OPC_PRECRQ_OB_QH      = (0x0C << 6) | OPC_CMPU_EQ_OB_DSP,
662     OPC_PRECRQ_PW_L       = (0x1C << 6) | OPC_CMPU_EQ_OB_DSP,
663     OPC_PRECRQ_QH_PW      = (0x14 << 6) | OPC_CMPU_EQ_OB_DSP,
664     OPC_PRECRQ_RS_QH_PW   = (0x15 << 6) | OPC_CMPU_EQ_OB_DSP,
665     OPC_PRECRQU_S_OB_QH   = (0x0F << 6) | OPC_CMPU_EQ_OB_DSP,
666 };
667
668 #define MASK_DAPPEND(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
669 enum {
670     /* DSP Compare-Pick Sub-class */
671     OPC_DAPPEND  = (0x00 << 6) | OPC_DAPPEND_DSP,
672     OPC_PREPENDD = (0x03 << 6) | OPC_DAPPEND_DSP,
673     OPC_PREPENDW = (0x01 << 6) | OPC_DAPPEND_DSP,
674     OPC_DBALIGN  = (0x10 << 6) | OPC_DAPPEND_DSP,
675 };
676
677 #define MASK_DEXTR_W(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
678 enum {
679     /* MIPS DSP Accumulator and DSPControl Access Sub-class */
680     OPC_DMTHLIP     = (0x1F << 6) | OPC_DEXTR_W_DSP,
681     OPC_DSHILO      = (0x1A << 6) | OPC_DEXTR_W_DSP,
682     OPC_DEXTP       = (0x02 << 6) | OPC_DEXTR_W_DSP,
683     OPC_DEXTPDP     = (0x0A << 6) | OPC_DEXTR_W_DSP,
684     OPC_DEXTPDPV    = (0x0B << 6) | OPC_DEXTR_W_DSP,
685     OPC_DEXTPV      = (0x03 << 6) | OPC_DEXTR_W_DSP,
686     OPC_DEXTR_L     = (0x10 << 6) | OPC_DEXTR_W_DSP,
687     OPC_DEXTR_R_L   = (0x14 << 6) | OPC_DEXTR_W_DSP,
688     OPC_DEXTR_RS_L  = (0x16 << 6) | OPC_DEXTR_W_DSP,
689     OPC_DEXTR_W     = (0x00 << 6) | OPC_DEXTR_W_DSP,
690     OPC_DEXTR_R_W   = (0x04 << 6) | OPC_DEXTR_W_DSP,
691     OPC_DEXTR_RS_W  = (0x06 << 6) | OPC_DEXTR_W_DSP,
692     OPC_DEXTR_S_H   = (0x0E << 6) | OPC_DEXTR_W_DSP,
693     OPC_DEXTRV_L    = (0x11 << 6) | OPC_DEXTR_W_DSP,
694     OPC_DEXTRV_R_L  = (0x15 << 6) | OPC_DEXTR_W_DSP,
695     OPC_DEXTRV_RS_L = (0x17 << 6) | OPC_DEXTR_W_DSP,
696     OPC_DEXTRV_S_H  = (0x0F << 6) | OPC_DEXTR_W_DSP,
697     OPC_DEXTRV_W    = (0x01 << 6) | OPC_DEXTR_W_DSP,
698     OPC_DEXTRV_R_W  = (0x05 << 6) | OPC_DEXTR_W_DSP,
699     OPC_DEXTRV_RS_W = (0x07 << 6) | OPC_DEXTR_W_DSP,
700     OPC_DSHILOV     = (0x1B << 6) | OPC_DEXTR_W_DSP,
701 };
702
703 #define MASK_DINSV(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
704 enum {
705     /* DSP Bit/Manipulation Sub-class */
706     OPC_DINSV = (0x00 << 6) | OPC_DINSV_DSP,
707 };
708
709 #define MASK_DPAQ_W_QH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
710 enum {
711     /* MIPS DSP Multiply Sub-class insns */
712     OPC_DMADD         = (0x19 << 6) | OPC_DPAQ_W_QH_DSP,
713     OPC_DMADDU        = (0x1D << 6) | OPC_DPAQ_W_QH_DSP,
714     OPC_DMSUB         = (0x1B << 6) | OPC_DPAQ_W_QH_DSP,
715     OPC_DMSUBU        = (0x1F << 6) | OPC_DPAQ_W_QH_DSP,
716     OPC_DPA_W_QH      = (0x00 << 6) | OPC_DPAQ_W_QH_DSP,
717     OPC_DPAQ_S_W_QH   = (0x04 << 6) | OPC_DPAQ_W_QH_DSP,
718     OPC_DPAQ_SA_L_PW  = (0x0C << 6) | OPC_DPAQ_W_QH_DSP,
719     OPC_DPAU_H_OBL    = (0x03 << 6) | OPC_DPAQ_W_QH_DSP,
720     OPC_DPAU_H_OBR    = (0x07 << 6) | OPC_DPAQ_W_QH_DSP,
721     OPC_DPS_W_QH      = (0x01 << 6) | OPC_DPAQ_W_QH_DSP,
722     OPC_DPSQ_S_W_QH   = (0x05 << 6) | OPC_DPAQ_W_QH_DSP,
723     OPC_DPSQ_SA_L_PW  = (0x0D << 6) | OPC_DPAQ_W_QH_DSP,
724     OPC_DPSU_H_OBL    = (0x0B << 6) | OPC_DPAQ_W_QH_DSP,
725     OPC_DPSU_H_OBR    = (0x0F << 6) | OPC_DPAQ_W_QH_DSP,
726     OPC_MAQ_S_L_PWL   = (0x1C << 6) | OPC_DPAQ_W_QH_DSP,
727     OPC_MAQ_S_L_PWR   = (0x1E << 6) | OPC_DPAQ_W_QH_DSP,
728     OPC_MAQ_S_W_QHLL  = (0x14 << 6) | OPC_DPAQ_W_QH_DSP,
729     OPC_MAQ_SA_W_QHLL = (0x10 << 6) | OPC_DPAQ_W_QH_DSP,
730     OPC_MAQ_S_W_QHLR  = (0x15 << 6) | OPC_DPAQ_W_QH_DSP,
731     OPC_MAQ_SA_W_QHLR = (0x11 << 6) | OPC_DPAQ_W_QH_DSP,
732     OPC_MAQ_S_W_QHRL  = (0x16 << 6) | OPC_DPAQ_W_QH_DSP,
733     OPC_MAQ_SA_W_QHRL = (0x12 << 6) | OPC_DPAQ_W_QH_DSP,
734     OPC_MAQ_S_W_QHRR  = (0x17 << 6) | OPC_DPAQ_W_QH_DSP,
735     OPC_MAQ_SA_W_QHRR = (0x13 << 6) | OPC_DPAQ_W_QH_DSP,
736     OPC_MULSAQ_S_L_PW = (0x0E << 6) | OPC_DPAQ_W_QH_DSP,
737     OPC_MULSAQ_S_W_QH = (0x06 << 6) | OPC_DPAQ_W_QH_DSP,
738 };
739
740 #define MASK_SHLL_OB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
741 enum {
742     /* MIPS DSP GPR-Based Shift Sub-class */
743     OPC_SHLL_PW    = (0x10 << 6) | OPC_SHLL_OB_DSP,
744     OPC_SHLL_S_PW  = (0x14 << 6) | OPC_SHLL_OB_DSP,
745     OPC_SHLLV_OB   = (0x02 << 6) | OPC_SHLL_OB_DSP,
746     OPC_SHLLV_PW   = (0x12 << 6) | OPC_SHLL_OB_DSP,
747     OPC_SHLLV_S_PW = (0x16 << 6) | OPC_SHLL_OB_DSP,
748     OPC_SHLLV_QH   = (0x0A << 6) | OPC_SHLL_OB_DSP,
749     OPC_SHLLV_S_QH = (0x0E << 6) | OPC_SHLL_OB_DSP,
750     OPC_SHRA_PW    = (0x11 << 6) | OPC_SHLL_OB_DSP,
751     OPC_SHRA_R_PW  = (0x15 << 6) | OPC_SHLL_OB_DSP,
752     OPC_SHRAV_OB   = (0x06 << 6) | OPC_SHLL_OB_DSP,
753     OPC_SHRAV_R_OB = (0x07 << 6) | OPC_SHLL_OB_DSP,
754     OPC_SHRAV_PW   = (0x13 << 6) | OPC_SHLL_OB_DSP,
755     OPC_SHRAV_R_PW = (0x17 << 6) | OPC_SHLL_OB_DSP,
756     OPC_SHRAV_QH   = (0x0B << 6) | OPC_SHLL_OB_DSP,
757     OPC_SHRAV_R_QH = (0x0F << 6) | OPC_SHLL_OB_DSP,
758     OPC_SHRLV_OB   = (0x03 << 6) | OPC_SHLL_OB_DSP,
759     OPC_SHRLV_QH   = (0x1B << 6) | OPC_SHLL_OB_DSP,
760     OPC_SHLL_OB    = (0x00 << 6) | OPC_SHLL_OB_DSP,
761     OPC_SHLL_QH    = (0x08 << 6) | OPC_SHLL_OB_DSP,
762     OPC_SHLL_S_QH  = (0x0C << 6) | OPC_SHLL_OB_DSP,
763     OPC_SHRA_OB    = (0x04 << 6) | OPC_SHLL_OB_DSP,
764     OPC_SHRA_R_OB  = (0x05 << 6) | OPC_SHLL_OB_DSP,
765     OPC_SHRA_QH    = (0x09 << 6) | OPC_SHLL_OB_DSP,
766     OPC_SHRA_R_QH  = (0x0D << 6) | OPC_SHLL_OB_DSP,
767     OPC_SHRL_OB    = (0x01 << 6) | OPC_SHLL_OB_DSP,
768     OPC_SHRL_QH    = (0x19 << 6) | OPC_SHLL_OB_DSP,
769 };
770
771 /* Coprocessor 0 (rs field) */
772 #define MASK_CP0(op)       MASK_OP_MAJOR(op) | (op & (0x1F << 21))
773
774 enum {
775     OPC_MFC0     = (0x00 << 21) | OPC_CP0,
776     OPC_DMFC0    = (0x01 << 21) | OPC_CP0,
777     OPC_MTC0     = (0x04 << 21) | OPC_CP0,
778     OPC_DMTC0    = (0x05 << 21) | OPC_CP0,
779     OPC_MFTR     = (0x08 << 21) | OPC_CP0,
780     OPC_RDPGPR   = (0x0A << 21) | OPC_CP0,
781     OPC_MFMC0    = (0x0B << 21) | OPC_CP0,
782     OPC_MTTR     = (0x0C << 21) | OPC_CP0,
783     OPC_WRPGPR   = (0x0E << 21) | OPC_CP0,
784     OPC_C0       = (0x10 << 21) | OPC_CP0,
785     OPC_C0_FIRST = (0x10 << 21) | OPC_CP0,
786     OPC_C0_LAST  = (0x1F << 21) | OPC_CP0,
787 };
788
789 /* MFMC0 opcodes */
790 #define MASK_MFMC0(op)     MASK_CP0(op) | (op & 0xFFFF)
791
792 enum {
793     OPC_DMT      = 0x01 | (0 << 5) | (0x0F << 6) | (0x01 << 11) | OPC_MFMC0,
794     OPC_EMT      = 0x01 | (1 << 5) | (0x0F << 6) | (0x01 << 11) | OPC_MFMC0,
795     OPC_DVPE     = 0x01 | (0 << 5) | OPC_MFMC0,
796     OPC_EVPE     = 0x01 | (1 << 5) | OPC_MFMC0,
797     OPC_DI       = (0 << 5) | (0x0C << 11) | OPC_MFMC0,
798     OPC_EI       = (1 << 5) | (0x0C << 11) | OPC_MFMC0,
799 };
800
801 /* Coprocessor 0 (with rs == C0) */
802 #define MASK_C0(op)        MASK_CP0(op) | (op & 0x3F)
803
804 enum {
805     OPC_TLBR     = 0x01 | OPC_C0,
806     OPC_TLBWI    = 0x02 | OPC_C0,
807     OPC_TLBWR    = 0x06 | OPC_C0,
808     OPC_TLBP     = 0x08 | OPC_C0,
809     OPC_RFE      = 0x10 | OPC_C0,
810     OPC_ERET     = 0x18 | OPC_C0,
811     OPC_DERET    = 0x1F | OPC_C0,
812     OPC_WAIT     = 0x20 | OPC_C0,
813 };
814
815 /* Coprocessor 1 (rs field) */
816 #define MASK_CP1(op)       MASK_OP_MAJOR(op) | (op & (0x1F << 21))
817
818 /* Values for the fmt field in FP instructions */
819 enum {
820     /* 0 - 15 are reserved */
821     FMT_S = 16,          /* single fp */
822     FMT_D = 17,          /* double fp */
823     FMT_E = 18,          /* extended fp */
824     FMT_Q = 19,          /* quad fp */
825     FMT_W = 20,          /* 32-bit fixed */
826     FMT_L = 21,          /* 64-bit fixed */
827     FMT_PS = 22,         /* paired single fp */
828     /* 23 - 31 are reserved */
829 };
830
831 enum {
832     OPC_MFC1     = (0x00 << 21) | OPC_CP1,
833     OPC_DMFC1    = (0x01 << 21) | OPC_CP1,
834     OPC_CFC1     = (0x02 << 21) | OPC_CP1,
835     OPC_MFHC1    = (0x03 << 21) | OPC_CP1,
836     OPC_MTC1     = (0x04 << 21) | OPC_CP1,
837     OPC_DMTC1    = (0x05 << 21) | OPC_CP1,
838     OPC_CTC1     = (0x06 << 21) | OPC_CP1,
839     OPC_MTHC1    = (0x07 << 21) | OPC_CP1,
840     OPC_BC1      = (0x08 << 21) | OPC_CP1, /* bc */
841     OPC_BC1ANY2  = (0x09 << 21) | OPC_CP1,
842     OPC_BC1ANY4  = (0x0A << 21) | OPC_CP1,
843     OPC_S_FMT    = (FMT_S << 21) | OPC_CP1,
844     OPC_D_FMT    = (FMT_D << 21) | OPC_CP1,
845     OPC_E_FMT    = (FMT_E << 21) | OPC_CP1,
846     OPC_Q_FMT    = (FMT_Q << 21) | OPC_CP1,
847     OPC_W_FMT    = (FMT_W << 21) | OPC_CP1,
848     OPC_L_FMT    = (FMT_L << 21) | OPC_CP1,
849     OPC_PS_FMT   = (FMT_PS << 21) | OPC_CP1,
850 };
851
852 #define MASK_CP1_FUNC(op)       MASK_CP1(op) | (op & 0x3F)
853 #define MASK_BC1(op)            MASK_CP1(op) | (op & (0x3 << 16))
854
855 enum {
856     OPC_BC1F     = (0x00 << 16) | OPC_BC1,
857     OPC_BC1T     = (0x01 << 16) | OPC_BC1,
858     OPC_BC1FL    = (0x02 << 16) | OPC_BC1,
859     OPC_BC1TL    = (0x03 << 16) | OPC_BC1,
860 };
861
862 enum {
863     OPC_BC1FANY2     = (0x00 << 16) | OPC_BC1ANY2,
864     OPC_BC1TANY2     = (0x01 << 16) | OPC_BC1ANY2,
865 };
866
867 enum {
868     OPC_BC1FANY4     = (0x00 << 16) | OPC_BC1ANY4,
869     OPC_BC1TANY4     = (0x01 << 16) | OPC_BC1ANY4,
870 };
871
872 #define MASK_CP2(op)       MASK_OP_MAJOR(op) | (op & (0x1F << 21))
873
874 enum {
875     OPC_MFC2    = (0x00 << 21) | OPC_CP2,
876     OPC_DMFC2   = (0x01 << 21) | OPC_CP2,
877     OPC_CFC2    = (0x02 << 21) | OPC_CP2,
878     OPC_MFHC2   = (0x03 << 21) | OPC_CP2,
879     OPC_MTC2    = (0x04 << 21) | OPC_CP2,
880     OPC_DMTC2   = (0x05 << 21) | OPC_CP2,
881     OPC_CTC2    = (0x06 << 21) | OPC_CP2,
882     OPC_MTHC2   = (0x07 << 21) | OPC_CP2,
883     OPC_BC2     = (0x08 << 21) | OPC_CP2,
884 };
885
886 #define MASK_LMI(op)  (MASK_OP_MAJOR(op) | (op & (0x1F << 21)) | (op & 0x1F))
887
888 enum {
889     OPC_PADDSH  = (24 << 21) | (0x00) | OPC_CP2,
890     OPC_PADDUSH = (25 << 21) | (0x00) | OPC_CP2,
891     OPC_PADDH   = (26 << 21) | (0x00) | OPC_CP2,
892     OPC_PADDW   = (27 << 21) | (0x00) | OPC_CP2,
893     OPC_PADDSB  = (28 << 21) | (0x00) | OPC_CP2,
894     OPC_PADDUSB = (29 << 21) | (0x00) | OPC_CP2,
895     OPC_PADDB   = (30 << 21) | (0x00) | OPC_CP2,
896     OPC_PADDD   = (31 << 21) | (0x00) | OPC_CP2,
897
898     OPC_PSUBSH  = (24 << 21) | (0x01) | OPC_CP2,
899     OPC_PSUBUSH = (25 << 21) | (0x01) | OPC_CP2,
900     OPC_PSUBH   = (26 << 21) | (0x01) | OPC_CP2,
901     OPC_PSUBW   = (27 << 21) | (0x01) | OPC_CP2,
902     OPC_PSUBSB  = (28 << 21) | (0x01) | OPC_CP2,
903     OPC_PSUBUSB = (29 << 21) | (0x01) | OPC_CP2,
904     OPC_PSUBB   = (30 << 21) | (0x01) | OPC_CP2,
905     OPC_PSUBD   = (31 << 21) | (0x01) | OPC_CP2,
906
907     OPC_PSHUFH   = (24 << 21) | (0x02) | OPC_CP2,
908     OPC_PACKSSWH = (25 << 21) | (0x02) | OPC_CP2,
909     OPC_PACKSSHB = (26 << 21) | (0x02) | OPC_CP2,
910     OPC_PACKUSHB = (27 << 21) | (0x02) | OPC_CP2,
911     OPC_XOR_CP2  = (28 << 21) | (0x02) | OPC_CP2,
912     OPC_NOR_CP2  = (29 << 21) | (0x02) | OPC_CP2,
913     OPC_AND_CP2  = (30 << 21) | (0x02) | OPC_CP2,
914     OPC_PANDN    = (31 << 21) | (0x02) | OPC_CP2,
915
916     OPC_PUNPCKLHW = (24 << 21) | (0x03) | OPC_CP2,
917     OPC_PUNPCKHHW = (25 << 21) | (0x03) | OPC_CP2,
918     OPC_PUNPCKLBH = (26 << 21) | (0x03) | OPC_CP2,
919     OPC_PUNPCKHBH = (27 << 21) | (0x03) | OPC_CP2,
920     OPC_PINSRH_0  = (28 << 21) | (0x03) | OPC_CP2,
921     OPC_PINSRH_1  = (29 << 21) | (0x03) | OPC_CP2,
922     OPC_PINSRH_2  = (30 << 21) | (0x03) | OPC_CP2,
923     OPC_PINSRH_3  = (31 << 21) | (0x03) | OPC_CP2,
924
925     OPC_PAVGH   = (24 << 21) | (0x08) | OPC_CP2,
926     OPC_PAVGB   = (25 << 21) | (0x08) | OPC_CP2,
927     OPC_PMAXSH  = (26 << 21) | (0x08) | OPC_CP2,
928     OPC_PMINSH  = (27 << 21) | (0x08) | OPC_CP2,
929     OPC_PMAXUB  = (28 << 21) | (0x08) | OPC_CP2,
930     OPC_PMINUB  = (29 << 21) | (0x08) | OPC_CP2,
931
932     OPC_PCMPEQW = (24 << 21) | (0x09) | OPC_CP2,
933     OPC_PCMPGTW = (25 << 21) | (0x09) | OPC_CP2,
934     OPC_PCMPEQH = (26 << 21) | (0x09) | OPC_CP2,
935     OPC_PCMPGTH = (27 << 21) | (0x09) | OPC_CP2,
936     OPC_PCMPEQB = (28 << 21) | (0x09) | OPC_CP2,
937     OPC_PCMPGTB = (29 << 21) | (0x09) | OPC_CP2,
938
939     OPC_PSLLW   = (24 << 21) | (0x0A) | OPC_CP2,
940     OPC_PSLLH   = (25 << 21) | (0x0A) | OPC_CP2,
941     OPC_PMULLH  = (26 << 21) | (0x0A) | OPC_CP2,
942     OPC_PMULHH  = (27 << 21) | (0x0A) | OPC_CP2,
943     OPC_PMULUW  = (28 << 21) | (0x0A) | OPC_CP2,
944     OPC_PMULHUH = (29 << 21) | (0x0A) | OPC_CP2,
945
946     OPC_PSRLW     = (24 << 21) | (0x0B) | OPC_CP2,
947     OPC_PSRLH     = (25 << 21) | (0x0B) | OPC_CP2,
948     OPC_PSRAW     = (26 << 21) | (0x0B) | OPC_CP2,
949     OPC_PSRAH     = (27 << 21) | (0x0B) | OPC_CP2,
950     OPC_PUNPCKLWD = (28 << 21) | (0x0B) | OPC_CP2,
951     OPC_PUNPCKHWD = (29 << 21) | (0x0B) | OPC_CP2,
952
953     OPC_ADDU_CP2 = (24 << 21) | (0x0C) | OPC_CP2,
954     OPC_OR_CP2   = (25 << 21) | (0x0C) | OPC_CP2,
955     OPC_ADD_CP2  = (26 << 21) | (0x0C) | OPC_CP2,
956     OPC_DADD_CP2 = (27 << 21) | (0x0C) | OPC_CP2,
957     OPC_SEQU_CP2 = (28 << 21) | (0x0C) | OPC_CP2,
958     OPC_SEQ_CP2  = (29 << 21) | (0x0C) | OPC_CP2,
959
960     OPC_SUBU_CP2 = (24 << 21) | (0x0D) | OPC_CP2,
961     OPC_PASUBUB  = (25 << 21) | (0x0D) | OPC_CP2,
962     OPC_SUB_CP2  = (26 << 21) | (0x0D) | OPC_CP2,
963     OPC_DSUB_CP2 = (27 << 21) | (0x0D) | OPC_CP2,
964     OPC_SLTU_CP2 = (28 << 21) | (0x0D) | OPC_CP2,
965     OPC_SLT_CP2  = (29 << 21) | (0x0D) | OPC_CP2,
966
967     OPC_SLL_CP2  = (24 << 21) | (0x0E) | OPC_CP2,
968     OPC_DSLL_CP2 = (25 << 21) | (0x0E) | OPC_CP2,
969     OPC_PEXTRH   = (26 << 21) | (0x0E) | OPC_CP2,
970     OPC_PMADDHW  = (27 << 21) | (0x0E) | OPC_CP2,
971     OPC_SLEU_CP2 = (28 << 21) | (0x0E) | OPC_CP2,
972     OPC_SLE_CP2  = (29 << 21) | (0x0E) | OPC_CP2,
973
974     OPC_SRL_CP2  = (24 << 21) | (0x0F) | OPC_CP2,
975     OPC_DSRL_CP2 = (25 << 21) | (0x0F) | OPC_CP2,
976     OPC_SRA_CP2  = (26 << 21) | (0x0F) | OPC_CP2,
977     OPC_DSRA_CP2 = (27 << 21) | (0x0F) | OPC_CP2,
978     OPC_BIADD    = (28 << 21) | (0x0F) | OPC_CP2,
979     OPC_PMOVMSKB = (29 << 21) | (0x0F) | OPC_CP2,
980 };
981
982
983 #define MASK_CP3(op)       MASK_OP_MAJOR(op) | (op & 0x3F)
984
985 enum {
986     OPC_LWXC1   = 0x00 | OPC_CP3,
987     OPC_LDXC1   = 0x01 | OPC_CP3,
988     OPC_LUXC1   = 0x05 | OPC_CP3,
989     OPC_SWXC1   = 0x08 | OPC_CP3,
990     OPC_SDXC1   = 0x09 | OPC_CP3,
991     OPC_SUXC1   = 0x0D | OPC_CP3,
992     OPC_PREFX   = 0x0F | OPC_CP3,
993     OPC_ALNV_PS = 0x1E | OPC_CP3,
994     OPC_MADD_S  = 0x20 | OPC_CP3,
995     OPC_MADD_D  = 0x21 | OPC_CP3,
996     OPC_MADD_PS = 0x26 | OPC_CP3,
997     OPC_MSUB_S  = 0x28 | OPC_CP3,
998     OPC_MSUB_D  = 0x29 | OPC_CP3,
999     OPC_MSUB_PS = 0x2E | OPC_CP3,
1000     OPC_NMADD_S = 0x30 | OPC_CP3,
1001     OPC_NMADD_D = 0x31 | OPC_CP3,
1002     OPC_NMADD_PS= 0x36 | OPC_CP3,
1003     OPC_NMSUB_S = 0x38 | OPC_CP3,
1004     OPC_NMSUB_D = 0x39 | OPC_CP3,
1005     OPC_NMSUB_PS= 0x3E | OPC_CP3,
1006 };
1007
1008 /* global register indices */
1009 static TCGv_ptr cpu_env;
1010 static TCGv cpu_gpr[32], cpu_PC;
1011 static TCGv cpu_HI[MIPS_DSP_ACC], cpu_LO[MIPS_DSP_ACC], cpu_ACX[MIPS_DSP_ACC];
1012 static TCGv cpu_dspctrl, btarget, bcond;
1013 static TCGv_i32 hflags;
1014 static TCGv_i32 fpu_fcr0, fpu_fcr31;
1015 static TCGv_i64 fpu_f64[32];
1016
1017 static uint32_t gen_opc_hflags[OPC_BUF_SIZE];
1018
1019 #include "gen-icount.h"
1020
1021 #define gen_helper_0e0i(name, arg) do {                           \
1022     TCGv_i32 helper_tmp = tcg_const_i32(arg);                     \
1023     gen_helper_##name(cpu_env, helper_tmp);                       \
1024     tcg_temp_free_i32(helper_tmp);                                \
1025     } while(0)
1026
1027 #define gen_helper_0e1i(name, arg1, arg2) do {                    \
1028     TCGv_i32 helper_tmp = tcg_const_i32(arg2);                    \
1029     gen_helper_##name(cpu_env, arg1, helper_tmp);                 \
1030     tcg_temp_free_i32(helper_tmp);                                \
1031     } while(0)
1032
1033 #define gen_helper_1e0i(name, ret, arg1) do {                     \
1034     TCGv_i32 helper_tmp = tcg_const_i32(arg1);                    \
1035     gen_helper_##name(ret, cpu_env, helper_tmp);                  \
1036     tcg_temp_free_i32(helper_tmp);                                \
1037     } while(0)
1038
1039 #define gen_helper_1e1i(name, ret, arg1, arg2) do {               \
1040     TCGv_i32 helper_tmp = tcg_const_i32(arg2);                    \
1041     gen_helper_##name(ret, cpu_env, arg1, helper_tmp);            \
1042     tcg_temp_free_i32(helper_tmp);                                \
1043     } while(0)
1044
1045 #define gen_helper_0e2i(name, arg1, arg2, arg3) do {              \
1046     TCGv_i32 helper_tmp = tcg_const_i32(arg3);                    \
1047     gen_helper_##name(cpu_env, arg1, arg2, helper_tmp);           \
1048     tcg_temp_free_i32(helper_tmp);                                \
1049     } while(0)
1050
1051 #define gen_helper_1e2i(name, ret, arg1, arg2, arg3) do {         \
1052     TCGv_i32 helper_tmp = tcg_const_i32(arg3);                    \
1053     gen_helper_##name(ret, cpu_env, arg1, arg2, helper_tmp);      \
1054     tcg_temp_free_i32(helper_tmp);                                \
1055     } while(0)
1056
1057 #define gen_helper_0e3i(name, arg1, arg2, arg3, arg4) do {        \
1058     TCGv_i32 helper_tmp = tcg_const_i32(arg4);                    \
1059     gen_helper_##name(cpu_env, arg1, arg2, arg3, helper_tmp);     \
1060     tcg_temp_free_i32(helper_tmp);                                \
1061     } while(0)
1062
1063 typedef struct DisasContext {
1064     struct TranslationBlock *tb;
1065     target_ulong pc, saved_pc;
1066     uint32_t opcode;
1067     int singlestep_enabled;
1068     /* Routine used to access memory */
1069     int mem_idx;
1070     uint32_t hflags, saved_hflags;
1071     int bstate;
1072     target_ulong btarget;
1073 } DisasContext;
1074
1075 enum {
1076     BS_NONE     = 0, /* We go out of the TB without reaching a branch or an
1077                       * exception condition */
1078     BS_STOP     = 1, /* We want to stop translation for any reason */
1079     BS_BRANCH   = 2, /* We reached a branch condition     */
1080     BS_EXCP     = 3, /* We reached an exception condition */
1081 };
1082
1083 static const char * const regnames[] = {
1084     "r0", "at", "v0", "v1", "a0", "a1", "a2", "a3",
1085     "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
1086     "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1087     "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra",
1088 };
1089
1090 static const char * const regnames_HI[] = {
1091     "HI0", "HI1", "HI2", "HI3",
1092 };
1093
1094 static const char * const regnames_LO[] = {
1095     "LO0", "LO1", "LO2", "LO3",
1096 };
1097
1098 static const char * const regnames_ACX[] = {
1099     "ACX0", "ACX1", "ACX2", "ACX3",
1100 };
1101
1102 static const char * const fregnames[] = {
1103     "f0",  "f1",  "f2",  "f3",  "f4",  "f5",  "f6",  "f7",
1104     "f8",  "f9",  "f10", "f11", "f12", "f13", "f14", "f15",
1105     "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1106     "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
1107 };
1108
1109 #define MIPS_DEBUG(fmt, ...)                                                  \
1110     do {                                                                      \
1111         if (MIPS_DEBUG_DISAS) {                                               \
1112             qemu_log_mask(CPU_LOG_TB_IN_ASM,                                  \
1113                           TARGET_FMT_lx ": %08x " fmt "\n",                   \
1114                           ctx->pc, ctx->opcode , ## __VA_ARGS__);             \
1115         }                                                                     \
1116     } while (0)
1117
1118 #define LOG_DISAS(...)                                                        \
1119     do {                                                                      \
1120         if (MIPS_DEBUG_DISAS) {                                               \
1121             qemu_log_mask(CPU_LOG_TB_IN_ASM, ## __VA_ARGS__);                 \
1122         }                                                                     \
1123     } while (0)
1124
1125 #define MIPS_INVAL(op)                                                        \
1126     MIPS_DEBUG("Invalid %s %03x %03x %03x", op, ctx->opcode >> 26,            \
1127                ctx->opcode & 0x3F, ((ctx->opcode >> 16) & 0x1F))
1128
1129 /* General purpose registers moves. */
1130 static inline void gen_load_gpr (TCGv t, int reg)
1131 {
1132     if (reg == 0)
1133         tcg_gen_movi_tl(t, 0);
1134     else
1135         tcg_gen_mov_tl(t, cpu_gpr[reg]);
1136 }
1137
1138 static inline void gen_store_gpr (TCGv t, int reg)
1139 {
1140     if (reg != 0)
1141         tcg_gen_mov_tl(cpu_gpr[reg], t);
1142 }
1143
1144 /* Moves to/from ACX register.  */
1145 static inline void gen_load_ACX (TCGv t, int reg)
1146 {
1147     tcg_gen_mov_tl(t, cpu_ACX[reg]);
1148 }
1149
1150 static inline void gen_store_ACX (TCGv t, int reg)
1151 {
1152     tcg_gen_mov_tl(cpu_ACX[reg], t);
1153 }
1154
1155 /* Moves to/from shadow registers. */
1156 static inline void gen_load_srsgpr (int from, int to)
1157 {
1158     TCGv t0 = tcg_temp_new();
1159
1160     if (from == 0)
1161         tcg_gen_movi_tl(t0, 0);
1162     else {
1163         TCGv_i32 t2 = tcg_temp_new_i32();
1164         TCGv_ptr addr = tcg_temp_new_ptr();
1165
1166         tcg_gen_ld_i32(t2, cpu_env, offsetof(CPUMIPSState, CP0_SRSCtl));
1167         tcg_gen_shri_i32(t2, t2, CP0SRSCtl_PSS);
1168         tcg_gen_andi_i32(t2, t2, 0xf);
1169         tcg_gen_muli_i32(t2, t2, sizeof(target_ulong) * 32);
1170         tcg_gen_ext_i32_ptr(addr, t2);
1171         tcg_gen_add_ptr(addr, cpu_env, addr);
1172
1173         tcg_gen_ld_tl(t0, addr, sizeof(target_ulong) * from);
1174         tcg_temp_free_ptr(addr);
1175         tcg_temp_free_i32(t2);
1176     }
1177     gen_store_gpr(t0, to);
1178     tcg_temp_free(t0);
1179 }
1180
1181 static inline void gen_store_srsgpr (int from, int to)
1182 {
1183     if (to != 0) {
1184         TCGv t0 = tcg_temp_new();
1185         TCGv_i32 t2 = tcg_temp_new_i32();
1186         TCGv_ptr addr = tcg_temp_new_ptr();
1187
1188         gen_load_gpr(t0, from);
1189         tcg_gen_ld_i32(t2, cpu_env, offsetof(CPUMIPSState, CP0_SRSCtl));
1190         tcg_gen_shri_i32(t2, t2, CP0SRSCtl_PSS);
1191         tcg_gen_andi_i32(t2, t2, 0xf);
1192         tcg_gen_muli_i32(t2, t2, sizeof(target_ulong) * 32);
1193         tcg_gen_ext_i32_ptr(addr, t2);
1194         tcg_gen_add_ptr(addr, cpu_env, addr);
1195
1196         tcg_gen_st_tl(t0, addr, sizeof(target_ulong) * to);
1197         tcg_temp_free_ptr(addr);
1198         tcg_temp_free_i32(t2);
1199         tcg_temp_free(t0);
1200     }
1201 }
1202
1203 /* Floating point register moves. */
1204 static void gen_load_fpr32(TCGv_i32 t, int reg)
1205 {
1206     tcg_gen_trunc_i64_i32(t, fpu_f64[reg]);
1207 }
1208
1209 static void gen_store_fpr32(TCGv_i32 t, int reg)
1210 {
1211     TCGv_i64 t64 = tcg_temp_new_i64();
1212     tcg_gen_extu_i32_i64(t64, t);
1213     tcg_gen_deposit_i64(fpu_f64[reg], fpu_f64[reg], t64, 0, 32);
1214     tcg_temp_free_i64(t64);
1215 }
1216
1217 static void gen_load_fpr32h(TCGv_i32 t, int reg)
1218 {
1219     TCGv_i64 t64 = tcg_temp_new_i64();
1220     tcg_gen_shri_i64(t64, fpu_f64[reg], 32);
1221     tcg_gen_trunc_i64_i32(t, t64);
1222     tcg_temp_free_i64(t64);
1223 }
1224
1225 static void gen_store_fpr32h(TCGv_i32 t, int reg)
1226 {
1227     TCGv_i64 t64 = tcg_temp_new_i64();
1228     tcg_gen_extu_i32_i64(t64, t);
1229     tcg_gen_deposit_i64(fpu_f64[reg], fpu_f64[reg], t64, 32, 32);
1230     tcg_temp_free_i64(t64);
1231 }
1232
1233 static void gen_load_fpr64(DisasContext *ctx, TCGv_i64 t, int reg)
1234 {
1235     if (ctx->hflags & MIPS_HFLAG_F64) {
1236         tcg_gen_mov_i64(t, fpu_f64[reg]);
1237     } else {
1238         tcg_gen_concat32_i64(t, fpu_f64[reg & ~1], fpu_f64[reg | 1]);
1239     }
1240 }
1241
1242 static void gen_store_fpr64(DisasContext *ctx, TCGv_i64 t, int reg)
1243 {
1244     if (ctx->hflags & MIPS_HFLAG_F64) {
1245         tcg_gen_mov_i64(fpu_f64[reg], t);
1246     } else {
1247         TCGv_i64 t0;
1248         tcg_gen_deposit_i64(fpu_f64[reg & ~1], fpu_f64[reg & ~1], t, 0, 32);
1249         t0 = tcg_temp_new_i64();
1250         tcg_gen_shri_i64(t0, t, 32);
1251         tcg_gen_deposit_i64(fpu_f64[reg | 1], fpu_f64[reg | 1], t0, 0, 32);
1252         tcg_temp_free_i64(t0);
1253     }
1254 }
1255
1256 static inline int get_fp_bit (int cc)
1257 {
1258     if (cc)
1259         return 24 + cc;
1260     else
1261         return 23;
1262 }
1263
1264 /* Tests */
1265 static inline void gen_save_pc(target_ulong pc)
1266 {
1267     tcg_gen_movi_tl(cpu_PC, pc);
1268 }
1269
1270 static inline void save_cpu_state (DisasContext *ctx, int do_save_pc)
1271 {
1272     LOG_DISAS("hflags %08x saved %08x\n", ctx->hflags, ctx->saved_hflags);
1273     if (do_save_pc && ctx->pc != ctx->saved_pc) {
1274         gen_save_pc(ctx->pc);
1275         ctx->saved_pc = ctx->pc;
1276     }
1277     if (ctx->hflags != ctx->saved_hflags) {
1278         tcg_gen_movi_i32(hflags, ctx->hflags);
1279         ctx->saved_hflags = ctx->hflags;
1280         switch (ctx->hflags & MIPS_HFLAG_BMASK_BASE) {
1281         case MIPS_HFLAG_BR:
1282             break;
1283         case MIPS_HFLAG_BC:
1284         case MIPS_HFLAG_BL:
1285         case MIPS_HFLAG_B:
1286             tcg_gen_movi_tl(btarget, ctx->btarget);
1287             break;
1288         }
1289     }
1290 }
1291
1292 static inline void restore_cpu_state (CPUMIPSState *env, DisasContext *ctx)
1293 {
1294     ctx->saved_hflags = ctx->hflags;
1295     switch (ctx->hflags & MIPS_HFLAG_BMASK_BASE) {
1296     case MIPS_HFLAG_BR:
1297         break;
1298     case MIPS_HFLAG_BC:
1299     case MIPS_HFLAG_BL:
1300     case MIPS_HFLAG_B:
1301         ctx->btarget = env->btarget;
1302         break;
1303     }
1304 }
1305
1306 static inline void
1307 generate_exception_err (DisasContext *ctx, int excp, int err)
1308 {
1309     TCGv_i32 texcp = tcg_const_i32(excp);
1310     TCGv_i32 terr = tcg_const_i32(err);
1311     save_cpu_state(ctx, 1);
1312     gen_helper_raise_exception_err(cpu_env, texcp, terr);
1313     tcg_temp_free_i32(terr);
1314     tcg_temp_free_i32(texcp);
1315 }
1316
1317 static inline void
1318 generate_exception (DisasContext *ctx, int excp)
1319 {
1320     save_cpu_state(ctx, 1);
1321     gen_helper_0e0i(raise_exception, excp);
1322 }
1323
1324 /* Addresses computation */
1325 static inline void gen_op_addr_add (DisasContext *ctx, TCGv ret, TCGv arg0, TCGv arg1)
1326 {
1327     tcg_gen_add_tl(ret, arg0, arg1);
1328
1329 #if defined(TARGET_MIPS64)
1330     /* For compatibility with 32-bit code, data reference in user mode
1331        with Status_UX = 0 should be casted to 32-bit and sign extended.
1332        See the MIPS64 PRA manual, section 4.10. */
1333     if (((ctx->hflags & MIPS_HFLAG_KSU) == MIPS_HFLAG_UM) &&
1334         !(ctx->hflags & MIPS_HFLAG_UX)) {
1335         tcg_gen_ext32s_i64(ret, ret);
1336     }
1337 #endif
1338 }
1339
1340 static inline void check_cp0_enabled(DisasContext *ctx)
1341 {
1342     if (unlikely(!(ctx->hflags & MIPS_HFLAG_CP0)))
1343         generate_exception_err(ctx, EXCP_CpU, 0);
1344 }
1345
1346 static inline void check_cp1_enabled(DisasContext *ctx)
1347 {
1348     if (unlikely(!(ctx->hflags & MIPS_HFLAG_FPU)))
1349         generate_exception_err(ctx, EXCP_CpU, 1);
1350 }
1351
1352 /* Verify that the processor is running with COP1X instructions enabled.
1353    This is associated with the nabla symbol in the MIPS32 and MIPS64
1354    opcode tables.  */
1355
1356 static inline void check_cop1x(DisasContext *ctx)
1357 {
1358     if (unlikely(!(ctx->hflags & MIPS_HFLAG_COP1X)))
1359         generate_exception(ctx, EXCP_RI);
1360 }
1361
1362 /* Verify that the processor is running with 64-bit floating-point
1363    operations enabled.  */
1364
1365 static inline void check_cp1_64bitmode(DisasContext *ctx)
1366 {
1367     if (unlikely(~ctx->hflags & (MIPS_HFLAG_F64 | MIPS_HFLAG_COP1X)))
1368         generate_exception(ctx, EXCP_RI);
1369 }
1370
1371 /*
1372  * Verify if floating point register is valid; an operation is not defined
1373  * if bit 0 of any register specification is set and the FR bit in the
1374  * Status register equals zero, since the register numbers specify an
1375  * even-odd pair of adjacent coprocessor general registers. When the FR bit
1376  * in the Status register equals one, both even and odd register numbers
1377  * are valid. This limitation exists only for 64 bit wide (d,l,ps) registers.
1378  *
1379  * Multiple 64 bit wide registers can be checked by calling
1380  * gen_op_cp1_registers(freg1 | freg2 | ... | fregN);
1381  */
1382 static inline void check_cp1_registers(DisasContext *ctx, int regs)
1383 {
1384     if (unlikely(!(ctx->hflags & MIPS_HFLAG_F64) && (regs & 1)))
1385         generate_exception(ctx, EXCP_RI);
1386 }
1387
1388 /* Verify that the processor is running with DSP instructions enabled.
1389    This is enabled by CP0 Status register MX(24) bit.
1390  */
1391
1392 static inline void check_dsp(DisasContext *ctx)
1393 {
1394     if (unlikely(!(ctx->hflags & MIPS_HFLAG_DSP))) {
1395         generate_exception(ctx, EXCP_DSPDIS);
1396     }
1397 }
1398
1399 static inline void check_dspr2(DisasContext *ctx)
1400 {
1401     if (unlikely(!(ctx->hflags & MIPS_HFLAG_DSPR2))) {
1402         generate_exception(ctx, EXCP_DSPDIS);
1403     }
1404 }
1405
1406 /* This code generates a "reserved instruction" exception if the
1407    CPU does not support the instruction set corresponding to flags. */
1408 static inline void check_insn(CPUMIPSState *env, DisasContext *ctx, int flags)
1409 {
1410     if (unlikely(!(env->insn_flags & flags)))
1411         generate_exception(ctx, EXCP_RI);
1412 }
1413
1414 /* This code generates a "reserved instruction" exception if 64-bit
1415    instructions are not enabled. */
1416 static inline void check_mips_64(DisasContext *ctx)
1417 {
1418     if (unlikely(!(ctx->hflags & MIPS_HFLAG_64)))
1419         generate_exception(ctx, EXCP_RI);
1420 }
1421
1422 /* Define small wrappers for gen_load_fpr* so that we have a uniform
1423    calling interface for 32 and 64-bit FPRs.  No sense in changing
1424    all callers for gen_load_fpr32 when we need the CTX parameter for
1425    this one use.  */
1426 #define gen_ldcmp_fpr32(ctx, x, y) gen_load_fpr32(x, y)
1427 #define gen_ldcmp_fpr64(ctx, x, y) gen_load_fpr64(ctx, x, y)
1428 #define FOP_CONDS(type, abs, fmt, ifmt, bits)                                 \
1429 static inline void gen_cmp ## type ## _ ## fmt(DisasContext *ctx, int n,      \
1430                                                int ft, int fs, int cc)        \
1431 {                                                                             \
1432     TCGv_i##bits fp0 = tcg_temp_new_i##bits ();                               \
1433     TCGv_i##bits fp1 = tcg_temp_new_i##bits ();                               \
1434     switch (ifmt) {                                                           \
1435     case FMT_PS:                                                              \
1436         check_cp1_64bitmode(ctx);                                             \
1437         break;                                                                \
1438     case FMT_D:                                                               \
1439         if (abs) {                                                            \
1440             check_cop1x(ctx);                                                 \
1441         }                                                                     \
1442         check_cp1_registers(ctx, fs | ft);                                    \
1443         break;                                                                \
1444     case FMT_S:                                                               \
1445         if (abs) {                                                            \
1446             check_cop1x(ctx);                                                 \
1447         }                                                                     \
1448         break;                                                                \
1449     }                                                                         \
1450     gen_ldcmp_fpr##bits (ctx, fp0, fs);                                       \
1451     gen_ldcmp_fpr##bits (ctx, fp1, ft);                                       \
1452     switch (n) {                                                              \
1453     case  0: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _f, fp0, fp1, cc);    break;\
1454     case  1: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _un, fp0, fp1, cc);   break;\
1455     case  2: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _eq, fp0, fp1, cc);   break;\
1456     case  3: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ueq, fp0, fp1, cc);  break;\
1457     case  4: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _olt, fp0, fp1, cc);  break;\
1458     case  5: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ult, fp0, fp1, cc);  break;\
1459     case  6: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ole, fp0, fp1, cc);  break;\
1460     case  7: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ule, fp0, fp1, cc);  break;\
1461     case  8: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _sf, fp0, fp1, cc);   break;\
1462     case  9: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngle, fp0, fp1, cc); break;\
1463     case 10: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _seq, fp0, fp1, cc);  break;\
1464     case 11: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngl, fp0, fp1, cc);  break;\
1465     case 12: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _lt, fp0, fp1, cc);   break;\
1466     case 13: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _nge, fp0, fp1, cc);  break;\
1467     case 14: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _le, fp0, fp1, cc);   break;\
1468     case 15: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngt, fp0, fp1, cc);  break;\
1469     default: abort();                                                         \
1470     }                                                                         \
1471     tcg_temp_free_i##bits (fp0);                                              \
1472     tcg_temp_free_i##bits (fp1);                                              \
1473 }
1474
1475 FOP_CONDS(, 0, d, FMT_D, 64)
1476 FOP_CONDS(abs, 1, d, FMT_D, 64)
1477 FOP_CONDS(, 0, s, FMT_S, 32)
1478 FOP_CONDS(abs, 1, s, FMT_S, 32)
1479 FOP_CONDS(, 0, ps, FMT_PS, 64)
1480 FOP_CONDS(abs, 1, ps, FMT_PS, 64)
1481 #undef FOP_CONDS
1482 #undef gen_ldcmp_fpr32
1483 #undef gen_ldcmp_fpr64
1484
1485 /* load/store instructions. */
1486 #define OP_LD(insn,fname)                                                 \
1487 static inline void op_ld_##insn(TCGv ret, TCGv arg1, DisasContext *ctx)   \
1488 {                                                                         \
1489     tcg_gen_qemu_##fname(ret, arg1, ctx->mem_idx);                        \
1490 }
1491 OP_LD(lb,ld8s);
1492 OP_LD(lbu,ld8u);
1493 OP_LD(lh,ld16s);
1494 OP_LD(lhu,ld16u);
1495 OP_LD(lw,ld32s);
1496 #if defined(TARGET_MIPS64)
1497 OP_LD(lwu,ld32u);
1498 OP_LD(ld,ld64);
1499 #endif
1500 #undef OP_LD
1501
1502 #define OP_ST(insn,fname)                                                  \
1503 static inline void op_st_##insn(TCGv arg1, TCGv arg2, DisasContext *ctx)   \
1504 {                                                                          \
1505     tcg_gen_qemu_##fname(arg1, arg2, ctx->mem_idx);                        \
1506 }
1507 OP_ST(sb,st8);
1508 OP_ST(sh,st16);
1509 OP_ST(sw,st32);
1510 #if defined(TARGET_MIPS64)
1511 OP_ST(sd,st64);
1512 #endif
1513 #undef OP_ST
1514
1515 #ifdef CONFIG_USER_ONLY
1516 #define OP_LD_ATOMIC(insn,fname)                                           \
1517 static inline void op_ld_##insn(TCGv ret, TCGv arg1, DisasContext *ctx)    \
1518 {                                                                          \
1519     TCGv t0 = tcg_temp_new();                                              \
1520     tcg_gen_mov_tl(t0, arg1);                                              \
1521     tcg_gen_qemu_##fname(ret, arg1, ctx->mem_idx);                         \
1522     tcg_gen_st_tl(t0, cpu_env, offsetof(CPUMIPSState, lladdr));                \
1523     tcg_gen_st_tl(ret, cpu_env, offsetof(CPUMIPSState, llval));                \
1524     tcg_temp_free(t0);                                                     \
1525 }
1526 #else
1527 #define OP_LD_ATOMIC(insn,fname)                                           \
1528 static inline void op_ld_##insn(TCGv ret, TCGv arg1, DisasContext *ctx)    \
1529 {                                                                          \
1530     gen_helper_1e1i(insn, ret, arg1, ctx->mem_idx);                        \
1531 }
1532 #endif
1533 OP_LD_ATOMIC(ll,ld32s);
1534 #if defined(TARGET_MIPS64)
1535 OP_LD_ATOMIC(lld,ld64);
1536 #endif
1537 #undef OP_LD_ATOMIC
1538
1539 #ifdef CONFIG_USER_ONLY
1540 #define OP_ST_ATOMIC(insn,fname,ldname,almask)                               \
1541 static inline void op_st_##insn(TCGv arg1, TCGv arg2, int rt, DisasContext *ctx) \
1542 {                                                                            \
1543     TCGv t0 = tcg_temp_new();                                                \
1544     int l1 = gen_new_label();                                                \
1545     int l2 = gen_new_label();                                                \
1546                                                                              \
1547     tcg_gen_andi_tl(t0, arg2, almask);                                       \
1548     tcg_gen_brcondi_tl(TCG_COND_EQ, t0, 0, l1);                              \
1549     tcg_gen_st_tl(arg2, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));          \
1550     generate_exception(ctx, EXCP_AdES);                                      \
1551     gen_set_label(l1);                                                       \
1552     tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUMIPSState, lladdr));                  \
1553     tcg_gen_brcond_tl(TCG_COND_NE, arg2, t0, l2);                            \
1554     tcg_gen_movi_tl(t0, rt | ((almask << 3) & 0x20));                        \
1555     tcg_gen_st_tl(t0, cpu_env, offsetof(CPUMIPSState, llreg));                   \
1556     tcg_gen_st_tl(arg1, cpu_env, offsetof(CPUMIPSState, llnewval));              \
1557     gen_helper_0e0i(raise_exception, EXCP_SC);                               \
1558     gen_set_label(l2);                                                       \
1559     tcg_gen_movi_tl(t0, 0);                                                  \
1560     gen_store_gpr(t0, rt);                                                   \
1561     tcg_temp_free(t0);                                                       \
1562 }
1563 #else
1564 #define OP_ST_ATOMIC(insn,fname,ldname,almask)                               \
1565 static inline void op_st_##insn(TCGv arg1, TCGv arg2, int rt, DisasContext *ctx) \
1566 {                                                                            \
1567     TCGv t0 = tcg_temp_new();                                                \
1568     gen_helper_1e2i(insn, t0, arg1, arg2, ctx->mem_idx);                     \
1569     gen_store_gpr(t0, rt);                                                   \
1570     tcg_temp_free(t0);                                                       \
1571 }
1572 #endif
1573 OP_ST_ATOMIC(sc,st32,ld32s,0x3);
1574 #if defined(TARGET_MIPS64)
1575 OP_ST_ATOMIC(scd,st64,ld64,0x7);
1576 #endif
1577 #undef OP_ST_ATOMIC
1578
1579 static void gen_base_offset_addr (DisasContext *ctx, TCGv addr,
1580                                   int base, int16_t offset)
1581 {
1582     if (base == 0) {
1583         tcg_gen_movi_tl(addr, offset);
1584     } else if (offset == 0) {
1585         gen_load_gpr(addr, base);
1586     } else {
1587         tcg_gen_movi_tl(addr, offset);
1588         gen_op_addr_add(ctx, addr, cpu_gpr[base], addr);
1589     }
1590 }
1591
1592 static target_ulong pc_relative_pc (DisasContext *ctx)
1593 {
1594     target_ulong pc = ctx->pc;
1595
1596     if (ctx->hflags & MIPS_HFLAG_BMASK) {
1597         int branch_bytes = ctx->hflags & MIPS_HFLAG_BDS16 ? 2 : 4;
1598
1599         pc -= branch_bytes;
1600     }
1601
1602     pc &= ~(target_ulong)3;
1603     return pc;
1604 }
1605
1606 /* Load */
1607 static void gen_ld (CPUMIPSState *env, DisasContext *ctx, uint32_t opc,
1608                     int rt, int base, int16_t offset)
1609 {
1610     const char *opn = "ld";
1611     TCGv t0, t1;
1612
1613     if (rt == 0 && env->insn_flags & (INSN_LOONGSON2E | INSN_LOONGSON2F)) {
1614         /* Loongson CPU uses a load to zero register for prefetch.
1615            We emulate it as a NOP. On other CPU we must perform the
1616            actual memory access. */
1617         MIPS_DEBUG("NOP");
1618         return;
1619     }
1620
1621     t0 = tcg_temp_new();
1622     t1 = tcg_temp_new();
1623     gen_base_offset_addr(ctx, t0, base, offset);
1624
1625     switch (opc) {
1626 #if defined(TARGET_MIPS64)
1627     case OPC_LWU:
1628         save_cpu_state(ctx, 0);
1629         op_ld_lwu(t0, t0, ctx);
1630         gen_store_gpr(t0, rt);
1631         opn = "lwu";
1632         break;
1633     case OPC_LD:
1634         save_cpu_state(ctx, 0);
1635         op_ld_ld(t0, t0, ctx);
1636         gen_store_gpr(t0, rt);
1637         opn = "ld";
1638         break;
1639     case OPC_LLD:
1640         save_cpu_state(ctx, 1);
1641         op_ld_lld(t0, t0, ctx);
1642         gen_store_gpr(t0, rt);
1643         opn = "lld";
1644         break;
1645     case OPC_LDL:
1646         save_cpu_state(ctx, 1);
1647         gen_load_gpr(t1, rt);
1648         gen_helper_1e2i(ldl, t1, t1, t0, ctx->mem_idx);
1649         gen_store_gpr(t1, rt);
1650         opn = "ldl";
1651         break;
1652     case OPC_LDR:
1653         save_cpu_state(ctx, 1);
1654         gen_load_gpr(t1, rt);
1655         gen_helper_1e2i(ldr, t1, t1, t0, ctx->mem_idx);
1656         gen_store_gpr(t1, rt);
1657         opn = "ldr";
1658         break;
1659     case OPC_LDPC:
1660         save_cpu_state(ctx, 0);
1661         tcg_gen_movi_tl(t1, pc_relative_pc(ctx));
1662         gen_op_addr_add(ctx, t0, t0, t1);
1663         op_ld_ld(t0, t0, ctx);
1664         gen_store_gpr(t0, rt);
1665         opn = "ldpc";
1666         break;
1667 #endif
1668     case OPC_LWPC:
1669         save_cpu_state(ctx, 0);
1670         tcg_gen_movi_tl(t1, pc_relative_pc(ctx));
1671         gen_op_addr_add(ctx, t0, t0, t1);
1672         op_ld_lw(t0, t0, ctx);
1673         gen_store_gpr(t0, rt);
1674         opn = "lwpc";
1675         break;
1676     case OPC_LW:
1677         save_cpu_state(ctx, 0);
1678         op_ld_lw(t0, t0, ctx);
1679         gen_store_gpr(t0, rt);
1680         opn = "lw";
1681         break;
1682     case OPC_LH:
1683         save_cpu_state(ctx, 0);
1684         op_ld_lh(t0, t0, ctx);
1685         gen_store_gpr(t0, rt);
1686         opn = "lh";
1687         break;
1688     case OPC_LHU:
1689         save_cpu_state(ctx, 0);
1690         op_ld_lhu(t0, t0, ctx);
1691         gen_store_gpr(t0, rt);
1692         opn = "lhu";
1693         break;
1694     case OPC_LB:
1695         save_cpu_state(ctx, 0);
1696         op_ld_lb(t0, t0, ctx);
1697         gen_store_gpr(t0, rt);
1698         opn = "lb";
1699         break;
1700     case OPC_LBU:
1701         save_cpu_state(ctx, 0);
1702         op_ld_lbu(t0, t0, ctx);
1703         gen_store_gpr(t0, rt);
1704         opn = "lbu";
1705         break;
1706     case OPC_LWL:
1707         save_cpu_state(ctx, 1);
1708         gen_load_gpr(t1, rt);
1709         gen_helper_1e2i(lwl, t1, t1, t0, ctx->mem_idx);
1710         gen_store_gpr(t1, rt);
1711         opn = "lwl";
1712         break;
1713     case OPC_LWR:
1714         save_cpu_state(ctx, 1);
1715         gen_load_gpr(t1, rt);
1716         gen_helper_1e2i(lwr, t1, t1, t0, ctx->mem_idx);
1717         gen_store_gpr(t1, rt);
1718         opn = "lwr";
1719         break;
1720     case OPC_LL:
1721         save_cpu_state(ctx, 1);
1722         op_ld_ll(t0, t0, ctx);
1723         gen_store_gpr(t0, rt);
1724         opn = "ll";
1725         break;
1726     }
1727     (void)opn; /* avoid a compiler warning */
1728     MIPS_DEBUG("%s %s, %d(%s)", opn, regnames[rt], offset, regnames[base]);
1729     tcg_temp_free(t0);
1730     tcg_temp_free(t1);
1731 }
1732
1733 /* Store */
1734 static void gen_st (DisasContext *ctx, uint32_t opc, int rt,
1735                     int base, int16_t offset)
1736 {
1737     const char *opn = "st";
1738     TCGv t0 = tcg_temp_new();
1739     TCGv t1 = tcg_temp_new();
1740
1741     gen_base_offset_addr(ctx, t0, base, offset);
1742     gen_load_gpr(t1, rt);
1743     switch (opc) {
1744 #if defined(TARGET_MIPS64)
1745     case OPC_SD:
1746         save_cpu_state(ctx, 0);
1747         op_st_sd(t1, t0, ctx);
1748         opn = "sd";
1749         break;
1750     case OPC_SDL:
1751         save_cpu_state(ctx, 1);
1752         gen_helper_0e2i(sdl, t1, t0, ctx->mem_idx);
1753         opn = "sdl";
1754         break;
1755     case OPC_SDR:
1756         save_cpu_state(ctx, 1);
1757         gen_helper_0e2i(sdr, t1, t0, ctx->mem_idx);
1758         opn = "sdr";
1759         break;
1760 #endif
1761     case OPC_SW:
1762         save_cpu_state(ctx, 0);
1763         op_st_sw(t1, t0, ctx);
1764         opn = "sw";
1765         break;
1766     case OPC_SH:
1767         save_cpu_state(ctx, 0);
1768         op_st_sh(t1, t0, ctx);
1769         opn = "sh";
1770         break;
1771     case OPC_SB:
1772         save_cpu_state(ctx, 0);
1773         op_st_sb(t1, t0, ctx);
1774         opn = "sb";
1775         break;
1776     case OPC_SWL:
1777         save_cpu_state(ctx, 1);
1778         gen_helper_0e2i(swl, t1, t0, ctx->mem_idx);
1779         opn = "swl";
1780         break;
1781     case OPC_SWR:
1782         save_cpu_state(ctx, 1);
1783         gen_helper_0e2i(swr, t1, t0, ctx->mem_idx);
1784         opn = "swr";
1785         break;
1786     }
1787     (void)opn; /* avoid a compiler warning */
1788     MIPS_DEBUG("%s %s, %d(%s)", opn, regnames[rt], offset, regnames[base]);
1789     tcg_temp_free(t0);
1790     tcg_temp_free(t1);
1791 }
1792
1793
1794 /* Store conditional */
1795 static void gen_st_cond (DisasContext *ctx, uint32_t opc, int rt,
1796                          int base, int16_t offset)
1797 {
1798     const char *opn = "st_cond";
1799     TCGv t0, t1;
1800
1801     t0 = tcg_temp_local_new();
1802
1803     gen_base_offset_addr(ctx, t0, base, offset);
1804     /* Don't do NOP if destination is zero: we must perform the actual
1805        memory access. */
1806
1807     t1 = tcg_temp_local_new();
1808     gen_load_gpr(t1, rt);
1809     switch (opc) {
1810 #if defined(TARGET_MIPS64)
1811     case OPC_SCD:
1812         save_cpu_state(ctx, 1);
1813         op_st_scd(t1, t0, rt, ctx);
1814         opn = "scd";
1815         break;
1816 #endif
1817     case OPC_SC:
1818         save_cpu_state(ctx, 1);
1819         op_st_sc(t1, t0, rt, ctx);
1820         opn = "sc";
1821         break;
1822     }
1823     (void)opn; /* avoid a compiler warning */
1824     MIPS_DEBUG("%s %s, %d(%s)", opn, regnames[rt], offset, regnames[base]);
1825     tcg_temp_free(t1);
1826     tcg_temp_free(t0);
1827 }
1828
1829 /* Load and store */
1830 static void gen_flt_ldst (DisasContext *ctx, uint32_t opc, int ft,
1831                           int base, int16_t offset)
1832 {
1833     const char *opn = "flt_ldst";
1834     TCGv t0 = tcg_temp_new();
1835
1836     gen_base_offset_addr(ctx, t0, base, offset);
1837     /* Don't do NOP if destination is zero: we must perform the actual
1838        memory access. */
1839     switch (opc) {
1840     case OPC_LWC1:
1841         {
1842             TCGv_i32 fp0 = tcg_temp_new_i32();
1843
1844             tcg_gen_qemu_ld32s(t0, t0, ctx->mem_idx);
1845             tcg_gen_trunc_tl_i32(fp0, t0);
1846             gen_store_fpr32(fp0, ft);
1847             tcg_temp_free_i32(fp0);
1848         }
1849         opn = "lwc1";
1850         break;
1851     case OPC_SWC1:
1852         {
1853             TCGv_i32 fp0 = tcg_temp_new_i32();
1854             TCGv t1 = tcg_temp_new();
1855
1856             gen_load_fpr32(fp0, ft);
1857             tcg_gen_extu_i32_tl(t1, fp0);
1858             tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);
1859             tcg_temp_free(t1);
1860             tcg_temp_free_i32(fp0);
1861         }
1862         opn = "swc1";
1863         break;
1864     case OPC_LDC1:
1865         {
1866             TCGv_i64 fp0 = tcg_temp_new_i64();
1867
1868             tcg_gen_qemu_ld64(fp0, t0, ctx->mem_idx);
1869             gen_store_fpr64(ctx, fp0, ft);
1870             tcg_temp_free_i64(fp0);
1871         }
1872         opn = "ldc1";
1873         break;
1874     case OPC_SDC1:
1875         {
1876             TCGv_i64 fp0 = tcg_temp_new_i64();
1877
1878             gen_load_fpr64(ctx, fp0, ft);
1879             tcg_gen_qemu_st64(fp0, t0, ctx->mem_idx);
1880             tcg_temp_free_i64(fp0);
1881         }
1882         opn = "sdc1";
1883         break;
1884     default:
1885         MIPS_INVAL(opn);
1886         generate_exception(ctx, EXCP_RI);
1887         goto out;
1888     }
1889     (void)opn; /* avoid a compiler warning */
1890     MIPS_DEBUG("%s %s, %d(%s)", opn, fregnames[ft], offset, regnames[base]);
1891  out:
1892     tcg_temp_free(t0);
1893 }
1894
1895 static void gen_cop1_ldst(CPUMIPSState *env, DisasContext *ctx,
1896                           uint32_t op, int rt, int rs, int16_t imm)
1897 {
1898     if (env->CP0_Config1 & (1 << CP0C1_FP)) {
1899         check_cp1_enabled(ctx);
1900         gen_flt_ldst(ctx, op, rt, rs, imm);
1901     } else {
1902         generate_exception_err(ctx, EXCP_CpU, 1);
1903     }
1904 }
1905
1906 /* Arithmetic with immediate operand */
1907 static void gen_arith_imm (CPUMIPSState *env, DisasContext *ctx, uint32_t opc,
1908                            int rt, int rs, int16_t imm)
1909 {
1910     target_ulong uimm = (target_long)imm; /* Sign extend to 32/64 bits */
1911     const char *opn = "imm arith";
1912
1913     if (rt == 0 && opc != OPC_ADDI && opc != OPC_DADDI) {
1914         /* If no destination, treat it as a NOP.
1915            For addi, we must generate the overflow exception when needed. */
1916         MIPS_DEBUG("NOP");
1917         return;
1918     }
1919     switch (opc) {
1920     case OPC_ADDI:
1921         {
1922             TCGv t0 = tcg_temp_local_new();
1923             TCGv t1 = tcg_temp_new();
1924             TCGv t2 = tcg_temp_new();
1925             int l1 = gen_new_label();
1926
1927             gen_load_gpr(t1, rs);
1928             tcg_gen_addi_tl(t0, t1, uimm);
1929             tcg_gen_ext32s_tl(t0, t0);
1930
1931             tcg_gen_xori_tl(t1, t1, ~uimm);
1932             tcg_gen_xori_tl(t2, t0, uimm);
1933             tcg_gen_and_tl(t1, t1, t2);
1934             tcg_temp_free(t2);
1935             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
1936             tcg_temp_free(t1);
1937             /* operands of same sign, result different sign */
1938             generate_exception(ctx, EXCP_OVERFLOW);
1939             gen_set_label(l1);
1940             tcg_gen_ext32s_tl(t0, t0);
1941             gen_store_gpr(t0, rt);
1942             tcg_temp_free(t0);
1943         }
1944         opn = "addi";
1945         break;
1946     case OPC_ADDIU:
1947         if (rs != 0) {
1948             tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
1949             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
1950         } else {
1951             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
1952         }
1953         opn = "addiu";
1954         break;
1955 #if defined(TARGET_MIPS64)
1956     case OPC_DADDI:
1957         {
1958             TCGv t0 = tcg_temp_local_new();
1959             TCGv t1 = tcg_temp_new();
1960             TCGv t2 = tcg_temp_new();
1961             int l1 = gen_new_label();
1962
1963             gen_load_gpr(t1, rs);
1964             tcg_gen_addi_tl(t0, t1, uimm);
1965
1966             tcg_gen_xori_tl(t1, t1, ~uimm);
1967             tcg_gen_xori_tl(t2, t0, uimm);
1968             tcg_gen_and_tl(t1, t1, t2);
1969             tcg_temp_free(t2);
1970             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
1971             tcg_temp_free(t1);
1972             /* operands of same sign, result different sign */
1973             generate_exception(ctx, EXCP_OVERFLOW);
1974             gen_set_label(l1);
1975             gen_store_gpr(t0, rt);
1976             tcg_temp_free(t0);
1977         }
1978         opn = "daddi";
1979         break;
1980     case OPC_DADDIU:
1981         if (rs != 0) {
1982             tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
1983         } else {
1984             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
1985         }
1986         opn = "daddiu";
1987         break;
1988 #endif
1989     }
1990     (void)opn; /* avoid a compiler warning */
1991     MIPS_DEBUG("%s %s, %s, " TARGET_FMT_lx, opn, regnames[rt], regnames[rs], uimm);
1992 }
1993
1994 /* Logic with immediate operand */
1995 static void gen_logic_imm(CPUMIPSState *env, DisasContext *ctx, uint32_t opc,
1996                           int rt, int rs, int16_t imm)
1997 {
1998     target_ulong uimm;
1999     const char *opn = "imm logic";
2000
2001     if (rt == 0) {
2002         /* If no destination, treat it as a NOP. */
2003         MIPS_DEBUG("NOP");
2004         return;
2005     }
2006     uimm = (uint16_t)imm;
2007     switch (opc) {
2008     case OPC_ANDI:
2009         if (likely(rs != 0))
2010             tcg_gen_andi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2011         else
2012             tcg_gen_movi_tl(cpu_gpr[rt], 0);
2013         opn = "andi";
2014         break;
2015     case OPC_ORI:
2016         if (rs != 0)
2017             tcg_gen_ori_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2018         else
2019             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
2020         opn = "ori";
2021         break;
2022     case OPC_XORI:
2023         if (likely(rs != 0))
2024             tcg_gen_xori_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2025         else
2026             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
2027         opn = "xori";
2028         break;
2029     case OPC_LUI:
2030         tcg_gen_movi_tl(cpu_gpr[rt], imm << 16);
2031         opn = "lui";
2032         break;
2033     }
2034     (void)opn; /* avoid a compiler warning */
2035     MIPS_DEBUG("%s %s, %s, " TARGET_FMT_lx, opn, regnames[rt], regnames[rs], uimm);
2036 }
2037
2038 /* Set on less than with immediate operand */
2039 static void gen_slt_imm(CPUMIPSState *env, DisasContext *ctx, uint32_t opc,
2040                         int rt, int rs, int16_t imm)
2041 {
2042     target_ulong uimm = (target_long)imm; /* Sign extend to 32/64 bits */
2043     const char *opn = "imm arith";
2044     TCGv t0;
2045
2046     if (rt == 0) {
2047         /* If no destination, treat it as a NOP. */
2048         MIPS_DEBUG("NOP");
2049         return;
2050     }
2051     t0 = tcg_temp_new();
2052     gen_load_gpr(t0, rs);
2053     switch (opc) {
2054     case OPC_SLTI:
2055         tcg_gen_setcondi_tl(TCG_COND_LT, cpu_gpr[rt], t0, uimm);
2056         opn = "slti";
2057         break;
2058     case OPC_SLTIU:
2059         tcg_gen_setcondi_tl(TCG_COND_LTU, cpu_gpr[rt], t0, uimm);
2060         opn = "sltiu";
2061         break;
2062     }
2063     (void)opn; /* avoid a compiler warning */
2064     MIPS_DEBUG("%s %s, %s, " TARGET_FMT_lx, opn, regnames[rt], regnames[rs], uimm);
2065     tcg_temp_free(t0);
2066 }
2067
2068 /* Shifts with immediate operand */
2069 static void gen_shift_imm(CPUMIPSState *env, DisasContext *ctx, uint32_t opc,
2070                           int rt, int rs, int16_t imm)
2071 {
2072     target_ulong uimm = ((uint16_t)imm) & 0x1f;
2073     const char *opn = "imm shift";
2074     TCGv t0;
2075
2076     if (rt == 0) {
2077         /* If no destination, treat it as a NOP. */
2078         MIPS_DEBUG("NOP");
2079         return;
2080     }
2081
2082     t0 = tcg_temp_new();
2083     gen_load_gpr(t0, rs);
2084     switch (opc) {
2085     case OPC_SLL:
2086         tcg_gen_shli_tl(t0, t0, uimm);
2087         tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
2088         opn = "sll";
2089         break;
2090     case OPC_SRA:
2091         tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm);
2092         opn = "sra";
2093         break;
2094     case OPC_SRL:
2095         if (uimm != 0) {
2096             tcg_gen_ext32u_tl(t0, t0);
2097             tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm);
2098         } else {
2099             tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
2100         }
2101         opn = "srl";
2102         break;
2103     case OPC_ROTR:
2104         if (uimm != 0) {
2105             TCGv_i32 t1 = tcg_temp_new_i32();
2106
2107             tcg_gen_trunc_tl_i32(t1, t0);
2108             tcg_gen_rotri_i32(t1, t1, uimm);
2109             tcg_gen_ext_i32_tl(cpu_gpr[rt], t1);
2110             tcg_temp_free_i32(t1);
2111         } else {
2112             tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
2113         }
2114         opn = "rotr";
2115         break;
2116 #if defined(TARGET_MIPS64)
2117     case OPC_DSLL:
2118         tcg_gen_shli_tl(cpu_gpr[rt], t0, uimm);
2119         opn = "dsll";
2120         break;
2121     case OPC_DSRA:
2122         tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm);
2123         opn = "dsra";
2124         break;
2125     case OPC_DSRL:
2126         tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm);
2127         opn = "dsrl";
2128         break;
2129     case OPC_DROTR:
2130         if (uimm != 0) {
2131             tcg_gen_rotri_tl(cpu_gpr[rt], t0, uimm);
2132         } else {
2133             tcg_gen_mov_tl(cpu_gpr[rt], t0);
2134         }
2135         opn = "drotr";
2136         break;
2137     case OPC_DSLL32:
2138         tcg_gen_shli_tl(cpu_gpr[rt], t0, uimm + 32);
2139         opn = "dsll32";
2140         break;
2141     case OPC_DSRA32:
2142         tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm + 32);
2143         opn = "dsra32";
2144         break;
2145     case OPC_DSRL32:
2146         tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm + 32);
2147         opn = "dsrl32";
2148         break;
2149     case OPC_DROTR32:
2150         tcg_gen_rotri_tl(cpu_gpr[rt], t0, uimm + 32);
2151         opn = "drotr32";
2152         break;
2153 #endif
2154     }
2155     (void)opn; /* avoid a compiler warning */
2156     MIPS_DEBUG("%s %s, %s, " TARGET_FMT_lx, opn, regnames[rt], regnames[rs], uimm);
2157     tcg_temp_free(t0);
2158 }
2159
2160 /* Arithmetic */
2161 static void gen_arith (CPUMIPSState *env, DisasContext *ctx, uint32_t opc,
2162                        int rd, int rs, int rt)
2163 {
2164     const char *opn = "arith";
2165
2166     if (rd == 0 && opc != OPC_ADD && opc != OPC_SUB
2167        && opc != OPC_DADD && opc != OPC_DSUB) {
2168         /* If no destination, treat it as a NOP.
2169            For add & sub, we must generate the overflow exception when needed. */
2170         MIPS_DEBUG("NOP");
2171         return;
2172     }
2173
2174     switch (opc) {
2175     case OPC_ADD:
2176         {
2177             TCGv t0 = tcg_temp_local_new();
2178             TCGv t1 = tcg_temp_new();
2179             TCGv t2 = tcg_temp_new();
2180             int l1 = gen_new_label();
2181
2182             gen_load_gpr(t1, rs);
2183             gen_load_gpr(t2, rt);
2184             tcg_gen_add_tl(t0, t1, t2);
2185             tcg_gen_ext32s_tl(t0, t0);
2186             tcg_gen_xor_tl(t1, t1, t2);
2187             tcg_gen_xor_tl(t2, t0, t2);
2188             tcg_gen_andc_tl(t1, t2, t1);
2189             tcg_temp_free(t2);
2190             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2191             tcg_temp_free(t1);
2192             /* operands of same sign, result different sign */
2193             generate_exception(ctx, EXCP_OVERFLOW);
2194             gen_set_label(l1);
2195             gen_store_gpr(t0, rd);
2196             tcg_temp_free(t0);
2197         }
2198         opn = "add";
2199         break;
2200     case OPC_ADDU:
2201         if (rs != 0 && rt != 0) {
2202             tcg_gen_add_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2203             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2204         } else if (rs == 0 && rt != 0) {
2205             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
2206         } else if (rs != 0 && rt == 0) {
2207             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2208         } else {
2209             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2210         }
2211         opn = "addu";
2212         break;
2213     case OPC_SUB:
2214         {
2215             TCGv t0 = tcg_temp_local_new();
2216             TCGv t1 = tcg_temp_new();
2217             TCGv t2 = tcg_temp_new();
2218             int l1 = gen_new_label();
2219
2220             gen_load_gpr(t1, rs);
2221             gen_load_gpr(t2, rt);
2222             tcg_gen_sub_tl(t0, t1, t2);
2223             tcg_gen_ext32s_tl(t0, t0);
2224             tcg_gen_xor_tl(t2, t1, t2);
2225             tcg_gen_xor_tl(t1, t0, t1);
2226             tcg_gen_and_tl(t1, t1, t2);
2227             tcg_temp_free(t2);
2228             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2229             tcg_temp_free(t1);
2230             /* operands of different sign, first operand and result different sign */
2231             generate_exception(ctx, EXCP_OVERFLOW);
2232             gen_set_label(l1);
2233             gen_store_gpr(t0, rd);
2234             tcg_temp_free(t0);
2235         }
2236         opn = "sub";
2237         break;
2238     case OPC_SUBU:
2239         if (rs != 0 && rt != 0) {
2240             tcg_gen_sub_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2241             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2242         } else if (rs == 0 && rt != 0) {
2243             tcg_gen_neg_tl(cpu_gpr[rd], cpu_gpr[rt]);
2244             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2245         } else if (rs != 0 && rt == 0) {
2246             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2247         } else {
2248             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2249         }
2250         opn = "subu";
2251         break;
2252 #if defined(TARGET_MIPS64)
2253     case OPC_DADD:
2254         {
2255             TCGv t0 = tcg_temp_local_new();
2256             TCGv t1 = tcg_temp_new();
2257             TCGv t2 = tcg_temp_new();
2258             int l1 = gen_new_label();
2259
2260             gen_load_gpr(t1, rs);
2261             gen_load_gpr(t2, rt);
2262             tcg_gen_add_tl(t0, t1, t2);
2263             tcg_gen_xor_tl(t1, t1, t2);
2264             tcg_gen_xor_tl(t2, t0, t2);
2265             tcg_gen_andc_tl(t1, t2, t1);
2266             tcg_temp_free(t2);
2267             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2268             tcg_temp_free(t1);
2269             /* operands of same sign, result different sign */
2270             generate_exception(ctx, EXCP_OVERFLOW);
2271             gen_set_label(l1);
2272             gen_store_gpr(t0, rd);
2273             tcg_temp_free(t0);
2274         }
2275         opn = "dadd";
2276         break;
2277     case OPC_DADDU:
2278         if (rs != 0 && rt != 0) {
2279             tcg_gen_add_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2280         } else if (rs == 0 && rt != 0) {
2281             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
2282         } else if (rs != 0 && rt == 0) {
2283             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2284         } else {
2285             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2286         }
2287         opn = "daddu";
2288         break;
2289     case OPC_DSUB:
2290         {
2291             TCGv t0 = tcg_temp_local_new();
2292             TCGv t1 = tcg_temp_new();
2293             TCGv t2 = tcg_temp_new();
2294             int l1 = gen_new_label();
2295
2296             gen_load_gpr(t1, rs);
2297             gen_load_gpr(t2, rt);
2298             tcg_gen_sub_tl(t0, t1, t2);
2299             tcg_gen_xor_tl(t2, t1, t2);
2300             tcg_gen_xor_tl(t1, t0, t1);
2301             tcg_gen_and_tl(t1, t1, t2);
2302             tcg_temp_free(t2);
2303             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2304             tcg_temp_free(t1);
2305             /* operands of different sign, first operand and result different sign */
2306             generate_exception(ctx, EXCP_OVERFLOW);
2307             gen_set_label(l1);
2308             gen_store_gpr(t0, rd);
2309             tcg_temp_free(t0);
2310         }
2311         opn = "dsub";
2312         break;
2313     case OPC_DSUBU:
2314         if (rs != 0 && rt != 0) {
2315             tcg_gen_sub_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2316         } else if (rs == 0 && rt != 0) {
2317             tcg_gen_neg_tl(cpu_gpr[rd], cpu_gpr[rt]);
2318         } else if (rs != 0 && rt == 0) {
2319             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2320         } else {
2321             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2322         }
2323         opn = "dsubu";
2324         break;
2325 #endif
2326     case OPC_MUL:
2327         if (likely(rs != 0 && rt != 0)) {
2328             tcg_gen_mul_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2329             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2330         } else {
2331             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2332         }
2333         opn = "mul";
2334         break;
2335     }
2336     (void)opn; /* avoid a compiler warning */
2337     MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
2338 }
2339
2340 /* Conditional move */
2341 static void gen_cond_move(CPUMIPSState *env, DisasContext *ctx, uint32_t opc,
2342                           int rd, int rs, int rt)
2343 {
2344     const char *opn = "cond move";
2345     int l1;
2346
2347     if (rd == 0) {
2348         /* If no destination, treat it as a NOP.
2349            For add & sub, we must generate the overflow exception when needed. */
2350         MIPS_DEBUG("NOP");
2351         return;
2352     }
2353
2354     l1 = gen_new_label();
2355     switch (opc) {
2356     case OPC_MOVN:
2357         if (likely(rt != 0))
2358             tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[rt], 0, l1);
2359         else
2360             tcg_gen_br(l1);
2361         opn = "movn";
2362         break;
2363     case OPC_MOVZ:
2364         if (likely(rt != 0))
2365             tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[rt], 0, l1);
2366         opn = "movz";
2367         break;
2368     }
2369     if (rs != 0)
2370         tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2371     else
2372         tcg_gen_movi_tl(cpu_gpr[rd], 0);
2373     gen_set_label(l1);
2374
2375     (void)opn; /* avoid a compiler warning */
2376     MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
2377 }
2378
2379 /* Logic */
2380 static void gen_logic(CPUMIPSState *env, DisasContext *ctx, uint32_t opc,
2381                       int rd, int rs, int rt)
2382 {
2383     const char *opn = "logic";
2384
2385     if (rd == 0) {
2386         /* If no destination, treat it as a NOP. */
2387         MIPS_DEBUG("NOP");
2388         return;
2389     }
2390
2391     switch (opc) {
2392     case OPC_AND:
2393         if (likely(rs != 0 && rt != 0)) {
2394             tcg_gen_and_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2395         } else {
2396             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2397         }
2398         opn = "and";
2399         break;
2400     case OPC_NOR:
2401         if (rs != 0 && rt != 0) {
2402             tcg_gen_nor_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2403         } else if (rs == 0 && rt != 0) {
2404             tcg_gen_not_tl(cpu_gpr[rd], cpu_gpr[rt]);
2405         } else if (rs != 0 && rt == 0) {
2406             tcg_gen_not_tl(cpu_gpr[rd], cpu_gpr[rs]);
2407         } else {
2408             tcg_gen_movi_tl(cpu_gpr[rd], ~((target_ulong)0));
2409         }
2410         opn = "nor";
2411         break;
2412     case OPC_OR:
2413         if (likely(rs != 0 && rt != 0)) {
2414             tcg_gen_or_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2415         } else if (rs == 0 && rt != 0) {
2416             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
2417         } else if (rs != 0 && rt == 0) {
2418             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2419         } else {
2420             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2421         }
2422         opn = "or";
2423         break;
2424     case OPC_XOR:
2425         if (likely(rs != 0 && rt != 0)) {
2426             tcg_gen_xor_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2427         } else if (rs == 0 && rt != 0) {
2428             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
2429         } else if (rs != 0 && rt == 0) {
2430             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2431         } else {
2432             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2433         }
2434         opn = "xor";
2435         break;
2436     }
2437     (void)opn; /* avoid a compiler warning */
2438     MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
2439 }
2440
2441 /* Set on lower than */
2442 static void gen_slt(CPUMIPSState *env, DisasContext *ctx, uint32_t opc,
2443                     int rd, int rs, int rt)
2444 {
2445     const char *opn = "slt";
2446     TCGv t0, t1;
2447
2448     if (rd == 0) {
2449         /* If no destination, treat it as a NOP. */
2450         MIPS_DEBUG("NOP");
2451         return;
2452     }
2453
2454     t0 = tcg_temp_new();
2455     t1 = tcg_temp_new();
2456     gen_load_gpr(t0, rs);
2457     gen_load_gpr(t1, rt);
2458     switch (opc) {
2459     case OPC_SLT:
2460         tcg_gen_setcond_tl(TCG_COND_LT, cpu_gpr[rd], t0, t1);
2461         opn = "slt";
2462         break;
2463     case OPC_SLTU:
2464         tcg_gen_setcond_tl(TCG_COND_LTU, cpu_gpr[rd], t0, t1);
2465         opn = "sltu";
2466         break;
2467     }
2468     (void)opn; /* avoid a compiler warning */
2469     MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
2470     tcg_temp_free(t0);
2471     tcg_temp_free(t1);
2472 }
2473
2474 /* Shifts */
2475 static void gen_shift (CPUMIPSState *env, DisasContext *ctx, uint32_t opc,
2476                        int rd, int rs, int rt)
2477 {
2478     const char *opn = "shifts";
2479     TCGv t0, t1;
2480
2481     if (rd == 0) {
2482         /* If no destination, treat it as a NOP.
2483            For add & sub, we must generate the overflow exception when needed. */
2484         MIPS_DEBUG("NOP");
2485         return;
2486     }
2487
2488     t0 = tcg_temp_new();
2489     t1 = tcg_temp_new();
2490     gen_load_gpr(t0, rs);
2491     gen_load_gpr(t1, rt);
2492     switch (opc) {
2493     case OPC_SLLV:
2494         tcg_gen_andi_tl(t0, t0, 0x1f);
2495         tcg_gen_shl_tl(t0, t1, t0);
2496         tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
2497         opn = "sllv";
2498         break;
2499     case OPC_SRAV:
2500         tcg_gen_andi_tl(t0, t0, 0x1f);
2501         tcg_gen_sar_tl(cpu_gpr[rd], t1, t0);
2502         opn = "srav";
2503         break;
2504     case OPC_SRLV:
2505         tcg_gen_ext32u_tl(t1, t1);
2506         tcg_gen_andi_tl(t0, t0, 0x1f);
2507         tcg_gen_shr_tl(t0, t1, t0);
2508         tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
2509         opn = "srlv";
2510         break;
2511     case OPC_ROTRV:
2512         {
2513             TCGv_i32 t2 = tcg_temp_new_i32();
2514             TCGv_i32 t3 = tcg_temp_new_i32();
2515
2516             tcg_gen_trunc_tl_i32(t2, t0);
2517             tcg_gen_trunc_tl_i32(t3, t1);
2518             tcg_gen_andi_i32(t2, t2, 0x1f);
2519             tcg_gen_rotr_i32(t2, t3, t2);
2520             tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
2521             tcg_temp_free_i32(t2);
2522             tcg_temp_free_i32(t3);
2523             opn = "rotrv";
2524         }
2525         break;
2526 #if defined(TARGET_MIPS64)
2527     case OPC_DSLLV:
2528         tcg_gen_andi_tl(t0, t0, 0x3f);
2529         tcg_gen_shl_tl(cpu_gpr[rd], t1, t0);
2530         opn = "dsllv";
2531         break;
2532     case OPC_DSRAV:
2533         tcg_gen_andi_tl(t0, t0, 0x3f);
2534         tcg_gen_sar_tl(cpu_gpr[rd], t1, t0);
2535         opn = "dsrav";
2536         break;
2537     case OPC_DSRLV:
2538         tcg_gen_andi_tl(t0, t0, 0x3f);
2539         tcg_gen_shr_tl(cpu_gpr[rd], t1, t0);
2540         opn = "dsrlv";
2541         break;
2542     case OPC_DROTRV:
2543         tcg_gen_andi_tl(t0, t0, 0x3f);
2544         tcg_gen_rotr_tl(cpu_gpr[rd], t1, t0);
2545         opn = "drotrv";
2546         break;
2547 #endif
2548     }
2549     (void)opn; /* avoid a compiler warning */
2550     MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
2551     tcg_temp_free(t0);
2552     tcg_temp_free(t1);
2553 }
2554
2555 /* Arithmetic on HI/LO registers */
2556 static void gen_HILO (DisasContext *ctx, uint32_t opc, int reg)
2557 {
2558     const char *opn = "hilo";
2559     unsigned int acc;
2560
2561     if (reg == 0 && (opc == OPC_MFHI || opc == OPC_MFLO)) {
2562         /* Treat as NOP. */
2563         MIPS_DEBUG("NOP");
2564         return;
2565     }
2566
2567     if (opc == OPC_MFHI || opc == OPC_MFLO) {
2568         acc = ((ctx->opcode) >> 21) & 0x03;
2569     } else {
2570         acc = ((ctx->opcode) >> 11) & 0x03;
2571     }
2572
2573     if (acc != 0) {
2574         check_dsp(ctx);
2575     }
2576
2577     switch (opc) {
2578     case OPC_MFHI:
2579 #if defined(TARGET_MIPS64)
2580         if (acc != 0) {
2581             tcg_gen_ext32s_tl(cpu_gpr[reg], cpu_HI[acc]);
2582         } else
2583 #endif
2584         {
2585             tcg_gen_mov_tl(cpu_gpr[reg], cpu_HI[acc]);
2586         }
2587         opn = "mfhi";
2588         break;
2589     case OPC_MFLO:
2590 #if defined(TARGET_MIPS64)
2591         if (acc != 0) {
2592             tcg_gen_ext32s_tl(cpu_gpr[reg], cpu_LO[acc]);
2593         } else
2594 #endif
2595         {
2596             tcg_gen_mov_tl(cpu_gpr[reg], cpu_LO[acc]);
2597         }
2598         opn = "mflo";
2599         break;
2600     case OPC_MTHI:
2601         if (reg != 0) {
2602 #if defined(TARGET_MIPS64)
2603             if (acc != 0) {
2604                 tcg_gen_ext32s_tl(cpu_HI[acc], cpu_gpr[reg]);
2605             } else
2606 #endif
2607             {
2608                 tcg_gen_mov_tl(cpu_HI[acc], cpu_gpr[reg]);
2609             }
2610         } else {
2611             tcg_gen_movi_tl(cpu_HI[acc], 0);
2612         }
2613         opn = "mthi";
2614         break;
2615     case OPC_MTLO:
2616         if (reg != 0) {
2617 #if defined(TARGET_MIPS64)
2618             if (acc != 0) {
2619                 tcg_gen_ext32s_tl(cpu_LO[acc], cpu_gpr[reg]);
2620             } else
2621 #endif
2622             {
2623                 tcg_gen_mov_tl(cpu_LO[acc], cpu_gpr[reg]);
2624             }
2625         } else {
2626             tcg_gen_movi_tl(cpu_LO[acc], 0);
2627         }
2628         opn = "mtlo";
2629         break;
2630     }
2631     (void)opn; /* avoid a compiler warning */
2632     MIPS_DEBUG("%s %s", opn, regnames[reg]);
2633 }
2634
2635 static void gen_muldiv (DisasContext *ctx, uint32_t opc,
2636                         int rs, int rt)
2637 {
2638     const char *opn = "mul/div";
2639     TCGv t0, t1;
2640     unsigned int acc;
2641
2642     switch (opc) {
2643     case OPC_DIV:
2644     case OPC_DIVU:
2645 #if defined(TARGET_MIPS64)
2646     case OPC_DDIV:
2647     case OPC_DDIVU:
2648 #endif
2649         t0 = tcg_temp_local_new();
2650         t1 = tcg_temp_local_new();
2651         break;
2652     default:
2653         t0 = tcg_temp_new();
2654         t1 = tcg_temp_new();
2655         break;
2656     }
2657
2658     gen_load_gpr(t0, rs);
2659     gen_load_gpr(t1, rt);
2660     switch (opc) {
2661     case OPC_DIV:
2662         {
2663             int l1 = gen_new_label();
2664             int l2 = gen_new_label();
2665
2666             tcg_gen_ext32s_tl(t0, t0);
2667             tcg_gen_ext32s_tl(t1, t1);
2668             tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
2669             tcg_gen_brcondi_tl(TCG_COND_NE, t0, INT_MIN, l2);
2670             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1, l2);
2671
2672             tcg_gen_mov_tl(cpu_LO[0], t0);
2673             tcg_gen_movi_tl(cpu_HI[0], 0);
2674             tcg_gen_br(l1);
2675             gen_set_label(l2);
2676             tcg_gen_div_tl(cpu_LO[0], t0, t1);
2677             tcg_gen_rem_tl(cpu_HI[0], t0, t1);
2678             tcg_gen_ext32s_tl(cpu_LO[0], cpu_LO[0]);
2679             tcg_gen_ext32s_tl(cpu_HI[0], cpu_HI[0]);
2680             gen_set_label(l1);
2681         }
2682         opn = "div";
2683         break;
2684     case OPC_DIVU:
2685         {
2686             int l1 = gen_new_label();
2687
2688             tcg_gen_ext32u_tl(t0, t0);
2689             tcg_gen_ext32u_tl(t1, t1);
2690             tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
2691             tcg_gen_divu_tl(cpu_LO[0], t0, t1);
2692             tcg_gen_remu_tl(cpu_HI[0], t0, t1);
2693             tcg_gen_ext32s_tl(cpu_LO[0], cpu_LO[0]);
2694             tcg_gen_ext32s_tl(cpu_HI[0], cpu_HI[0]);
2695             gen_set_label(l1);
2696         }
2697         opn = "divu";
2698         break;
2699     case OPC_MULT:
2700         {
2701             TCGv_i64 t2 = tcg_temp_new_i64();
2702             TCGv_i64 t3 = tcg_temp_new_i64();
2703             acc = ((ctx->opcode) >> 11) & 0x03;
2704             if (acc != 0) {
2705                 check_dsp(ctx);
2706             }
2707
2708             tcg_gen_ext_tl_i64(t2, t0);
2709             tcg_gen_ext_tl_i64(t3, t1);
2710             tcg_gen_mul_i64(t2, t2, t3);
2711             tcg_temp_free_i64(t3);
2712             tcg_gen_trunc_i64_tl(t0, t2);
2713             tcg_gen_shri_i64(t2, t2, 32);
2714             tcg_gen_trunc_i64_tl(t1, t2);
2715             tcg_temp_free_i64(t2);
2716             tcg_gen_ext32s_tl(cpu_LO[acc], t0);
2717             tcg_gen_ext32s_tl(cpu_HI[acc], t1);
2718         }
2719         opn = "mult";
2720         break;
2721     case OPC_MULTU:
2722         {
2723             TCGv_i64 t2 = tcg_temp_new_i64();
2724             TCGv_i64 t3 = tcg_temp_new_i64();
2725             acc = ((ctx->opcode) >> 11) & 0x03;
2726             if (acc != 0) {
2727                 check_dsp(ctx);
2728             }
2729
2730             tcg_gen_ext32u_tl(t0, t0);
2731             tcg_gen_ext32u_tl(t1, t1);
2732             tcg_gen_extu_tl_i64(t2, t0);
2733             tcg_gen_extu_tl_i64(t3, t1);
2734             tcg_gen_mul_i64(t2, t2, t3);
2735             tcg_temp_free_i64(t3);
2736             tcg_gen_trunc_i64_tl(t0, t2);
2737             tcg_gen_shri_i64(t2, t2, 32);
2738             tcg_gen_trunc_i64_tl(t1, t2);
2739             tcg_temp_free_i64(t2);
2740             tcg_gen_ext32s_tl(cpu_LO[acc], t0);
2741             tcg_gen_ext32s_tl(cpu_HI[acc], t1);
2742         }
2743         opn = "multu";
2744         break;
2745 #if defined(TARGET_MIPS64)
2746     case OPC_DDIV:
2747         {
2748             int l1 = gen_new_label();
2749             int l2 = gen_new_label();
2750
2751             tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
2752             tcg_gen_brcondi_tl(TCG_COND_NE, t0, -1LL << 63, l2);
2753             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1LL, l2);
2754             tcg_gen_mov_tl(cpu_LO[0], t0);
2755             tcg_gen_movi_tl(cpu_HI[0], 0);
2756             tcg_gen_br(l1);
2757             gen_set_label(l2);
2758             tcg_gen_div_i64(cpu_LO[0], t0, t1);
2759             tcg_gen_rem_i64(cpu_HI[0], t0, t1);
2760             gen_set_label(l1);
2761         }
2762         opn = "ddiv";
2763         break;
2764     case OPC_DDIVU:
2765         {
2766             int l1 = gen_new_label();
2767
2768             tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
2769             tcg_gen_divu_i64(cpu_LO[0], t0, t1);
2770             tcg_gen_remu_i64(cpu_HI[0], t0, t1);
2771             gen_set_label(l1);
2772         }
2773         opn = "ddivu";
2774         break;
2775     case OPC_DMULT:
2776         gen_helper_dmult(cpu_env, t0, t1);
2777         opn = "dmult";
2778         break;
2779     case OPC_DMULTU:
2780         gen_helper_dmultu(cpu_env, t0, t1);
2781         opn = "dmultu";
2782         break;
2783 #endif
2784     case OPC_MADD:
2785         {
2786             TCGv_i64 t2 = tcg_temp_new_i64();
2787             TCGv_i64 t3 = tcg_temp_new_i64();
2788             acc = ((ctx->opcode) >> 11) & 0x03;
2789             if (acc != 0) {
2790                 check_dsp(ctx);
2791             }
2792
2793             tcg_gen_ext_tl_i64(t2, t0);
2794             tcg_gen_ext_tl_i64(t3, t1);
2795             tcg_gen_mul_i64(t2, t2, t3);
2796             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
2797             tcg_gen_add_i64(t2, t2, t3);
2798             tcg_temp_free_i64(t3);
2799             tcg_gen_trunc_i64_tl(t0, t2);
2800             tcg_gen_shri_i64(t2, t2, 32);
2801             tcg_gen_trunc_i64_tl(t1, t2);
2802             tcg_temp_free_i64(t2);
2803             tcg_gen_ext32s_tl(cpu_LO[acc], t0);
2804             tcg_gen_ext32s_tl(cpu_HI[acc], t1);
2805         }
2806         opn = "madd";
2807         break;
2808     case OPC_MADDU:
2809         {
2810             TCGv_i64 t2 = tcg_temp_new_i64();
2811             TCGv_i64 t3 = tcg_temp_new_i64();
2812             acc = ((ctx->opcode) >> 11) & 0x03;
2813             if (acc != 0) {
2814                 check_dsp(ctx);
2815             }
2816
2817             tcg_gen_ext32u_tl(t0, t0);
2818             tcg_gen_ext32u_tl(t1, t1);
2819             tcg_gen_extu_tl_i64(t2, t0);
2820             tcg_gen_extu_tl_i64(t3, t1);
2821             tcg_gen_mul_i64(t2, t2, t3);
2822             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
2823             tcg_gen_add_i64(t2, t2, t3);
2824             tcg_temp_free_i64(t3);
2825             tcg_gen_trunc_i64_tl(t0, t2);
2826             tcg_gen_shri_i64(t2, t2, 32);
2827             tcg_gen_trunc_i64_tl(t1, t2);
2828             tcg_temp_free_i64(t2);
2829             tcg_gen_ext32s_tl(cpu_LO[acc], t0);
2830             tcg_gen_ext32s_tl(cpu_HI[acc], t1);
2831         }
2832         opn = "maddu";
2833         break;
2834     case OPC_MSUB:
2835         {
2836             TCGv_i64 t2 = tcg_temp_new_i64();
2837             TCGv_i64 t3 = tcg_temp_new_i64();
2838             acc = ((ctx->opcode) >> 11) & 0x03;
2839             if (acc != 0) {
2840                 check_dsp(ctx);
2841             }
2842
2843             tcg_gen_ext_tl_i64(t2, t0);
2844             tcg_gen_ext_tl_i64(t3, t1);
2845             tcg_gen_mul_i64(t2, t2, t3);
2846             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
2847             tcg_gen_sub_i64(t2, t3, t2);
2848             tcg_temp_free_i64(t3);
2849             tcg_gen_trunc_i64_tl(t0, t2);
2850             tcg_gen_shri_i64(t2, t2, 32);
2851             tcg_gen_trunc_i64_tl(t1, t2);
2852             tcg_temp_free_i64(t2);
2853             tcg_gen_ext32s_tl(cpu_LO[acc], t0);
2854             tcg_gen_ext32s_tl(cpu_HI[acc], t1);
2855         }
2856         opn = "msub";
2857         break;
2858     case OPC_MSUBU:
2859         {
2860             TCGv_i64 t2 = tcg_temp_new_i64();
2861             TCGv_i64 t3 = tcg_temp_new_i64();
2862             acc = ((ctx->opcode) >> 11) & 0x03;
2863             if (acc != 0) {
2864                 check_dsp(ctx);
2865             }
2866
2867             tcg_gen_ext32u_tl(t0, t0);
2868             tcg_gen_ext32u_tl(t1, t1);
2869             tcg_gen_extu_tl_i64(t2, t0);
2870             tcg_gen_extu_tl_i64(t3, t1);
2871             tcg_gen_mul_i64(t2, t2, t3);
2872             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
2873             tcg_gen_sub_i64(t2, t3, t2);
2874             tcg_temp_free_i64(t3);
2875             tcg_gen_trunc_i64_tl(t0, t2);
2876             tcg_gen_shri_i64(t2, t2, 32);
2877             tcg_gen_trunc_i64_tl(t1, t2);
2878             tcg_temp_free_i64(t2);
2879             tcg_gen_ext32s_tl(cpu_LO[acc], t0);
2880             tcg_gen_ext32s_tl(cpu_HI[acc], t1);
2881         }
2882         opn = "msubu";
2883         break;
2884     default:
2885         MIPS_INVAL(opn);
2886         generate_exception(ctx, EXCP_RI);
2887         goto out;
2888     }
2889     (void)opn; /* avoid a compiler warning */
2890     MIPS_DEBUG("%s %s %s", opn, regnames[rs], regnames[rt]);
2891  out:
2892     tcg_temp_free(t0);
2893     tcg_temp_free(t1);
2894 }
2895
2896 static void gen_mul_vr54xx (DisasContext *ctx, uint32_t opc,
2897                             int rd, int rs, int rt)
2898 {
2899     const char *opn = "mul vr54xx";
2900     TCGv t0 = tcg_temp_new();
2901     TCGv t1 = tcg_temp_new();
2902
2903     gen_load_gpr(t0, rs);
2904     gen_load_gpr(t1, rt);
2905
2906     switch (opc) {
2907     case OPC_VR54XX_MULS:
2908         gen_helper_muls(t0, cpu_env, t0, t1);
2909         opn = "muls";
2910         break;
2911     case OPC_VR54XX_MULSU:
2912         gen_helper_mulsu(t0, cpu_env, t0, t1);
2913         opn = "mulsu";
2914         break;
2915     case OPC_VR54XX_MACC:
2916         gen_helper_macc(t0, cpu_env, t0, t1);
2917         opn = "macc";
2918         break;
2919     case OPC_VR54XX_MACCU:
2920         gen_helper_maccu(t0, cpu_env, t0, t1);
2921         opn = "maccu";
2922         break;
2923     case OPC_VR54XX_MSAC:
2924         gen_helper_msac(t0, cpu_env, t0, t1);
2925         opn = "msac";
2926         break;
2927     case OPC_VR54XX_MSACU:
2928         gen_helper_msacu(t0, cpu_env, t0, t1);
2929         opn = "msacu";
2930         break;
2931     case OPC_VR54XX_MULHI:
2932         gen_helper_mulhi(t0, cpu_env, t0, t1);
2933         opn = "mulhi";
2934         break;
2935     case OPC_VR54XX_MULHIU:
2936         gen_helper_mulhiu(t0, cpu_env, t0, t1);
2937         opn = "mulhiu";
2938         break;
2939     case OPC_VR54XX_MULSHI:
2940         gen_helper_mulshi(t0, cpu_env, t0, t1);
2941         opn = "mulshi";
2942         break;
2943     case OPC_VR54XX_MULSHIU:
2944         gen_helper_mulshiu(t0, cpu_env, t0, t1);
2945         opn = "mulshiu";
2946         break;
2947     case OPC_VR54XX_MACCHI:
2948         gen_helper_macchi(t0, cpu_env, t0, t1);
2949         opn = "macchi";
2950         break;
2951     case OPC_VR54XX_MACCHIU:
2952         gen_helper_macchiu(t0, cpu_env, t0, t1);
2953         opn = "macchiu";
2954         break;
2955     case OPC_VR54XX_MSACHI:
2956         gen_helper_msachi(t0, cpu_env, t0, t1);
2957         opn = "msachi";
2958         break;
2959     case OPC_VR54XX_MSACHIU:
2960         gen_helper_msachiu(t0, cpu_env, t0, t1);
2961         opn = "msachiu";
2962         break;
2963     default:
2964         MIPS_INVAL("mul vr54xx");
2965         generate_exception(ctx, EXCP_RI);
2966         goto out;
2967     }
2968     gen_store_gpr(t0, rd);
2969     (void)opn; /* avoid a compiler warning */
2970     MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
2971
2972  out:
2973     tcg_temp_free(t0);
2974     tcg_temp_free(t1);
2975 }
2976
2977 static void gen_cl (DisasContext *ctx, uint32_t opc,
2978                     int rd, int rs)
2979 {
2980     const char *opn = "CLx";
2981     TCGv t0;
2982
2983     if (rd == 0) {
2984         /* Treat as NOP. */
2985         MIPS_DEBUG("NOP");
2986         return;
2987     }
2988     t0 = tcg_temp_new();
2989     gen_load_gpr(t0, rs);
2990     switch (opc) {
2991     case OPC_CLO:
2992         gen_helper_clo(cpu_gpr[rd], t0);
2993         opn = "clo";
2994         break;
2995     case OPC_CLZ:
2996         gen_helper_clz(cpu_gpr[rd], t0);
2997         opn = "clz";
2998         break;
2999 #if defined(TARGET_MIPS64)
3000     case OPC_DCLO:
3001         gen_helper_dclo(cpu_gpr[rd], t0);
3002         opn = "dclo";
3003         break;
3004     case OPC_DCLZ:
3005         gen_helper_dclz(cpu_gpr[rd], t0);
3006         opn = "dclz";
3007         break;
3008 #endif
3009     }
3010     (void)opn; /* avoid a compiler warning */
3011     MIPS_DEBUG("%s %s, %s", opn, regnames[rd], regnames[rs]);
3012     tcg_temp_free(t0);
3013 }
3014
3015 /* Godson integer instructions */
3016 static void gen_loongson_integer(DisasContext *ctx, uint32_t opc,
3017                                  int rd, int rs, int rt)
3018 {
3019     const char *opn = "loongson";
3020     TCGv t0, t1;
3021
3022     if (rd == 0) {
3023         /* Treat as NOP. */
3024         MIPS_DEBUG("NOP");
3025         return;
3026     }
3027
3028     switch (opc) {
3029     case OPC_MULT_G_2E:
3030     case OPC_MULT_G_2F:
3031     case OPC_MULTU_G_2E:
3032     case OPC_MULTU_G_2F:
3033 #if defined(TARGET_MIPS64)
3034     case OPC_DMULT_G_2E:
3035     case OPC_DMULT_G_2F:
3036     case OPC_DMULTU_G_2E:
3037     case OPC_DMULTU_G_2F:
3038 #endif
3039         t0 = tcg_temp_new();
3040         t1 = tcg_temp_new();
3041         break;
3042     default:
3043         t0 = tcg_temp_local_new();
3044         t1 = tcg_temp_local_new();
3045         break;
3046     }
3047
3048     gen_load_gpr(t0, rs);
3049     gen_load_gpr(t1, rt);
3050
3051     switch (opc) {
3052     case OPC_MULT_G_2E:
3053     case OPC_MULT_G_2F:
3054         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3055         tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3056         opn = "mult.g";
3057         break;
3058     case OPC_MULTU_G_2E:
3059     case OPC_MULTU_G_2F:
3060         tcg_gen_ext32u_tl(t0, t0);
3061         tcg_gen_ext32u_tl(t1, t1);
3062         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3063         tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3064         opn = "multu.g";
3065         break;
3066     case OPC_DIV_G_2E:
3067     case OPC_DIV_G_2F:
3068         {
3069             int l1 = gen_new_label();
3070             int l2 = gen_new_label();
3071             int l3 = gen_new_label();
3072             tcg_gen_ext32s_tl(t0, t0);
3073             tcg_gen_ext32s_tl(t1, t1);
3074             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3075             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3076             tcg_gen_br(l3);
3077             gen_set_label(l1);
3078             tcg_gen_brcondi_tl(TCG_COND_NE, t0, INT_MIN, l2);
3079             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1, l2);
3080             tcg_gen_mov_tl(cpu_gpr[rd], t0);
3081             tcg_gen_br(l3);
3082             gen_set_label(l2);
3083             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
3084             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3085             gen_set_label(l3);
3086         }
3087         opn = "div.g";
3088         break;
3089     case OPC_DIVU_G_2E:
3090     case OPC_DIVU_G_2F:
3091         {
3092             int l1 = gen_new_label();
3093             int l2 = gen_new_label();
3094             tcg_gen_ext32u_tl(t0, t0);
3095             tcg_gen_ext32u_tl(t1, t1);
3096             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3097             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3098             tcg_gen_br(l2);
3099             gen_set_label(l1);
3100             tcg_gen_divu_tl(cpu_gpr[rd], t0, t1);
3101             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3102             gen_set_label(l2);
3103         }
3104         opn = "divu.g";
3105         break;
3106     case OPC_MOD_G_2E:
3107     case OPC_MOD_G_2F:
3108         {
3109             int l1 = gen_new_label();
3110             int l2 = gen_new_label();
3111             int l3 = gen_new_label();
3112             tcg_gen_ext32u_tl(t0, t0);
3113             tcg_gen_ext32u_tl(t1, t1);
3114             tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
3115             tcg_gen_brcondi_tl(TCG_COND_NE, t0, INT_MIN, l2);
3116             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1, l2);
3117             gen_set_label(l1);
3118             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3119             tcg_gen_br(l3);
3120             gen_set_label(l2);
3121             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
3122             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3123             gen_set_label(l3);
3124         }
3125         opn = "mod.g";
3126         break;
3127     case OPC_MODU_G_2E:
3128     case OPC_MODU_G_2F:
3129         {
3130             int l1 = gen_new_label();
3131             int l2 = gen_new_label();
3132             tcg_gen_ext32u_tl(t0, t0);
3133             tcg_gen_ext32u_tl(t1, t1);
3134             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3135             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3136             tcg_gen_br(l2);
3137             gen_set_label(l1);
3138             tcg_gen_remu_tl(cpu_gpr[rd], t0, t1);
3139             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3140             gen_set_label(l2);
3141         }
3142         opn = "modu.g";
3143         break;
3144 #if defined(TARGET_MIPS64)
3145     case OPC_DMULT_G_2E:
3146     case OPC_DMULT_G_2F:
3147         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3148         opn = "dmult.g";
3149         break;
3150     case OPC_DMULTU_G_2E:
3151     case OPC_DMULTU_G_2F:
3152         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3153         opn = "dmultu.g";
3154         break;
3155     case OPC_DDIV_G_2E:
3156     case OPC_DDIV_G_2F:
3157         {
3158             int l1 = gen_new_label();
3159             int l2 = gen_new_label();
3160             int l3 = gen_new_label();
3161             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3162             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3163             tcg_gen_br(l3);
3164             gen_set_label(l1);
3165             tcg_gen_brcondi_tl(TCG_COND_NE, t0, -1LL << 63, l2);
3166             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1LL, l2);
3167             tcg_gen_mov_tl(cpu_gpr[rd], t0);
3168             tcg_gen_br(l3);
3169             gen_set_label(l2);
3170             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
3171             gen_set_label(l3);
3172         }
3173         opn = "ddiv.g";
3174         break;
3175     case OPC_DDIVU_G_2E:
3176     case OPC_DDIVU_G_2F:
3177         {
3178             int l1 = gen_new_label();
3179             int l2 = gen_new_label();
3180             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3181             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3182             tcg_gen_br(l2);
3183             gen_set_label(l1);
3184             tcg_gen_divu_tl(cpu_gpr[rd], t0, t1);
3185             gen_set_label(l2);
3186         }
3187         opn = "ddivu.g";
3188         break;
3189     case OPC_DMOD_G_2E:
3190     case OPC_DMOD_G_2F:
3191         {
3192             int l1 = gen_new_label();
3193             int l2 = gen_new_label();
3194             int l3 = gen_new_label();
3195             tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
3196             tcg_gen_brcondi_tl(TCG_COND_NE, t0, -1LL << 63, l2);
3197             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1LL, l2);
3198             gen_set_label(l1);
3199             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3200             tcg_gen_br(l3);
3201             gen_set_label(l2);
3202             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
3203             gen_set_label(l3);
3204         }
3205         opn = "dmod.g";
3206         break;
3207     case OPC_DMODU_G_2E:
3208     case OPC_DMODU_G_2F:
3209         {
3210             int l1 = gen_new_label();
3211             int l2 = gen_new_label();
3212             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3213             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3214             tcg_gen_br(l2);
3215             gen_set_label(l1);
3216             tcg_gen_remu_tl(cpu_gpr[rd], t0, t1);
3217             gen_set_label(l2);
3218         }
3219         opn = "dmodu.g";
3220         break;
3221 #endif
3222     }
3223
3224     (void)opn; /* avoid a compiler warning */
3225     MIPS_DEBUG("%s %s, %s", opn, regnames[rd], regnames[rs]);
3226     tcg_temp_free(t0);
3227     tcg_temp_free(t1);
3228 }
3229
3230 /* Loongson multimedia instructions */
3231 static void gen_loongson_multimedia(DisasContext *ctx, int rd, int rs, int rt)
3232 {
3233     const char *opn = "loongson_cp2";
3234     uint32_t opc, shift_max;
3235     TCGv_i64 t0, t1;
3236
3237     opc = MASK_LMI(ctx->opcode);
3238     switch (opc) {
3239     case OPC_ADD_CP2:
3240     case OPC_SUB_CP2:
3241     case OPC_DADD_CP2:
3242     case OPC_DSUB_CP2:
3243         t0 = tcg_temp_local_new_i64();
3244         t1 = tcg_temp_local_new_i64();
3245         break;
3246     default:
3247         t0 = tcg_temp_new_i64();
3248         t1 = tcg_temp_new_i64();
3249         break;
3250     }
3251
3252     gen_load_fpr64(ctx, t0, rs);
3253     gen_load_fpr64(ctx, t1, rt);
3254
3255 #define LMI_HELPER(UP, LO) \
3256     case OPC_##UP: gen_helper_##LO(t0, t0, t1); opn = #LO; break
3257 #define LMI_HELPER_1(UP, LO) \
3258     case OPC_##UP: gen_helper_##LO(t0, t0); opn = #LO; break
3259 #define LMI_DIRECT(UP, LO, OP) \
3260     case OPC_##UP: tcg_gen_##OP##_i64(t0, t0, t1); opn = #LO; break
3261
3262     switch (opc) {
3263     LMI_HELPER(PADDSH, paddsh);
3264     LMI_HELPER(PADDUSH, paddush);
3265     LMI_HELPER(PADDH, paddh);
3266     LMI_HELPER(PADDW, paddw);
3267     LMI_HELPER(PADDSB, paddsb);
3268     LMI_HELPER(PADDUSB, paddusb);
3269     LMI_HELPER(PADDB, paddb);
3270
3271     LMI_HELPER(PSUBSH, psubsh);
3272     LMI_HELPER(PSUBUSH, psubush);
3273     LMI_HELPER(PSUBH, psubh);
3274     LMI_HELPER(PSUBW, psubw);
3275     LMI_HELPER(PSUBSB, psubsb);
3276     LMI_HELPER(PSUBUSB, psubusb);
3277     LMI_HELPER(PSUBB, psubb);
3278
3279     LMI_HELPER(PSHUFH, pshufh);
3280     LMI_HELPER(PACKSSWH, packsswh);
3281     LMI_HELPER(PACKSSHB, packsshb);
3282     LMI_HELPER(PACKUSHB, packushb);
3283
3284     LMI_HELPER(PUNPCKLHW, punpcklhw);
3285     LMI_HELPER(PUNPCKHHW, punpckhhw);
3286     LMI_HELPER(PUNPCKLBH, punpcklbh);
3287     LMI_HELPER(PUNPCKHBH, punpckhbh);
3288     LMI_HELPER(PUNPCKLWD, punpcklwd);
3289     LMI_HELPER(PUNPCKHWD, punpckhwd);
3290
3291     LMI_HELPER(PAVGH, pavgh);
3292     LMI_HELPER(PAVGB, pavgb);
3293     LMI_HELPER(PMAXSH, pmaxsh);
3294     LMI_HELPER(PMINSH, pminsh);
3295     LMI_HELPER(PMAXUB, pmaxub);
3296     LMI_HELPER(PMINUB, pminub);
3297
3298     LMI_HELPER(PCMPEQW, pcmpeqw);
3299     LMI_HELPER(PCMPGTW, pcmpgtw);
3300     LMI_HELPER(PCMPEQH, pcmpeqh);
3301     LMI_HELPER(PCMPGTH, pcmpgth);
3302     LMI_HELPER(PCMPEQB, pcmpeqb);
3303     LMI_HELPER(PCMPGTB, pcmpgtb);
3304
3305     LMI_HELPER(PSLLW, psllw);
3306     LMI_HELPER(PSLLH, psllh);
3307     LMI_HELPER(PSRLW, psrlw);
3308     LMI_HELPER(PSRLH, psrlh);
3309     LMI_HELPER(PSRAW, psraw);
3310     LMI_HELPER(PSRAH, psrah);
3311
3312     LMI_HELPER(PMULLH, pmullh);
3313     LMI_HELPER(PMULHH, pmulhh);
3314     LMI_HELPER(PMULHUH, pmulhuh);
3315     LMI_HELPER(PMADDHW, pmaddhw);
3316
3317     LMI_HELPER(PASUBUB, pasubub);
3318     LMI_HELPER_1(BIADD, biadd);
3319     LMI_HELPER_1(PMOVMSKB, pmovmskb);
3320
3321     LMI_DIRECT(PADDD, paddd, add);
3322     LMI_DIRECT(PSUBD, psubd, sub);
3323     LMI_DIRECT(XOR_CP2, xor, xor);
3324     LMI_DIRECT(NOR_CP2, nor, nor);
3325     LMI_DIRECT(AND_CP2, and, and);
3326     LMI_DIRECT(PANDN, pandn, andc);
3327     LMI_DIRECT(OR, or, or);
3328
3329     case OPC_PINSRH_0:
3330         tcg_gen_deposit_i64(t0, t0, t1, 0, 16);
3331         opn = "pinsrh_0";
3332         break;
3333     case OPC_PINSRH_1:
3334         tcg_gen_deposit_i64(t0, t0, t1, 16, 16);
3335         opn = "pinsrh_1";
3336         break;
3337     case OPC_PINSRH_2:
3338         tcg_gen_deposit_i64(t0, t0, t1, 32, 16);
3339         opn = "pinsrh_2";
3340         break;
3341     case OPC_PINSRH_3:
3342         tcg_gen_deposit_i64(t0, t0, t1, 48, 16);
3343         opn = "pinsrh_3";
3344         break;
3345
3346     case OPC_PEXTRH:
3347         tcg_gen_andi_i64(t1, t1, 3);
3348         tcg_gen_shli_i64(t1, t1, 4);
3349         tcg_gen_shr_i64(t0, t0, t1);
3350         tcg_gen_ext16u_i64(t0, t0);
3351         opn = "pextrh";
3352         break;
3353
3354     case OPC_ADDU_CP2:
3355         tcg_gen_add_i64(t0, t0, t1);
3356         tcg_gen_ext32s_i64(t0, t0);
3357         opn = "addu";
3358         break;
3359     case OPC_SUBU_CP2:
3360         tcg_gen_sub_i64(t0, t0, t1);
3361         tcg_gen_ext32s_i64(t0, t0);
3362         opn = "addu";
3363         break;
3364
3365     case OPC_SLL_CP2:
3366         opn = "sll";
3367         shift_max = 32;
3368         goto do_shift;
3369     case OPC_SRL_CP2:
3370         opn = "srl";
3371         shift_max = 32;
3372         goto do_shift;
3373     case OPC_SRA_CP2:
3374         opn = "sra";
3375         shift_max = 32;
3376         goto do_shift;
3377     case OPC_DSLL_CP2:
3378         opn = "dsll";
3379         shift_max = 64;
3380         goto do_shift;
3381     case OPC_DSRL_CP2:
3382         opn = "dsrl";
3383         shift_max = 64;
3384         goto do_shift;
3385     case OPC_DSRA_CP2:
3386         opn = "dsra";
3387         shift_max = 64;
3388         goto do_shift;
3389     do_shift:
3390         /* Make sure shift count isn't TCG undefined behaviour.  */
3391         tcg_gen_andi_i64(t1, t1, shift_max - 1);
3392
3393         switch (opc) {
3394         case OPC_SLL_CP2:
3395         case OPC_DSLL_CP2:
3396             tcg_gen_shl_i64(t0, t0, t1);
3397             break;
3398         case OPC_SRA_CP2:
3399         case OPC_DSRA_CP2:
3400             /* Since SRA is UndefinedResult without sign-extended inputs,
3401                we can treat SRA and DSRA the same.  */
3402             tcg_gen_sar_i64(t0, t0, t1);
3403             break;
3404         case OPC_SRL_CP2:
3405             /* We want to shift in zeros for SRL; zero-extend first.  */
3406             tcg_gen_ext32u_i64(t0, t0);
3407             /* FALLTHRU */
3408         case OPC_DSRL_CP2:
3409             tcg_gen_shr_i64(t0, t0, t1);
3410             break;
3411         }
3412
3413         if (shift_max == 32) {
3414             tcg_gen_ext32s_i64(t0, t0);
3415         }
3416
3417         /* Shifts larger than MAX produce zero.  */
3418         tcg_gen_setcondi_i64(TCG_COND_LTU, t1, t1, shift_max);
3419         tcg_gen_neg_i64(t1, t1);
3420         tcg_gen_and_i64(t0, t0, t1);
3421         break;
3422
3423     case OPC_ADD_CP2:
3424     case OPC_DADD_CP2:
3425         {
3426             TCGv_i64 t2 = tcg_temp_new_i64();
3427             int lab = gen_new_label();
3428
3429             tcg_gen_mov_i64(t2, t0);
3430             tcg_gen_add_i64(t0, t1, t2);
3431             if (opc == OPC_ADD_CP2) {
3432                 tcg_gen_ext32s_i64(t0, t0);
3433             }
3434             tcg_gen_xor_i64(t1, t1, t2);
3435             tcg_gen_xor_i64(t2, t2, t0);
3436             tcg_gen_andc_i64(t1, t2, t1);
3437             tcg_temp_free_i64(t2);
3438             tcg_gen_brcondi_i64(TCG_COND_GE, t1, 0, lab);
3439             generate_exception(ctx, EXCP_OVERFLOW);
3440             gen_set_label(lab);
3441
3442             opn = (opc == OPC_ADD_CP2 ? "add" : "dadd");
3443             break;
3444         }
3445
3446     case OPC_SUB_CP2:
3447     case OPC_DSUB_CP2:
3448         {
3449             TCGv_i64 t2 = tcg_temp_new_i64();
3450             int lab = gen_new_label();
3451
3452             tcg_gen_mov_i64(t2, t0);
3453             tcg_gen_sub_i64(t0, t1, t2);
3454             if (opc == OPC_SUB_CP2) {
3455                 tcg_gen_ext32s_i64(t0, t0);
3456             }
3457             tcg_gen_xor_i64(t1, t1, t2);
3458             tcg_gen_xor_i64(t2, t2, t0);
3459             tcg_gen_and_i64(t1, t1, t2);
3460             tcg_temp_free_i64(t2);
3461             tcg_gen_brcondi_i64(TCG_COND_GE, t1, 0, lab);
3462             generate_exception(ctx, EXCP_OVERFLOW);
3463             gen_set_label(lab);
3464
3465             opn = (opc == OPC_SUB_CP2 ? "sub" : "dsub");
3466             break;
3467         }
3468
3469     case OPC_PMULUW:
3470         tcg_gen_ext32u_i64(t0, t0);
3471         tcg_gen_ext32u_i64(t1, t1);
3472         tcg_gen_mul_i64(t0, t0, t1);
3473         opn = "pmuluw";
3474         break;
3475
3476     case OPC_SEQU_CP2:
3477     case OPC_SEQ_CP2:
3478     case OPC_SLTU_CP2:
3479     case OPC_SLT_CP2:
3480     case OPC_SLEU_CP2:
3481     case OPC_SLE_CP2:
3482         /* ??? Document is unclear: Set FCC[CC].  Does that mean the
3483            FD field is the CC field?  */
3484     default:
3485         MIPS_INVAL(opn);
3486         generate_exception(ctx, EXCP_RI);
3487         return;
3488     }
3489
3490 #undef LMI_HELPER
3491 #undef LMI_DIRECT
3492
3493     gen_store_fpr64(ctx, t0, rd);
3494
3495     (void)opn; /* avoid a compiler warning */
3496     MIPS_DEBUG("%s %s, %s, %s", opn,
3497                fregnames[rd], fregnames[rs], fregnames[rt]);
3498     tcg_temp_free_i64(t0);
3499     tcg_temp_free_i64(t1);
3500 }
3501
3502 /* Traps */
3503 static void gen_trap (DisasContext *ctx, uint32_t opc,
3504                       int rs, int rt, int16_t imm)
3505 {
3506     int cond;
3507     TCGv t0 = tcg_temp_new();
3508     TCGv t1 = tcg_temp_new();
3509
3510     cond = 0;
3511     /* Load needed operands */
3512     switch (opc) {
3513     case OPC_TEQ:
3514     case OPC_TGE:
3515     case OPC_TGEU:
3516     case OPC_TLT:
3517     case OPC_TLTU:
3518     case OPC_TNE:
3519         /* Compare two registers */
3520         if (rs != rt) {
3521             gen_load_gpr(t0, rs);
3522             gen_load_gpr(t1, rt);
3523             cond = 1;
3524         }
3525         break;
3526     case OPC_TEQI:
3527     case OPC_TGEI:
3528     case OPC_TGEIU:
3529     case OPC_TLTI:
3530     case OPC_TLTIU:
3531     case OPC_TNEI:
3532         /* Compare register to immediate */
3533         if (rs != 0 || imm != 0) {
3534             gen_load_gpr(t0, rs);
3535             tcg_gen_movi_tl(t1, (int32_t)imm);
3536             cond = 1;
3537         }
3538         break;
3539     }
3540     if (cond == 0) {
3541         switch (opc) {
3542         case OPC_TEQ:   /* rs == rs */
3543         case OPC_TEQI:  /* r0 == 0  */
3544         case OPC_TGE:   /* rs >= rs */
3545         case OPC_TGEI:  /* r0 >= 0  */
3546         case OPC_TGEU:  /* rs >= rs unsigned */
3547         case OPC_TGEIU: /* r0 >= 0  unsigned */
3548             /* Always trap */
3549             generate_exception(ctx, EXCP_TRAP);
3550             break;
3551         case OPC_TLT:   /* rs < rs           */
3552         case OPC_TLTI:  /* r0 < 0            */
3553         case OPC_TLTU:  /* rs < rs unsigned  */
3554         case OPC_TLTIU: /* r0 < 0  unsigned  */
3555         case OPC_TNE:   /* rs != rs          */
3556         case OPC_TNEI:  /* r0 != 0           */
3557             /* Never trap: treat as NOP. */
3558             break;
3559         }
3560     } else {
3561         int l1 = gen_new_label();
3562
3563         switch (opc) {
3564         case OPC_TEQ:
3565         case OPC_TEQI:
3566             tcg_gen_brcond_tl(TCG_COND_NE, t0, t1, l1);
3567             break;
3568         case OPC_TGE:
3569         case OPC_TGEI:
3570             tcg_gen_brcond_tl(TCG_COND_LT, t0, t1, l1);
3571             break;
3572         case OPC_TGEU:
3573         case OPC_TGEIU:
3574             tcg_gen_brcond_tl(TCG_COND_LTU, t0, t1, l1);
3575             break;
3576         case OPC_TLT:
3577         case OPC_TLTI:
3578             tcg_gen_brcond_tl(TCG_COND_GE, t0, t1, l1);
3579             break;
3580         case OPC_TLTU:
3581         case OPC_TLTIU:
3582             tcg_gen_brcond_tl(TCG_COND_GEU, t0, t1, l1);
3583             break;
3584         case OPC_TNE:
3585         case OPC_TNEI:
3586             tcg_gen_brcond_tl(TCG_COND_EQ, t0, t1, l1);
3587             break;
3588         }
3589         generate_exception(ctx, EXCP_TRAP);
3590         gen_set_label(l1);
3591     }
3592     tcg_temp_free(t0);
3593     tcg_temp_free(t1);
3594 }
3595
3596 static inline void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
3597 {
3598     TranslationBlock *tb;
3599     tb = ctx->tb;
3600     if ((tb->pc & TARGET_PAGE_MASK) == (dest & TARGET_PAGE_MASK) &&
3601         likely(!ctx->singlestep_enabled)) {
3602         tcg_gen_goto_tb(n);
3603         gen_save_pc(dest);
3604         tcg_gen_exit_tb((tcg_target_long)tb + n);
3605     } else {
3606         gen_save_pc(dest);
3607         if (ctx->singlestep_enabled) {
3608             save_cpu_state(ctx, 0);
3609             gen_helper_0e0i(raise_exception, EXCP_DEBUG);
3610         }
3611         tcg_gen_exit_tb(0);
3612     }
3613 }
3614
3615 /* Branches (before delay slot) */
3616 static void gen_compute_branch (DisasContext *ctx, uint32_t opc,
3617                                 int insn_bytes,
3618                                 int rs, int rt, int32_t offset)
3619 {
3620     target_ulong btgt = -1;
3621     int blink = 0;
3622     int bcond_compute = 0;
3623     TCGv t0 = tcg_temp_new();
3624     TCGv t1 = tcg_temp_new();
3625
3626     if (ctx->hflags & MIPS_HFLAG_BMASK) {
3627 #ifdef MIPS_DEBUG_DISAS
3628         LOG_DISAS("Branch in delay slot at PC 0x" TARGET_FMT_lx "\n", ctx->pc);
3629 #endif
3630         generate_exception(ctx, EXCP_RI);
3631         goto out;
3632     }
3633
3634     /* Load needed operands */
3635     switch (opc) {
3636     case OPC_BEQ:
3637     case OPC_BEQL:
3638     case OPC_BNE:
3639     case OPC_BNEL:
3640         /* Compare two registers */
3641         if (rs != rt) {
3642             gen_load_gpr(t0, rs);
3643             gen_load_gpr(t1, rt);
3644             bcond_compute = 1;
3645         }
3646         btgt = ctx->pc + insn_bytes + offset;
3647         break;
3648     case OPC_BGEZ:
3649     case OPC_BGEZAL:
3650     case OPC_BGEZALS:
3651     case OPC_BGEZALL:
3652     case OPC_BGEZL:
3653     case OPC_BGTZ:
3654     case OPC_BGTZL:
3655     case OPC_BLEZ:
3656     case OPC_BLEZL:
3657     case OPC_BLTZ:
3658     case OPC_BLTZAL:
3659     case OPC_BLTZALS:
3660     case OPC_BLTZALL:
3661     case OPC_BLTZL:
3662         /* Compare to zero */
3663         if (rs != 0) {
3664             gen_load_gpr(t0, rs);
3665             bcond_compute = 1;
3666         }
3667         btgt = ctx->pc + insn_bytes + offset;
3668         break;
3669     case OPC_BPOSGE32:
3670 #if defined(TARGET_MIPS64)
3671     case OPC_BPOSGE64:
3672         tcg_gen_andi_tl(t0, cpu_dspctrl, 0x7F);
3673 #else
3674         tcg_gen_andi_tl(t0, cpu_dspctrl, 0x3F);
3675 #endif
3676         bcond_compute = 1;
3677         btgt = ctx->pc + insn_bytes + offset;
3678         break;
3679     case OPC_J:
3680     case OPC_JAL:
3681     case OPC_JALX:
3682     case OPC_JALS:
3683     case OPC_JALXS:
3684         /* Jump to immediate */
3685         btgt = ((ctx->pc + insn_bytes) & (int32_t)0xF0000000) | (uint32_t)offset;
3686         break;
3687     case OPC_JR:
3688     case OPC_JALR:
3689     case OPC_JALRC:
3690     case OPC_JALRS:
3691         /* Jump to register */
3692         if (offset != 0 && offset != 16) {
3693             /* Hint = 0 is JR/JALR, hint 16 is JR.HB/JALR.HB, the
3694                others are reserved. */
3695             MIPS_INVAL("jump hint");
3696             generate_exception(ctx, EXCP_RI);
3697             goto out;
3698         }
3699         gen_load_gpr(btarget, rs);
3700         break;
3701     default:
3702         MIPS_INVAL("branch/jump");
3703         generate_exception(ctx, EXCP_RI);
3704         goto out;
3705     }
3706     if (bcond_compute == 0) {
3707         /* No condition to be computed */
3708         switch (opc) {
3709         case OPC_BEQ:     /* rx == rx        */
3710         case OPC_BEQL:    /* rx == rx likely */
3711         case OPC_BGEZ:    /* 0 >= 0          */
3712         case OPC_BGEZL:   /* 0 >= 0 likely   */
3713         case OPC_BLEZ:    /* 0 <= 0          */
3714         case OPC_BLEZL:   /* 0 <= 0 likely   */
3715             /* Always take */
3716             ctx->hflags |= MIPS_HFLAG_B;
3717             MIPS_DEBUG("balways");
3718             break;
3719         case OPC_BGEZALS:
3720         case OPC_BGEZAL:  /* 0 >= 0          */
3721         case OPC_BGEZALL: /* 0 >= 0 likely   */
3722             ctx->hflags |= (opc == OPC_BGEZALS
3723                             ? MIPS_HFLAG_BDS16
3724                             : MIPS_HFLAG_BDS32);
3725             /* Always take and link */
3726             blink = 31;
3727             ctx->hflags |= MIPS_HFLAG_B;
3728             MIPS_DEBUG("balways and link");
3729             break;
3730         case OPC_BNE:     /* rx != rx        */
3731         case OPC_BGTZ:    /* 0 > 0           */
3732         case OPC_BLTZ:    /* 0 < 0           */
3733             /* Treat as NOP. */
3734             MIPS_DEBUG("bnever (NOP)");
3735             goto out;
3736         case OPC_BLTZALS:
3737         case OPC_BLTZAL:  /* 0 < 0           */
3738             ctx->hflags |= (opc == OPC_BLTZALS
3739                             ? MIPS_HFLAG_BDS16
3740                             : MIPS_HFLAG_BDS32);
3741             /* Handle as an unconditional branch to get correct delay
3742                slot checking.  */
3743             blink = 31;
3744             btgt = ctx->pc + (opc == OPC_BLTZALS ? 6 : 8);
3745             ctx->hflags |= MIPS_HFLAG_B;
3746             MIPS_DEBUG("bnever and link");
3747             break;
3748         case OPC_BLTZALL: /* 0 < 0 likely */
3749             tcg_gen_movi_tl(cpu_gpr[31], ctx->pc + 8);
3750             /* Skip the instruction in the delay slot */
3751             MIPS_DEBUG("bnever, link and skip");
3752             ctx->pc += 4;
3753             goto out;
3754         case OPC_BNEL:    /* rx != rx likely */
3755         case OPC_BGTZL:   /* 0 > 0 likely */
3756         case OPC_BLTZL:   /* 0 < 0 likely */
3757             /* Skip the instruction in the delay slot */
3758             MIPS_DEBUG("bnever and skip");
3759             ctx->pc += 4;
3760             goto out;
3761         case OPC_J:
3762             ctx->hflags |= MIPS_HFLAG_B;
3763             MIPS_DEBUG("j " TARGET_FMT_lx, btgt);
3764             break;
3765         case OPC_JALXS:
3766         case OPC_JALX:
3767             ctx->hflags |= MIPS_HFLAG_BX;
3768             /* Fallthrough */
3769         case OPC_JALS:
3770         case OPC_JAL:
3771             blink = 31;
3772             ctx->hflags |= MIPS_HFLAG_B;
3773             ctx->hflags |= ((opc == OPC_JALS || opc == OPC_JALXS)
3774                             ? MIPS_HFLAG_BDS16
3775                             : MIPS_HFLAG_BDS32);
3776             MIPS_DEBUG("jal " TARGET_FMT_lx, btgt);
3777             break;
3778         case OPC_JR:
3779             ctx->hflags |= MIPS_HFLAG_BR;
3780             if (insn_bytes == 4)
3781                 ctx->hflags |= MIPS_HFLAG_BDS32;
3782             MIPS_DEBUG("jr %s", regnames[rs]);
3783             break;
3784         case OPC_JALRS:
3785         case OPC_JALR:
3786         case OPC_JALRC:
3787             blink = rt;
3788             ctx->hflags |= MIPS_HFLAG_BR;
3789             ctx->hflags |= (opc == OPC_JALRS
3790                             ? MIPS_HFLAG_BDS16
3791                             : MIPS_HFLAG_BDS32);
3792             MIPS_DEBUG("jalr %s, %s", regnames[rt], regnames[rs]);
3793             break;
3794         default:
3795             MIPS_INVAL("branch/jump");
3796             generate_exception(ctx, EXCP_RI);
3797             goto out;
3798         }
3799     } else {
3800         switch (opc) {
3801         case OPC_BEQ:
3802             tcg_gen_setcond_tl(TCG_COND_EQ, bcond, t0, t1);
3803             MIPS_DEBUG("beq %s, %s, " TARGET_FMT_lx,
3804                        regnames[rs], regnames[rt], btgt);
3805             goto not_likely;
3806         case OPC_BEQL:
3807             tcg_gen_setcond_tl(TCG_COND_EQ, bcond, t0, t1);
3808             MIPS_DEBUG("beql %s, %s, " TARGET_FMT_lx,
3809                        regnames[rs], regnames[rt], btgt);
3810             goto likely;
3811         case OPC_BNE:
3812             tcg_gen_setcond_tl(TCG_COND_NE, bcond, t0, t1);
3813             MIPS_DEBUG("bne %s, %s, " TARGET_FMT_lx,
3814                        regnames[rs], regnames[rt], btgt);
3815             goto not_likely;
3816         case OPC_BNEL:
3817             tcg_gen_setcond_tl(TCG_COND_NE, bcond, t0, t1);
3818             MIPS_DEBUG("bnel %s, %s, " TARGET_FMT_lx,
3819                        regnames[rs], regnames[rt], btgt);
3820             goto likely;
3821         case OPC_BGEZ:
3822             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
3823             MIPS_DEBUG("bgez %s, " TARGET_FMT_lx, regnames[rs], btgt);
3824             goto not_likely;
3825         case OPC_BGEZL:
3826             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
3827             MIPS_DEBUG("bgezl %s, " TARGET_FMT_lx, regnames[rs], btgt);
3828             goto likely;
3829         case OPC_BGEZALS:
3830         case OPC_BGEZAL:
3831             ctx->hflags |= (opc == OPC_BGEZALS
3832                             ? MIPS_HFLAG_BDS16
3833                             : MIPS_HFLAG_BDS32);
3834             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
3835             MIPS_DEBUG("bgezal %s, " TARGET_FMT_lx, regnames[rs], btgt);
3836             blink = 31;
3837             goto not_likely;
3838         case OPC_BGEZALL:
3839             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
3840             blink = 31;
3841             MIPS_DEBUG("bgezall %s, " TARGET_FMT_lx, regnames[rs], btgt);
3842             goto likely;
3843         case OPC_BGTZ:
3844             tcg_gen_setcondi_tl(TCG_COND_GT, bcond, t0, 0);
3845             MIPS_DEBUG("bgtz %s, " TARGET_FMT_lx, regnames[rs], btgt);
3846             goto not_likely;
3847         case OPC_BGTZL:
3848             tcg_gen_setcondi_tl(TCG_COND_GT, bcond, t0, 0);
3849             MIPS_DEBUG("bgtzl %s, " TARGET_FMT_lx, regnames[rs], btgt);
3850             goto likely;
3851         case OPC_BLEZ:
3852             tcg_gen_setcondi_tl(TCG_COND_LE, bcond, t0, 0);
3853             MIPS_DEBUG("blez %s, " TARGET_FMT_lx, regnames[rs], btgt);
3854             goto not_likely;
3855         case OPC_BLEZL:
3856             tcg_gen_setcondi_tl(TCG_COND_LE, bcond, t0, 0);
3857             MIPS_DEBUG("blezl %s, " TARGET_FMT_lx, regnames[rs], btgt);
3858             goto likely;
3859         case OPC_BLTZ:
3860             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
3861             MIPS_DEBUG("bltz %s, " TARGET_FMT_lx, regnames[rs], btgt);
3862             goto not_likely;
3863         case OPC_BLTZL:
3864             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
3865             MIPS_DEBUG("bltzl %s, " TARGET_FMT_lx, regnames[rs], btgt);
3866             goto likely;
3867         case OPC_BPOSGE32:
3868             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 32);
3869             MIPS_DEBUG("bposge32 " TARGET_FMT_lx, btgt);
3870             goto not_likely;
3871 #if defined(TARGET_MIPS64)
3872         case OPC_BPOSGE64:
3873             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 64);
3874             MIPS_DEBUG("bposge64 " TARGET_FMT_lx, btgt);
3875             goto not_likely;
3876 #endif
3877         case OPC_BLTZALS:
3878         case OPC_BLTZAL:
3879             ctx->hflags |= (opc == OPC_BLTZALS
3880                             ? MIPS_HFLAG_BDS16
3881                             : MIPS_HFLAG_BDS32);
3882             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
3883             blink = 31;
3884             MIPS_DEBUG("bltzal %s, " TARGET_FMT_lx, regnames[rs], btgt);
3885         not_likely:
3886             ctx->hflags |= MIPS_HFLAG_BC;
3887             break;
3888         case OPC_BLTZALL:
3889             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
3890             blink = 31;
3891             MIPS_DEBUG("bltzall %s, " TARGET_FMT_lx, regnames[rs], btgt);
3892         likely:
3893             ctx->hflags |= MIPS_HFLAG_BL;
3894             break;
3895         default:
3896             MIPS_INVAL("conditional branch/jump");
3897             generate_exception(ctx, EXCP_RI);
3898             goto out;
3899         }
3900     }
3901     MIPS_DEBUG("enter ds: link %d cond %02x target " TARGET_FMT_lx,
3902                blink, ctx->hflags, btgt);
3903
3904     ctx->btarget = btgt;
3905     if (blink > 0) {
3906         int post_delay = insn_bytes;
3907         int lowbit = !!(ctx->hflags & MIPS_HFLAG_M16);
3908
3909         if (opc != OPC_JALRC)
3910             post_delay += ((ctx->hflags & MIPS_HFLAG_BDS16) ? 2 : 4);
3911
3912         tcg_gen_movi_tl(cpu_gpr[blink], ctx->pc + post_delay + lowbit);
3913     }
3914
3915  out:
3916     if (insn_bytes == 2)
3917         ctx->hflags |= MIPS_HFLAG_B16;
3918     tcg_temp_free(t0);
3919     tcg_temp_free(t1);
3920 }
3921
3922 /* special3 bitfield operations */
3923 static void gen_bitops (DisasContext *ctx, uint32_t opc, int rt,
3924                         int rs, int lsb, int msb)
3925 {
3926     TCGv t0 = tcg_temp_new();
3927     TCGv t1 = tcg_temp_new();
3928     target_ulong mask;
3929
3930     gen_load_gpr(t1, rs);
3931     switch (opc) {
3932     case OPC_EXT:
3933         if (lsb + msb > 31)
3934             goto fail;
3935         tcg_gen_shri_tl(t0, t1, lsb);
3936         if (msb != 31) {
3937             tcg_gen_andi_tl(t0, t0, (1 << (msb + 1)) - 1);
3938         } else {
3939             tcg_gen_ext32s_tl(t0, t0);
3940         }
3941         break;
3942 #if defined(TARGET_MIPS64)
3943     case OPC_DEXTM:
3944         tcg_gen_shri_tl(t0, t1, lsb);
3945         if (msb != 31) {
3946             tcg_gen_andi_tl(t0, t0, (1ULL << (msb + 1 + 32)) - 1);
3947         }
3948         break;
3949     case OPC_DEXTU:
3950         tcg_gen_shri_tl(t0, t1, lsb + 32);
3951         tcg_gen_andi_tl(t0, t0, (1ULL << (msb + 1)) - 1);
3952         break;
3953     case OPC_DEXT:
3954         tcg_gen_shri_tl(t0, t1, lsb);
3955         tcg_gen_andi_tl(t0, t0, (1ULL << (msb + 1)) - 1);
3956         break;
3957 #endif
3958     case OPC_INS:
3959         if (lsb > msb)
3960             goto fail;
3961         mask = ((msb - lsb + 1 < 32) ? ((1 << (msb - lsb + 1)) - 1) : ~0) << lsb;
3962         gen_load_gpr(t0, rt);
3963         tcg_gen_andi_tl(t0, t0, ~mask);
3964         tcg_gen_shli_tl(t1, t1, lsb);
3965         tcg_gen_andi_tl(t1, t1, mask);
3966         tcg_gen_or_tl(t0, t0, t1);
3967         tcg_gen_ext32s_tl(t0, t0);
3968         break;
3969 #if defined(TARGET_MIPS64)
3970     case OPC_DINSM:
3971         if (lsb > msb)
3972             goto fail;
3973         mask = ((msb - lsb + 1 + 32 < 64) ? ((1ULL << (msb - lsb + 1 + 32)) - 1) : ~0ULL) << lsb;
3974         gen_load_gpr(t0, rt);
3975         tcg_gen_andi_tl(t0, t0, ~mask);
3976         tcg_gen_shli_tl(t1, t1, lsb);
3977         tcg_gen_andi_tl(t1, t1, mask);
3978         tcg_gen_or_tl(t0, t0, t1);
3979         break;
3980     case OPC_DINSU:
3981         if (lsb > msb)
3982             goto fail;
3983         mask = ((1ULL << (msb - lsb + 1)) - 1) << (lsb + 32);
3984         gen_load_gpr(t0, rt);
3985         tcg_gen_andi_tl(t0, t0, ~mask);
3986         tcg_gen_shli_tl(t1, t1, lsb + 32);
3987         tcg_gen_andi_tl(t1, t1, mask);
3988         tcg_gen_or_tl(t0, t0, t1);
3989         break;
3990     case OPC_DINS:
3991         if (lsb > msb)
3992             goto fail;
3993         gen_load_gpr(t0, rt);
3994         mask = ((1ULL << (msb - lsb + 1)) - 1) << lsb;
3995         gen_load_gpr(t0, rt);
3996         tcg_gen_andi_tl(t0, t0, ~mask);
3997         tcg_gen_shli_tl(t1, t1, lsb);
3998         tcg_gen_andi_tl(t1, t1, mask);
3999         tcg_gen_or_tl(t0, t0, t1);
4000         break;
4001 #endif
4002     default:
4003 fail:
4004         MIPS_INVAL("bitops");
4005         generate_exception(ctx, EXCP_RI);
4006         tcg_temp_free(t0);
4007         tcg_temp_free(t1);
4008         return;
4009     }
4010     gen_store_gpr(t0, rt);
4011     tcg_temp_free(t0);
4012     tcg_temp_free(t1);
4013 }
4014
4015 static void gen_bshfl (DisasContext *ctx, uint32_t op2, int rt, int rd)
4016 {
4017     TCGv t0;
4018
4019     if (rd == 0) {
4020         /* If no destination, treat it as a NOP. */
4021         MIPS_DEBUG("NOP");
4022         return;
4023     }
4024
4025     t0 = tcg_temp_new();
4026     gen_load_gpr(t0, rt);
4027     switch (op2) {
4028     case OPC_WSBH:
4029         {
4030             TCGv t1 = tcg_temp_new();
4031
4032             tcg_gen_shri_tl(t1, t0, 8);
4033             tcg_gen_andi_tl(t1, t1, 0x00FF00FF);
4034             tcg_gen_shli_tl(t0, t0, 8);
4035             tcg_gen_andi_tl(t0, t0, ~0x00FF00FF);
4036             tcg_gen_or_tl(t0, t0, t1);
4037             tcg_temp_free(t1);
4038             tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
4039         }
4040         break;
4041     case OPC_SEB:
4042         tcg_gen_ext8s_tl(cpu_gpr[rd], t0);
4043         break;
4044     case OPC_SEH:
4045         tcg_gen_ext16s_tl(cpu_gpr[rd], t0);
4046         break;
4047 #if defined(TARGET_MIPS64)
4048     case OPC_DSBH:
4049         {
4050             TCGv t1 = tcg_temp_new();
4051
4052             tcg_gen_shri_tl(t1, t0, 8);
4053             tcg_gen_andi_tl(t1, t1, 0x00FF00FF00FF00FFULL);
4054             tcg_gen_shli_tl(t0, t0, 8);
4055             tcg_gen_andi_tl(t0, t0, ~0x00FF00FF00FF00FFULL);
4056             tcg_gen_or_tl(cpu_gpr[rd], t0, t1);
4057             tcg_temp_free(t1);
4058         }
4059         break;
4060     case OPC_DSHD:
4061         {
4062             TCGv t1 = tcg_temp_new();
4063
4064             tcg_gen_shri_tl(t1, t0, 16);
4065             tcg_gen_andi_tl(t1, t1, 0x0000FFFF0000FFFFULL);
4066             tcg_gen_shli_tl(t0, t0, 16);
4067             tcg_gen_andi_tl(t0, t0, ~0x0000FFFF0000FFFFULL);
4068             tcg_gen_or_tl(t0, t0, t1);
4069             tcg_gen_shri_tl(t1, t0, 32);
4070             tcg_gen_shli_tl(t0, t0, 32);
4071             tcg_gen_or_tl(cpu_gpr[rd], t0, t1);
4072             tcg_temp_free(t1);
4073         }
4074         break;
4075 #endif
4076     default:
4077         MIPS_INVAL("bsfhl");
4078         generate_exception(ctx, EXCP_RI);
4079         tcg_temp_free(t0);
4080         return;
4081     }
4082     tcg_temp_free(t0);
4083 }
4084
4085 #ifndef CONFIG_USER_ONLY
4086 /* CP0 (MMU and control) */
4087 static inline void gen_mfc0_load32 (TCGv arg, target_ulong off)
4088 {
4089     TCGv_i32 t0 = tcg_temp_new_i32();
4090
4091     tcg_gen_ld_i32(t0, cpu_env, off);
4092     tcg_gen_ext_i32_tl(arg, t0);
4093     tcg_temp_free_i32(t0);
4094 }
4095
4096 static inline void gen_mfc0_load64 (TCGv arg, target_ulong off)
4097 {
4098     tcg_gen_ld_tl(arg, cpu_env, off);
4099     tcg_gen_ext32s_tl(arg, arg);
4100 }
4101
4102 static inline void gen_mtc0_store32 (TCGv arg, target_ulong off)
4103 {
4104     TCGv_i32 t0 = tcg_temp_new_i32();
4105
4106     tcg_gen_trunc_tl_i32(t0, arg);
4107     tcg_gen_st_i32(t0, cpu_env, off);
4108     tcg_temp_free_i32(t0);
4109 }
4110
4111 static inline void gen_mtc0_store64 (TCGv arg, target_ulong off)
4112 {
4113     tcg_gen_ext32s_tl(arg, arg);
4114     tcg_gen_st_tl(arg, cpu_env, off);
4115 }
4116
4117 static void gen_mfc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, int sel)
4118 {
4119     const char *rn = "invalid";
4120
4121     if (sel != 0)
4122         check_insn(env, ctx, ISA_MIPS32);
4123
4124     switch (reg) {
4125     case 0:
4126         switch (sel) {
4127         case 0:
4128             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Index));
4129             rn = "Index";
4130             break;
4131         case 1:
4132             check_insn(env, ctx, ASE_MT);
4133             gen_helper_mfc0_mvpcontrol(arg, cpu_env);
4134             rn = "MVPControl";
4135             break;
4136         case 2:
4137             check_insn(env, ctx, ASE_MT);
4138             gen_helper_mfc0_mvpconf0(arg, cpu_env);
4139             rn = "MVPConf0";
4140             break;
4141         case 3:
4142             check_insn(env, ctx, ASE_MT);
4143             gen_helper_mfc0_mvpconf1(arg, cpu_env);
4144             rn = "MVPConf1";
4145             break;
4146         default:
4147             goto die;
4148         }
4149         break;
4150     case 1:
4151         switch (sel) {
4152         case 0:
4153             gen_helper_mfc0_random(arg, cpu_env);
4154             rn = "Random";
4155             break;
4156         case 1:
4157             check_insn(env, ctx, ASE_MT);
4158             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEControl));
4159             rn = "VPEControl";
4160             break;
4161         case 2:
4162             check_insn(env, ctx, ASE_MT);
4163             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf0));
4164             rn = "VPEConf0";
4165             break;
4166         case 3:
4167             check_insn(env, ctx, ASE_MT);
4168             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf1));
4169             rn = "VPEConf1";
4170             break;
4171         case 4:
4172             check_insn(env, ctx, ASE_MT);
4173             gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_YQMask));
4174             rn = "YQMask";
4175             break;
4176         case 5:
4177             check_insn(env, ctx, ASE_MT);
4178             gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_VPESchedule));
4179             rn = "VPESchedule";
4180             break;
4181         case 6:
4182             check_insn(env, ctx, ASE_MT);
4183             gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_VPEScheFBack));
4184             rn = "VPEScheFBack";
4185             break;
4186         case 7:
4187             check_insn(env, ctx, ASE_MT);
4188             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEOpt));
4189             rn = "VPEOpt";
4190             break;
4191         default:
4192             goto die;
4193         }
4194         break;
4195     case 2:
4196         switch (sel) {
4197         case 0:
4198             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryLo0));
4199             tcg_gen_ext32s_tl(arg, arg);
4200             rn = "EntryLo0";
4201             break;
4202         case 1:
4203             check_insn(env, ctx, ASE_MT);
4204             gen_helper_mfc0_tcstatus(arg, cpu_env);
4205             rn = "TCStatus";
4206             break;
4207         case 2:
4208             check_insn(env, ctx, ASE_MT);
4209             gen_helper_mfc0_tcbind(arg, cpu_env);
4210             rn = "TCBind";
4211             break;
4212         case 3:
4213             check_insn(env, ctx, ASE_MT);
4214             gen_helper_mfc0_tcrestart(arg, cpu_env);
4215             rn = "TCRestart";
4216             break;
4217         case 4:
4218             check_insn(env, ctx, ASE_MT);
4219             gen_helper_mfc0_tchalt(arg, cpu_env);
4220             rn = "TCHalt";
4221             break;
4222         case 5:
4223             check_insn(env, ctx, ASE_MT);
4224             gen_helper_mfc0_tccontext(arg, cpu_env);
4225             rn = "TCContext";
4226             break;
4227         case 6:
4228             check_insn(env, ctx, ASE_MT);
4229             gen_helper_mfc0_tcschedule(arg, cpu_env);
4230             rn = "TCSchedule";
4231             break;
4232         case 7:
4233             check_insn(env, ctx, ASE_MT);
4234             gen_helper_mfc0_tcschefback(arg, cpu_env);
4235             rn = "TCScheFBack";
4236             break;
4237         default:
4238             goto die;
4239         }
4240         break;
4241     case 3:
4242         switch (sel) {
4243         case 0:
4244             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryLo1));
4245             tcg_gen_ext32s_tl(arg, arg);
4246             rn = "EntryLo1";
4247             break;
4248         default:
4249             goto die;
4250         }
4251         break;
4252     case 4:
4253         switch (sel) {
4254         case 0:
4255             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_Context));
4256             tcg_gen_ext32s_tl(arg, arg);
4257             rn = "Context";
4258             break;
4259         case 1:
4260 //            gen_helper_mfc0_contextconfig(arg); /* SmartMIPS ASE */
4261             rn = "ContextConfig";
4262 //            break;
4263         default:
4264             goto die;
4265         }
4266         break;
4267     case 5:
4268         switch (sel) {
4269         case 0:
4270             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageMask));
4271             rn = "PageMask";
4272             break;
4273         case 1:
4274             check_insn(env, ctx, ISA_MIPS32R2);
4275             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageGrain));
4276             rn = "PageGrain";
4277             break;
4278         default:
4279             goto die;
4280         }
4281         break;
4282     case 6:
4283         switch (sel) {
4284         case 0:
4285             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Wired));
4286             rn = "Wired";
4287             break;
4288         case 1:
4289             check_insn(env, ctx, ISA_MIPS32R2);
4290             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf0));
4291             rn = "SRSConf0";
4292             break;
4293         case 2:
4294             check_insn(env, ctx, ISA_MIPS32R2);
4295             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf1));
4296             rn = "SRSConf1";
4297             break;
4298         case 3:
4299             check_insn(env, ctx, ISA_MIPS32R2);
4300             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf2));
4301             rn = "SRSConf2";
4302             break;
4303         case 4:
4304             check_insn(env, ctx, ISA_MIPS32R2);
4305             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf3));
4306             rn = "SRSConf3";
4307             break;
4308         case 5:
4309             check_insn(env, ctx, ISA_MIPS32R2);
4310             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf4));
4311             rn = "SRSConf4";
4312             break;
4313         default:
4314             goto die;
4315         }
4316         break;
4317     case 7:
4318         switch (sel) {
4319         case 0:
4320             check_insn(env, ctx, ISA_MIPS32R2);
4321             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_HWREna));
4322             rn = "HWREna";
4323             break;
4324         default:
4325             goto die;
4326         }
4327         break;
4328     case 8:
4329         switch (sel) {
4330         case 0:
4331             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));
4332             tcg_gen_ext32s_tl(arg, arg);
4333             rn = "BadVAddr";
4334             break;
4335         default:
4336             goto die;
4337        }
4338         break;
4339     case 9:
4340         switch (sel) {
4341         case 0:
4342             /* Mark as an IO operation because we read the time.  */
4343             if (use_icount)
4344                 gen_io_start();
4345             gen_helper_mfc0_count(arg, cpu_env);
4346             if (use_icount) {
4347                 gen_io_end();
4348             }
4349             /* Break the TB to be able to take timer interrupts immediately
4350                after reading count.  */
4351             ctx->bstate = BS_STOP;
4352             rn = "Count";
4353             break;
4354         /* 6,7 are implementation dependent */
4355         default:
4356             goto die;
4357         }
4358         break;
4359     case 10:
4360         switch (sel) {
4361         case 0:
4362             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryHi));
4363             tcg_gen_ext32s_tl(arg, arg);
4364             rn = "EntryHi";
4365             break;
4366         default:
4367             goto die;
4368         }
4369         break;
4370     case 11:
4371         switch (sel) {
4372         case 0:
4373             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Compare));
4374             rn = "Compare";
4375             break;
4376         /* 6,7 are implementation dependent */
4377         default:
4378             goto die;
4379         }
4380         break;
4381     case 12:
4382         switch (sel) {
4383         case 0:
4384             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Status));
4385             rn = "Status";
4386             break;
4387         case 1:
4388             check_insn(env, ctx, ISA_MIPS32R2);
4389             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_IntCtl));
4390             rn = "IntCtl";
4391             break;
4392         case 2:
4393             check_insn(env, ctx, ISA_MIPS32R2);
4394             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSCtl));
4395             rn = "SRSCtl";
4396             break;
4397         case 3:
4398             check_insn(env, ctx, ISA_MIPS32R2);
4399             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
4400             rn = "SRSMap";
4401             break;
4402         default:
4403             goto die;
4404        }
4405         break;
4406     case 13:
4407         switch (sel) {
4408         case 0:
4409             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Cause));
4410             rn = "Cause";
4411             break;
4412         default:
4413             goto die;
4414        }
4415         break;
4416     case 14:
4417         switch (sel) {
4418         case 0:
4419             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
4420             tcg_gen_ext32s_tl(arg, arg);
4421             rn = "EPC";
4422             break;
4423         default:
4424             goto die;
4425         }
4426         break;
4427     case 15:
4428         switch (sel) {
4429         case 0:
4430             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PRid));
4431             rn = "PRid";
4432             break;
4433         case 1:
4434             check_insn(env, ctx, ISA_MIPS32R2);
4435             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_EBase));
4436             rn = "EBase";
4437             break;
4438         default:
4439             goto die;
4440        }
4441         break;
4442     case 16:
4443         switch (sel) {
4444         case 0:
4445             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config0));
4446             rn = "Config";
4447             break;
4448         case 1:
4449             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config1));
4450             rn = "Config1";
4451             break;
4452         case 2:
4453             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config2));
4454             rn = "Config2";
4455             break;
4456         case 3:
4457             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config3));
4458             rn = "Config3";
4459             break;
4460         /* 4,5 are reserved */
4461         /* 6,7 are implementation dependent */
4462         case 6:
4463             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config6));
4464             rn = "Config6";
4465             break;
4466         case 7:
4467             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config7));
4468             rn = "Config7";
4469             break;
4470         default:
4471             goto die;
4472         }
4473         break;
4474     case 17:
4475         switch (sel) {
4476         case 0:
4477             gen_helper_mfc0_lladdr(arg, cpu_env);
4478             rn = "LLAddr";
4479             break;
4480         default:
4481             goto die;
4482         }
4483         break;
4484     case 18:
4485         switch (sel) {
4486         case 0 ... 7:
4487             gen_helper_1e0i(mfc0_watchlo, arg, sel);
4488             rn = "WatchLo";
4489             break;
4490         default:
4491             goto die;
4492         }
4493         break;
4494     case 19:
4495         switch (sel) {
4496         case 0 ...7:
4497             gen_helper_1e0i(mfc0_watchhi, arg, sel);
4498             rn = "WatchHi";
4499             break;
4500         default:
4501             goto die;
4502         }
4503         break;
4504     case 20:
4505         switch (sel) {
4506         case 0:
4507 #if defined(TARGET_MIPS64)
4508             check_insn(env, ctx, ISA_MIPS3);
4509             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_XContext));
4510             tcg_gen_ext32s_tl(arg, arg);
4511             rn = "XContext";
4512             break;
4513 #endif
4514         default:
4515             goto die;
4516         }
4517         break;
4518     case 21:
4519        /* Officially reserved, but sel 0 is used for R1x000 framemask */
4520         switch (sel) {
4521         case 0:
4522             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Framemask));
4523             rn = "Framemask";
4524             break;
4525         default:
4526             goto die;
4527         }
4528         break;
4529     case 22:
4530         tcg_gen_movi_tl(arg, 0); /* unimplemented */
4531         rn = "'Diagnostic"; /* implementation dependent */
4532         break;
4533     case 23:
4534         switch (sel) {
4535         case 0:
4536             gen_helper_mfc0_debug(arg, cpu_env); /* EJTAG support */
4537             rn = "Debug";
4538             break;
4539         case 1:
4540 //            gen_helper_mfc0_tracecontrol(arg); /* PDtrace support */
4541             rn = "TraceControl";
4542 //            break;
4543         case 2:
4544 //            gen_helper_mfc0_tracecontrol2(arg); /* PDtrace support */
4545             rn = "TraceControl2";
4546 //            break;
4547         case 3:
4548 //            gen_helper_mfc0_usertracedata(arg); /* PDtrace support */
4549             rn = "UserTraceData";
4550 //            break;
4551         case 4:
4552 //            gen_helper_mfc0_tracebpc(arg); /* PDtrace support */
4553             rn = "TraceBPC";
4554 //            break;
4555         default:
4556             goto die;
4557         }
4558         break;
4559     case 24:
4560         switch (sel) {
4561         case 0:
4562             /* EJTAG support */
4563             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
4564             tcg_gen_ext32s_tl(arg, arg);
4565             rn = "DEPC";
4566             break;
4567         default:
4568             goto die;
4569         }
4570         break;
4571     case 25:
4572         switch (sel) {
4573         case 0:
4574             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Performance0));
4575             rn = "Performance0";
4576             break;
4577         case 1:
4578 //            gen_helper_mfc0_performance1(arg);
4579             rn = "Performance1";
4580 //            break;
4581         case 2:
4582 //            gen_helper_mfc0_performance2(arg);
4583             rn = "Performance2";
4584 //            break;
4585         case 3:
4586 //            gen_helper_mfc0_performance3(arg);
4587             rn = "Performance3";
4588 //            break;
4589         case 4:
4590 //            gen_helper_mfc0_performance4(arg);
4591             rn = "Performance4";
4592 //            break;
4593         case 5:
4594 //            gen_helper_mfc0_performance5(arg);
4595             rn = "Performance5";
4596 //            break;
4597         case 6:
4598 //            gen_helper_mfc0_performance6(arg);
4599             rn = "Performance6";
4600 //            break;
4601         case 7:
4602 //            gen_helper_mfc0_performance7(arg);
4603             rn = "Performance7";
4604 //            break;
4605         default:
4606             goto die;
4607         }
4608         break;
4609     case 26:
4610         tcg_gen_movi_tl(arg, 0); /* unimplemented */
4611         rn = "ECC";
4612         break;
4613     case 27:
4614         switch (sel) {
4615         case 0 ... 3:
4616             tcg_gen_movi_tl(arg, 0); /* unimplemented */
4617             rn = "CacheErr";
4618             break;
4619         default:
4620             goto die;
4621         }
4622         break;
4623     case 28:
4624         switch (sel) {
4625         case 0:
4626         case 2:
4627         case 4:
4628         case 6:
4629             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagLo));
4630             rn = "TagLo";
4631             break;
4632         case 1:
4633         case 3:
4634         case 5:
4635         case 7:
4636             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataLo));
4637             rn = "DataLo";
4638             break;
4639         default:
4640             goto die;
4641         }
4642         break;
4643     case 29:
4644         switch (sel) {
4645         case 0:
4646         case 2:
4647         case 4:
4648         case 6:
4649             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagHi));
4650             rn = "TagHi";
4651             break;
4652         case 1:
4653         case 3:
4654         case 5:
4655         case 7:
4656             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataHi));
4657             rn = "DataHi";
4658             break;
4659         default:
4660             goto die;
4661         }
4662         break;
4663     case 30:
4664         switch (sel) {
4665         case 0:
4666             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
4667             tcg_gen_ext32s_tl(arg, arg);
4668             rn = "ErrorEPC";
4669             break;
4670         default:
4671             goto die;
4672         }
4673         break;
4674     case 31:
4675         switch (sel) {
4676         case 0:
4677             /* EJTAG support */
4678             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
4679             rn = "DESAVE";
4680             break;
4681         default:
4682             goto die;
4683         }
4684         break;
4685     default:
4686        goto die;
4687     }
4688     (void)rn; /* avoid a compiler warning */
4689     LOG_DISAS("mfc0 %s (reg %d sel %d)\n", rn, reg, sel);
4690     return;
4691
4692 die:
4693     LOG_DISAS("mfc0 %s (reg %d sel %d)\n", rn, reg, sel);
4694     generate_exception(ctx, EXCP_RI);
4695 }
4696
4697 static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, int sel)
4698 {
4699     const char *rn = "invalid";
4700
4701     if (sel != 0)
4702         check_insn(env, ctx, ISA_MIPS32);
4703
4704     if (use_icount)
4705         gen_io_start();
4706
4707     switch (reg) {
4708     case 0:
4709         switch (sel) {
4710         case 0:
4711             gen_helper_mtc0_index(cpu_env, arg);
4712             rn = "Index";
4713             break;
4714         case 1:
4715             check_insn(env, ctx, ASE_MT);
4716             gen_helper_mtc0_mvpcontrol(cpu_env, arg);
4717             rn = "MVPControl";
4718             break;
4719         case 2:
4720             check_insn(env, ctx, ASE_MT);
4721             /* ignored */
4722             rn = "MVPConf0";
4723             break;
4724         case 3:
4725             check_insn(env, ctx, ASE_MT);
4726             /* ignored */
4727             rn = "MVPConf1";
4728             break;
4729         default:
4730             goto die;
4731         }
4732         break;
4733     case 1:
4734         switch (sel) {
4735         case 0:
4736             /* ignored */
4737             rn = "Random";
4738             break;
4739         case 1:
4740             check_insn(env, ctx, ASE_MT);
4741             gen_helper_mtc0_vpecontrol(cpu_env, arg);
4742             rn = "VPEControl";
4743             break;
4744         case 2:
4745             check_insn(env, ctx, ASE_MT);
4746             gen_helper_mtc0_vpeconf0(cpu_env, arg);
4747             rn = "VPEConf0";
4748             break;
4749         case 3:
4750             check_insn(env, ctx, ASE_MT);
4751             gen_helper_mtc0_vpeconf1(cpu_env, arg);
4752             rn = "VPEConf1";
4753             break;
4754         case 4:
4755             check_insn(env, ctx, ASE_MT);
4756             gen_helper_mtc0_yqmask(cpu_env, arg);
4757             rn = "YQMask";
4758             break;
4759         case 5:
4760             check_insn(env, ctx, ASE_MT);
4761             gen_mtc0_store64(arg, offsetof(CPUMIPSState, CP0_VPESchedule));
4762             rn = "VPESchedule";
4763             break;
4764         case 6:
4765             check_insn(env, ctx, ASE_MT);
4766             gen_mtc0_store64(arg, offsetof(CPUMIPSState, CP0_VPEScheFBack));
4767             rn = "VPEScheFBack";
4768             break;
4769         case 7:
4770             check_insn(env, ctx, ASE_MT);
4771             gen_helper_mtc0_vpeopt(cpu_env, arg);
4772             rn = "VPEOpt";
4773             break;
4774         default:
4775             goto die;
4776         }
4777         break;
4778     case 2:
4779         switch (sel) {
4780         case 0:
4781             gen_helper_mtc0_entrylo0(cpu_env, arg);
4782             rn = "EntryLo0";
4783             break;
4784         case 1:
4785             check_insn(env, ctx, ASE_MT);
4786             gen_helper_mtc0_tcstatus(cpu_env, arg);
4787             rn = "TCStatus";
4788             break;
4789         case 2:
4790             check_insn(env, ctx, ASE_MT);
4791             gen_helper_mtc0_tcbind(cpu_env, arg);
4792             rn = "TCBind";
4793             break;
4794         case 3:
4795             check_insn(env, ctx, ASE_MT);
4796             gen_helper_mtc0_tcrestart(cpu_env, arg);
4797             rn = "TCRestart";
4798             break;
4799         case 4:
4800             check_insn(env, ctx, ASE_MT);
4801             gen_helper_mtc0_tchalt(cpu_env, arg);
4802             rn = "TCHalt";
4803             break;
4804         case 5:
4805             check_insn(env, ctx, ASE_MT);
4806             gen_helper_mtc0_tccontext(cpu_env, arg);
4807             rn = "TCContext";
4808             break;
4809         case 6:
4810             check_insn(env, ctx, ASE_MT);
4811             gen_helper_mtc0_tcschedule(cpu_env, arg);
4812             rn = "TCSchedule";
4813             break;
4814         case 7:
4815             check_insn(env, ctx, ASE_MT);
4816             gen_helper_mtc0_tcschefback(cpu_env, arg);
4817             rn = "TCScheFBack";
4818             break;
4819         default:
4820             goto die;
4821         }
4822         break;
4823     case 3:
4824         switch (sel) {
4825         case 0:
4826             gen_helper_mtc0_entrylo1(cpu_env, arg);
4827             rn = "EntryLo1";
4828             break;
4829         default:
4830             goto die;
4831         }
4832         break;
4833     case 4:
4834         switch (sel) {
4835         case 0:
4836             gen_helper_mtc0_context(cpu_env, arg);
4837             rn = "Context";
4838             break;
4839         case 1:
4840 //            gen_helper_mtc0_contextconfig(cpu_env, arg); /* SmartMIPS ASE */
4841             rn = "ContextConfig";
4842 //            break;
4843         default:
4844             goto die;
4845         }
4846         break;
4847     case 5:
4848         switch (sel) {
4849         case 0:
4850             gen_helper_mtc0_pagemask(cpu_env, arg);
4851             rn = "PageMask";
4852             break;
4853         case 1:
4854             check_insn(env, ctx, ISA_MIPS32R2);
4855             gen_helper_mtc0_pagegrain(cpu_env, arg);
4856             rn = "PageGrain";
4857             break;
4858         default:
4859             goto die;
4860         }
4861         break;
4862     case 6:
4863         switch (sel) {
4864         case 0:
4865             gen_helper_mtc0_wired(cpu_env, arg);
4866             rn = "Wired";
4867             break;
4868         case 1:
4869             check_insn(env, ctx, ISA_MIPS32R2);
4870             gen_helper_mtc0_srsconf0(cpu_env, arg);
4871             rn = "SRSConf0";
4872             break;
4873         case 2:
4874             check_insn(env, ctx, ISA_MIPS32R2);
4875             gen_helper_mtc0_srsconf1(cpu_env, arg);
4876             rn = "SRSConf1";
4877             break;
4878         case 3:
4879             check_insn(env, ctx, ISA_MIPS32R2);
4880             gen_helper_mtc0_srsconf2(cpu_env, arg);
4881             rn = "SRSConf2";
4882             break;
4883         case 4:
4884             check_insn(env, ctx, ISA_MIPS32R2);
4885             gen_helper_mtc0_srsconf3(cpu_env, arg);
4886             rn = "SRSConf3";
4887             break;
4888         case 5:
4889             check_insn(env, ctx, ISA_MIPS32R2);
4890             gen_helper_mtc0_srsconf4(cpu_env, arg);
4891             rn = "SRSConf4";
4892             break;
4893         default:
4894             goto die;
4895         }
4896         break;
4897     case 7:
4898         switch (sel) {
4899         case 0:
4900             check_insn(env, ctx, ISA_MIPS32R2);
4901             gen_helper_mtc0_hwrena(cpu_env, arg);
4902             rn = "HWREna";
4903             break;
4904         default:
4905             goto die;
4906         }
4907         break;
4908     case 8:
4909         /* ignored */
4910         rn = "BadVAddr";
4911         break;
4912     case 9:
4913         switch (sel) {
4914         case 0:
4915             gen_helper_mtc0_count(cpu_env, arg);
4916             rn = "Count";
4917             break;
4918         /* 6,7 are implementation dependent */
4919         default:
4920             goto die;
4921         }
4922         break;
4923     case 10:
4924         switch (sel) {
4925         case 0:
4926             gen_helper_mtc0_entryhi(cpu_env, arg);
4927             rn = "EntryHi";
4928             break;
4929         default:
4930             goto die;
4931         }
4932         break;
4933     case 11:
4934         switch (sel) {
4935         case 0:
4936             gen_helper_mtc0_compare(cpu_env, arg);
4937             rn = "Compare";
4938             break;
4939         /* 6,7 are implementation dependent */
4940         default:
4941             goto die;
4942         }
4943         break;
4944     case 12:
4945         switch (sel) {
4946         case 0:
4947             save_cpu_state(ctx, 1);
4948             gen_helper_mtc0_status(cpu_env, arg);
4949             /* BS_STOP isn't good enough here, hflags may have changed. */
4950             gen_save_pc(ctx->pc + 4);
4951             ctx->bstate = BS_EXCP;
4952             rn = "Status";
4953             break;
4954         case 1:
4955             check_insn(env, ctx, ISA_MIPS32R2);
4956             gen_helper_mtc0_intctl(cpu_env, arg);
4957             /* Stop translation as we may have switched the execution mode */
4958             ctx->bstate = BS_STOP;
4959             rn = "IntCtl";
4960             break;
4961         case 2:
4962             check_insn(env, ctx, ISA_MIPS32R2);
4963             gen_helper_mtc0_srsctl(cpu_env, arg);
4964             /* Stop translation as we may have switched the execution mode */
4965             ctx->bstate = BS_STOP;
4966             rn = "SRSCtl";
4967             break;
4968         case 3:
4969             check_insn(env, ctx, ISA_MIPS32R2);
4970             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
4971             /* Stop translation as we may have switched the execution mode */
4972             ctx->bstate = BS_STOP;
4973             rn = "SRSMap";
4974             break;
4975         default:
4976             goto die;
4977         }
4978         break;
4979     case 13:
4980         switch (sel) {
4981         case 0:
4982             save_cpu_state(ctx, 1);
4983             gen_helper_mtc0_cause(cpu_env, arg);
4984             rn = "Cause";
4985             break;
4986         default:
4987             goto die;
4988         }
4989         break;
4990     case 14:
4991         switch (sel) {
4992         case 0:
4993             gen_mtc0_store64(arg, offsetof(CPUMIPSState, CP0_EPC));
4994             rn = "EPC";
4995             break;
4996         default:
4997             goto die;
4998         }
4999         break;
5000     case 15:
5001         switch (sel) {
5002         case 0:
5003             /* ignored */
5004             rn = "PRid";
5005             break;
5006         case 1:
5007             check_insn(env, ctx, ISA_MIPS32R2);
5008             gen_helper_mtc0_ebase(cpu_env, arg);
5009             rn = "EBase";
5010             break;
5011         default:
5012             goto die;
5013         }
5014         break;
5015     case 16:
5016         switch (sel) {
5017         case 0:
5018             gen_helper_mtc0_config0(cpu_env, arg);
5019             rn = "Config";
5020             /* Stop translation as we may have switched the execution mode */
5021             ctx->bstate = BS_STOP;
5022             break;
5023         case 1:
5024             /* ignored, read only */
5025             rn = "Config1";
5026             break;
5027         case 2:
5028             gen_helper_mtc0_config2(cpu_env, arg);
5029             rn = "Config2";
5030             /* Stop translation as we may have switched the execution mode */
5031             ctx->bstate = BS_STOP;
5032             break;
5033         case 3:
5034             /* ignored, read only */
5035             rn = "Config3";
5036             break;
5037         /* 4,5 are reserved */
5038         /* 6,7 are implementation dependent */
5039         case 6:
5040             /* ignored */
5041             rn = "Config6";
5042             break;
5043         case 7:
5044             /* ignored */
5045             rn = "Config7";
5046             break;
5047         default:
5048             rn = "Invalid config selector";
5049             goto die;
5050         }
5051         break;
5052     case 17:
5053         switch (sel) {
5054         case 0:
5055             gen_helper_mtc0_lladdr(cpu_env, arg);
5056             rn = "LLAddr";
5057             break;
5058         default:
5059             goto die;
5060         }
5061         break;
5062     case 18:
5063         switch (sel) {
5064         case 0 ... 7:
5065             gen_helper_0e1i(mtc0_watchlo, arg, sel);
5066             rn = "WatchLo";
5067             break;
5068         default:
5069             goto die;
5070         }
5071         break;
5072     case 19:
5073         switch (sel) {
5074         case 0 ... 7:
5075             gen_helper_0e1i(mtc0_watchhi, arg, sel);
5076             rn = "WatchHi";
5077             break;
5078         default:
5079             goto die;
5080         }
5081         break;
5082     case 20:
5083         switch (sel) {
5084         case 0:
5085 #if defined(TARGET_MIPS64)
5086             check_insn(env, ctx, ISA_MIPS3);
5087             gen_helper_mtc0_xcontext(cpu_env, arg);
5088             rn = "XContext";
5089             break;
5090 #endif
5091         default:
5092             goto die;
5093         }
5094         break;
5095     case 21:
5096        /* Officially reserved, but sel 0 is used for R1x000 framemask */
5097         switch (sel) {
5098         case 0:
5099             gen_helper_mtc0_framemask(cpu_env, arg);
5100             rn = "Framemask";
5101             break;
5102         default:
5103             goto die;
5104         }
5105         break;
5106     case 22:
5107         /* ignored */
5108         rn = "Diagnostic"; /* implementation dependent */
5109         break;
5110     case 23:
5111         switch (sel) {
5112         case 0:
5113             gen_helper_mtc0_debug(cpu_env, arg); /* EJTAG support */
5114             /* BS_STOP isn't good enough here, hflags may have changed. */
5115             gen_save_pc(ctx->pc + 4);
5116             ctx->bstate = BS_EXCP;
5117             rn = "Debug";
5118             break;
5119         case 1:
5120 //            gen_helper_mtc0_tracecontrol(cpu_env, arg); /* PDtrace support */
5121             rn = "TraceControl";
5122             /* Stop translation as we may have switched the execution mode */
5123             ctx->bstate = BS_STOP;
5124 //            break;
5125         case 2:
5126 //            gen_helper_mtc0_tracecontrol2(cpu_env, arg); /* PDtrace support */
5127             rn = "TraceControl2";
5128             /* Stop translation as we may have switched the execution mode */
5129             ctx->bstate = BS_STOP;
5130 //            break;
5131         case 3:
5132             /* Stop translation as we may have switched the execution mode */
5133             ctx->bstate = BS_STOP;
5134 //            gen_helper_mtc0_usertracedata(cpu_env, arg); /* PDtrace support */
5135             rn = "UserTraceData";
5136             /* Stop translation as we may have switched the execution mode */
5137             ctx->bstate = BS_STOP;
5138 //            break;
5139         case 4:
5140 //            gen_helper_mtc0_tracebpc(cpu_env, arg); /* PDtrace support */
5141             /* Stop translation as we may have switched the execution mode */
5142             ctx->bstate = BS_STOP;
5143             rn = "TraceBPC";
5144 //            break;
5145         default:
5146             goto die;
5147         }
5148         break;
5149     case 24:
5150         switch (sel) {
5151         case 0:
5152             /* EJTAG support */
5153             gen_mtc0_store64(arg, offsetof(CPUMIPSState, CP0_DEPC));
5154             rn = "DEPC";
5155             break;
5156         default:
5157             goto die;
5158         }
5159         break;
5160     case 25:
5161         switch (sel) {
5162         case 0:
5163             gen_helper_mtc0_performance0(cpu_env, arg);
5164             rn = "Performance0";
5165             break;
5166         case 1:
5167 //            gen_helper_mtc0_performance1(arg);
5168             rn = "Performance1";
5169 //            break;
5170         case 2:
5171 //            gen_helper_mtc0_performance2(arg);
5172             rn = "Performance2";
5173 //            break;
5174         case 3:
5175 //            gen_helper_mtc0_performance3(arg);
5176             rn = "Performance3";
5177 //            break;
5178         case 4:
5179 //            gen_helper_mtc0_performance4(arg);
5180             rn = "Performance4";
5181 //            break;
5182         case 5:
5183 //            gen_helper_mtc0_performance5(arg);
5184             rn = "Performance5";
5185 //            break;
5186         case 6:
5187 //            gen_helper_mtc0_performance6(arg);
5188             rn = "Performance6";
5189 //            break;
5190         case 7:
5191 //            gen_helper_mtc0_performance7(arg);
5192             rn = "Performance7";
5193 //            break;
5194         default:
5195             goto die;
5196         }
5197        break;
5198     case 26:
5199         /* ignored */
5200         rn = "ECC";
5201         break;
5202     case 27:
5203         switch (sel) {
5204         case 0 ... 3:
5205             /* ignored */
5206             rn = "CacheErr";
5207             break;
5208         default:
5209             goto die;
5210         }
5211        break;
5212     case 28:
5213         switch (sel) {
5214         case 0:
5215         case 2:
5216         case 4:
5217         case 6:
5218             gen_helper_mtc0_taglo(cpu_env, arg);
5219             rn = "TagLo";
5220             break;
5221         case 1:
5222         case 3:
5223         case 5:
5224         case 7:
5225             gen_helper_mtc0_datalo(cpu_env, arg);
5226             rn = "DataLo";
5227             break;
5228         default:
5229             goto die;
5230         }
5231         break;
5232     case 29:
5233         switch (sel) {
5234         case 0:
5235         case 2:
5236         case 4:
5237         case 6:
5238             gen_helper_mtc0_taghi(cpu_env, arg);
5239             rn = "TagHi";
5240             break;
5241         case 1:
5242         case 3:
5243         case 5:
5244         case 7:
5245             gen_helper_mtc0_datahi(cpu_env, arg);
5246             rn = "DataHi";
5247             break;
5248         default:
5249             rn = "invalid sel";
5250             goto die;
5251         }
5252        break;
5253     case 30:
5254         switch (sel) {
5255         case 0:
5256             gen_mtc0_store64(arg, offsetof(CPUMIPSState, CP0_ErrorEPC));
5257             rn = "ErrorEPC";
5258             break;
5259         default:
5260             goto die;
5261         }
5262         break;
5263     case 31:
5264         switch (sel) {
5265         case 0:
5266             /* EJTAG support */
5267             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
5268             rn = "DESAVE";
5269             break;
5270         default:
5271             goto die;
5272         }
5273         /* Stop translation as we may have switched the execution mode */
5274         ctx->bstate = BS_STOP;
5275         break;
5276     default:
5277        goto die;
5278     }
5279     (void)rn; /* avoid a compiler warning */
5280     LOG_DISAS("mtc0 %s (reg %d sel %d)\n", rn, reg, sel);
5281     /* For simplicity assume that all writes can cause interrupts.  */
5282     if (use_icount) {
5283         gen_io_end();
5284         ctx->bstate = BS_STOP;
5285     }
5286     return;
5287
5288 die:
5289     LOG_DISAS("mtc0 %s (reg %d sel %d)\n", rn, reg, sel);
5290     generate_exception(ctx, EXCP_RI);
5291 }
5292
5293 #if defined(TARGET_MIPS64)
5294 static void gen_dmfc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, int sel)
5295 {
5296     const char *rn = "invalid";
5297
5298     if (sel != 0)
5299         check_insn(env, ctx, ISA_MIPS64);
5300
5301     switch (reg) {
5302     case 0:
5303         switch (sel) {
5304         case 0:
5305             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Index));
5306             rn = "Index";
5307             break;
5308         case 1:
5309             check_insn(env, ctx, ASE_MT);
5310             gen_helper_mfc0_mvpcontrol(arg, cpu_env);
5311             rn = "MVPControl";
5312             break;
5313         case 2:
5314             check_insn(env, ctx, ASE_MT);
5315             gen_helper_mfc0_mvpconf0(arg, cpu_env);
5316             rn = "MVPConf0";
5317             break;
5318         case 3:
5319             check_insn(env, ctx, ASE_MT);
5320             gen_helper_mfc0_mvpconf1(arg, cpu_env);
5321             rn = "MVPConf1";
5322             break;
5323         default:
5324             goto die;
5325         }
5326         break;
5327     case 1:
5328         switch (sel) {
5329         case 0:
5330             gen_helper_mfc0_random(arg, cpu_env);
5331             rn = "Random";
5332             break;
5333         case 1:
5334             check_insn(env, ctx, ASE_MT);
5335             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEControl));
5336             rn = "VPEControl";
5337             break;
5338         case 2:
5339             check_insn(env, ctx, ASE_MT);
5340             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf0));
5341             rn = "VPEConf0";
5342             break;
5343         case 3:
5344             check_insn(env, ctx, ASE_MT);
5345             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf1));
5346             rn = "VPEConf1";
5347             break;
5348         case 4:
5349             check_insn(env, ctx, ASE_MT);
5350             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_YQMask));
5351             rn = "YQMask";
5352             break;
5353         case 5:
5354             check_insn(env, ctx, ASE_MT);
5355             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPESchedule));
5356             rn = "VPESchedule";
5357             break;
5358         case 6:
5359             check_insn(env, ctx, ASE_MT);
5360             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPEScheFBack));
5361             rn = "VPEScheFBack";
5362             break;
5363         case 7:
5364             check_insn(env, ctx, ASE_MT);
5365             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEOpt));
5366             rn = "VPEOpt";
5367             break;
5368         default:
5369             goto die;
5370         }
5371         break;
5372     case 2:
5373         switch (sel) {
5374         case 0:
5375             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryLo0));
5376             rn = "EntryLo0";
5377             break;
5378         case 1:
5379             check_insn(env, ctx, ASE_MT);
5380             gen_helper_mfc0_tcstatus(arg, cpu_env);
5381             rn = "TCStatus";
5382             break;
5383         case 2:
5384             check_insn(env, ctx, ASE_MT);
5385             gen_helper_mfc0_tcbind(arg, cpu_env);
5386             rn = "TCBind";
5387             break;
5388         case 3:
5389             check_insn(env, ctx, ASE_MT);
5390             gen_helper_dmfc0_tcrestart(arg, cpu_env);
5391             rn = "TCRestart";
5392             break;
5393         case 4:
5394             check_insn(env, ctx, ASE_MT);
5395             gen_helper_dmfc0_tchalt(arg, cpu_env);
5396             rn = "TCHalt";
5397             break;
5398         case 5:
5399             check_insn(env, ctx, ASE_MT);
5400             gen_helper_dmfc0_tccontext(arg, cpu_env);
5401             rn = "TCContext";
5402             break;
5403         case 6:
5404             check_insn(env, ctx, ASE_MT);
5405             gen_helper_dmfc0_tcschedule(arg, cpu_env);
5406             rn = "TCSchedule";
5407             break;
5408         case 7:
5409             check_insn(env, ctx, ASE_MT);
5410             gen_helper_dmfc0_tcschefback(arg, cpu_env);
5411             rn = "TCScheFBack";
5412             break;
5413         default:
5414             goto die;
5415         }
5416         break;
5417     case 3:
5418         switch (sel) {
5419         case 0:
5420             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryLo1));
5421             rn = "EntryLo1";
5422             break;
5423         default:
5424             goto die;
5425         }
5426         break;
5427     case 4:
5428         switch (sel) {
5429         case 0:
5430             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_Context));
5431             rn = "Context";
5432             break;
5433         case 1:
5434 //            gen_helper_dmfc0_contextconfig(arg); /* SmartMIPS ASE */
5435             rn = "ContextConfig";
5436 //            break;
5437         default:
5438             goto die;
5439         }
5440         break;
5441     case 5:
5442         switch (sel) {
5443         case 0:
5444             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageMask));
5445             rn = "PageMask";
5446             break;
5447         case 1:
5448             check_insn(env, ctx, ISA_MIPS32R2);
5449             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageGrain));
5450             rn = "PageGrain";
5451             break;
5452         default:
5453             goto die;
5454         }
5455         break;
5456     case 6:
5457         switch (sel) {
5458         case 0:
5459             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Wired));
5460             rn = "Wired";
5461             break;
5462         case 1:
5463             check_insn(env, ctx, ISA_MIPS32R2);
5464             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf0));
5465             rn = "SRSConf0";
5466             break;
5467         case 2:
5468             check_insn(env, ctx, ISA_MIPS32R2);
5469             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf1));
5470             rn = "SRSConf1";
5471             break;
5472         case 3:
5473             check_insn(env, ctx, ISA_MIPS32R2);
5474             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf2));
5475             rn = "SRSConf2";
5476             break;
5477         case 4:
5478             check_insn(env, ctx, ISA_MIPS32R2);
5479             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf3));
5480             rn = "SRSConf3";
5481             break;
5482         case 5:
5483             check_insn(env, ctx, ISA_MIPS32R2);
5484             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf4));
5485             rn = "SRSConf4";
5486             break;
5487         default:
5488             goto die;
5489         }
5490         break;
5491     case 7:
5492         switch (sel) {
5493         case 0:
5494             check_insn(env, ctx, ISA_MIPS32R2);
5495             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_HWREna));
5496             rn = "HWREna";
5497             break;
5498         default:
5499             goto die;
5500         }
5501         break;
5502     case 8:
5503         switch (sel) {
5504         case 0:
5505             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));
5506             rn = "BadVAddr";
5507             break;
5508         default:
5509             goto die;
5510         }
5511         break;
5512     case 9:
5513         switch (sel) {
5514         case 0:
5515             /* Mark as an IO operation because we read the time.  */
5516             if (use_icount)
5517                 gen_io_start();
5518             gen_helper_mfc0_count(arg, cpu_env);
5519             if (use_icount) {
5520                 gen_io_end();
5521             }
5522             /* Break the TB to be able to take timer interrupts immediately
5523                after reading count.  */
5524             ctx->bstate = BS_STOP;
5525             rn = "Count";
5526             break;
5527         /* 6,7 are implementation dependent */
5528         default:
5529             goto die;
5530         }
5531         break;
5532     case 10:
5533         switch (sel) {
5534         case 0:
5535             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryHi));
5536             rn = "EntryHi";
5537             break;
5538         default:
5539             goto die;
5540         }
5541         break;
5542     case 11:
5543         switch (sel) {
5544         case 0:
5545             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Compare));
5546             rn = "Compare";
5547             break;
5548         /* 6,7 are implementation dependent */
5549         default:
5550             goto die;
5551         }
5552         break;
5553     case 12:
5554         switch (sel) {
5555         case 0:
5556             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Status));
5557             rn = "Status";
5558             break;
5559         case 1:
5560             check_insn(env, ctx, ISA_MIPS32R2);
5561             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_IntCtl));
5562             rn = "IntCtl";
5563             break;
5564         case 2:
5565             check_insn(env, ctx, ISA_MIPS32R2);
5566             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSCtl));
5567             rn = "SRSCtl";
5568             break;
5569         case 3:
5570             check_insn(env, ctx, ISA_MIPS32R2);
5571             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
5572             rn = "SRSMap";
5573             break;
5574         default:
5575             goto die;
5576         }
5577         break;
5578     case 13:
5579         switch (sel) {
5580         case 0:
5581             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Cause));
5582             rn = "Cause";
5583             break;
5584         default:
5585             goto die;
5586         }
5587         break;
5588     case 14:
5589         switch (sel) {
5590         case 0:
5591             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
5592             rn = "EPC";
5593             break;
5594         default:
5595             goto die;
5596         }
5597         break;
5598     case 15:
5599         switch (sel) {
5600         case 0:
5601             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PRid));
5602             rn = "PRid";
5603             break;
5604         case 1:
5605             check_insn(env, ctx, ISA_MIPS32R2);
5606             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_EBase));
5607             rn = "EBase";
5608             break;
5609         default:
5610             goto die;
5611         }
5612         break;
5613     case 16:
5614         switch (sel) {
5615         case 0:
5616             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config0));
5617             rn = "Config";
5618             break;
5619         case 1:
5620             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config1));
5621             rn = "Config1";
5622             break;
5623         case 2:
5624             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config2));
5625             rn = "Config2";
5626             break;
5627         case 3:
5628             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config3));
5629             rn = "Config3";
5630             break;
5631        /* 6,7 are implementation dependent */
5632         case 6:
5633             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config6));
5634             rn = "Config6";
5635             break;
5636         case 7:
5637             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config7));
5638             rn = "Config7";
5639             break;
5640         default:
5641             goto die;
5642         }
5643         break;
5644     case 17:
5645         switch (sel) {
5646         case 0:
5647             gen_helper_dmfc0_lladdr(arg, cpu_env);
5648             rn = "LLAddr";
5649             break;
5650         default:
5651             goto die;
5652         }
5653         break;
5654     case 18:
5655         switch (sel) {
5656         case 0 ... 7:
5657             gen_helper_1e0i(dmfc0_watchlo, arg, sel);
5658             rn = "WatchLo";
5659             break;
5660         default:
5661             goto die;
5662         }
5663         break;
5664     case 19:
5665         switch (sel) {
5666         case 0 ... 7:
5667             gen_helper_1e0i(mfc0_watchhi, arg, sel);
5668             rn = "WatchHi";
5669             break;
5670         default:
5671             goto die;
5672         }
5673         break;
5674     case 20:
5675         switch (sel) {
5676         case 0:
5677             check_insn(env, ctx, ISA_MIPS3);
5678             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_XContext));
5679             rn = "XContext";
5680             break;
5681         default:
5682             goto die;
5683         }
5684         break;
5685     case 21:
5686        /* Officially reserved, but sel 0 is used for R1x000 framemask */
5687         switch (sel) {
5688         case 0:
5689             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Framemask));
5690             rn = "Framemask";
5691             break;
5692         default:
5693             goto die;
5694         }
5695         break;
5696     case 22:
5697         tcg_gen_movi_tl(arg, 0); /* unimplemented */
5698         rn = "'Diagnostic"; /* implementation dependent */
5699         break;
5700     case 23:
5701         switch (sel) {
5702         case 0:
5703             gen_helper_mfc0_debug(arg, cpu_env); /* EJTAG support */
5704             rn = "Debug";
5705             break;
5706         case 1:
5707 //            gen_helper_dmfc0_tracecontrol(arg, cpu_env); /* PDtrace support */
5708             rn = "TraceControl";
5709 //            break;
5710         case 2:
5711 //            gen_helper_dmfc0_tracecontrol2(arg, cpu_env); /* PDtrace support */
5712             rn = "TraceControl2";
5713 //            break;
5714         case 3:
5715 //            gen_helper_dmfc0_usertracedata(arg, cpu_env); /* PDtrace support */
5716             rn = "UserTraceData";
5717 //            break;
5718         case 4:
5719 //            gen_helper_dmfc0_tracebpc(arg, cpu_env); /* PDtrace support */
5720             rn = "TraceBPC";
5721 //            break;
5722         default:
5723             goto die;
5724         }
5725         break;
5726     case 24:
5727         switch (sel) {
5728         case 0:
5729             /* EJTAG support */
5730             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
5731             rn = "DEPC";
5732             break;
5733         default:
5734             goto die;
5735         }
5736         break;
5737     case 25:
5738         switch (sel) {
5739         case 0:
5740             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Performance0));
5741             rn = "Performance0";
5742             break;
5743         case 1:
5744 //            gen_helper_dmfc0_performance1(arg);
5745             rn = "Performance1";
5746 //            break;
5747         case 2:
5748 //            gen_helper_dmfc0_performance2(arg);
5749             rn = "Performance2";
5750 //            break;
5751         case 3:
5752 //            gen_helper_dmfc0_performance3(arg);
5753             rn = "Performance3";
5754 //            break;
5755         case 4:
5756 //            gen_helper_dmfc0_performance4(arg);
5757             rn = "Performance4";
5758 //            break;
5759         case 5:
5760 //            gen_helper_dmfc0_performance5(arg);
5761             rn = "Performance5";
5762 //            break;
5763         case 6:
5764 //            gen_helper_dmfc0_performance6(arg);
5765             rn = "Performance6";
5766 //            break;
5767         case 7:
5768 //            gen_helper_dmfc0_performance7(arg);
5769             rn = "Performance7";
5770 //            break;
5771         default:
5772             goto die;
5773         }
5774         break;
5775     case 26:
5776         tcg_gen_movi_tl(arg, 0); /* unimplemented */
5777         rn = "ECC";
5778         break;
5779     case 27:
5780         switch (sel) {
5781         /* ignored */
5782         case 0 ... 3:
5783             tcg_gen_movi_tl(arg, 0); /* unimplemented */
5784             rn = "CacheErr";
5785             break;
5786         default:
5787             goto die;
5788         }
5789         break;
5790     case 28:
5791         switch (sel) {
5792         case 0:
5793         case 2:
5794         case 4:
5795         case 6:
5796             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagLo));
5797             rn = "TagLo";
5798             break;
5799         case 1:
5800         case 3:
5801         case 5:
5802         case 7:
5803             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataLo));
5804             rn = "DataLo";
5805             break;
5806         default:
5807             goto die;
5808         }
5809         break;
5810     case 29:
5811         switch (sel) {
5812         case 0:
5813         case 2:
5814         case 4:
5815         case 6:
5816             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagHi));
5817             rn = "TagHi";
5818             break;
5819         case 1:
5820         case 3:
5821         case 5:
5822         case 7:
5823             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataHi));
5824             rn = "DataHi";
5825             break;
5826         default:
5827             goto die;
5828         }
5829         break;
5830     case 30:
5831         switch (sel) {
5832         case 0:
5833             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
5834             rn = "ErrorEPC";
5835             break;
5836         default:
5837             goto die;
5838         }
5839         break;
5840     case 31:
5841         switch (sel) {
5842         case 0:
5843             /* EJTAG support */
5844             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
5845             rn = "DESAVE";
5846             break;
5847         default:
5848             goto die;
5849         }
5850         break;
5851     default:
5852         goto die;
5853     }
5854     (void)rn; /* avoid a compiler warning */
5855     LOG_DISAS("dmfc0 %s (reg %d sel %d)\n", rn, reg, sel);
5856     return;
5857
5858 die:
5859     LOG_DISAS("dmfc0 %s (reg %d sel %d)\n", rn, reg, sel);
5860     generate_exception(ctx, EXCP_RI);
5861 }
5862
5863 static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, int sel)
5864 {
5865     const char *rn = "invalid";
5866
5867     if (sel != 0)
5868         check_insn(env, ctx, ISA_MIPS64);
5869
5870     if (use_icount)
5871         gen_io_start();
5872
5873     switch (reg) {
5874     case 0:
5875         switch (sel) {
5876         case 0:
5877             gen_helper_mtc0_index(cpu_env, arg);
5878             rn = "Index";
5879             break;
5880         case 1:
5881             check_insn(env, ctx, ASE_MT);
5882             gen_helper_mtc0_mvpcontrol(cpu_env, arg);
5883             rn = "MVPControl";
5884             break;
5885         case 2:
5886             check_insn(env, ctx, ASE_MT);
5887             /* ignored */
5888             rn = "MVPConf0";
5889             break;
5890         case 3:
5891             check_insn(env, ctx, ASE_MT);
5892             /* ignored */
5893             rn = "MVPConf1";
5894             break;
5895         default:
5896             goto die;
5897         }
5898         break;
5899     case 1:
5900         switch (sel) {
5901         case 0:
5902             /* ignored */
5903             rn = "Random";
5904             break;
5905         case 1:
5906             check_insn(env, ctx, ASE_MT);
5907             gen_helper_mtc0_vpecontrol(cpu_env, arg);
5908             rn = "VPEControl";
5909             break;
5910         case 2:
5911             check_insn(env, ctx, ASE_MT);
5912             gen_helper_mtc0_vpeconf0(cpu_env, arg);
5913             rn = "VPEConf0";
5914             break;
5915         case 3:
5916             check_insn(env, ctx, ASE_MT);
5917             gen_helper_mtc0_vpeconf1(cpu_env, arg);
5918             rn = "VPEConf1";
5919             break;
5920         case 4:
5921             check_insn(env, ctx, ASE_MT);
5922             gen_helper_mtc0_yqmask(cpu_env, arg);
5923             rn = "YQMask";
5924             break;
5925         case 5:
5926             check_insn(env, ctx, ASE_MT);
5927             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPESchedule));
5928             rn = "VPESchedule";
5929             break;
5930         case 6:
5931             check_insn(env, ctx, ASE_MT);
5932             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPEScheFBack));
5933             rn = "VPEScheFBack";
5934             break;
5935         case 7:
5936             check_insn(env, ctx, ASE_MT);
5937             gen_helper_mtc0_vpeopt(cpu_env, arg);
5938             rn = "VPEOpt";
5939             break;
5940         default:
5941             goto die;
5942         }
5943         break;
5944     case 2:
5945         switch (sel) {
5946         case 0:
5947             gen_helper_mtc0_entrylo0(cpu_env, arg);
5948             rn = "EntryLo0";
5949             break;
5950         case 1:
5951             check_insn(env, ctx, ASE_MT);
5952             gen_helper_mtc0_tcstatus(cpu_env, arg);
5953             rn = "TCStatus";
5954             break;
5955         case 2:
5956             check_insn(env, ctx, ASE_MT);
5957             gen_helper_mtc0_tcbind(cpu_env, arg);
5958             rn = "TCBind";
5959             break;
5960         case 3:
5961             check_insn(env, ctx, ASE_MT);
5962             gen_helper_mtc0_tcrestart(cpu_env, arg);
5963             rn = "TCRestart";
5964             break;
5965         case 4:
5966             check_insn(env, ctx, ASE_MT);
5967             gen_helper_mtc0_tchalt(cpu_env, arg);
5968             rn = "TCHalt";
5969             break;
5970         case 5:
5971             check_insn(env, ctx, ASE_MT);
5972             gen_helper_mtc0_tccontext(cpu_env, arg);
5973             rn = "TCContext";
5974             break;
5975         case 6:
5976             check_insn(env, ctx, ASE_MT);
5977             gen_helper_mtc0_tcschedule(cpu_env, arg);
5978             rn = "TCSchedule";
5979             break;
5980         case 7:
5981             check_insn(env, ctx, ASE_MT);
5982             gen_helper_mtc0_tcschefback(cpu_env, arg);
5983             rn = "TCScheFBack";
5984             break;
5985         default:
5986             goto die;
5987         }
5988         break;
5989     case 3:
5990         switch (sel) {
5991         case 0:
5992             gen_helper_mtc0_entrylo1(cpu_env, arg);
5993             rn = "EntryLo1";
5994             break;
5995         default:
5996             goto die;
5997         }
5998         break;
5999     case 4:
6000         switch (sel) {
6001         case 0:
6002             gen_helper_mtc0_context(cpu_env, arg);
6003             rn = "Context";
6004             break;
6005         case 1:
6006 //           gen_helper_mtc0_contextconfig(cpu_env, arg); /* SmartMIPS ASE */
6007             rn = "ContextConfig";
6008 //           break;
6009         default:
6010             goto die;
6011         }
6012         break;
6013     case 5:
6014         switch (sel) {
6015         case 0:
6016             gen_helper_mtc0_pagemask(cpu_env, arg);
6017             rn = "PageMask";
6018             break;
6019         case 1:
6020             check_insn(env, ctx, ISA_MIPS32R2);
6021             gen_helper_mtc0_pagegrain(cpu_env, arg);
6022             rn = "PageGrain";
6023             break;
6024         default:
6025             goto die;
6026         }
6027         break;
6028     case 6:
6029         switch (sel) {
6030         case 0:
6031             gen_helper_mtc0_wired(cpu_env, arg);
6032             rn = "Wired";
6033             break;
6034         case 1:
6035             check_insn(env, ctx, ISA_MIPS32R2);
6036             gen_helper_mtc0_srsconf0(cpu_env, arg);
6037             rn = "SRSConf0";
6038             break;
6039         case 2:
6040             check_insn(env, ctx, ISA_MIPS32R2);
6041             gen_helper_mtc0_srsconf1(cpu_env, arg);
6042             rn = "SRSConf1";
6043             break;
6044         case 3:
6045             check_insn(env, ctx, ISA_MIPS32R2);
6046             gen_helper_mtc0_srsconf2(cpu_env, arg);
6047             rn = "SRSConf2";
6048             break;
6049         case 4:
6050             check_insn(env, ctx, ISA_MIPS32R2);
6051             gen_helper_mtc0_srsconf3(cpu_env, arg);
6052             rn = "SRSConf3";
6053             break;
6054         case 5:
6055             check_insn(env, ctx, ISA_MIPS32R2);
6056             gen_helper_mtc0_srsconf4(cpu_env, arg);
6057             rn = "SRSConf4";
6058             break;
6059         default:
6060             goto die;
6061         }
6062         break;
6063     case 7:
6064         switch (sel) {
6065         case 0:
6066             check_insn(env, ctx, ISA_MIPS32R2);
6067             gen_helper_mtc0_hwrena(cpu_env, arg);
6068             rn = "HWREna";
6069             break;
6070         default:
6071             goto die;
6072         }
6073         break;
6074     case 8:
6075         /* ignored */
6076         rn = "BadVAddr";
6077         break;
6078     case 9:
6079         switch (sel) {
6080         case 0:
6081             gen_helper_mtc0_count(cpu_env, arg);
6082             rn = "Count";
6083             break;
6084         /* 6,7 are implementation dependent */
6085         default:
6086             goto die;
6087         }
6088         /* Stop translation as we may have switched the execution mode */
6089         ctx->bstate = BS_STOP;
6090         break;
6091     case 10:
6092         switch (sel) {
6093         case 0:
6094             gen_helper_mtc0_entryhi(cpu_env, arg);
6095             rn = "EntryHi";
6096             break;
6097         default:
6098             goto die;
6099         }
6100         break;
6101     case 11:
6102         switch (sel) {
6103         case 0:
6104             gen_helper_mtc0_compare(cpu_env, arg);
6105             rn = "Compare";
6106             break;
6107         /* 6,7 are implementation dependent */
6108         default:
6109             goto die;
6110         }
6111         /* Stop translation as we may have switched the execution mode */
6112         ctx->bstate = BS_STOP;
6113         break;
6114     case 12:
6115         switch (sel) {
6116         case 0:
6117             save_cpu_state(ctx, 1);
6118             gen_helper_mtc0_status(cpu_env, arg);
6119             /* BS_STOP isn't good enough here, hflags may have changed. */
6120             gen_save_pc(ctx->pc + 4);
6121             ctx->bstate = BS_EXCP;
6122             rn = "Status";
6123             break;
6124         case 1:
6125             check_insn(env, ctx, ISA_MIPS32R2);
6126             gen_helper_mtc0_intctl(cpu_env, arg);
6127             /* Stop translation as we may have switched the execution mode */
6128             ctx->bstate = BS_STOP;
6129             rn = "IntCtl";
6130             break;
6131         case 2:
6132             check_insn(env, ctx, ISA_MIPS32R2);
6133             gen_helper_mtc0_srsctl(cpu_env, arg);
6134             /* Stop translation as we may have switched the execution mode */
6135             ctx->bstate = BS_STOP;
6136             rn = "SRSCtl";
6137             break;
6138         case 3:
6139             check_insn(env, ctx, ISA_MIPS32R2);
6140             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
6141             /* Stop translation as we may have switched the execution mode */
6142             ctx->bstate = BS_STOP;
6143             rn = "SRSMap";
6144             break;
6145         default:
6146             goto die;
6147         }
6148         break;
6149     case 13:
6150         switch (sel) {
6151         case 0:
6152             save_cpu_state(ctx, 1);
6153             /* Mark as an IO operation because we may trigger a software
6154                interrupt.  */
6155             if (use_icount) {
6156                 gen_io_start();
6157             }
6158             gen_helper_mtc0_cause(cpu_env, arg);
6159             if (use_icount) {
6160                 gen_io_end();
6161             }
6162             /* Stop translation as we may have triggered an intetrupt */
6163             ctx->bstate = BS_STOP;
6164             rn = "Cause";
6165             break;
6166         default:
6167             goto die;
6168         }
6169         break;
6170     case 14:
6171         switch (sel) {
6172         case 0:
6173             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
6174             rn = "EPC";
6175             break;
6176         default:
6177             goto die;
6178         }
6179         break;
6180     case 15:
6181         switch (sel) {
6182         case 0:
6183             /* ignored */
6184             rn = "PRid";
6185             break;
6186         case 1:
6187             check_insn(env, ctx, ISA_MIPS32R2);
6188             gen_helper_mtc0_ebase(cpu_env, arg);
6189             rn = "EBase";
6190             break;
6191         default:
6192             goto die;
6193         }
6194         break;
6195     case 16:
6196         switch (sel) {
6197         case 0:
6198             gen_helper_mtc0_config0(cpu_env, arg);
6199             rn = "Config";
6200             /* Stop translation as we may have switched the execution mode */
6201             ctx->bstate = BS_STOP;
6202             break;
6203         case 1:
6204             /* ignored, read only */
6205             rn = "Config1";
6206             break;
6207         case 2:
6208             gen_helper_mtc0_config2(cpu_env, arg);
6209             rn = "Config2";
6210             /* Stop translation as we may have switched the execution mode */
6211             ctx->bstate = BS_STOP;
6212             break;
6213         case 3:
6214             /* ignored */
6215             rn = "Config3";
6216             break;
6217         /* 6,7 are implementation dependent */
6218         default:
6219             rn = "Invalid config selector";
6220             goto die;
6221         }
6222         break;
6223     case 17:
6224         switch (sel) {
6225         case 0:
6226             gen_helper_mtc0_lladdr(cpu_env, arg);
6227             rn = "LLAddr";
6228             break;
6229         default:
6230             goto die;
6231         }
6232         break;
6233     case 18:
6234         switch (sel) {
6235         case 0 ... 7:
6236             gen_helper_0e1i(mtc0_watchlo, arg, sel);
6237             rn = "WatchLo";
6238             break;
6239         default:
6240             goto die;
6241         }
6242         break;
6243     case 19:
6244         switch (sel) {
6245         case 0 ... 7:
6246             gen_helper_0e1i(mtc0_watchhi, arg, sel);
6247             rn = "WatchHi";
6248             break;
6249         default:
6250             goto die;
6251         }
6252         break;
6253     case 20:
6254         switch (sel) {
6255         case 0:
6256             check_insn(env, ctx, ISA_MIPS3);
6257             gen_helper_mtc0_xcontext(cpu_env, arg);
6258             rn = "XContext";
6259             break;
6260         default:
6261             goto die;
6262         }
6263         break;
6264     case 21:
6265        /* Officially reserved, but sel 0 is used for R1x000 framemask */
6266         switch (sel) {
6267         case 0:
6268             gen_helper_mtc0_framemask(cpu_env, arg);
6269             rn = "Framemask";
6270             break;
6271         default:
6272             goto die;
6273         }
6274         break;
6275     case 22:
6276         /* ignored */
6277         rn = "Diagnostic"; /* implementation dependent */
6278         break;
6279     case 23:
6280         switch (sel) {
6281         case 0:
6282             gen_helper_mtc0_debug(cpu_env, arg); /* EJTAG support */
6283             /* BS_STOP isn't good enough here, hflags may have changed. */
6284             gen_save_pc(ctx->pc + 4);
6285             ctx->bstate = BS_EXCP;
6286             rn = "Debug";
6287             break;
6288         case 1:
6289 //            gen_helper_mtc0_tracecontrol(cpu_env, arg); /* PDtrace support */
6290             /* Stop translation as we may have switched the execution mode */
6291             ctx->bstate = BS_STOP;
6292             rn = "TraceControl";
6293 //            break;
6294         case 2:
6295 //            gen_helper_mtc0_tracecontrol2(cpu_env, arg); /* PDtrace support */
6296             /* Stop translation as we may have switched the execution mode */
6297             ctx->bstate = BS_STOP;
6298             rn = "TraceControl2";
6299 //            break;
6300         case 3:
6301 //            gen_helper_mtc0_usertracedata(cpu_env, arg); /* PDtrace support */
6302             /* Stop translation as we may have switched the execution mode */
6303             ctx->bstate = BS_STOP;
6304             rn = "UserTraceData";
6305 //            break;
6306         case 4:
6307 //            gen_helper_mtc0_tracebpc(cpu_env, arg); /* PDtrace support */
6308             /* Stop translation as we may have switched the execution mode */
6309             ctx->bstate = BS_STOP;
6310             rn = "TraceBPC";
6311 //            break;
6312         default:
6313             goto die;
6314         }
6315         break;
6316     case 24:
6317         switch (sel) {
6318         case 0:
6319             /* EJTAG support */
6320             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
6321             rn = "DEPC";
6322             break;
6323         default:
6324             goto die;
6325         }
6326         break;
6327     case 25:
6328         switch (sel) {
6329         case 0:
6330             gen_helper_mtc0_performance0(cpu_env, arg);
6331             rn = "Performance0";
6332             break;
6333         case 1:
6334 //            gen_helper_mtc0_performance1(cpu_env, arg);
6335             rn = "Performance1";
6336 //            break;
6337         case 2:
6338 //            gen_helper_mtc0_performance2(cpu_env, arg);
6339             rn = "Performance2";
6340 //            break;
6341         case 3:
6342 //            gen_helper_mtc0_performance3(cpu_env, arg);
6343             rn = "Performance3";
6344 //            break;
6345         case 4:
6346 //            gen_helper_mtc0_performance4(cpu_env, arg);
6347             rn = "Performance4";
6348 //            break;
6349         case 5:
6350 //            gen_helper_mtc0_performance5(cpu_env, arg);
6351             rn = "Performance5";
6352 //            break;
6353         case 6:
6354 //            gen_helper_mtc0_performance6(cpu_env, arg);
6355             rn = "Performance6";
6356 //            break;
6357         case 7:
6358 //            gen_helper_mtc0_performance7(cpu_env, arg);
6359             rn = "Performance7";
6360 //            break;
6361         default:
6362             goto die;
6363         }
6364         break;
6365     case 26:
6366         /* ignored */
6367         rn = "ECC";
6368         break;
6369     case 27:
6370         switch (sel) {
6371         case 0 ... 3:
6372             /* ignored */
6373             rn = "CacheErr";
6374             break;
6375         default:
6376             goto die;
6377         }
6378         break;
6379     case 28:
6380         switch (sel) {
6381         case 0:
6382         case 2:
6383         case 4:
6384         case 6:
6385             gen_helper_mtc0_taglo(cpu_env, arg);
6386             rn = "TagLo";
6387             break;
6388         case 1:
6389         case 3:
6390         case 5:
6391         case 7:
6392             gen_helper_mtc0_datalo(cpu_env, arg);
6393             rn = "DataLo";
6394             break;
6395         default:
6396             goto die;
6397         }
6398         break;
6399     case 29:
6400         switch (sel) {
6401         case 0:
6402         case 2:
6403         case 4:
6404         case 6:
6405             gen_helper_mtc0_taghi(cpu_env, arg);
6406             rn = "TagHi";
6407             break;
6408         case 1:
6409         case 3:
6410         case 5:
6411         case 7:
6412             gen_helper_mtc0_datahi(cpu_env, arg);
6413             rn = "DataHi";
6414             break;
6415         default:
6416             rn = "invalid sel";
6417             goto die;
6418         }
6419         break;
6420     case 30:
6421         switch (sel) {
6422         case 0:
6423             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
6424             rn = "ErrorEPC";
6425             break;
6426         default:
6427             goto die;
6428         }
6429         break;
6430     case 31:
6431         switch (sel) {
6432         case 0:
6433             /* EJTAG support */
6434             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
6435             rn = "DESAVE";
6436             break;
6437         default:
6438             goto die;
6439         }
6440         /* Stop translation as we may have switched the execution mode */
6441         ctx->bstate = BS_STOP;
6442         break;
6443     default:
6444         goto die;
6445     }
6446     (void)rn; /* avoid a compiler warning */
6447     LOG_DISAS("dmtc0 %s (reg %d sel %d)\n", rn, reg, sel);
6448     /* For simplicity assume that all writes can cause interrupts.  */
6449     if (use_icount) {
6450         gen_io_end();
6451         ctx->bstate = BS_STOP;
6452     }
6453     return;
6454
6455 die:
6456     LOG_DISAS("dmtc0 %s (reg %d sel %d)\n", rn, reg, sel);
6457     generate_exception(ctx, EXCP_RI);
6458 }
6459 #endif /* TARGET_MIPS64 */
6460
6461 static void gen_mftr(CPUMIPSState *env, DisasContext *ctx, int rt, int rd,
6462                      int u, int sel, int h)
6463 {
6464     int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
6465     TCGv t0 = tcg_temp_local_new();
6466
6467     if ((env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) == 0 &&
6468         ((env->tcs[other_tc].CP0_TCBind & (0xf << CP0TCBd_CurVPE)) !=
6469          (env->active_tc.CP0_TCBind & (0xf << CP0TCBd_CurVPE))))
6470         tcg_gen_movi_tl(t0, -1);
6471     else if ((env->CP0_VPEControl & (0xff << CP0VPECo_TargTC)) >
6472              (env->mvp->CP0_MVPConf0 & (0xff << CP0MVPC0_PTC)))
6473         tcg_gen_movi_tl(t0, -1);
6474     else if (u == 0) {
6475         switch (rt) {
6476         case 1:
6477             switch (sel) {
6478             case 1:
6479                 gen_helper_mftc0_vpecontrol(t0, cpu_env);
6480                 break;
6481             case 2:
6482                 gen_helper_mftc0_vpeconf0(t0, cpu_env);
6483                 break;
6484             default:
6485                 goto die;
6486                 break;
6487             }
6488             break;
6489         case 2:
6490             switch (sel) {
6491             case 1:
6492                 gen_helper_mftc0_tcstatus(t0, cpu_env);
6493                 break;
6494             case 2:
6495                 gen_helper_mftc0_tcbind(t0, cpu_env);
6496                 break;
6497             case 3:
6498                 gen_helper_mftc0_tcrestart(t0, cpu_env);
6499                 break;
6500             case 4:
6501                 gen_helper_mftc0_tchalt(t0, cpu_env);
6502                 break;
6503             case 5:
6504                 gen_helper_mftc0_tccontext(t0, cpu_env);
6505                 break;
6506             case 6:
6507                 gen_helper_mftc0_tcschedule(t0, cpu_env);
6508                 break;
6509             case 7:
6510                 gen_helper_mftc0_tcschefback(t0, cpu_env);
6511                 break;
6512             default:
6513                 gen_mfc0(env, ctx, t0, rt, sel);
6514                 break;
6515             }
6516             break;
6517         case 10:
6518             switch (sel) {
6519             case 0:
6520                 gen_helper_mftc0_entryhi(t0, cpu_env);
6521                 break;
6522             default:
6523                 gen_mfc0(env, ctx, t0, rt, sel);
6524                 break;
6525             }
6526         case 12:
6527             switch (sel) {
6528             case 0:
6529                 gen_helper_mftc0_status(t0, cpu_env);
6530                 break;
6531             default:
6532                 gen_mfc0(env, ctx, t0, rt, sel);
6533                 break;
6534             }
6535         case 13:
6536             switch (sel) {
6537             case 0:
6538                 gen_helper_mftc0_cause(t0, cpu_env);
6539                 break;
6540             default:
6541                 goto die;
6542                 break;
6543             }
6544             break;
6545         case 14:
6546             switch (sel) {
6547             case 0:
6548                 gen_helper_mftc0_epc(t0, cpu_env);
6549                 break;
6550             default:
6551                 goto die;
6552                 break;
6553             }
6554             break;
6555         case 15:
6556             switch (sel) {
6557             case 1:
6558                 gen_helper_mftc0_ebase(t0, cpu_env);
6559                 break;
6560             default:
6561                 goto die;
6562                 break;
6563             }
6564             break;
6565         case 16:
6566             switch (sel) {
6567             case 0 ... 7:
6568                 gen_helper_mftc0_configx(t0, cpu_env, tcg_const_tl(sel));
6569                 break;
6570             default:
6571                 goto die;
6572                 break;
6573             }
6574             break;
6575         case 23:
6576             switch (sel) {
6577             case 0:
6578                 gen_helper_mftc0_debug(t0, cpu_env);
6579                 break;
6580             default:
6581                 gen_mfc0(env, ctx, t0, rt, sel);
6582                 break;
6583             }
6584             break;
6585         default:
6586             gen_mfc0(env, ctx, t0, rt, sel);
6587         }
6588     } else switch (sel) {
6589     /* GPR registers. */
6590     case 0:
6591         gen_helper_1e0i(mftgpr, t0, rt);
6592         break;
6593     /* Auxiliary CPU registers */
6594     case 1:
6595         switch (rt) {
6596         case 0:
6597             gen_helper_1e0i(mftlo, t0, 0);
6598             break;
6599         case 1:
6600             gen_helper_1e0i(mfthi, t0, 0);
6601             break;
6602         case 2:
6603             gen_helper_1e0i(mftacx, t0, 0);
6604             break;
6605         case 4:
6606             gen_helper_1e0i(mftlo, t0, 1);
6607             break;
6608         case 5:
6609             gen_helper_1e0i(mfthi, t0, 1);
6610             break;
6611         case 6:
6612             gen_helper_1e0i(mftacx, t0, 1);
6613             break;
6614         case 8:
6615             gen_helper_1e0i(mftlo, t0, 2);
6616             break;
6617         case 9:
6618             gen_helper_1e0i(mfthi, t0, 2);
6619             break;
6620         case 10:
6621             gen_helper_1e0i(mftacx, t0, 2);
6622             break;
6623         case 12:
6624             gen_helper_1e0i(mftlo, t0, 3);
6625             break;
6626         case 13:
6627             gen_helper_1e0i(mfthi, t0, 3);
6628             break;
6629         case 14:
6630             gen_helper_1e0i(mftacx, t0, 3);
6631             break;
6632         case 16:
6633             gen_helper_mftdsp(t0, cpu_env);
6634             break;
6635         default:
6636             goto die;
6637         }
6638         break;
6639     /* Floating point (COP1). */
6640     case 2:
6641         /* XXX: For now we support only a single FPU context. */
6642         if (h == 0) {
6643             TCGv_i32 fp0 = tcg_temp_new_i32();
6644
6645             gen_load_fpr32(fp0, rt);
6646             tcg_gen_ext_i32_tl(t0, fp0);
6647             tcg_temp_free_i32(fp0);
6648         } else {
6649             TCGv_i32 fp0 = tcg_temp_new_i32();
6650
6651             gen_load_fpr32h(fp0, rt);
6652             tcg_gen_ext_i32_tl(t0, fp0);
6653             tcg_temp_free_i32(fp0);
6654         }
6655         break;
6656     case 3:
6657         /* XXX: For now we support only a single FPU context. */
6658         gen_helper_1e0i(cfc1, t0, rt);
6659         break;
6660     /* COP2: Not implemented. */
6661     case 4:
6662     case 5:
6663         /* fall through */
6664     default:
6665         goto die;
6666     }
6667     LOG_DISAS("mftr (reg %d u %d sel %d h %d)\n", rt, u, sel, h);
6668     gen_store_gpr(t0, rd);
6669     tcg_temp_free(t0);
6670     return;
6671
6672 die:
6673     tcg_temp_free(t0);
6674     LOG_DISAS("mftr (reg %d u %d sel %d h %d)\n", rt, u, sel, h);
6675     generate_exception(ctx, EXCP_RI);
6676 }
6677
6678 static void gen_mttr(CPUMIPSState *env, DisasContext *ctx, int rd, int rt,
6679                      int u, int sel, int h)
6680 {
6681     int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
6682     TCGv t0 = tcg_temp_local_new();
6683
6684     gen_load_gpr(t0, rt);
6685     if ((env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) == 0 &&
6686         ((env->tcs[other_tc].CP0_TCBind & (0xf << CP0TCBd_CurVPE)) !=
6687          (env->active_tc.CP0_TCBind & (0xf << CP0TCBd_CurVPE))))
6688         /* NOP */ ;
6689     else if ((env->CP0_VPEControl & (0xff << CP0VPECo_TargTC)) >
6690              (env->mvp->CP0_MVPConf0 & (0xff << CP0MVPC0_PTC)))
6691         /* NOP */ ;
6692     else if (u == 0) {
6693         switch (rd) {
6694         case 1:
6695             switch (sel) {
6696             case 1:
6697                 gen_helper_mttc0_vpecontrol(cpu_env, t0);
6698                 break;
6699             case 2:
6700                 gen_helper_mttc0_vpeconf0(cpu_env, t0);
6701                 break;
6702             default:
6703                 goto die;
6704                 break;
6705             }
6706             break;
6707         case 2:
6708             switch (sel) {
6709             case 1:
6710                 gen_helper_mttc0_tcstatus(cpu_env, t0);
6711                 break;
6712             case 2:
6713                 gen_helper_mttc0_tcbind(cpu_env, t0);
6714                 break;
6715             case 3:
6716                 gen_helper_mttc0_tcrestart(cpu_env, t0);
6717                 break;
6718             case 4:
6719                 gen_helper_mttc0_tchalt(cpu_env, t0);
6720                 break;
6721             case 5:
6722                 gen_helper_mttc0_tccontext(cpu_env, t0);
6723                 break;
6724             case 6:
6725                 gen_helper_mttc0_tcschedule(cpu_env, t0);
6726                 break;
6727             case 7:
6728                 gen_helper_mttc0_tcschefback(cpu_env, t0);
6729                 break;
6730             default:
6731                 gen_mtc0(env, ctx, t0, rd, sel);
6732                 break;
6733             }
6734             break;
6735         case 10:
6736             switch (sel) {
6737             case 0:
6738                 gen_helper_mttc0_entryhi(cpu_env, t0);
6739                 break;
6740             default:
6741                 gen_mtc0(env, ctx, t0, rd, sel);
6742                 break;
6743             }
6744         case 12:
6745             switch (sel) {
6746             case 0:
6747                 gen_helper_mttc0_status(cpu_env, t0);
6748                 break;
6749             default:
6750                 gen_mtc0(env, ctx, t0, rd, sel);
6751                 break;
6752             }
6753         case 13:
6754             switch (sel) {
6755             case 0:
6756                 gen_helper_mttc0_cause(cpu_env, t0);
6757                 break;
6758             default:
6759                 goto die;
6760                 break;
6761             }
6762             break;
6763         case 15:
6764             switch (sel) {
6765             case 1:
6766                 gen_helper_mttc0_ebase(cpu_env, t0);
6767                 break;
6768             default:
6769                 goto die;
6770                 break;
6771             }
6772             break;
6773         case 23:
6774             switch (sel) {
6775             case 0:
6776                 gen_helper_mttc0_debug(cpu_env, t0);
6777                 break;
6778             default:
6779                 gen_mtc0(env, ctx, t0, rd, sel);
6780                 break;
6781             }
6782             break;
6783         default:
6784             gen_mtc0(env, ctx, t0, rd, sel);
6785         }
6786     } else switch (sel) {
6787     /* GPR registers. */
6788     case 0:
6789         gen_helper_0e1i(mttgpr, t0, rd);
6790         break;
6791     /* Auxiliary CPU registers */
6792     case 1:
6793         switch (rd) {
6794         case 0:
6795             gen_helper_0e1i(mttlo, t0, 0);
6796             break;
6797         case 1:
6798             gen_helper_0e1i(mtthi, t0, 0);
6799             break;
6800         case 2:
6801             gen_helper_0e1i(mttacx, t0, 0);
6802             break;
6803         case 4:
6804             gen_helper_0e1i(mttlo, t0, 1);
6805             break;
6806         case 5:
6807             gen_helper_0e1i(mtthi, t0, 1);
6808             break;
6809         case 6:
6810             gen_helper_0e1i(mttacx, t0, 1);
6811             break;
6812         case 8:
6813             gen_helper_0e1i(mttlo, t0, 2);
6814             break;
6815         case 9:
6816             gen_helper_0e1i(mtthi, t0, 2);
6817             break;
6818         case 10:
6819             gen_helper_0e1i(mttacx, t0, 2);
6820             break;
6821         case 12:
6822             gen_helper_0e1i(mttlo, t0, 3);
6823             break;
6824         case 13:
6825             gen_helper_0e1i(mtthi, t0, 3);
6826             break;
6827         case 14:
6828             gen_helper_0e1i(mttacx, t0, 3);
6829             break;
6830         case 16:
6831             gen_helper_mttdsp(cpu_env, t0);
6832             break;
6833         default:
6834             goto die;
6835         }
6836         break;
6837     /* Floating point (COP1). */
6838     case 2:
6839         /* XXX: For now we support only a single FPU context. */
6840         if (h == 0) {
6841             TCGv_i32 fp0 = tcg_temp_new_i32();
6842
6843             tcg_gen_trunc_tl_i32(fp0, t0);
6844             gen_store_fpr32(fp0, rd);
6845             tcg_temp_free_i32(fp0);
6846         } else {
6847             TCGv_i32 fp0 = tcg_temp_new_i32();
6848
6849             tcg_gen_trunc_tl_i32(fp0, t0);
6850             gen_store_fpr32h(fp0, rd);
6851             tcg_temp_free_i32(fp0);
6852         }
6853         break;
6854     case 3:
6855         /* XXX: For now we support only a single FPU context. */
6856         gen_helper_0e1i(ctc1, t0, rd);
6857         break;
6858     /* COP2: Not implemented. */
6859     case 4:
6860     case 5:
6861         /* fall through */
6862     default:
6863         goto die;
6864     }
6865     LOG_DISAS("mttr (reg %d u %d sel %d h %d)\n", rd, u, sel, h);
6866     tcg_temp_free(t0);
6867     return;
6868
6869 die:
6870     tcg_temp_free(t0);
6871     LOG_DISAS("mttr (reg %d u %d sel %d h %d)\n", rd, u, sel, h);
6872     generate_exception(ctx, EXCP_RI);
6873 }
6874
6875 static void gen_cp0 (CPUMIPSState *env, DisasContext *ctx, uint32_t opc, int rt, int rd)
6876 {
6877     const char *opn = "ldst";
6878
6879     check_cp0_enabled(ctx);
6880     switch (opc) {
6881     case OPC_MFC0:
6882         if (rt == 0) {
6883             /* Treat as NOP. */
6884             return;
6885         }
6886         gen_mfc0(env, ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
6887         opn = "mfc0";
6888         break;
6889     case OPC_MTC0:
6890         {
6891             TCGv t0 = tcg_temp_new();
6892
6893             gen_load_gpr(t0, rt);
6894             gen_mtc0(env, ctx, t0, rd, ctx->opcode & 0x7);
6895             tcg_temp_free(t0);
6896         }
6897         opn = "mtc0";
6898         break;
6899 #if defined(TARGET_MIPS64)
6900     case OPC_DMFC0:
6901         check_insn(env, ctx, ISA_MIPS3);
6902         if (rt == 0) {
6903             /* Treat as NOP. */
6904             return;
6905         }
6906         gen_dmfc0(env, ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
6907         opn = "dmfc0";
6908         break;
6909     case OPC_DMTC0:
6910         check_insn(env, ctx, ISA_MIPS3);
6911         {
6912             TCGv t0 = tcg_temp_new();
6913
6914             gen_load_gpr(t0, rt);
6915             gen_dmtc0(env, ctx, t0, rd, ctx->opcode & 0x7);
6916             tcg_temp_free(t0);
6917         }
6918         opn = "dmtc0";
6919         break;
6920 #endif
6921     case OPC_MFTR:
6922         check_insn(env, ctx, ASE_MT);
6923         if (rd == 0) {
6924             /* Treat as NOP. */
6925             return;
6926         }
6927         gen_mftr(env, ctx, rt, rd, (ctx->opcode >> 5) & 1,
6928                  ctx->opcode & 0x7, (ctx->opcode >> 4) & 1);
6929         opn = "mftr";
6930         break;
6931     case OPC_MTTR:
6932         check_insn(env, ctx, ASE_MT);
6933         gen_mttr(env, ctx, rd, rt, (ctx->opcode >> 5) & 1,
6934                  ctx->opcode & 0x7, (ctx->opcode >> 4) & 1);
6935         opn = "mttr";
6936         break;
6937     case OPC_TLBWI:
6938         opn = "tlbwi";
6939         if (!env->tlb->helper_tlbwi)
6940             goto die;
6941         gen_helper_tlbwi(cpu_env);
6942         break;
6943     case OPC_TLBWR:
6944         opn = "tlbwr";
6945         if (!env->tlb->helper_tlbwr)
6946             goto die;
6947         gen_helper_tlbwr(cpu_env);
6948         break;
6949     case OPC_TLBP:
6950         opn = "tlbp";
6951         if (!env->tlb->helper_tlbp)
6952             goto die;
6953         gen_helper_tlbp(cpu_env);
6954         break;
6955     case OPC_TLBR:
6956         opn = "tlbr";
6957         if (!env->tlb->helper_tlbr)
6958             goto die;
6959         gen_helper_tlbr(cpu_env);
6960         break;
6961     case OPC_ERET:
6962         opn = "eret";
6963         check_insn(env, ctx, ISA_MIPS2);
6964         gen_helper_eret(cpu_env);
6965         ctx->bstate = BS_EXCP;
6966         break;
6967     case OPC_DERET:
6968         opn = "deret";
6969         check_insn(env, ctx, ISA_MIPS32);
6970         if (!(ctx->hflags & MIPS_HFLAG_DM)) {
6971             MIPS_INVAL(opn);
6972             generate_exception(ctx, EXCP_RI);
6973         } else {
6974             gen_helper_deret(cpu_env);
6975             ctx->bstate = BS_EXCP;
6976         }
6977         break;
6978     case OPC_WAIT:
6979         opn = "wait";
6980         check_insn(env, ctx, ISA_MIPS3 | ISA_MIPS32);
6981         /* If we get an exception, we want to restart at next instruction */
6982         ctx->pc += 4;
6983         save_cpu_state(ctx, 1);
6984         ctx->pc -= 4;
6985         gen_helper_wait(cpu_env);
6986         ctx->bstate = BS_EXCP;
6987         break;
6988     default:
6989  die:
6990         MIPS_INVAL(opn);
6991         generate_exception(ctx, EXCP_RI);
6992         return;
6993     }
6994     (void)opn; /* avoid a compiler warning */
6995     MIPS_DEBUG("%s %s %d", opn, regnames[rt], rd);
6996 }
6997 #endif /* !CONFIG_USER_ONLY */
6998
6999 /* CP1 Branches (before delay slot) */
7000 static void gen_compute_branch1 (CPUMIPSState *env, DisasContext *ctx, uint32_t op,
7001                                  int32_t cc, int32_t offset)
7002 {
7003     target_ulong btarget;
7004     const char *opn = "cp1 cond branch";
7005     TCGv_i32 t0 = tcg_temp_new_i32();
7006
7007     if (cc != 0)
7008         check_insn(env, ctx, ISA_MIPS4 | ISA_MIPS32);
7009
7010     btarget = ctx->pc + 4 + offset;
7011
7012     switch (op) {
7013     case OPC_BC1F:
7014         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
7015         tcg_gen_not_i32(t0, t0);
7016         tcg_gen_andi_i32(t0, t0, 1);
7017         tcg_gen_extu_i32_tl(bcond, t0);
7018         opn = "bc1f";
7019         goto not_likely;
7020     case OPC_BC1FL:
7021         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
7022         tcg_gen_not_i32(t0, t0);
7023         tcg_gen_andi_i32(t0, t0, 1);
7024         tcg_gen_extu_i32_tl(bcond, t0);
7025         opn = "bc1fl";
7026         goto likely;
7027     case OPC_BC1T:
7028         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
7029         tcg_gen_andi_i32(t0, t0, 1);
7030         tcg_gen_extu_i32_tl(bcond, t0);
7031         opn = "bc1t";
7032         goto not_likely;
7033     case OPC_BC1TL:
7034         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
7035         tcg_gen_andi_i32(t0, t0, 1);
7036         tcg_gen_extu_i32_tl(bcond, t0);
7037         opn = "bc1tl";
7038     likely:
7039         ctx->hflags |= MIPS_HFLAG_BL;
7040         break;
7041     case OPC_BC1FANY2:
7042         {
7043             TCGv_i32 t1 = tcg_temp_new_i32();
7044             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
7045             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
7046             tcg_gen_nand_i32(t0, t0, t1);
7047             tcg_temp_free_i32(t1);
7048             tcg_gen_andi_i32(t0, t0, 1);
7049             tcg_gen_extu_i32_tl(bcond, t0);
7050         }
7051         opn = "bc1any2f";
7052         goto not_likely;
7053     case OPC_BC1TANY2:
7054         {
7055             TCGv_i32 t1 = tcg_temp_new_i32();
7056             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
7057             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
7058             tcg_gen_or_i32(t0, t0, t1);
7059             tcg_temp_free_i32(t1);
7060             tcg_gen_andi_i32(t0, t0, 1);
7061             tcg_gen_extu_i32_tl(bcond, t0);
7062         }
7063         opn = "bc1any2t";
7064         goto not_likely;
7065     case OPC_BC1FANY4:
7066         {
7067             TCGv_i32 t1 = tcg_temp_new_i32();
7068             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
7069             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
7070             tcg_gen_and_i32(t0, t0, t1);
7071             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+2));
7072             tcg_gen_and_i32(t0, t0, t1);
7073             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+3));
7074             tcg_gen_nand_i32(t0, t0, t1);
7075             tcg_temp_free_i32(t1);
7076             tcg_gen_andi_i32(t0, t0, 1);
7077             tcg_gen_extu_i32_tl(bcond, t0);
7078         }
7079         opn = "bc1any4f";
7080         goto not_likely;
7081     case OPC_BC1TANY4:
7082         {
7083             TCGv_i32 t1 = tcg_temp_new_i32();
7084             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
7085             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
7086             tcg_gen_or_i32(t0, t0, t1);
7087             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+2));
7088             tcg_gen_or_i32(t0, t0, t1);
7089             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+3));
7090             tcg_gen_or_i32(t0, t0, t1);
7091             tcg_temp_free_i32(t1);
7092             tcg_gen_andi_i32(t0, t0, 1);
7093             tcg_gen_extu_i32_tl(bcond, t0);
7094         }
7095         opn = "bc1any4t";
7096     not_likely:
7097         ctx->hflags |= MIPS_HFLAG_BC;
7098         break;
7099     default:
7100         MIPS_INVAL(opn);
7101         generate_exception (ctx, EXCP_RI);
7102         goto out;
7103     }
7104     (void)opn; /* avoid a compiler warning */
7105     MIPS_DEBUG("%s: cond %02x target " TARGET_FMT_lx, opn,
7106                ctx->hflags, btarget);
7107     ctx->btarget = btarget;
7108
7109  out:
7110     tcg_temp_free_i32(t0);
7111 }
7112
7113 /* Coprocessor 1 (FPU) */
7114
7115 #define FOP(func, fmt) (((fmt) << 21) | (func))
7116
7117 enum fopcode {
7118     OPC_ADD_S = FOP(0, FMT_S),
7119     OPC_SUB_S = FOP(1, FMT_S),
7120     OPC_MUL_S = FOP(2, FMT_S),
7121     OPC_DIV_S = FOP(3, FMT_S),
7122     OPC_SQRT_S = FOP(4, FMT_S),
7123     OPC_ABS_S = FOP(5, FMT_S),
7124     OPC_MOV_S = FOP(6, FMT_S),
7125     OPC_NEG_S = FOP(7, FMT_S),
7126     OPC_ROUND_L_S = FOP(8, FMT_S),
7127     OPC_TRUNC_L_S = FOP(9, FMT_S),
7128     OPC_CEIL_L_S = FOP(10, FMT_S),
7129     OPC_FLOOR_L_S = FOP(11, FMT_S),
7130     OPC_ROUND_W_S = FOP(12, FMT_S),
7131     OPC_TRUNC_W_S = FOP(13, FMT_S),
7132     OPC_CEIL_W_S = FOP(14, FMT_S),
7133     OPC_FLOOR_W_S = FOP(15, FMT_S),
7134     OPC_MOVCF_S = FOP(17, FMT_S),
7135     OPC_MOVZ_S = FOP(18, FMT_S),
7136     OPC_MOVN_S = FOP(19, FMT_S),
7137     OPC_RECIP_S = FOP(21, FMT_S),
7138     OPC_RSQRT_S = FOP(22, FMT_S),
7139     OPC_RECIP2_S = FOP(28, FMT_S),
7140     OPC_RECIP1_S = FOP(29, FMT_S),
7141     OPC_RSQRT1_S = FOP(30, FMT_S),
7142     OPC_RSQRT2_S = FOP(31, FMT_S),
7143     OPC_CVT_D_S = FOP(33, FMT_S),
7144     OPC_CVT_W_S = FOP(36, FMT_S),
7145     OPC_CVT_L_S = FOP(37, FMT_S),
7146     OPC_CVT_PS_S = FOP(38, FMT_S),
7147     OPC_CMP_F_S = FOP (48, FMT_S),
7148     OPC_CMP_UN_S = FOP (49, FMT_S),
7149     OPC_CMP_EQ_S = FOP (50, FMT_S),
7150     OPC_CMP_UEQ_S = FOP (51, FMT_S),
7151     OPC_CMP_OLT_S = FOP (52, FMT_S),
7152     OPC_CMP_ULT_S = FOP (53, FMT_S),
7153     OPC_CMP_OLE_S = FOP (54, FMT_S),
7154     OPC_CMP_ULE_S = FOP (55, FMT_S),
7155     OPC_CMP_SF_S = FOP (56, FMT_S),
7156     OPC_CMP_NGLE_S = FOP (57, FMT_S),
7157     OPC_CMP_SEQ_S = FOP (58, FMT_S),
7158     OPC_CMP_NGL_S = FOP (59, FMT_S),
7159     OPC_CMP_LT_S = FOP (60, FMT_S),
7160     OPC_CMP_NGE_S = FOP (61, FMT_S),
7161     OPC_CMP_LE_S = FOP (62, FMT_S),
7162     OPC_CMP_NGT_S = FOP (63, FMT_S),
7163
7164     OPC_ADD_D = FOP(0, FMT_D),
7165     OPC_SUB_D = FOP(1, FMT_D),
7166     OPC_MUL_D = FOP(2, FMT_D),
7167     OPC_DIV_D = FOP(3, FMT_D),
7168     OPC_SQRT_D = FOP(4, FMT_D),
7169     OPC_ABS_D = FOP(5, FMT_D),
7170     OPC_MOV_D = FOP(6, FMT_D),
7171     OPC_NEG_D = FOP(7, FMT_D),
7172     OPC_ROUND_L_D = FOP(8, FMT_D),
7173     OPC_TRUNC_L_D = FOP(9, FMT_D),
7174     OPC_CEIL_L_D = FOP(10, FMT_D),
7175     OPC_FLOOR_L_D = FOP(11, FMT_D),
7176     OPC_ROUND_W_D = FOP(12, FMT_D),
7177     OPC_TRUNC_W_D = FOP(13, FMT_D),
7178     OPC_CEIL_W_D = FOP(14, FMT_D),
7179     OPC_FLOOR_W_D = FOP(15, FMT_D),
7180     OPC_MOVCF_D = FOP(17, FMT_D),
7181     OPC_MOVZ_D = FOP(18, FMT_D),
7182     OPC_MOVN_D = FOP(19, FMT_D),
7183     OPC_RECIP_D = FOP(21, FMT_D),
7184     OPC_RSQRT_D = FOP(22, FMT_D),
7185     OPC_RECIP2_D = FOP(28, FMT_D),
7186     OPC_RECIP1_D = FOP(29, FMT_D),
7187     OPC_RSQRT1_D = FOP(30, FMT_D),
7188     OPC_RSQRT2_D = FOP(31, FMT_D),
7189     OPC_CVT_S_D = FOP(32, FMT_D),
7190     OPC_CVT_W_D = FOP(36, FMT_D),
7191     OPC_CVT_L_D = FOP(37, FMT_D),
7192     OPC_CMP_F_D = FOP (48, FMT_D),
7193     OPC_CMP_UN_D = FOP (49, FMT_D),
7194     OPC_CMP_EQ_D = FOP (50, FMT_D),
7195     OPC_CMP_UEQ_D = FOP (51, FMT_D),
7196     OPC_CMP_OLT_D = FOP (52, FMT_D),
7197     OPC_CMP_ULT_D = FOP (53, FMT_D),
7198     OPC_CMP_OLE_D = FOP (54, FMT_D),
7199     OPC_CMP_ULE_D = FOP (55, FMT_D),
7200     OPC_CMP_SF_D = FOP (56, FMT_D),
7201     OPC_CMP_NGLE_D = FOP (57, FMT_D),
7202     OPC_CMP_SEQ_D = FOP (58, FMT_D),
7203     OPC_CMP_NGL_D = FOP (59, FMT_D),
7204     OPC_CMP_LT_D = FOP (60, FMT_D),
7205     OPC_CMP_NGE_D = FOP (61, FMT_D),
7206     OPC_CMP_LE_D = FOP (62, FMT_D),
7207     OPC_CMP_NGT_D = FOP (63, FMT_D),
7208
7209     OPC_CVT_S_W = FOP(32, FMT_W),
7210     OPC_CVT_D_W = FOP(33, FMT_W),
7211     OPC_CVT_S_L = FOP(32, FMT_L),
7212     OPC_CVT_D_L = FOP(33, FMT_L),
7213     OPC_CVT_PS_PW = FOP(38, FMT_W),
7214
7215     OPC_ADD_PS = FOP(0, FMT_PS),
7216     OPC_SUB_PS = FOP(1, FMT_PS),
7217     OPC_MUL_PS = FOP(2, FMT_PS),
7218     OPC_DIV_PS = FOP(3, FMT_PS),
7219     OPC_ABS_PS = FOP(5, FMT_PS),
7220     OPC_MOV_PS = FOP(6, FMT_PS),
7221     OPC_NEG_PS = FOP(7, FMT_PS),
7222     OPC_MOVCF_PS = FOP(17, FMT_PS),
7223     OPC_MOVZ_PS = FOP(18, FMT_PS),
7224     OPC_MOVN_PS = FOP(19, FMT_PS),
7225     OPC_ADDR_PS = FOP(24, FMT_PS),
7226     OPC_MULR_PS = FOP(26, FMT_PS),
7227     OPC_RECIP2_PS = FOP(28, FMT_PS),
7228     OPC_RECIP1_PS = FOP(29, FMT_PS),
7229     OPC_RSQRT1_PS = FOP(30, FMT_PS),
7230     OPC_RSQRT2_PS = FOP(31, FMT_PS),
7231
7232     OPC_CVT_S_PU = FOP(32, FMT_PS),
7233     OPC_CVT_PW_PS = FOP(36, FMT_PS),
7234     OPC_CVT_S_PL = FOP(40, FMT_PS),
7235     OPC_PLL_PS = FOP(44, FMT_PS),
7236     OPC_PLU_PS = FOP(45, FMT_PS),
7237     OPC_PUL_PS = FOP(46, FMT_PS),
7238     OPC_PUU_PS = FOP(47, FMT_PS),
7239     OPC_CMP_F_PS = FOP (48, FMT_PS),
7240     OPC_CMP_UN_PS = FOP (49, FMT_PS),
7241     OPC_CMP_EQ_PS = FOP (50, FMT_PS),
7242     OPC_CMP_UEQ_PS = FOP (51, FMT_PS),
7243     OPC_CMP_OLT_PS = FOP (52, FMT_PS),
7244     OPC_CMP_ULT_PS = FOP (53, FMT_PS),
7245     OPC_CMP_OLE_PS = FOP (54, FMT_PS),
7246     OPC_CMP_ULE_PS = FOP (55, FMT_PS),
7247     OPC_CMP_SF_PS = FOP (56, FMT_PS),
7248     OPC_CMP_NGLE_PS = FOP (57, FMT_PS),
7249     OPC_CMP_SEQ_PS = FOP (58, FMT_PS),
7250     OPC_CMP_NGL_PS = FOP (59, FMT_PS),
7251     OPC_CMP_LT_PS = FOP (60, FMT_PS),
7252     OPC_CMP_NGE_PS = FOP (61, FMT_PS),
7253     OPC_CMP_LE_PS = FOP (62, FMT_PS),
7254     OPC_CMP_NGT_PS = FOP (63, FMT_PS),
7255 };
7256
7257 static void gen_cp1 (DisasContext *ctx, uint32_t opc, int rt, int fs)
7258 {
7259     const char *opn = "cp1 move";
7260     TCGv t0 = tcg_temp_new();
7261
7262     switch (opc) {
7263     case OPC_MFC1:
7264         {
7265             TCGv_i32 fp0 = tcg_temp_new_i32();
7266
7267             gen_load_fpr32(fp0, fs);
7268             tcg_gen_ext_i32_tl(t0, fp0);
7269             tcg_temp_free_i32(fp0);
7270         }
7271         gen_store_gpr(t0, rt);
7272         opn = "mfc1";
7273         break;
7274     case OPC_MTC1:
7275         gen_load_gpr(t0, rt);
7276         {
7277             TCGv_i32 fp0 = tcg_temp_new_i32();
7278
7279             tcg_gen_trunc_tl_i32(fp0, t0);
7280             gen_store_fpr32(fp0, fs);
7281             tcg_temp_free_i32(fp0);
7282         }
7283         opn = "mtc1";
7284         break;
7285     case OPC_CFC1:
7286         gen_helper_1e0i(cfc1, t0, fs);
7287         gen_store_gpr(t0, rt);
7288         opn = "cfc1";
7289         break;
7290     case OPC_CTC1:
7291         gen_load_gpr(t0, rt);
7292         gen_helper_0e1i(ctc1, t0, fs);
7293         opn = "ctc1";
7294         break;
7295 #if defined(TARGET_MIPS64)
7296     case OPC_DMFC1:
7297         gen_load_fpr64(ctx, t0, fs);
7298         gen_store_gpr(t0, rt);
7299         opn = "dmfc1";
7300         break;
7301     case OPC_DMTC1:
7302         gen_load_gpr(t0, rt);
7303         gen_store_fpr64(ctx, t0, fs);
7304         opn = "dmtc1";
7305         break;
7306 #endif
7307     case OPC_MFHC1:
7308         {
7309             TCGv_i32 fp0 = tcg_temp_new_i32();
7310
7311             gen_load_fpr32h(fp0, fs);
7312             tcg_gen_ext_i32_tl(t0, fp0);
7313             tcg_temp_free_i32(fp0);
7314         }
7315         gen_store_gpr(t0, rt);
7316         opn = "mfhc1";
7317         break;
7318     case OPC_MTHC1:
7319         gen_load_gpr(t0, rt);
7320         {
7321             TCGv_i32 fp0 = tcg_temp_new_i32();
7322
7323             tcg_gen_trunc_tl_i32(fp0, t0);
7324             gen_store_fpr32h(fp0, fs);
7325             tcg_temp_free_i32(fp0);
7326         }
7327         opn = "mthc1";
7328         break;
7329     default:
7330         MIPS_INVAL(opn);
7331         generate_exception (ctx, EXCP_RI);
7332         goto out;
7333     }
7334     (void)opn; /* avoid a compiler warning */
7335     MIPS_DEBUG("%s %s %s", opn, regnames[rt], fregnames[fs]);
7336
7337  out:
7338     tcg_temp_free(t0);
7339 }
7340
7341 static void gen_movci (DisasContext *ctx, int rd, int rs, int cc, int tf)
7342 {
7343     int l1;
7344     TCGCond cond;
7345     TCGv_i32 t0;
7346
7347     if (rd == 0) {
7348         /* Treat as NOP. */
7349         return;
7350     }
7351
7352     if (tf)
7353         cond = TCG_COND_EQ;
7354     else
7355         cond = TCG_COND_NE;
7356
7357     l1 = gen_new_label();
7358     t0 = tcg_temp_new_i32();
7359     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
7360     tcg_gen_brcondi_i32(cond, t0, 0, l1);
7361     tcg_temp_free_i32(t0);
7362     if (rs == 0) {
7363         tcg_gen_movi_tl(cpu_gpr[rd], 0);
7364     } else {
7365         tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
7366     }
7367     gen_set_label(l1);
7368 }
7369
7370 static inline void gen_movcf_s (int fs, int fd, int cc, int tf)
7371 {
7372     int cond;
7373     TCGv_i32 t0 = tcg_temp_new_i32();
7374     int l1 = gen_new_label();
7375
7376     if (tf)
7377         cond = TCG_COND_EQ;
7378     else
7379         cond = TCG_COND_NE;
7380
7381     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
7382     tcg_gen_brcondi_i32(cond, t0, 0, l1);
7383     gen_load_fpr32(t0, fs);
7384     gen_store_fpr32(t0, fd);
7385     gen_set_label(l1);
7386     tcg_temp_free_i32(t0);
7387 }
7388
7389 static inline void gen_movcf_d (DisasContext *ctx, int fs, int fd, int cc, int tf)
7390 {
7391     int cond;
7392     TCGv_i32 t0 = tcg_temp_new_i32();
7393     TCGv_i64 fp0;
7394     int l1 = gen_new_label();
7395
7396     if (tf)
7397         cond = TCG_COND_EQ;
7398     else
7399         cond = TCG_COND_NE;
7400
7401     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
7402     tcg_gen_brcondi_i32(cond, t0, 0, l1);
7403     tcg_temp_free_i32(t0);
7404     fp0 = tcg_temp_new_i64();
7405     gen_load_fpr64(ctx, fp0, fs);
7406     gen_store_fpr64(ctx, fp0, fd);
7407     tcg_temp_free_i64(fp0);
7408     gen_set_label(l1);
7409 }
7410
7411 static inline void gen_movcf_ps (int fs, int fd, int cc, int tf)
7412 {
7413     int cond;
7414     TCGv_i32 t0 = tcg_temp_new_i32();
7415     int l1 = gen_new_label();
7416     int l2 = gen_new_label();
7417
7418     if (tf)
7419         cond = TCG_COND_EQ;
7420     else
7421         cond = TCG_COND_NE;
7422
7423     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
7424     tcg_gen_brcondi_i32(cond, t0, 0, l1);
7425     gen_load_fpr32(t0, fs);
7426     gen_store_fpr32(t0, fd);
7427     gen_set_label(l1);
7428
7429     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc+1));
7430     tcg_gen_brcondi_i32(cond, t0, 0, l2);
7431     gen_load_fpr32h(t0, fs);
7432     gen_store_fpr32h(t0, fd);
7433     tcg_temp_free_i32(t0);
7434     gen_set_label(l2);
7435 }
7436
7437
7438 static void gen_farith (DisasContext *ctx, enum fopcode op1,
7439                         int ft, int fs, int fd, int cc)
7440 {
7441     const char *opn = "farith";
7442     const char *condnames[] = {
7443             "c.f",
7444             "c.un",
7445             "c.eq",
7446             "c.ueq",
7447             "c.olt",
7448             "c.ult",
7449             "c.ole",
7450             "c.ule",
7451             "c.sf",
7452             "c.ngle",
7453             "c.seq",
7454             "c.ngl",
7455             "c.lt",
7456             "c.nge",
7457             "c.le",
7458             "c.ngt",
7459     };
7460     const char *condnames_abs[] = {
7461             "cabs.f",
7462             "cabs.un",
7463             "cabs.eq",
7464             "cabs.ueq",
7465             "cabs.olt",
7466             "cabs.ult",
7467             "cabs.ole",
7468             "cabs.ule",
7469             "cabs.sf",
7470             "cabs.ngle",
7471             "cabs.seq",
7472             "cabs.ngl",
7473             "cabs.lt",
7474             "cabs.nge",
7475             "cabs.le",
7476             "cabs.ngt",
7477     };
7478     enum { BINOP, CMPOP, OTHEROP } optype = OTHEROP;
7479     uint32_t func = ctx->opcode & 0x3f;
7480
7481     switch (op1) {
7482     case OPC_ADD_S:
7483         {
7484             TCGv_i32 fp0 = tcg_temp_new_i32();
7485             TCGv_i32 fp1 = tcg_temp_new_i32();
7486
7487             gen_load_fpr32(fp0, fs);
7488             gen_load_fpr32(fp1, ft);
7489             gen_helper_float_add_s(fp0, cpu_env, fp0, fp1);
7490             tcg_temp_free_i32(fp1);
7491             gen_store_fpr32(fp0, fd);
7492             tcg_temp_free_i32(fp0);
7493         }
7494         opn = "add.s";
7495         optype = BINOP;
7496         break;
7497     case OPC_SUB_S:
7498         {
7499             TCGv_i32 fp0 = tcg_temp_new_i32();
7500             TCGv_i32 fp1 = tcg_temp_new_i32();
7501
7502             gen_load_fpr32(fp0, fs);
7503             gen_load_fpr32(fp1, ft);
7504             gen_helper_float_sub_s(fp0, cpu_env, fp0, fp1);
7505             tcg_temp_free_i32(fp1);
7506             gen_store_fpr32(fp0, fd);
7507             tcg_temp_free_i32(fp0);
7508         }
7509         opn = "sub.s";
7510         optype = BINOP;
7511         break;
7512     case OPC_MUL_S:
7513         {
7514             TCGv_i32 fp0 = tcg_temp_new_i32();
7515             TCGv_i32 fp1 = tcg_temp_new_i32();
7516
7517             gen_load_fpr32(fp0, fs);
7518             gen_load_fpr32(fp1, ft);
7519             gen_helper_float_mul_s(fp0, cpu_env, fp0, fp1);
7520             tcg_temp_free_i32(fp1);
7521             gen_store_fpr32(fp0, fd);
7522             tcg_temp_free_i32(fp0);
7523         }
7524         opn = "mul.s";
7525         optype = BINOP;
7526         break;
7527     case OPC_DIV_S:
7528         {
7529             TCGv_i32 fp0 = tcg_temp_new_i32();
7530             TCGv_i32 fp1 = tcg_temp_new_i32();
7531
7532             gen_load_fpr32(fp0, fs);
7533             gen_load_fpr32(fp1, ft);
7534             gen_helper_float_div_s(fp0, cpu_env, fp0, fp1);
7535             tcg_temp_free_i32(fp1);
7536             gen_store_fpr32(fp0, fd);
7537             tcg_temp_free_i32(fp0);
7538         }
7539         opn = "div.s";
7540         optype = BINOP;
7541         break;
7542     case OPC_SQRT_S:
7543         {
7544             TCGv_i32 fp0 = tcg_temp_new_i32();
7545
7546             gen_load_fpr32(fp0, fs);
7547             gen_helper_float_sqrt_s(fp0, cpu_env, fp0);
7548             gen_store_fpr32(fp0, fd);
7549             tcg_temp_free_i32(fp0);
7550         }
7551         opn = "sqrt.s";
7552         break;
7553     case OPC_ABS_S:
7554         {
7555             TCGv_i32 fp0 = tcg_temp_new_i32();
7556
7557             gen_load_fpr32(fp0, fs);
7558             gen_helper_float_abs_s(fp0, fp0);
7559             gen_store_fpr32(fp0, fd);
7560             tcg_temp_free_i32(fp0);
7561         }
7562         opn = "abs.s";
7563         break;
7564     case OPC_MOV_S:
7565         {
7566             TCGv_i32 fp0 = tcg_temp_new_i32();
7567
7568             gen_load_fpr32(fp0, fs);
7569             gen_store_fpr32(fp0, fd);
7570             tcg_temp_free_i32(fp0);
7571         }
7572         opn = "mov.s";
7573         break;
7574     case OPC_NEG_S:
7575         {
7576             TCGv_i32 fp0 = tcg_temp_new_i32();
7577
7578             gen_load_fpr32(fp0, fs);
7579             gen_helper_float_chs_s(fp0, fp0);
7580             gen_store_fpr32(fp0, fd);
7581             tcg_temp_free_i32(fp0);
7582         }
7583         opn = "neg.s";
7584         break;
7585     case OPC_ROUND_L_S:
7586         check_cp1_64bitmode(ctx);
7587         {
7588             TCGv_i32 fp32 = tcg_temp_new_i32();
7589             TCGv_i64 fp64 = tcg_temp_new_i64();
7590
7591             gen_load_fpr32(fp32, fs);
7592             gen_helper_float_roundl_s(fp64, cpu_env, fp32);
7593             tcg_temp_free_i32(fp32);
7594             gen_store_fpr64(ctx, fp64, fd);
7595             tcg_temp_free_i64(fp64);
7596         }
7597         opn = "round.l.s";
7598         break;
7599     case OPC_TRUNC_L_S:
7600         check_cp1_64bitmode(ctx);
7601         {
7602             TCGv_i32 fp32 = tcg_temp_new_i32();
7603             TCGv_i64 fp64 = tcg_temp_new_i64();
7604
7605             gen_load_fpr32(fp32, fs);
7606             gen_helper_float_truncl_s(fp64, cpu_env, fp32);
7607             tcg_temp_free_i32(fp32);
7608             gen_store_fpr64(ctx, fp64, fd);
7609             tcg_temp_free_i64(fp64);
7610         }
7611         opn = "trunc.l.s";
7612         break;
7613     case OPC_CEIL_L_S:
7614         check_cp1_64bitmode(ctx);
7615         {
7616             TCGv_i32 fp32 = tcg_temp_new_i32();
7617             TCGv_i64 fp64 = tcg_temp_new_i64();
7618
7619             gen_load_fpr32(fp32, fs);
7620             gen_helper_float_ceill_s(fp64, cpu_env, fp32);
7621             tcg_temp_free_i32(fp32);
7622             gen_store_fpr64(ctx, fp64, fd);
7623             tcg_temp_free_i64(fp64);
7624         }
7625         opn = "ceil.l.s";
7626         break;
7627     case OPC_FLOOR_L_S:
7628         check_cp1_64bitmode(ctx);
7629         {
7630             TCGv_i32 fp32 = tcg_temp_new_i32();
7631             TCGv_i64 fp64 = tcg_temp_new_i64();
7632
7633             gen_load_fpr32(fp32, fs);
7634             gen_helper_float_floorl_s(fp64, cpu_env, fp32);
7635             tcg_temp_free_i32(fp32);
7636             gen_store_fpr64(ctx, fp64, fd);
7637             tcg_temp_free_i64(fp64);
7638         }
7639         opn = "floor.l.s";
7640         break;
7641     case OPC_ROUND_W_S:
7642         {
7643             TCGv_i32 fp0 = tcg_temp_new_i32();
7644
7645             gen_load_fpr32(fp0, fs);
7646             gen_helper_float_roundw_s(fp0, cpu_env, fp0);
7647             gen_store_fpr32(fp0, fd);
7648             tcg_temp_free_i32(fp0);
7649         }
7650         opn = "round.w.s";
7651         break;
7652     case OPC_TRUNC_W_S:
7653         {
7654             TCGv_i32 fp0 = tcg_temp_new_i32();
7655
7656             gen_load_fpr32(fp0, fs);
7657             gen_helper_float_truncw_s(fp0, cpu_env, fp0);
7658             gen_store_fpr32(fp0, fd);
7659             tcg_temp_free_i32(fp0);
7660         }
7661         opn = "trunc.w.s";
7662         break;
7663     case OPC_CEIL_W_S:
7664         {
7665             TCGv_i32 fp0 = tcg_temp_new_i32();
7666
7667             gen_load_fpr32(fp0, fs);
7668             gen_helper_float_ceilw_s(fp0, cpu_env, fp0);
7669             gen_store_fpr32(fp0, fd);
7670             tcg_temp_free_i32(fp0);
7671         }
7672         opn = "ceil.w.s";
7673         break;
7674     case OPC_FLOOR_W_S:
7675         {
7676             TCGv_i32 fp0 = tcg_temp_new_i32();
7677
7678             gen_load_fpr32(fp0, fs);
7679             gen_helper_float_floorw_s(fp0, cpu_env, fp0);
7680             gen_store_fpr32(fp0, fd);
7681             tcg_temp_free_i32(fp0);
7682         }
7683         opn = "floor.w.s";
7684         break;
7685     case OPC_MOVCF_S:
7686         gen_movcf_s(fs, fd, (ft >> 2) & 0x7, ft & 0x1);
7687         opn = "movcf.s";
7688         break;
7689     case OPC_MOVZ_S:
7690         {
7691             int l1 = gen_new_label();
7692             TCGv_i32 fp0;
7693
7694             if (ft != 0) {
7695                 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
7696             }
7697             fp0 = tcg_temp_new_i32();
7698             gen_load_fpr32(fp0, fs);
7699             gen_store_fpr32(fp0, fd);
7700             tcg_temp_free_i32(fp0);
7701             gen_set_label(l1);
7702         }
7703         opn = "movz.s";
7704         break;
7705     case OPC_MOVN_S:
7706         {
7707             int l1 = gen_new_label();
7708             TCGv_i32 fp0;
7709
7710             if (ft != 0) {
7711                 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
7712                 fp0 = tcg_temp_new_i32();
7713                 gen_load_fpr32(fp0, fs);
7714                 gen_store_fpr32(fp0, fd);
7715                 tcg_temp_free_i32(fp0);
7716                 gen_set_label(l1);
7717             }
7718         }
7719         opn = "movn.s";
7720         break;
7721     case OPC_RECIP_S:
7722         check_cop1x(ctx);
7723         {
7724             TCGv_i32 fp0 = tcg_temp_new_i32();
7725
7726             gen_load_fpr32(fp0, fs);
7727             gen_helper_float_recip_s(fp0, cpu_env, fp0);
7728             gen_store_fpr32(fp0, fd);
7729             tcg_temp_free_i32(fp0);
7730         }
7731         opn = "recip.s";
7732         break;
7733     case OPC_RSQRT_S:
7734         check_cop1x(ctx);
7735         {
7736             TCGv_i32 fp0 = tcg_temp_new_i32();
7737
7738             gen_load_fpr32(fp0, fs);
7739             gen_helper_float_rsqrt_s(fp0, cpu_env, fp0);
7740             gen_store_fpr32(fp0, fd);
7741             tcg_temp_free_i32(fp0);
7742         }
7743         opn = "rsqrt.s";
7744         break;
7745     case OPC_RECIP2_S:
7746         check_cp1_64bitmode(ctx);
7747         {
7748             TCGv_i32 fp0 = tcg_temp_new_i32();
7749             TCGv_i32 fp1 = tcg_temp_new_i32();
7750
7751             gen_load_fpr32(fp0, fs);
7752             gen_load_fpr32(fp1, ft);
7753             gen_helper_float_recip2_s(fp0, cpu_env, fp0, fp1);
7754             tcg_temp_free_i32(fp1);
7755             gen_store_fpr32(fp0, fd);
7756             tcg_temp_free_i32(fp0);
7757         }
7758         opn = "recip2.s";
7759         break;
7760     case OPC_RECIP1_S:
7761         check_cp1_64bitmode(ctx);
7762         {
7763             TCGv_i32 fp0 = tcg_temp_new_i32();
7764
7765             gen_load_fpr32(fp0, fs);
7766             gen_helper_float_recip1_s(fp0, cpu_env, fp0);
7767             gen_store_fpr32(fp0, fd);
7768             tcg_temp_free_i32(fp0);
7769         }
7770         opn = "recip1.s";
7771         break;
7772     case OPC_RSQRT1_S:
7773         check_cp1_64bitmode(ctx);
7774         {
7775             TCGv_i32 fp0 = tcg_temp_new_i32();
7776
7777             gen_load_fpr32(fp0, fs);
7778             gen_helper_float_rsqrt1_s(fp0, cpu_env, fp0);
7779             gen_store_fpr32(fp0, fd);
7780             tcg_temp_free_i32(fp0);
7781         }
7782         opn = "rsqrt1.s";
7783         break;
7784     case OPC_RSQRT2_S:
7785         check_cp1_64bitmode(ctx);
7786         {
7787             TCGv_i32 fp0 = tcg_temp_new_i32();
7788             TCGv_i32 fp1 = tcg_temp_new_i32();
7789
7790             gen_load_fpr32(fp0, fs);
7791             gen_load_fpr32(fp1, ft);
7792             gen_helper_float_rsqrt2_s(fp0, cpu_env, fp0, fp1);
7793             tcg_temp_free_i32(fp1);
7794             gen_store_fpr32(fp0, fd);
7795             tcg_temp_free_i32(fp0);
7796         }
7797         opn = "rsqrt2.s";
7798         break;
7799     case OPC_CVT_D_S:
7800         check_cp1_registers(ctx, fd);
7801         {
7802             TCGv_i32 fp32 = tcg_temp_new_i32();
7803             TCGv_i64 fp64 = tcg_temp_new_i64();
7804
7805             gen_load_fpr32(fp32, fs);
7806             gen_helper_float_cvtd_s(fp64, cpu_env, fp32);
7807             tcg_temp_free_i32(fp32);
7808             gen_store_fpr64(ctx, fp64, fd);
7809             tcg_temp_free_i64(fp64);
7810         }
7811         opn = "cvt.d.s";
7812         break;
7813     case OPC_CVT_W_S:
7814         {
7815             TCGv_i32 fp0 = tcg_temp_new_i32();
7816
7817             gen_load_fpr32(fp0, fs);
7818             gen_helper_float_cvtw_s(fp0, cpu_env, fp0);
7819             gen_store_fpr32(fp0, fd);
7820             tcg_temp_free_i32(fp0);
7821         }
7822         opn = "cvt.w.s";
7823         break;
7824     case OPC_CVT_L_S:
7825         check_cp1_64bitmode(ctx);
7826         {
7827             TCGv_i32 fp32 = tcg_temp_new_i32();
7828             TCGv_i64 fp64 = tcg_temp_new_i64();
7829
7830             gen_load_fpr32(fp32, fs);
7831             gen_helper_float_cvtl_s(fp64, cpu_env, fp32);
7832             tcg_temp_free_i32(fp32);
7833             gen_store_fpr64(ctx, fp64, fd);
7834             tcg_temp_free_i64(fp64);
7835         }
7836         opn = "cvt.l.s";
7837         break;
7838     case OPC_CVT_PS_S:
7839         check_cp1_64bitmode(ctx);
7840         {
7841             TCGv_i64 fp64 = tcg_temp_new_i64();
7842             TCGv_i32 fp32_0 = tcg_temp_new_i32();
7843             TCGv_i32 fp32_1 = tcg_temp_new_i32();
7844
7845             gen_load_fpr32(fp32_0, fs);
7846             gen_load_fpr32(fp32_1, ft);
7847             tcg_gen_concat_i32_i64(fp64, fp32_1, fp32_0);
7848             tcg_temp_free_i32(fp32_1);
7849             tcg_temp_free_i32(fp32_0);
7850             gen_store_fpr64(ctx, fp64, fd);
7851             tcg_temp_free_i64(fp64);
7852         }
7853         opn = "cvt.ps.s";
7854         break;
7855     case OPC_CMP_F_S:
7856     case OPC_CMP_UN_S:
7857     case OPC_CMP_EQ_S:
7858     case OPC_CMP_UEQ_S:
7859     case OPC_CMP_OLT_S:
7860     case OPC_CMP_ULT_S:
7861     case OPC_CMP_OLE_S:
7862     case OPC_CMP_ULE_S:
7863     case OPC_CMP_SF_S:
7864     case OPC_CMP_NGLE_S:
7865     case OPC_CMP_SEQ_S:
7866     case OPC_CMP_NGL_S:
7867     case OPC_CMP_LT_S:
7868     case OPC_CMP_NGE_S:
7869     case OPC_CMP_LE_S:
7870     case OPC_CMP_NGT_S:
7871         if (ctx->opcode & (1 << 6)) {
7872             gen_cmpabs_s(ctx, func-48, ft, fs, cc);
7873             opn = condnames_abs[func-48];
7874         } else {
7875             gen_cmp_s(ctx, func-48, ft, fs, cc);
7876             opn = condnames[func-48];
7877         }
7878         break;
7879     case OPC_ADD_D:
7880         check_cp1_registers(ctx, fs | ft | fd);
7881         {
7882             TCGv_i64 fp0 = tcg_temp_new_i64();
7883             TCGv_i64 fp1 = tcg_temp_new_i64();
7884
7885             gen_load_fpr64(ctx, fp0, fs);
7886             gen_load_fpr64(ctx, fp1, ft);
7887             gen_helper_float_add_d(fp0, cpu_env, fp0, fp1);
7888             tcg_temp_free_i64(fp1);
7889             gen_store_fpr64(ctx, fp0, fd);
7890             tcg_temp_free_i64(fp0);
7891         }
7892         opn = "add.d";
7893         optype = BINOP;
7894         break;
7895     case OPC_SUB_D:
7896         check_cp1_registers(ctx, fs | ft | fd);
7897         {
7898             TCGv_i64 fp0 = tcg_temp_new_i64();
7899             TCGv_i64 fp1 = tcg_temp_new_i64();
7900
7901             gen_load_fpr64(ctx, fp0, fs);
7902             gen_load_fpr64(ctx, fp1, ft);
7903             gen_helper_float_sub_d(fp0, cpu_env, fp0, fp1);
7904             tcg_temp_free_i64(fp1);
7905             gen_store_fpr64(ctx, fp0, fd);
7906             tcg_temp_free_i64(fp0);
7907         }
7908         opn = "sub.d";
7909         optype = BINOP;
7910         break;
7911     case OPC_MUL_D:
7912         check_cp1_registers(ctx, fs | ft | fd);
7913         {
7914             TCGv_i64 fp0 = tcg_temp_new_i64();
7915             TCGv_i64 fp1 = tcg_temp_new_i64();
7916
7917             gen_load_fpr64(ctx, fp0, fs);
7918             gen_load_fpr64(ctx, fp1, ft);
7919             gen_helper_float_mul_d(fp0, cpu_env, fp0, fp1);
7920             tcg_temp_free_i64(fp1);
7921             gen_store_fpr64(ctx, fp0, fd);
7922             tcg_temp_free_i64(fp0);
7923         }
7924         opn = "mul.d";
7925         optype = BINOP;
7926         break;
7927     case OPC_DIV_D:
7928         check_cp1_registers(ctx, fs | ft | fd);
7929         {
7930             TCGv_i64 fp0 = tcg_temp_new_i64();
7931             TCGv_i64 fp1 = tcg_temp_new_i64();
7932
7933             gen_load_fpr64(ctx, fp0, fs);
7934             gen_load_fpr64(ctx, fp1, ft);
7935             gen_helper_float_div_d(fp0, cpu_env, fp0, fp1);
7936             tcg_temp_free_i64(fp1);
7937             gen_store_fpr64(ctx, fp0, fd);
7938             tcg_temp_free_i64(fp0);
7939         }
7940         opn = "div.d";
7941         optype = BINOP;
7942         break;
7943     case OPC_SQRT_D:
7944         check_cp1_registers(ctx, fs | fd);
7945         {
7946             TCGv_i64 fp0 = tcg_temp_new_i64();
7947
7948             gen_load_fpr64(ctx, fp0, fs);
7949             gen_helper_float_sqrt_d(fp0, cpu_env, fp0);
7950             gen_store_fpr64(ctx, fp0, fd);
7951             tcg_temp_free_i64(fp0);
7952         }
7953         opn = "sqrt.d";
7954         break;
7955     case OPC_ABS_D:
7956         check_cp1_registers(ctx, fs | fd);
7957         {
7958             TCGv_i64 fp0 = tcg_temp_new_i64();
7959
7960             gen_load_fpr64(ctx, fp0, fs);
7961             gen_helper_float_abs_d(fp0, fp0);
7962             gen_store_fpr64(ctx, fp0, fd);
7963             tcg_temp_free_i64(fp0);
7964         }
7965         opn = "abs.d";
7966         break;
7967     case OPC_MOV_D:
7968         check_cp1_registers(ctx, fs | fd);
7969         {
7970             TCGv_i64 fp0 = tcg_temp_new_i64();
7971
7972             gen_load_fpr64(ctx, fp0, fs);
7973             gen_store_fpr64(ctx, fp0, fd);
7974             tcg_temp_free_i64(fp0);
7975         }
7976         opn = "mov.d";
7977         break;
7978     case OPC_NEG_D:
7979         check_cp1_registers(ctx, fs | fd);
7980         {
7981             TCGv_i64 fp0 = tcg_temp_new_i64();
7982
7983             gen_load_fpr64(ctx, fp0, fs);
7984             gen_helper_float_chs_d(fp0, fp0);
7985             gen_store_fpr64(ctx, fp0, fd);
7986             tcg_temp_free_i64(fp0);
7987         }
7988         opn = "neg.d";
7989         break;
7990     case OPC_ROUND_L_D:
7991         check_cp1_64bitmode(ctx);
7992         {
7993             TCGv_i64 fp0 = tcg_temp_new_i64();
7994
7995             gen_load_fpr64(ctx, fp0, fs);
7996             gen_helper_float_roundl_d(fp0, cpu_env, fp0);
7997             gen_store_fpr64(ctx, fp0, fd);
7998             tcg_temp_free_i64(fp0);
7999         }
8000         opn = "round.l.d";
8001         break;
8002     case OPC_TRUNC_L_D:
8003         check_cp1_64bitmode(ctx);
8004         {
8005             TCGv_i64 fp0 = tcg_temp_new_i64();
8006
8007             gen_load_fpr64(ctx, fp0, fs);
8008             gen_helper_float_truncl_d(fp0, cpu_env, fp0);
8009             gen_store_fpr64(ctx, fp0, fd);
8010             tcg_temp_free_i64(fp0);
8011         }
8012         opn = "trunc.l.d";
8013         break;
8014     case OPC_CEIL_L_D:
8015         check_cp1_64bitmode(ctx);
8016         {
8017             TCGv_i64 fp0 = tcg_temp_new_i64();
8018
8019             gen_load_fpr64(ctx, fp0, fs);
8020             gen_helper_float_ceill_d(fp0, cpu_env, fp0);
8021             gen_store_fpr64(ctx, fp0, fd);
8022             tcg_temp_free_i64(fp0);
8023         }
8024         opn = "ceil.l.d";
8025         break;
8026     case OPC_FLOOR_L_D:
8027         check_cp1_64bitmode(ctx);
8028         {
8029             TCGv_i64 fp0 = tcg_temp_new_i64();
8030
8031             gen_load_fpr64(ctx, fp0, fs);
8032             gen_helper_float_floorl_d(fp0, cpu_env, fp0);
8033             gen_store_fpr64(ctx, fp0, fd);
8034             tcg_temp_free_i64(fp0);
8035         }
8036         opn = "floor.l.d";
8037         break;
8038     case OPC_ROUND_W_D:
8039         check_cp1_registers(ctx, fs);
8040         {
8041             TCGv_i32 fp32 = tcg_temp_new_i32();
8042             TCGv_i64 fp64 = tcg_temp_new_i64();
8043
8044             gen_load_fpr64(ctx, fp64, fs);
8045             gen_helper_float_roundw_d(fp32, cpu_env, fp64);
8046             tcg_temp_free_i64(fp64);
8047             gen_store_fpr32(fp32, fd);
8048             tcg_temp_free_i32(fp32);
8049         }
8050         opn = "round.w.d";
8051         break;
8052     case OPC_TRUNC_W_D:
8053         check_cp1_registers(ctx, fs);
8054         {
8055             TCGv_i32 fp32 = tcg_temp_new_i32();
8056             TCGv_i64 fp64 = tcg_temp_new_i64();
8057
8058             gen_load_fpr64(ctx, fp64, fs);
8059             gen_helper_float_truncw_d(fp32, cpu_env, fp64);
8060             tcg_temp_free_i64(fp64);
8061             gen_store_fpr32(fp32, fd);
8062             tcg_temp_free_i32(fp32);
8063         }
8064         opn = "trunc.w.d";
8065         break;
8066     case OPC_CEIL_W_D:
8067         check_cp1_registers(ctx, fs);
8068         {
8069             TCGv_i32 fp32 = tcg_temp_new_i32();
8070             TCGv_i64 fp64 = tcg_temp_new_i64();
8071
8072             gen_load_fpr64(ctx, fp64, fs);
8073             gen_helper_float_ceilw_d(fp32, cpu_env, fp64);
8074             tcg_temp_free_i64(fp64);
8075             gen_store_fpr32(fp32, fd);
8076             tcg_temp_free_i32(fp32);
8077         }
8078         opn = "ceil.w.d";
8079         break;
8080     case OPC_FLOOR_W_D:
8081         check_cp1_registers(ctx, fs);
8082         {
8083             TCGv_i32 fp32 = tcg_temp_new_i32();
8084             TCGv_i64 fp64 = tcg_temp_new_i64();
8085
8086             gen_load_fpr64(ctx, fp64, fs);
8087             gen_helper_float_floorw_d(fp32, cpu_env, fp64);
8088             tcg_temp_free_i64(fp64);
8089             gen_store_fpr32(fp32, fd);
8090             tcg_temp_free_i32(fp32);
8091         }
8092         opn = "floor.w.d";
8093         break;
8094     case OPC_MOVCF_D:
8095         gen_movcf_d(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1);
8096         opn = "movcf.d";
8097         break;
8098     case OPC_MOVZ_D:
8099         {
8100             int l1 = gen_new_label();
8101             TCGv_i64 fp0;
8102
8103             if (ft != 0) {
8104                 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
8105             }
8106             fp0 = tcg_temp_new_i64();
8107             gen_load_fpr64(ctx, fp0, fs);
8108             gen_store_fpr64(ctx, fp0, fd);
8109             tcg_temp_free_i64(fp0);
8110             gen_set_label(l1);
8111         }
8112         opn = "movz.d";
8113         break;
8114     case OPC_MOVN_D:
8115         {
8116             int l1 = gen_new_label();
8117             TCGv_i64 fp0;
8118
8119             if (ft != 0) {
8120                 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
8121                 fp0 = tcg_temp_new_i64();
8122                 gen_load_fpr64(ctx, fp0, fs);
8123                 gen_store_fpr64(ctx, fp0, fd);
8124                 tcg_temp_free_i64(fp0);
8125                 gen_set_label(l1);
8126             }
8127         }
8128         opn = "movn.d";
8129         break;
8130     case OPC_RECIP_D:
8131         check_cp1_64bitmode(ctx);
8132         {
8133             TCGv_i64 fp0 = tcg_temp_new_i64();
8134
8135             gen_load_fpr64(ctx, fp0, fs);
8136             gen_helper_float_recip_d(fp0, cpu_env, fp0);
8137             gen_store_fpr64(ctx, fp0, fd);
8138             tcg_temp_free_i64(fp0);
8139         }
8140         opn = "recip.d";
8141         break;
8142     case OPC_RSQRT_D:
8143         check_cp1_64bitmode(ctx);
8144         {
8145             TCGv_i64 fp0 = tcg_temp_new_i64();
8146
8147             gen_load_fpr64(ctx, fp0, fs);
8148             gen_helper_float_rsqrt_d(fp0, cpu_env, fp0);
8149             gen_store_fpr64(ctx, fp0, fd);
8150             tcg_temp_free_i64(fp0);
8151         }
8152         opn = "rsqrt.d";
8153         break;
8154     case OPC_RECIP2_D:
8155         check_cp1_64bitmode(ctx);
8156         {
8157             TCGv_i64 fp0 = tcg_temp_new_i64();
8158             TCGv_i64 fp1 = tcg_temp_new_i64();
8159
8160             gen_load_fpr64(ctx, fp0, fs);
8161             gen_load_fpr64(ctx, fp1, ft);
8162             gen_helper_float_recip2_d(fp0, cpu_env, fp0, fp1);
8163             tcg_temp_free_i64(fp1);
8164             gen_store_fpr64(ctx, fp0, fd);
8165             tcg_temp_free_i64(fp0);
8166         }
8167         opn = "recip2.d";
8168         break;
8169     case OPC_RECIP1_D:
8170         check_cp1_64bitmode(ctx);
8171         {
8172             TCGv_i64 fp0 = tcg_temp_new_i64();
8173
8174             gen_load_fpr64(ctx, fp0, fs);
8175             gen_helper_float_recip1_d(fp0, cpu_env, fp0);
8176             gen_store_fpr64(ctx, fp0, fd);
8177             tcg_temp_free_i64(fp0);
8178         }
8179         opn = "recip1.d";
8180         break;
8181     case OPC_RSQRT1_D:
8182         check_cp1_64bitmode(ctx);
8183         {
8184             TCGv_i64 fp0 = tcg_temp_new_i64();
8185
8186             gen_load_fpr64(ctx, fp0, fs);
8187             gen_helper_float_rsqrt1_d(fp0, cpu_env, fp0);
8188             gen_store_fpr64(ctx, fp0, fd);
8189             tcg_temp_free_i64(fp0);
8190         }
8191         opn = "rsqrt1.d";
8192         break;
8193     case OPC_RSQRT2_D:
8194         check_cp1_64bitmode(ctx);
8195         {
8196             TCGv_i64 fp0 = tcg_temp_new_i64();
8197             TCGv_i64 fp1 = tcg_temp_new_i64();
8198
8199             gen_load_fpr64(ctx, fp0, fs);
8200             gen_load_fpr64(ctx, fp1, ft);
8201             gen_helper_float_rsqrt2_d(fp0, cpu_env, fp0, fp1);
8202             tcg_temp_free_i64(fp1);
8203             gen_store_fpr64(ctx, fp0, fd);
8204             tcg_temp_free_i64(fp0);
8205         }
8206         opn = "rsqrt2.d";
8207         break;
8208     case OPC_CMP_F_D:
8209     case OPC_CMP_UN_D:
8210     case OPC_CMP_EQ_D:
8211     case OPC_CMP_UEQ_D:
8212     case OPC_CMP_OLT_D:
8213     case OPC_CMP_ULT_D:
8214     case OPC_CMP_OLE_D:
8215     case OPC_CMP_ULE_D:
8216     case OPC_CMP_SF_D:
8217     case OPC_CMP_NGLE_D:
8218     case OPC_CMP_SEQ_D:
8219     case OPC_CMP_NGL_D:
8220     case OPC_CMP_LT_D:
8221     case OPC_CMP_NGE_D:
8222     case OPC_CMP_LE_D:
8223     case OPC_CMP_NGT_D:
8224         if (ctx->opcode & (1 << 6)) {
8225             gen_cmpabs_d(ctx, func-48, ft, fs, cc);
8226             opn = condnames_abs[func-48];
8227         } else {
8228             gen_cmp_d(ctx, func-48, ft, fs, cc);
8229             opn = condnames[func-48];
8230         }
8231         break;
8232     case OPC_CVT_S_D:
8233         check_cp1_registers(ctx, fs);
8234         {
8235             TCGv_i32 fp32 = tcg_temp_new_i32();
8236             TCGv_i64 fp64 = tcg_temp_new_i64();
8237
8238             gen_load_fpr64(ctx, fp64, fs);
8239             gen_helper_float_cvts_d(fp32, cpu_env, fp64);
8240             tcg_temp_free_i64(fp64);
8241             gen_store_fpr32(fp32, fd);
8242             tcg_temp_free_i32(fp32);
8243         }
8244         opn = "cvt.s.d";
8245         break;
8246     case OPC_CVT_W_D:
8247         check_cp1_registers(ctx, fs);
8248         {
8249             TCGv_i32 fp32 = tcg_temp_new_i32();
8250             TCGv_i64 fp64 = tcg_temp_new_i64();
8251
8252             gen_load_fpr64(ctx, fp64, fs);
8253             gen_helper_float_cvtw_d(fp32, cpu_env, fp64);
8254             tcg_temp_free_i64(fp64);
8255             gen_store_fpr32(fp32, fd);
8256             tcg_temp_free_i32(fp32);
8257         }
8258         opn = "cvt.w.d";
8259         break;
8260     case OPC_CVT_L_D:
8261         check_cp1_64bitmode(ctx);
8262         {
8263             TCGv_i64 fp0 = tcg_temp_new_i64();
8264
8265             gen_load_fpr64(ctx, fp0, fs);
8266             gen_helper_float_cvtl_d(fp0, cpu_env, fp0);
8267             gen_store_fpr64(ctx, fp0, fd);
8268             tcg_temp_free_i64(fp0);
8269         }
8270         opn = "cvt.l.d";
8271         break;
8272     case OPC_CVT_S_W:
8273         {
8274             TCGv_i32 fp0 = tcg_temp_new_i32();
8275
8276             gen_load_fpr32(fp0, fs);
8277             gen_helper_float_cvts_w(fp0, cpu_env, fp0);
8278             gen_store_fpr32(fp0, fd);
8279             tcg_temp_free_i32(fp0);
8280         }
8281         opn = "cvt.s.w";
8282         break;
8283     case OPC_CVT_D_W:
8284         check_cp1_registers(ctx, fd);
8285         {
8286             TCGv_i32 fp32 = tcg_temp_new_i32();
8287             TCGv_i64 fp64 = tcg_temp_new_i64();
8288
8289             gen_load_fpr32(fp32, fs);
8290             gen_helper_float_cvtd_w(fp64, cpu_env, fp32);
8291             tcg_temp_free_i32(fp32);
8292             gen_store_fpr64(ctx, fp64, fd);
8293             tcg_temp_free_i64(fp64);
8294         }
8295         opn = "cvt.d.w";
8296         break;
8297     case OPC_CVT_S_L:
8298         check_cp1_64bitmode(ctx);
8299         {
8300             TCGv_i32 fp32 = tcg_temp_new_i32();
8301             TCGv_i64 fp64 = tcg_temp_new_i64();
8302
8303             gen_load_fpr64(ctx, fp64, fs);
8304             gen_helper_float_cvts_l(fp32, cpu_env, fp64);
8305             tcg_temp_free_i64(fp64);
8306             gen_store_fpr32(fp32, fd);
8307             tcg_temp_free_i32(fp32);
8308         }
8309         opn = "cvt.s.l";
8310         break;
8311     case OPC_CVT_D_L:
8312         check_cp1_64bitmode(ctx);
8313         {
8314             TCGv_i64 fp0 = tcg_temp_new_i64();
8315
8316             gen_load_fpr64(ctx, fp0, fs);
8317             gen_helper_float_cvtd_l(fp0, cpu_env, fp0);
8318             gen_store_fpr64(ctx, fp0, fd);
8319             tcg_temp_free_i64(fp0);
8320         }
8321         opn = "cvt.d.l";
8322         break;
8323     case OPC_CVT_PS_PW:
8324         check_cp1_64bitmode(ctx);
8325         {
8326             TCGv_i64 fp0 = tcg_temp_new_i64();
8327
8328             gen_load_fpr64(ctx, fp0, fs);
8329             gen_helper_float_cvtps_pw(fp0, cpu_env, fp0);
8330             gen_store_fpr64(ctx, fp0, fd);
8331             tcg_temp_free_i64(fp0);
8332         }
8333         opn = "cvt.ps.pw";
8334         break;
8335     case OPC_ADD_PS:
8336         check_cp1_64bitmode(ctx);
8337         {
8338             TCGv_i64 fp0 = tcg_temp_new_i64();
8339             TCGv_i64 fp1 = tcg_temp_new_i64();
8340
8341             gen_load_fpr64(ctx, fp0, fs);
8342             gen_load_fpr64(ctx, fp1, ft);
8343             gen_helper_float_add_ps(fp0, cpu_env, fp0, fp1);
8344             tcg_temp_free_i64(fp1);
8345             gen_store_fpr64(ctx, fp0, fd);
8346             tcg_temp_free_i64(fp0);
8347         }
8348         opn = "add.ps";
8349         break;
8350     case OPC_SUB_PS:
8351         check_cp1_64bitmode(ctx);
8352         {
8353             TCGv_i64 fp0 = tcg_temp_new_i64();
8354             TCGv_i64 fp1 = tcg_temp_new_i64();
8355
8356             gen_load_fpr64(ctx, fp0, fs);
8357             gen_load_fpr64(ctx, fp1, ft);
8358             gen_helper_float_sub_ps(fp0, cpu_env, fp0, fp1);
8359             tcg_temp_free_i64(fp1);
8360             gen_store_fpr64(ctx, fp0, fd);
8361             tcg_temp_free_i64(fp0);
8362         }
8363         opn = "sub.ps";
8364         break;
8365     case OPC_MUL_PS:
8366         check_cp1_64bitmode(ctx);
8367         {
8368             TCGv_i64 fp0 = tcg_temp_new_i64();
8369             TCGv_i64 fp1 = tcg_temp_new_i64();
8370
8371             gen_load_fpr64(ctx, fp0, fs);
8372             gen_load_fpr64(ctx, fp1, ft);
8373             gen_helper_float_mul_ps(fp0, cpu_env, fp0, fp1);
8374             tcg_temp_free_i64(fp1);
8375             gen_store_fpr64(ctx, fp0, fd);
8376             tcg_temp_free_i64(fp0);
8377         }
8378         opn = "mul.ps";
8379         break;
8380     case OPC_ABS_PS:
8381         check_cp1_64bitmode(ctx);
8382         {
8383             TCGv_i64 fp0 = tcg_temp_new_i64();
8384
8385             gen_load_fpr64(ctx, fp0, fs);
8386             gen_helper_float_abs_ps(fp0, fp0);
8387             gen_store_fpr64(ctx, fp0, fd);
8388             tcg_temp_free_i64(fp0);
8389         }
8390         opn = "abs.ps";
8391         break;
8392     case OPC_MOV_PS:
8393         check_cp1_64bitmode(ctx);
8394         {
8395             TCGv_i64 fp0 = tcg_temp_new_i64();
8396
8397             gen_load_fpr64(ctx, fp0, fs);
8398             gen_store_fpr64(ctx, fp0, fd);
8399             tcg_temp_free_i64(fp0);
8400         }
8401         opn = "mov.ps";
8402         break;
8403     case OPC_NEG_PS:
8404         check_cp1_64bitmode(ctx);
8405         {
8406             TCGv_i64 fp0 = tcg_temp_new_i64();
8407
8408             gen_load_fpr64(ctx, fp0, fs);
8409             gen_helper_float_chs_ps(fp0, fp0);
8410             gen_store_fpr64(ctx, fp0, fd);
8411             tcg_temp_free_i64(fp0);
8412         }
8413         opn = "neg.ps";
8414         break;
8415     case OPC_MOVCF_PS:
8416         check_cp1_64bitmode(ctx);
8417         gen_movcf_ps(fs, fd, (ft >> 2) & 0x7, ft & 0x1);
8418         opn = "movcf.ps";
8419         break;
8420     case OPC_MOVZ_PS:
8421         check_cp1_64bitmode(ctx);
8422         {
8423             int l1 = gen_new_label();
8424             TCGv_i64 fp0;
8425
8426             if (ft != 0)
8427                 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
8428             fp0 = tcg_temp_new_i64();
8429             gen_load_fpr64(ctx, fp0, fs);
8430             gen_store_fpr64(ctx, fp0, fd);
8431             tcg_temp_free_i64(fp0);
8432             gen_set_label(l1);
8433         }
8434         opn = "movz.ps";
8435         break;
8436     case OPC_MOVN_PS:
8437         check_cp1_64bitmode(ctx);
8438         {
8439             int l1 = gen_new_label();
8440             TCGv_i64 fp0;
8441
8442             if (ft != 0) {
8443                 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
8444                 fp0 = tcg_temp_new_i64();
8445                 gen_load_fpr64(ctx, fp0, fs);
8446                 gen_store_fpr64(ctx, fp0, fd);
8447                 tcg_temp_free_i64(fp0);
8448                 gen_set_label(l1);
8449             }
8450         }
8451         opn = "movn.ps";
8452         break;
8453     case OPC_ADDR_PS:
8454         check_cp1_64bitmode(ctx);
8455         {
8456             TCGv_i64 fp0 = tcg_temp_new_i64();
8457             TCGv_i64 fp1 = tcg_temp_new_i64();
8458
8459             gen_load_fpr64(ctx, fp0, ft);
8460             gen_load_fpr64(ctx, fp1, fs);
8461             gen_helper_float_addr_ps(fp0, cpu_env, fp0, fp1);
8462             tcg_temp_free_i64(fp1);
8463             gen_store_fpr64(ctx, fp0, fd);
8464             tcg_temp_free_i64(fp0);
8465         }
8466         opn = "addr.ps";
8467         break;
8468     case OPC_MULR_PS:
8469         check_cp1_64bitmode(ctx);
8470         {
8471             TCGv_i64 fp0 = tcg_temp_new_i64();
8472             TCGv_i64 fp1 = tcg_temp_new_i64();
8473
8474             gen_load_fpr64(ctx, fp0, ft);
8475             gen_load_fpr64(ctx, fp1, fs);
8476             gen_helper_float_mulr_ps(fp0, cpu_env, fp0, fp1);
8477             tcg_temp_free_i64(fp1);
8478             gen_store_fpr64(ctx, fp0, fd);
8479             tcg_temp_free_i64(fp0);
8480         }
8481         opn = "mulr.ps";
8482         break;
8483     case OPC_RECIP2_PS:
8484         check_cp1_64bitmode(ctx);
8485         {
8486             TCGv_i64 fp0 = tcg_temp_new_i64();
8487             TCGv_i64 fp1 = tcg_temp_new_i64();
8488
8489             gen_load_fpr64(ctx, fp0, fs);
8490             gen_load_fpr64(ctx, fp1, ft);
8491             gen_helper_float_recip2_ps(fp0, cpu_env, fp0, fp1);
8492             tcg_temp_free_i64(fp1);
8493             gen_store_fpr64(ctx, fp0, fd);
8494             tcg_temp_free_i64(fp0);
8495         }
8496         opn = "recip2.ps";
8497         break;
8498     case OPC_RECIP1_PS:
8499         check_cp1_64bitmode(ctx);
8500         {
8501             TCGv_i64 fp0 = tcg_temp_new_i64();
8502
8503             gen_load_fpr64(ctx, fp0, fs);
8504             gen_helper_float_recip1_ps(fp0, cpu_env, fp0);
8505             gen_store_fpr64(ctx, fp0, fd);
8506             tcg_temp_free_i64(fp0);
8507         }
8508         opn = "recip1.ps";
8509         break;
8510     case OPC_RSQRT1_PS:
8511         check_cp1_64bitmode(ctx);
8512         {
8513             TCGv_i64 fp0 = tcg_temp_new_i64();
8514
8515             gen_load_fpr64(ctx, fp0, fs);
8516             gen_helper_float_rsqrt1_ps(fp0, cpu_env, fp0);
8517             gen_store_fpr64(ctx, fp0, fd);
8518             tcg_temp_free_i64(fp0);
8519         }
8520         opn = "rsqrt1.ps";
8521         break;
8522     case OPC_RSQRT2_PS:
8523         check_cp1_64bitmode(ctx);
8524         {
8525             TCGv_i64 fp0 = tcg_temp_new_i64();
8526             TCGv_i64 fp1 = tcg_temp_new_i64();
8527
8528             gen_load_fpr64(ctx, fp0, fs);
8529             gen_load_fpr64(ctx, fp1, ft);
8530             gen_helper_float_rsqrt2_ps(fp0, cpu_env, fp0, fp1);
8531             tcg_temp_free_i64(fp1);
8532             gen_store_fpr64(ctx, fp0, fd);
8533             tcg_temp_free_i64(fp0);
8534         }
8535         opn = "rsqrt2.ps";
8536         break;
8537     case OPC_CVT_S_PU:
8538         check_cp1_64bitmode(ctx);
8539         {
8540             TCGv_i32 fp0 = tcg_temp_new_i32();
8541
8542             gen_load_fpr32h(fp0, fs);
8543             gen_helper_float_cvts_pu(fp0, cpu_env, fp0);
8544             gen_store_fpr32(fp0, fd);
8545             tcg_temp_free_i32(fp0);
8546         }
8547         opn = "cvt.s.pu";
8548         break;
8549     case OPC_CVT_PW_PS:
8550         check_cp1_64bitmode(ctx);
8551         {
8552             TCGv_i64 fp0 = tcg_temp_new_i64();
8553
8554             gen_load_fpr64(ctx, fp0, fs);
8555             gen_helper_float_cvtpw_ps(fp0, cpu_env, fp0);
8556             gen_store_fpr64(ctx, fp0, fd);
8557             tcg_temp_free_i64(fp0);
8558         }
8559         opn = "cvt.pw.ps";
8560         break;
8561     case OPC_CVT_S_PL:
8562         check_cp1_64bitmode(ctx);
8563         {
8564             TCGv_i32 fp0 = tcg_temp_new_i32();
8565
8566             gen_load_fpr32(fp0, fs);
8567             gen_helper_float_cvts_pl(fp0, cpu_env, fp0);
8568             gen_store_fpr32(fp0, fd);
8569             tcg_temp_free_i32(fp0);
8570         }
8571         opn = "cvt.s.pl";
8572         break;
8573     case OPC_PLL_PS:
8574         check_cp1_64bitmode(ctx);
8575         {
8576             TCGv_i32 fp0 = tcg_temp_new_i32();
8577             TCGv_i32 fp1 = tcg_temp_new_i32();
8578
8579             gen_load_fpr32(fp0, fs);
8580             gen_load_fpr32(fp1, ft);
8581             gen_store_fpr32h(fp0, fd);
8582             gen_store_fpr32(fp1, fd);
8583             tcg_temp_free_i32(fp0);
8584             tcg_temp_free_i32(fp1);
8585         }
8586         opn = "pll.ps";
8587         break;
8588     case OPC_PLU_PS:
8589         check_cp1_64bitmode(ctx);
8590         {
8591             TCGv_i32 fp0 = tcg_temp_new_i32();
8592             TCGv_i32 fp1 = tcg_temp_new_i32();
8593
8594             gen_load_fpr32(fp0, fs);
8595             gen_load_fpr32h(fp1, ft);
8596             gen_store_fpr32(fp1, fd);
8597             gen_store_fpr32h(fp0, fd);
8598             tcg_temp_free_i32(fp0);
8599             tcg_temp_free_i32(fp1);
8600         }
8601         opn = "plu.ps";
8602         break;
8603     case OPC_PUL_PS:
8604         check_cp1_64bitmode(ctx);
8605         {
8606             TCGv_i32 fp0 = tcg_temp_new_i32();
8607             TCGv_i32 fp1 = tcg_temp_new_i32();
8608
8609             gen_load_fpr32h(fp0, fs);
8610             gen_load_fpr32(fp1, ft);
8611             gen_store_fpr32(fp1, fd);
8612             gen_store_fpr32h(fp0, fd);
8613             tcg_temp_free_i32(fp0);
8614             tcg_temp_free_i32(fp1);
8615         }
8616         opn = "pul.ps";
8617         break;
8618     case OPC_PUU_PS:
8619         check_cp1_64bitmode(ctx);
8620         {
8621             TCGv_i32 fp0 = tcg_temp_new_i32();
8622             TCGv_i32 fp1 = tcg_temp_new_i32();
8623
8624             gen_load_fpr32h(fp0, fs);
8625             gen_load_fpr32h(fp1, ft);
8626             gen_store_fpr32(fp1, fd);
8627             gen_store_fpr32h(fp0, fd);
8628             tcg_temp_free_i32(fp0);
8629             tcg_temp_free_i32(fp1);
8630         }
8631         opn = "puu.ps";
8632         break;
8633     case OPC_CMP_F_PS:
8634     case OPC_CMP_UN_PS:
8635     case OPC_CMP_EQ_PS:
8636     case OPC_CMP_UEQ_PS:
8637     case OPC_CMP_OLT_PS:
8638     case OPC_CMP_ULT_PS:
8639     case OPC_CMP_OLE_PS:
8640     case OPC_CMP_ULE_PS:
8641     case OPC_CMP_SF_PS:
8642     case OPC_CMP_NGLE_PS:
8643     case OPC_CMP_SEQ_PS:
8644     case OPC_CMP_NGL_PS:
8645     case OPC_CMP_LT_PS:
8646     case OPC_CMP_NGE_PS:
8647     case OPC_CMP_LE_PS:
8648     case OPC_CMP_NGT_PS:
8649         if (ctx->opcode & (1 << 6)) {
8650             gen_cmpabs_ps(ctx, func-48, ft, fs, cc);
8651             opn = condnames_abs[func-48];
8652         } else {
8653             gen_cmp_ps(ctx, func-48, ft, fs, cc);
8654             opn = condnames[func-48];
8655         }
8656         break;
8657     default:
8658         MIPS_INVAL(opn);
8659         generate_exception (ctx, EXCP_RI);
8660         return;
8661     }
8662     (void)opn; /* avoid a compiler warning */
8663     switch (optype) {
8664     case BINOP:
8665         MIPS_DEBUG("%s %s, %s, %s", opn, fregnames[fd], fregnames[fs], fregnames[ft]);
8666         break;
8667     case CMPOP:
8668         MIPS_DEBUG("%s %s,%s", opn, fregnames[fs], fregnames[ft]);
8669         break;
8670     default:
8671         MIPS_DEBUG("%s %s,%s", opn, fregnames[fd], fregnames[fs]);
8672         break;
8673     }
8674 }
8675
8676 /* Coprocessor 3 (FPU) */
8677 static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc,
8678                            int fd, int fs, int base, int index)
8679 {
8680     const char *opn = "extended float load/store";
8681     int store = 0;
8682     TCGv t0 = tcg_temp_new();
8683
8684     if (base == 0) {
8685         gen_load_gpr(t0, index);
8686     } else if (index == 0) {
8687         gen_load_gpr(t0, base);
8688     } else {
8689         gen_op_addr_add(ctx, t0, cpu_gpr[base], cpu_gpr[index]);
8690     }
8691     /* Don't do NOP if destination is zero: we must perform the actual
8692        memory access. */
8693     save_cpu_state(ctx, 0);
8694     switch (opc) {
8695     case OPC_LWXC1:
8696         check_cop1x(ctx);
8697         {
8698             TCGv_i32 fp0 = tcg_temp_new_i32();
8699
8700             tcg_gen_qemu_ld32s(t0, t0, ctx->mem_idx);
8701             tcg_gen_trunc_tl_i32(fp0, t0);
8702             gen_store_fpr32(fp0, fd);
8703             tcg_temp_free_i32(fp0);
8704         }
8705         opn = "lwxc1";
8706         break;
8707     case OPC_LDXC1:
8708         check_cop1x(ctx);
8709         check_cp1_registers(ctx, fd);
8710         {
8711             TCGv_i64 fp0 = tcg_temp_new_i64();
8712
8713             tcg_gen_qemu_ld64(fp0, t0, ctx->mem_idx);
8714             gen_store_fpr64(ctx, fp0, fd);
8715             tcg_temp_free_i64(fp0);
8716         }
8717         opn = "ldxc1";
8718         break;
8719     case OPC_LUXC1:
8720         check_cp1_64bitmode(ctx);
8721         tcg_gen_andi_tl(t0, t0, ~0x7);
8722         {
8723             TCGv_i64 fp0 = tcg_temp_new_i64();
8724
8725             tcg_gen_qemu_ld64(fp0, t0, ctx->mem_idx);
8726             gen_store_fpr64(ctx, fp0, fd);
8727             tcg_temp_free_i64(fp0);
8728         }
8729         opn = "luxc1";
8730         break;
8731     case OPC_SWXC1:
8732         check_cop1x(ctx);
8733         {
8734             TCGv_i32 fp0 = tcg_temp_new_i32();
8735             TCGv t1 = tcg_temp_new();
8736
8737             gen_load_fpr32(fp0, fs);
8738             tcg_gen_extu_i32_tl(t1, fp0);
8739             tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);
8740             tcg_temp_free_i32(fp0);
8741             tcg_temp_free(t1);
8742         }
8743         opn = "swxc1";
8744         store = 1;
8745         break;
8746     case OPC_SDXC1:
8747         check_cop1x(ctx);
8748         check_cp1_registers(ctx, fs);
8749         {
8750             TCGv_i64 fp0 = tcg_temp_new_i64();
8751
8752             gen_load_fpr64(ctx, fp0, fs);
8753             tcg_gen_qemu_st64(fp0, t0, ctx->mem_idx);
8754             tcg_temp_free_i64(fp0);
8755         }
8756         opn = "sdxc1";
8757         store = 1;
8758         break;
8759     case OPC_SUXC1:
8760         check_cp1_64bitmode(ctx);
8761         tcg_gen_andi_tl(t0, t0, ~0x7);
8762         {
8763             TCGv_i64 fp0 = tcg_temp_new_i64();
8764
8765             gen_load_fpr64(ctx, fp0, fs);
8766             tcg_gen_qemu_st64(fp0, t0, ctx->mem_idx);
8767             tcg_temp_free_i64(fp0);
8768         }
8769         opn = "suxc1";
8770         store = 1;
8771         break;
8772     }
8773     tcg_temp_free(t0);
8774     (void)opn; (void)store; /* avoid compiler warnings */
8775     MIPS_DEBUG("%s %s, %s(%s)", opn, fregnames[store ? fs : fd],
8776                regnames[index], regnames[base]);
8777 }
8778
8779 static void gen_flt3_arith (DisasContext *ctx, uint32_t opc,
8780                             int fd, int fr, int fs, int ft)
8781 {
8782     const char *opn = "flt3_arith";
8783
8784     switch (opc) {
8785     case OPC_ALNV_PS:
8786         check_cp1_64bitmode(ctx);
8787         {
8788             TCGv t0 = tcg_temp_local_new();
8789             TCGv_i32 fp = tcg_temp_new_i32();
8790             TCGv_i32 fph = tcg_temp_new_i32();
8791             int l1 = gen_new_label();
8792             int l2 = gen_new_label();
8793
8794             gen_load_gpr(t0, fr);
8795             tcg_gen_andi_tl(t0, t0, 0x7);
8796
8797             tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0, l1);
8798             gen_load_fpr32(fp, fs);
8799             gen_load_fpr32h(fph, fs);
8800             gen_store_fpr32(fp, fd);
8801             gen_store_fpr32h(fph, fd);
8802             tcg_gen_br(l2);
8803             gen_set_label(l1);
8804             tcg_gen_brcondi_tl(TCG_COND_NE, t0, 4, l2);
8805             tcg_temp_free(t0);
8806 #ifdef TARGET_WORDS_BIGENDIAN
8807             gen_load_fpr32(fp, fs);
8808             gen_load_fpr32h(fph, ft);
8809             gen_store_fpr32h(fp, fd);
8810             gen_store_fpr32(fph, fd);
8811 #else
8812             gen_load_fpr32h(fph, fs);
8813             gen_load_fpr32(fp, ft);
8814             gen_store_fpr32(fph, fd);
8815             gen_store_fpr32h(fp, fd);
8816 #endif
8817             gen_set_label(l2);
8818             tcg_temp_free_i32(fp);
8819             tcg_temp_free_i32(fph);
8820         }
8821         opn = "alnv.ps";
8822         break;
8823     case OPC_MADD_S:
8824         check_cop1x(ctx);
8825         {
8826             TCGv_i32 fp0 = tcg_temp_new_i32();
8827             TCGv_i32 fp1 = tcg_temp_new_i32();
8828             TCGv_i32 fp2 = tcg_temp_new_i32();
8829
8830             gen_load_fpr32(fp0, fs);
8831             gen_load_fpr32(fp1, ft);
8832             gen_load_fpr32(fp2, fr);
8833             gen_helper_float_muladd_s(fp2, cpu_env, fp0, fp1, fp2);
8834             tcg_temp_free_i32(fp0);
8835             tcg_temp_free_i32(fp1);
8836             gen_store_fpr32(fp2, fd);
8837             tcg_temp_free_i32(fp2);
8838         }
8839         opn = "madd.s";
8840         break;
8841     case OPC_MADD_D:
8842         check_cop1x(ctx);
8843         check_cp1_registers(ctx, fd | fs | ft | fr);
8844         {
8845             TCGv_i64 fp0 = tcg_temp_new_i64();
8846             TCGv_i64 fp1 = tcg_temp_new_i64();
8847             TCGv_i64 fp2 = tcg_temp_new_i64();
8848
8849             gen_load_fpr64(ctx, fp0, fs);
8850             gen_load_fpr64(ctx, fp1, ft);
8851             gen_load_fpr64(ctx, fp2, fr);
8852             gen_helper_float_muladd_d(fp2, cpu_env, fp0, fp1, fp2);
8853             tcg_temp_free_i64(fp0);
8854             tcg_temp_free_i64(fp1);
8855             gen_store_fpr64(ctx, fp2, fd);
8856             tcg_temp_free_i64(fp2);
8857         }
8858         opn = "madd.d";
8859         break;
8860     case OPC_MADD_PS:
8861         check_cp1_64bitmode(ctx);
8862         {
8863             TCGv_i64 fp0 = tcg_temp_new_i64();
8864             TCGv_i64 fp1 = tcg_temp_new_i64();
8865             TCGv_i64 fp2 = tcg_temp_new_i64();
8866
8867             gen_load_fpr64(ctx, fp0, fs);
8868             gen_load_fpr64(ctx, fp1, ft);
8869             gen_load_fpr64(ctx, fp2, fr);
8870             gen_helper_float_muladd_ps(fp2, cpu_env, fp0, fp1, fp2);
8871             tcg_temp_free_i64(fp0);
8872             tcg_temp_free_i64(fp1);
8873             gen_store_fpr64(ctx, fp2, fd);
8874             tcg_temp_free_i64(fp2);
8875         }
8876         opn = "madd.ps";
8877         break;
8878     case OPC_MSUB_S:
8879         check_cop1x(ctx);
8880         {
8881             TCGv_i32 fp0 = tcg_temp_new_i32();
8882             TCGv_i32 fp1 = tcg_temp_new_i32();
8883             TCGv_i32 fp2 = tcg_temp_new_i32();
8884
8885             gen_load_fpr32(fp0, fs);
8886             gen_load_fpr32(fp1, ft);
8887             gen_load_fpr32(fp2, fr);
8888             gen_helper_float_mulsub_s(fp2, cpu_env, fp0, fp1, fp2);
8889             tcg_temp_free_i32(fp0);
8890             tcg_temp_free_i32(fp1);
8891             gen_store_fpr32(fp2, fd);
8892             tcg_temp_free_i32(fp2);
8893         }
8894         opn = "msub.s";
8895         break;
8896     case OPC_MSUB_D:
8897         check_cop1x(ctx);
8898         check_cp1_registers(ctx, fd | fs | ft | fr);
8899         {
8900             TCGv_i64 fp0 = tcg_temp_new_i64();
8901             TCGv_i64 fp1 = tcg_temp_new_i64();
8902             TCGv_i64 fp2 = tcg_temp_new_i64();
8903
8904             gen_load_fpr64(ctx, fp0, fs);
8905             gen_load_fpr64(ctx, fp1, ft);
8906             gen_load_fpr64(ctx, fp2, fr);
8907             gen_helper_float_mulsub_d(fp2, cpu_env, fp0, fp1, fp2);
8908             tcg_temp_free_i64(fp0);
8909             tcg_temp_free_i64(fp1);
8910             gen_store_fpr64(ctx, fp2, fd);
8911             tcg_temp_free_i64(fp2);
8912         }
8913         opn = "msub.d";
8914         break;
8915     case OPC_MSUB_PS:
8916         check_cp1_64bitmode(ctx);
8917         {
8918             TCGv_i64 fp0 = tcg_temp_new_i64();
8919             TCGv_i64 fp1 = tcg_temp_new_i64();
8920             TCGv_i64 fp2 = tcg_temp_new_i64();
8921
8922             gen_load_fpr64(ctx, fp0, fs);
8923             gen_load_fpr64(ctx, fp1, ft);
8924             gen_load_fpr64(ctx, fp2, fr);
8925             gen_helper_float_mulsub_ps(fp2, cpu_env, fp0, fp1, fp2);
8926             tcg_temp_free_i64(fp0);
8927             tcg_temp_free_i64(fp1);
8928             gen_store_fpr64(ctx, fp2, fd);
8929             tcg_temp_free_i64(fp2);
8930         }
8931         opn = "msub.ps";
8932         break;
8933     case OPC_NMADD_S:
8934         check_cop1x(ctx);
8935         {
8936             TCGv_i32 fp0 = tcg_temp_new_i32();
8937             TCGv_i32 fp1 = tcg_temp_new_i32();
8938             TCGv_i32 fp2 = tcg_temp_new_i32();
8939
8940             gen_load_fpr32(fp0, fs);
8941             gen_load_fpr32(fp1, ft);
8942             gen_load_fpr32(fp2, fr);
8943             gen_helper_float_nmuladd_s(fp2, cpu_env, fp0, fp1, fp2);
8944             tcg_temp_free_i32(fp0);
8945             tcg_temp_free_i32(fp1);
8946             gen_store_fpr32(fp2, fd);
8947             tcg_temp_free_i32(fp2);
8948         }
8949         opn = "nmadd.s";
8950         break;
8951     case OPC_NMADD_D:
8952         check_cop1x(ctx);
8953         check_cp1_registers(ctx, fd | fs | ft | fr);
8954         {
8955             TCGv_i64 fp0 = tcg_temp_new_i64();
8956             TCGv_i64 fp1 = tcg_temp_new_i64();
8957             TCGv_i64 fp2 = tcg_temp_new_i64();
8958
8959             gen_load_fpr64(ctx, fp0, fs);
8960             gen_load_fpr64(ctx, fp1, ft);
8961             gen_load_fpr64(ctx, fp2, fr);
8962             gen_helper_float_nmuladd_d(fp2, cpu_env, fp0, fp1, fp2);
8963             tcg_temp_free_i64(fp0);
8964             tcg_temp_free_i64(fp1);
8965             gen_store_fpr64(ctx, fp2, fd);
8966             tcg_temp_free_i64(fp2);
8967         }
8968         opn = "nmadd.d";
8969         break;
8970     case OPC_NMADD_PS:
8971         check_cp1_64bitmode(ctx);
8972         {
8973             TCGv_i64 fp0 = tcg_temp_new_i64();
8974             TCGv_i64 fp1 = tcg_temp_new_i64();
8975             TCGv_i64 fp2 = tcg_temp_new_i64();
8976
8977             gen_load_fpr64(ctx, fp0, fs);
8978             gen_load_fpr64(ctx, fp1, ft);
8979             gen_load_fpr64(ctx, fp2, fr);
8980             gen_helper_float_nmuladd_ps(fp2, cpu_env, fp0, fp1, fp2);
8981             tcg_temp_free_i64(fp0);
8982             tcg_temp_free_i64(fp1);
8983             gen_store_fpr64(ctx, fp2, fd);
8984             tcg_temp_free_i64(fp2);
8985         }
8986         opn = "nmadd.ps";
8987         break;
8988     case OPC_NMSUB_S:
8989         check_cop1x(ctx);
8990         {
8991             TCGv_i32 fp0 = tcg_temp_new_i32();
8992             TCGv_i32 fp1 = tcg_temp_new_i32();
8993             TCGv_i32 fp2 = tcg_temp_new_i32();
8994
8995             gen_load_fpr32(fp0, fs);
8996             gen_load_fpr32(fp1, ft);
8997             gen_load_fpr32(fp2, fr);
8998             gen_helper_float_nmulsub_s(fp2, cpu_env, fp0, fp1, fp2);
8999             tcg_temp_free_i32(fp0);
9000             tcg_temp_free_i32(fp1);
9001             gen_store_fpr32(fp2, fd);
9002             tcg_temp_free_i32(fp2);
9003         }
9004         opn = "nmsub.s";
9005         break;
9006     case OPC_NMSUB_D:
9007         check_cop1x(ctx);
9008         check_cp1_registers(ctx, fd | fs | ft | fr);
9009         {
9010             TCGv_i64 fp0 = tcg_temp_new_i64();
9011             TCGv_i64 fp1 = tcg_temp_new_i64();
9012             TCGv_i64 fp2 = tcg_temp_new_i64();
9013
9014             gen_load_fpr64(ctx, fp0, fs);
9015             gen_load_fpr64(ctx, fp1, ft);
9016             gen_load_fpr64(ctx, fp2, fr);
9017             gen_helper_float_nmulsub_d(fp2, cpu_env, fp0, fp1, fp2);
9018             tcg_temp_free_i64(fp0);
9019             tcg_temp_free_i64(fp1);
9020             gen_store_fpr64(ctx, fp2, fd);
9021             tcg_temp_free_i64(fp2);
9022         }
9023         opn = "nmsub.d";
9024         break;
9025     case OPC_NMSUB_PS:
9026         check_cp1_64bitmode(ctx);
9027         {
9028             TCGv_i64 fp0 = tcg_temp_new_i64();
9029             TCGv_i64 fp1 = tcg_temp_new_i64();
9030             TCGv_i64 fp2 = tcg_temp_new_i64();
9031
9032             gen_load_fpr64(ctx, fp0, fs);
9033             gen_load_fpr64(ctx, fp1, ft);
9034             gen_load_fpr64(ctx, fp2, fr);
9035             gen_helper_float_nmulsub_ps(fp2, cpu_env, fp0, fp1, fp2);
9036             tcg_temp_free_i64(fp0);
9037             tcg_temp_free_i64(fp1);
9038             gen_store_fpr64(ctx, fp2, fd);
9039             tcg_temp_free_i64(fp2);
9040         }
9041         opn = "nmsub.ps";
9042         break;
9043     default:
9044         MIPS_INVAL(opn);
9045         generate_exception (ctx, EXCP_RI);
9046         return;
9047     }
9048     (void)opn; /* avoid a compiler warning */
9049     MIPS_DEBUG("%s %s, %s, %s, %s", opn, fregnames[fd], fregnames[fr],
9050                fregnames[fs], fregnames[ft]);
9051 }
9052
9053 static void
9054 gen_rdhwr (CPUMIPSState *env, DisasContext *ctx, int rt, int rd)
9055 {
9056     TCGv t0;
9057
9058 #if !defined(CONFIG_USER_ONLY)
9059     /* The Linux kernel will emulate rdhwr if it's not supported natively.
9060        Therefore only check the ISA in system mode.  */
9061     check_insn(env, ctx, ISA_MIPS32R2);
9062 #endif
9063     t0 = tcg_temp_new();
9064
9065     switch (rd) {
9066     case 0:
9067         save_cpu_state(ctx, 1);
9068         gen_helper_rdhwr_cpunum(t0, cpu_env);
9069         gen_store_gpr(t0, rt);
9070         break;
9071     case 1:
9072         save_cpu_state(ctx, 1);
9073         gen_helper_rdhwr_synci_step(t0, cpu_env);
9074         gen_store_gpr(t0, rt);
9075         break;
9076     case 2:
9077         save_cpu_state(ctx, 1);
9078         gen_helper_rdhwr_cc(t0, cpu_env);
9079         gen_store_gpr(t0, rt);
9080         break;
9081     case 3:
9082         save_cpu_state(ctx, 1);
9083         gen_helper_rdhwr_ccres(t0, cpu_env);
9084         gen_store_gpr(t0, rt);
9085         break;
9086     case 29:
9087 #if defined(CONFIG_USER_ONLY)
9088         tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUMIPSState, tls_value));
9089         gen_store_gpr(t0, rt);
9090         break;
9091 #else
9092         /* XXX: Some CPUs implement this in hardware.
9093            Not supported yet. */
9094 #endif
9095     default:            /* Invalid */
9096         MIPS_INVAL("rdhwr");
9097         generate_exception(ctx, EXCP_RI);
9098         break;
9099     }
9100     tcg_temp_free(t0);
9101 }
9102
9103 static void handle_delay_slot (CPUMIPSState *env, DisasContext *ctx,
9104                                int insn_bytes)
9105 {
9106     if (ctx->hflags & MIPS_HFLAG_BMASK) {
9107         int proc_hflags = ctx->hflags & MIPS_HFLAG_BMASK;
9108         /* Branches completion */
9109         ctx->hflags &= ~MIPS_HFLAG_BMASK;
9110         ctx->bstate = BS_BRANCH;
9111         save_cpu_state(ctx, 0);
9112         /* FIXME: Need to clear can_do_io.  */
9113         switch (proc_hflags & MIPS_HFLAG_BMASK_BASE) {
9114         case MIPS_HFLAG_B:
9115             /* unconditional branch */
9116             MIPS_DEBUG("unconditional branch");
9117             if (proc_hflags & MIPS_HFLAG_BX) {
9118                 tcg_gen_xori_i32(hflags, hflags, MIPS_HFLAG_M16);
9119             }
9120             gen_goto_tb(ctx, 0, ctx->btarget);
9121             break;
9122         case MIPS_HFLAG_BL:
9123             /* blikely taken case */
9124             MIPS_DEBUG("blikely branch taken");
9125             gen_goto_tb(ctx, 0, ctx->btarget);
9126             break;
9127         case MIPS_HFLAG_BC:
9128             /* Conditional branch */
9129             MIPS_DEBUG("conditional branch");
9130             {
9131                 int l1 = gen_new_label();
9132
9133                 tcg_gen_brcondi_tl(TCG_COND_NE, bcond, 0, l1);
9134                 gen_goto_tb(ctx, 1, ctx->pc + insn_bytes);
9135                 gen_set_label(l1);
9136                 gen_goto_tb(ctx, 0, ctx->btarget);
9137             }
9138             break;
9139         case MIPS_HFLAG_BR:
9140             /* unconditional branch to register */
9141             MIPS_DEBUG("branch to register");
9142             if (env->insn_flags & (ASE_MIPS16 | ASE_MICROMIPS)) {
9143                 TCGv t0 = tcg_temp_new();
9144                 TCGv_i32 t1 = tcg_temp_new_i32();
9145
9146                 tcg_gen_andi_tl(t0, btarget, 0x1);
9147                 tcg_gen_trunc_tl_i32(t1, t0);
9148                 tcg_temp_free(t0);
9149                 tcg_gen_andi_i32(hflags, hflags, ~(uint32_t)MIPS_HFLAG_M16);
9150                 tcg_gen_shli_i32(t1, t1, MIPS_HFLAG_M16_SHIFT);
9151                 tcg_gen_or_i32(hflags, hflags, t1);
9152                 tcg_temp_free_i32(t1);
9153
9154                 tcg_gen_andi_tl(cpu_PC, btarget, ~(target_ulong)0x1);
9155             } else {
9156                 tcg_gen_mov_tl(cpu_PC, btarget);
9157             }
9158             if (ctx->singlestep_enabled) {
9159                 save_cpu_state(ctx, 0);
9160                 gen_helper_0e0i(raise_exception, EXCP_DEBUG);
9161             }
9162             tcg_gen_exit_tb(0);
9163             break;
9164         default:
9165             MIPS_DEBUG("unknown branch");
9166             break;
9167         }
9168     }
9169 }
9170
9171 /* ISA extensions (ASEs) */
9172 /* MIPS16 extension to MIPS32 */
9173
9174 /* MIPS16 major opcodes */
9175 enum {
9176   M16_OPC_ADDIUSP = 0x00,
9177   M16_OPC_ADDIUPC = 0x01,
9178   M16_OPC_B = 0x02,
9179   M16_OPC_JAL = 0x03,
9180   M16_OPC_BEQZ = 0x04,
9181   M16_OPC_BNEQZ = 0x05,
9182   M16_OPC_SHIFT = 0x06,
9183   M16_OPC_LD = 0x07,
9184   M16_OPC_RRIA = 0x08,
9185   M16_OPC_ADDIU8 = 0x09,
9186   M16_OPC_SLTI = 0x0a,
9187   M16_OPC_SLTIU = 0x0b,
9188   M16_OPC_I8 = 0x0c,
9189   M16_OPC_LI = 0x0d,
9190   M16_OPC_CMPI = 0x0e,
9191   M16_OPC_SD = 0x0f,
9192   M16_OPC_LB = 0x10,
9193   M16_OPC_LH = 0x11,
9194   M16_OPC_LWSP = 0x12,
9195   M16_OPC_LW = 0x13,
9196   M16_OPC_LBU = 0x14,
9197   M16_OPC_LHU = 0x15,
9198   M16_OPC_LWPC = 0x16,
9199   M16_OPC_LWU = 0x17,
9200   M16_OPC_SB = 0x18,
9201   M16_OPC_SH = 0x19,
9202   M16_OPC_SWSP = 0x1a,
9203   M16_OPC_SW = 0x1b,
9204   M16_OPC_RRR = 0x1c,
9205   M16_OPC_RR = 0x1d,
9206   M16_OPC_EXTEND = 0x1e,
9207   M16_OPC_I64 = 0x1f
9208 };
9209
9210 /* I8 funct field */
9211 enum {
9212   I8_BTEQZ = 0x0,
9213   I8_BTNEZ = 0x1,
9214   I8_SWRASP = 0x2,
9215   I8_ADJSP = 0x3,
9216   I8_SVRS = 0x4,
9217   I8_MOV32R = 0x5,
9218   I8_MOVR32 = 0x7
9219 };
9220
9221 /* RRR f field */
9222 enum {
9223   RRR_DADDU = 0x0,
9224   RRR_ADDU = 0x1,
9225   RRR_DSUBU = 0x2,
9226   RRR_SUBU = 0x3
9227 };
9228
9229 /* RR funct field */
9230 enum {
9231   RR_JR = 0x00,
9232   RR_SDBBP = 0x01,
9233   RR_SLT = 0x02,
9234   RR_SLTU = 0x03,
9235   RR_SLLV = 0x04,
9236   RR_BREAK = 0x05,
9237   RR_SRLV = 0x06,
9238   RR_SRAV = 0x07,
9239   RR_DSRL = 0x08,
9240   RR_CMP = 0x0a,
9241   RR_NEG = 0x0b,
9242   RR_AND = 0x0c,
9243   RR_OR = 0x0d,
9244   RR_XOR = 0x0e,
9245   RR_NOT = 0x0f,
9246   RR_MFHI = 0x10,
9247   RR_CNVT = 0x11,
9248   RR_MFLO = 0x12,
9249   RR_DSRA = 0x13,
9250   RR_DSLLV = 0x14,
9251   RR_DSRLV = 0x16,
9252   RR_DSRAV = 0x17,
9253   RR_MULT = 0x18,
9254   RR_MULTU = 0x19,
9255   RR_DIV = 0x1a,
9256   RR_DIVU = 0x1b,
9257   RR_DMULT = 0x1c,
9258   RR_DMULTU = 0x1d,
9259   RR_DDIV = 0x1e,
9260   RR_DDIVU = 0x1f
9261 };
9262
9263 /* I64 funct field */
9264 enum {
9265   I64_LDSP = 0x0,
9266   I64_SDSP = 0x1,
9267   I64_SDRASP = 0x2,
9268   I64_DADJSP = 0x3,
9269   I64_LDPC = 0x4,
9270   I64_DADDIU5 = 0x5,
9271   I64_DADDIUPC = 0x6,
9272   I64_DADDIUSP = 0x7
9273 };
9274
9275 /* RR ry field for CNVT */
9276 enum {
9277   RR_RY_CNVT_ZEB = 0x0,
9278   RR_RY_CNVT_ZEH = 0x1,
9279   RR_RY_CNVT_ZEW = 0x2,
9280   RR_RY_CNVT_SEB = 0x4,
9281   RR_RY_CNVT_SEH = 0x5,
9282   RR_RY_CNVT_SEW = 0x6,
9283 };
9284
9285 static int xlat (int r)
9286 {
9287   static int map[] = { 16, 17, 2, 3, 4, 5, 6, 7 };
9288
9289   return map[r];
9290 }
9291
9292 static void gen_mips16_save (DisasContext *ctx,
9293                              int xsregs, int aregs,
9294                              int do_ra, int do_s0, int do_s1,
9295                              int framesize)
9296 {
9297     TCGv t0 = tcg_temp_new();
9298     TCGv t1 = tcg_temp_new();
9299     int args, astatic;
9300
9301     switch (aregs) {
9302     case 0:
9303     case 1:
9304     case 2:
9305     case 3:
9306     case 11:
9307         args = 0;
9308         break;
9309     case 4:
9310     case 5:
9311     case 6:
9312     case 7:
9313         args = 1;
9314         break;
9315     case 8:
9316     case 9:
9317     case 10:
9318         args = 2;
9319         break;
9320     case 12:
9321     case 13:
9322         args = 3;
9323         break;
9324     case 14:
9325         args = 4;
9326         break;
9327     default:
9328         generate_exception(ctx, EXCP_RI);
9329         return;
9330     }
9331
9332     switch (args) {
9333     case 4:
9334         gen_base_offset_addr(ctx, t0, 29, 12);
9335         gen_load_gpr(t1, 7);
9336         op_st_sw(t1, t0, ctx);
9337         /* Fall through */
9338     case 3:
9339         gen_base_offset_addr(ctx, t0, 29, 8);
9340         gen_load_gpr(t1, 6);
9341         op_st_sw(t1, t0, ctx);
9342         /* Fall through */
9343     case 2:
9344         gen_base_offset_addr(ctx, t0, 29, 4);
9345         gen_load_gpr(t1, 5);
9346         op_st_sw(t1, t0, ctx);
9347         /* Fall through */
9348     case 1:
9349         gen_base_offset_addr(ctx, t0, 29, 0);
9350         gen_load_gpr(t1, 4);
9351         op_st_sw(t1, t0, ctx);
9352     }
9353
9354     gen_load_gpr(t0, 29);
9355
9356 #define DECR_AND_STORE(reg) do {                \
9357         tcg_gen_subi_tl(t0, t0, 4);             \
9358         gen_load_gpr(t1, reg);                  \
9359         op_st_sw(t1, t0, ctx);                  \
9360     } while (0)
9361
9362     if (do_ra) {
9363         DECR_AND_STORE(31);
9364     }
9365
9366     switch (xsregs) {
9367     case 7:
9368         DECR_AND_STORE(30);
9369         /* Fall through */
9370     case 6:
9371         DECR_AND_STORE(23);
9372         /* Fall through */
9373     case 5:
9374         DECR_AND_STORE(22);
9375         /* Fall through */
9376     case 4:
9377         DECR_AND_STORE(21);
9378         /* Fall through */
9379     case 3:
9380         DECR_AND_STORE(20);
9381         /* Fall through */
9382     case 2:
9383         DECR_AND_STORE(19);
9384         /* Fall through */
9385     case 1:
9386         DECR_AND_STORE(18);
9387     }
9388
9389     if (do_s1) {
9390         DECR_AND_STORE(17);
9391     }
9392     if (do_s0) {
9393         DECR_AND_STORE(16);
9394     }
9395
9396     switch (aregs) {
9397     case 0:
9398     case 4:
9399     case 8:
9400     case 12:
9401     case 14:
9402         astatic = 0;
9403         break;
9404     case 1:
9405     case 5:
9406     case 9:
9407     case 13:
9408         astatic = 1;
9409         break;
9410     case 2:
9411     case 6:
9412     case 10:
9413         astatic = 2;
9414         break;
9415     case 3:
9416     case 7:
9417         astatic = 3;
9418         break;
9419     case 11:
9420         astatic = 4;
9421         break;
9422     default:
9423         generate_exception(ctx, EXCP_RI);
9424         return;
9425     }
9426
9427     if (astatic > 0) {
9428         DECR_AND_STORE(7);
9429         if (astatic > 1) {
9430             DECR_AND_STORE(6);
9431             if (astatic > 2) {
9432                 DECR_AND_STORE(5);
9433                 if (astatic > 3) {
9434                     DECR_AND_STORE(4);
9435                 }
9436             }
9437         }
9438     }
9439 #undef DECR_AND_STORE
9440
9441     tcg_gen_subi_tl(cpu_gpr[29], cpu_gpr[29], framesize);
9442     tcg_temp_free(t0);
9443     tcg_temp_free(t1);
9444 }
9445
9446 static void gen_mips16_restore (DisasContext *ctx,
9447                                 int xsregs, int aregs,
9448                                 int do_ra, int do_s0, int do_s1,
9449                                 int framesize)
9450 {
9451     int astatic;
9452     TCGv t0 = tcg_temp_new();
9453     TCGv t1 = tcg_temp_new();
9454
9455     tcg_gen_addi_tl(t0, cpu_gpr[29], framesize);
9456
9457 #define DECR_AND_LOAD(reg) do {                 \
9458         tcg_gen_subi_tl(t0, t0, 4);             \
9459         op_ld_lw(t1, t0, ctx);                  \
9460         gen_store_gpr(t1, reg);                 \
9461     } while (0)
9462
9463     if (do_ra) {
9464         DECR_AND_LOAD(31);
9465     }
9466
9467     switch (xsregs) {
9468     case 7:
9469         DECR_AND_LOAD(30);
9470         /* Fall through */
9471     case 6:
9472         DECR_AND_LOAD(23);
9473         /* Fall through */
9474     case 5:
9475         DECR_AND_LOAD(22);
9476         /* Fall through */
9477     case 4:
9478         DECR_AND_LOAD(21);
9479         /* Fall through */
9480     case 3:
9481         DECR_AND_LOAD(20);
9482         /* Fall through */
9483     case 2:
9484         DECR_AND_LOAD(19);
9485         /* Fall through */
9486     case 1:
9487         DECR_AND_LOAD(18);
9488     }
9489
9490     if (do_s1) {
9491         DECR_AND_LOAD(17);
9492     }
9493     if (do_s0) {
9494         DECR_AND_LOAD(16);
9495     }
9496
9497     switch (aregs) {
9498     case 0:
9499     case 4:
9500     case 8:
9501     case 12:
9502     case 14:
9503         astatic = 0;
9504         break;
9505     case 1:
9506     case 5:
9507     case 9:
9508     case 13:
9509         astatic = 1;
9510         break;
9511     case 2:
9512     case 6:
9513     case 10:
9514         astatic = 2;
9515         break;
9516     case 3:
9517     case 7:
9518         astatic = 3;
9519         break;
9520     case 11:
9521         astatic = 4;
9522         break;
9523     default:
9524         generate_exception(ctx, EXCP_RI);
9525         return;
9526     }
9527
9528     if (astatic > 0) {
9529         DECR_AND_LOAD(7);
9530         if (astatic > 1) {
9531             DECR_AND_LOAD(6);
9532             if (astatic > 2) {
9533                 DECR_AND_LOAD(5);
9534                 if (astatic > 3) {
9535                     DECR_AND_LOAD(4);
9536                 }
9537             }
9538         }
9539     }
9540 #undef DECR_AND_LOAD
9541
9542     tcg_gen_addi_tl(cpu_gpr[29], cpu_gpr[29], framesize);
9543     tcg_temp_free(t0);
9544     tcg_temp_free(t1);
9545 }
9546
9547 static void gen_addiupc (DisasContext *ctx, int rx, int imm,
9548                          int is_64_bit, int extended)
9549 {
9550     TCGv t0;
9551
9552     if (extended && (ctx->hflags & MIPS_HFLAG_BMASK)) {
9553         generate_exception(ctx, EXCP_RI);
9554         return;
9555     }
9556
9557     t0 = tcg_temp_new();
9558
9559     tcg_gen_movi_tl(t0, pc_relative_pc(ctx));
9560     tcg_gen_addi_tl(cpu_gpr[rx], t0, imm);
9561     if (!is_64_bit) {
9562         tcg_gen_ext32s_tl(cpu_gpr[rx], cpu_gpr[rx]);
9563     }
9564
9565     tcg_temp_free(t0);
9566 }
9567
9568 #if defined(TARGET_MIPS64)
9569 static void decode_i64_mips16 (CPUMIPSState *env, DisasContext *ctx,
9570                                int ry, int funct, int16_t offset,
9571                                int extended)
9572 {
9573     switch (funct) {
9574     case I64_LDSP:
9575         check_mips_64(ctx);
9576         offset = extended ? offset : offset << 3;
9577         gen_ld(env, ctx, OPC_LD, ry, 29, offset);
9578         break;
9579     case I64_SDSP:
9580         check_mips_64(ctx);
9581         offset = extended ? offset : offset << 3;
9582         gen_st(ctx, OPC_SD, ry, 29, offset);
9583         break;
9584     case I64_SDRASP:
9585         check_mips_64(ctx);
9586         offset = extended ? offset : (ctx->opcode & 0xff) << 3;
9587         gen_st(ctx, OPC_SD, 31, 29, offset);
9588         break;
9589     case I64_DADJSP:
9590         check_mips_64(ctx);
9591         offset = extended ? offset : ((int8_t)ctx->opcode) << 3;
9592         gen_arith_imm(env, ctx, OPC_DADDIU, 29, 29, offset);
9593         break;
9594     case I64_LDPC:
9595         if (extended && (ctx->hflags & MIPS_HFLAG_BMASK)) {
9596             generate_exception(ctx, EXCP_RI);
9597         } else {
9598             offset = extended ? offset : offset << 3;
9599             gen_ld(env, ctx, OPC_LDPC, ry, 0, offset);
9600         }
9601         break;
9602     case I64_DADDIU5:
9603         check_mips_64(ctx);
9604         offset = extended ? offset : ((int8_t)(offset << 3)) >> 3;
9605         gen_arith_imm(env, ctx, OPC_DADDIU, ry, ry, offset);
9606         break;
9607     case I64_DADDIUPC:
9608         check_mips_64(ctx);
9609         offset = extended ? offset : offset << 2;
9610         gen_addiupc(ctx, ry, offset, 1, extended);
9611         break;
9612     case I64_DADDIUSP:
9613         check_mips_64(ctx);
9614         offset = extended ? offset : offset << 2;
9615         gen_arith_imm(env, ctx, OPC_DADDIU, ry, 29, offset);
9616         break;
9617     }
9618 }
9619 #endif
9620
9621 static int decode_extended_mips16_opc (CPUMIPSState *env, DisasContext *ctx,
9622                                        int *is_branch)
9623 {
9624     int extend = cpu_lduw_code(env, ctx->pc + 2);
9625     int op, rx, ry, funct, sa;
9626     int16_t imm, offset;
9627
9628     ctx->opcode = (ctx->opcode << 16) | extend;
9629     op = (ctx->opcode >> 11) & 0x1f;
9630     sa = (ctx->opcode >> 22) & 0x1f;
9631     funct = (ctx->opcode >> 8) & 0x7;
9632     rx = xlat((ctx->opcode >> 8) & 0x7);
9633     ry = xlat((ctx->opcode >> 5) & 0x7);
9634     offset = imm = (int16_t) (((ctx->opcode >> 16) & 0x1f) << 11
9635                               | ((ctx->opcode >> 21) & 0x3f) << 5
9636                               | (ctx->opcode & 0x1f));
9637
9638     /* The extended opcodes cleverly reuse the opcodes from their 16-bit
9639        counterparts.  */
9640     switch (op) {
9641     case M16_OPC_ADDIUSP:
9642         gen_arith_imm(env, ctx, OPC_ADDIU, rx, 29, imm);
9643         break;
9644     case M16_OPC_ADDIUPC:
9645         gen_addiupc(ctx, rx, imm, 0, 1);
9646         break;
9647     case M16_OPC_B:
9648         gen_compute_branch(ctx, OPC_BEQ, 4, 0, 0, offset << 1);
9649         /* No delay slot, so just process as a normal instruction */
9650         break;
9651     case M16_OPC_BEQZ:
9652         gen_compute_branch(ctx, OPC_BEQ, 4, rx, 0, offset << 1);
9653         /* No delay slot, so just process as a normal instruction */
9654         break;
9655     case M16_OPC_BNEQZ:
9656         gen_compute_branch(ctx, OPC_BNE, 4, rx, 0, offset << 1);
9657         /* No delay slot, so just process as a normal instruction */
9658         break;
9659     case M16_OPC_SHIFT:
9660         switch (ctx->opcode & 0x3) {
9661         case 0x0:
9662             gen_shift_imm(env, ctx, OPC_SLL, rx, ry, sa);
9663             break;
9664         case 0x1:
9665 #if defined(TARGET_MIPS64)
9666             check_mips_64(ctx);
9667             gen_shift_imm(env, ctx, OPC_DSLL, rx, ry, sa);
9668 #else
9669             generate_exception(ctx, EXCP_RI);
9670 #endif
9671             break;
9672         case 0x2:
9673             gen_shift_imm(env, ctx, OPC_SRL, rx, ry, sa);
9674             break;
9675         case 0x3:
9676             gen_shift_imm(env, ctx, OPC_SRA, rx, ry, sa);
9677             break;
9678         }
9679         break;
9680 #if defined(TARGET_MIPS64)
9681     case M16_OPC_LD:
9682             check_mips_64(ctx);
9683         gen_ld(env, ctx, OPC_LD, ry, rx, offset);
9684         break;
9685 #endif
9686     case M16_OPC_RRIA:
9687         imm = ctx->opcode & 0xf;
9688         imm = imm | ((ctx->opcode >> 20) & 0x7f) << 4;
9689         imm = imm | ((ctx->opcode >> 16) & 0xf) << 11;
9690         imm = (int16_t) (imm << 1) >> 1;
9691         if ((ctx->opcode >> 4) & 0x1) {
9692 #if defined(TARGET_MIPS64)
9693             check_mips_64(ctx);
9694             gen_arith_imm(env, ctx, OPC_DADDIU, ry, rx, imm);
9695 #else
9696             generate_exception(ctx, EXCP_RI);
9697 #endif
9698         } else {
9699             gen_arith_imm(env, ctx, OPC_ADDIU, ry, rx, imm);
9700         }
9701         break;
9702     case M16_OPC_ADDIU8:
9703         gen_arith_imm(env, ctx, OPC_ADDIU, rx, rx, imm);
9704         break;
9705     case M16_OPC_SLTI:
9706         gen_slt_imm(env, ctx, OPC_SLTI, 24, rx, imm);
9707         break;
9708     case M16_OPC_SLTIU:
9709         gen_slt_imm(env, ctx, OPC_SLTIU, 24, rx, imm);
9710         break;
9711     case M16_OPC_I8:
9712         switch (funct) {
9713         case I8_BTEQZ:
9714             gen_compute_branch(ctx, OPC_BEQ, 4, 24, 0, offset << 1);
9715             break;
9716         case I8_BTNEZ:
9717             gen_compute_branch(ctx, OPC_BNE, 4, 24, 0, offset << 1);
9718             break;
9719         case I8_SWRASP:
9720             gen_st(ctx, OPC_SW, 31, 29, imm);
9721             break;
9722         case I8_ADJSP:
9723             gen_arith_imm(env, ctx, OPC_ADDIU, 29, 29, imm);
9724             break;
9725         case I8_SVRS:
9726             {
9727                 int xsregs = (ctx->opcode >> 24) & 0x7;
9728                 int aregs = (ctx->opcode >> 16) & 0xf;
9729                 int do_ra = (ctx->opcode >> 6) & 0x1;
9730                 int do_s0 = (ctx->opcode >> 5) & 0x1;
9731                 int do_s1 = (ctx->opcode >> 4) & 0x1;
9732                 int framesize = (((ctx->opcode >> 20) & 0xf) << 4
9733                                  | (ctx->opcode & 0xf)) << 3;
9734
9735                 if (ctx->opcode & (1 << 7)) {
9736                     gen_mips16_save(ctx, xsregs, aregs,
9737                                     do_ra, do_s0, do_s1,
9738                                     framesize);
9739                 } else {
9740                     gen_mips16_restore(ctx, xsregs, aregs,
9741                                        do_ra, do_s0, do_s1,
9742                                        framesize);
9743                 }
9744             }
9745             break;
9746         default:
9747             generate_exception(ctx, EXCP_RI);
9748             break;
9749         }
9750         break;
9751     case M16_OPC_LI:
9752         tcg_gen_movi_tl(cpu_gpr[rx], (uint16_t) imm);
9753         break;
9754     case M16_OPC_CMPI:
9755         tcg_gen_xori_tl(cpu_gpr[24], cpu_gpr[rx], (uint16_t) imm);
9756         break;
9757 #if defined(TARGET_MIPS64)
9758     case M16_OPC_SD:
9759         gen_st(ctx, OPC_SD, ry, rx, offset);
9760         break;
9761 #endif
9762     case M16_OPC_LB:
9763         gen_ld(env, ctx, OPC_LB, ry, rx, offset);
9764         break;
9765     case M16_OPC_LH:
9766         gen_ld(env, ctx, OPC_LH, ry, rx, offset);
9767         break;
9768     case M16_OPC_LWSP:
9769         gen_ld(env, ctx, OPC_LW, rx, 29, offset);
9770         break;
9771     case M16_OPC_LW:
9772         gen_ld(env, ctx, OPC_LW, ry, rx, offset);
9773         break;
9774     case M16_OPC_LBU:
9775         gen_ld(env, ctx, OPC_LBU, ry, rx, offset);
9776         break;
9777     case M16_OPC_LHU:
9778         gen_ld(env, ctx, OPC_LHU, ry, rx, offset);
9779         break;
9780     case M16_OPC_LWPC:
9781         gen_ld(env, ctx, OPC_LWPC, rx, 0, offset);
9782         break;
9783 #if defined(TARGET_MIPS64)
9784     case M16_OPC_LWU:
9785         gen_ld(env, ctx, OPC_LWU, ry, rx, offset);
9786         break;
9787 #endif
9788     case M16_OPC_SB:
9789         gen_st(ctx, OPC_SB, ry, rx, offset);
9790         break;
9791     case M16_OPC_SH:
9792         gen_st(ctx, OPC_SH, ry, rx, offset);
9793         break;
9794     case M16_OPC_SWSP:
9795         gen_st(ctx, OPC_SW, rx, 29, offset);
9796         break;
9797     case M16_OPC_SW:
9798         gen_st(ctx, OPC_SW, ry, rx, offset);
9799         break;
9800 #if defined(TARGET_MIPS64)
9801     case M16_OPC_I64:
9802         decode_i64_mips16(env, ctx, ry, funct, offset, 1);
9803         break;
9804 #endif
9805     default:
9806         generate_exception(ctx, EXCP_RI);
9807         break;
9808     }
9809
9810     return 4;
9811 }
9812
9813 static int decode_mips16_opc (CPUMIPSState *env, DisasContext *ctx,
9814                               int *is_branch)
9815 {
9816     int rx, ry;
9817     int sa;
9818     int op, cnvt_op, op1, offset;
9819     int funct;
9820     int n_bytes;
9821
9822     op = (ctx->opcode >> 11) & 0x1f;
9823     sa = (ctx->opcode >> 2) & 0x7;
9824     sa = sa == 0 ? 8 : sa;
9825     rx = xlat((ctx->opcode >> 8) & 0x7);
9826     cnvt_op = (ctx->opcode >> 5) & 0x7;
9827     ry = xlat((ctx->opcode >> 5) & 0x7);
9828     op1 = offset = ctx->opcode & 0x1f;
9829
9830     n_bytes = 2;
9831
9832     switch (op) {
9833     case M16_OPC_ADDIUSP:
9834         {
9835             int16_t imm = ((uint8_t) ctx->opcode) << 2;
9836
9837             gen_arith_imm(env, ctx, OPC_ADDIU, rx, 29, imm);
9838         }
9839         break;
9840     case M16_OPC_ADDIUPC:
9841         gen_addiupc(ctx, rx, ((uint8_t) ctx->opcode) << 2, 0, 0);
9842         break;
9843     case M16_OPC_B:
9844         offset = (ctx->opcode & 0x7ff) << 1;
9845         offset = (int16_t)(offset << 4) >> 4;
9846         gen_compute_branch(ctx, OPC_BEQ, 2, 0, 0, offset);
9847         /* No delay slot, so just process as a normal instruction */
9848         break;
9849     case M16_OPC_JAL:
9850         offset = cpu_lduw_code(env, ctx->pc + 2);
9851         offset = (((ctx->opcode & 0x1f) << 21)
9852                   | ((ctx->opcode >> 5) & 0x1f) << 16
9853                   | offset) << 2;
9854         op = ((ctx->opcode >> 10) & 0x1) ? OPC_JALXS : OPC_JALS;
9855         gen_compute_branch(ctx, op, 4, rx, ry, offset);
9856         n_bytes = 4;
9857         *is_branch = 1;
9858         break;
9859     case M16_OPC_BEQZ:
9860         gen_compute_branch(ctx, OPC_BEQ, 2, rx, 0, ((int8_t)ctx->opcode) << 1);
9861         /* No delay slot, so just process as a normal instruction */
9862         break;
9863     case M16_OPC_BNEQZ:
9864         gen_compute_branch(ctx, OPC_BNE, 2, rx, 0, ((int8_t)ctx->opcode) << 1);
9865         /* No delay slot, so just process as a normal instruction */
9866         break;
9867     case M16_OPC_SHIFT:
9868         switch (ctx->opcode & 0x3) {
9869         case 0x0:
9870             gen_shift_imm(env, ctx, OPC_SLL, rx, ry, sa);
9871             break;
9872         case 0x1:
9873 #if defined(TARGET_MIPS64)
9874             check_mips_64(ctx);
9875             gen_shift_imm(env, ctx, OPC_DSLL, rx, ry, sa);
9876 #else
9877             generate_exception(ctx, EXCP_RI);
9878 #endif
9879             break;
9880         case 0x2:
9881             gen_shift_imm(env, ctx, OPC_SRL, rx, ry, sa);
9882             break;
9883         case 0x3:
9884             gen_shift_imm(env, ctx, OPC_SRA, rx, ry, sa);
9885             break;
9886         }
9887         break;
9888 #if defined(TARGET_MIPS64)
9889     case M16_OPC_LD:
9890         check_mips_64(ctx);
9891         gen_ld(env, ctx, OPC_LD, ry, rx, offset << 3);
9892         break;
9893 #endif
9894     case M16_OPC_RRIA:
9895         {
9896             int16_t imm = (int8_t)((ctx->opcode & 0xf) << 4) >> 4;
9897
9898             if ((ctx->opcode >> 4) & 1) {
9899 #if defined(TARGET_MIPS64)
9900                 check_mips_64(ctx);
9901                 gen_arith_imm(env, ctx, OPC_DADDIU, ry, rx, imm);
9902 #else
9903                 generate_exception(ctx, EXCP_RI);
9904 #endif
9905             } else {
9906                 gen_arith_imm(env, ctx, OPC_ADDIU, ry, rx, imm);
9907             }
9908         }
9909         break;
9910     case M16_OPC_ADDIU8:
9911         {
9912             int16_t imm = (int8_t) ctx->opcode;
9913
9914             gen_arith_imm(env, ctx, OPC_ADDIU, rx, rx, imm);
9915         }
9916         break;
9917     case M16_OPC_SLTI:
9918         {
9919             int16_t imm = (uint8_t) ctx->opcode;
9920             gen_slt_imm(env, ctx, OPC_SLTI, 24, rx, imm);
9921         }
9922         break;
9923     case M16_OPC_SLTIU:
9924         {
9925             int16_t imm = (uint8_t) ctx->opcode;
9926             gen_slt_imm(env, ctx, OPC_SLTIU, 24, rx, imm);
9927         }
9928         break;
9929     case M16_OPC_I8:
9930         {
9931             int reg32;
9932
9933             funct = (ctx->opcode >> 8) & 0x7;
9934             switch (funct) {
9935             case I8_BTEQZ:
9936                 gen_compute_branch(ctx, OPC_BEQ, 2, 24, 0,
9937                                    ((int8_t)ctx->opcode) << 1);
9938                 break;
9939             case I8_BTNEZ:
9940                 gen_compute_branch(ctx, OPC_BNE, 2, 24, 0,
9941                                    ((int8_t)ctx->opcode) << 1);
9942                 break;
9943             case I8_SWRASP:
9944                 gen_st(ctx, OPC_SW, 31, 29, (ctx->opcode & 0xff) << 2);
9945                 break;
9946             case I8_ADJSP:
9947                 gen_arith_imm(env, ctx, OPC_ADDIU, 29, 29,
9948                               ((int8_t)ctx->opcode) << 3);
9949                 break;
9950             case I8_SVRS:
9951                 {
9952                     int do_ra = ctx->opcode & (1 << 6);
9953                     int do_s0 = ctx->opcode & (1 << 5);
9954                     int do_s1 = ctx->opcode & (1 << 4);
9955                     int framesize = ctx->opcode & 0xf;
9956
9957                     if (framesize == 0) {
9958                         framesize = 128;
9959                     } else {
9960                         framesize = framesize << 3;
9961                     }
9962
9963                     if (ctx->opcode & (1 << 7)) {
9964                         gen_mips16_save(ctx, 0, 0,
9965                                         do_ra, do_s0, do_s1, framesize);
9966                     } else {
9967                         gen_mips16_restore(ctx, 0, 0,
9968                                            do_ra, do_s0, do_s1, framesize);
9969                     }
9970                 }
9971                 break;
9972             case I8_MOV32R:
9973                 {
9974                     int rz = xlat(ctx->opcode & 0x7);
9975
9976                     reg32 = (((ctx->opcode >> 3) & 0x3) << 3) |
9977                         ((ctx->opcode >> 5) & 0x7);
9978                     gen_arith(env, ctx, OPC_ADDU, reg32, rz, 0);
9979                 }
9980                 break;
9981             case I8_MOVR32:
9982                 reg32 = ctx->opcode & 0x1f;
9983                 gen_arith(env, ctx, OPC_ADDU, ry, reg32, 0);
9984                 break;
9985             default:
9986                 generate_exception(ctx, EXCP_RI);
9987                 break;
9988             }
9989         }
9990         break;
9991     case M16_OPC_LI:
9992         {
9993             int16_t imm = (uint8_t) ctx->opcode;
9994
9995             gen_arith_imm(env, ctx, OPC_ADDIU, rx, 0, imm);
9996         }
9997         break;
9998     case M16_OPC_CMPI:
9999         {
10000             int16_t imm = (uint8_t) ctx->opcode;
10001             gen_logic_imm(env, ctx, OPC_XORI, 24, rx, imm);
10002         }
10003         break;
10004 #if defined(TARGET_MIPS64)
10005     case M16_OPC_SD:
10006         check_mips_64(ctx);
10007         gen_st(ctx, OPC_SD, ry, rx, offset << 3);
10008         break;
10009 #endif
10010     case M16_OPC_LB:
10011         gen_ld(env, ctx, OPC_LB, ry, rx, offset);
10012         break;
10013     case M16_OPC_LH:
10014         gen_ld(env, ctx, OPC_LH, ry, rx, offset << 1);
10015         break;
10016     case M16_OPC_LWSP:
10017         gen_ld(env, ctx, OPC_LW, rx, 29, ((uint8_t)ctx->opcode) << 2);
10018         break;
10019     case M16_OPC_LW:
10020         gen_ld(env, ctx, OPC_LW, ry, rx, offset << 2);
10021         break;
10022     case M16_OPC_LBU:
10023         gen_ld(env, ctx, OPC_LBU, ry, rx, offset);
10024         break;
10025     case M16_OPC_LHU:
10026         gen_ld(env, ctx, OPC_LHU, ry, rx, offset << 1);
10027         break;
10028     case M16_OPC_LWPC:
10029         gen_ld(env, ctx, OPC_LWPC, rx, 0, ((uint8_t)ctx->opcode) << 2);
10030         break;
10031 #if defined (TARGET_MIPS64)
10032     case M16_OPC_LWU:
10033         check_mips_64(ctx);
10034         gen_ld(env, ctx, OPC_LWU, ry, rx, offset << 2);
10035         break;
10036 #endif
10037     case M16_OPC_SB:
10038         gen_st(ctx, OPC_SB, ry, rx, offset);
10039         break;
10040     case M16_OPC_SH:
10041         gen_st(ctx, OPC_SH, ry, rx, offset << 1);
10042         break;
10043     case M16_OPC_SWSP:
10044         gen_st(ctx, OPC_SW, rx, 29, ((uint8_t)ctx->opcode) << 2);
10045         break;
10046     case M16_OPC_SW:
10047         gen_st(ctx, OPC_SW, ry, rx, offset << 2);
10048         break;
10049     case M16_OPC_RRR:
10050         {
10051             int rz = xlat((ctx->opcode >> 2) & 0x7);
10052             int mips32_op;
10053
10054             switch (ctx->opcode & 0x3) {
10055             case RRR_ADDU:
10056                 mips32_op = OPC_ADDU;
10057                 break;
10058             case RRR_SUBU:
10059                 mips32_op = OPC_SUBU;
10060                 break;
10061 #if defined(TARGET_MIPS64)
10062             case RRR_DADDU:
10063                 mips32_op = OPC_DADDU;
10064                 check_mips_64(ctx);
10065                 break;
10066             case RRR_DSUBU:
10067                 mips32_op = OPC_DSUBU;
10068                 check_mips_64(ctx);
10069                 break;
10070 #endif
10071             default:
10072                 generate_exception(ctx, EXCP_RI);
10073                 goto done;
10074             }
10075
10076             gen_arith(env, ctx, mips32_op, rz, rx, ry);
10077         done:
10078             ;
10079         }
10080         break;
10081     case M16_OPC_RR:
10082         switch (op1) {
10083         case RR_JR:
10084             {
10085                 int nd = (ctx->opcode >> 7) & 0x1;
10086                 int link = (ctx->opcode >> 6) & 0x1;
10087                 int ra = (ctx->opcode >> 5) & 0x1;
10088
10089                 if (link) {
10090                     op = nd ? OPC_JALRC : OPC_JALRS;
10091                 } else {
10092                     op = OPC_JR;
10093                 }
10094
10095                 gen_compute_branch(ctx, op, 2, ra ? 31 : rx, 31, 0);
10096                 if (!nd) {
10097                     *is_branch = 1;
10098                 }
10099             }
10100             break;
10101         case RR_SDBBP:
10102             /* XXX: not clear which exception should be raised
10103              *      when in debug mode...
10104              */
10105             check_insn(env, ctx, ISA_MIPS32);
10106             if (!(ctx->hflags & MIPS_HFLAG_DM)) {
10107                 generate_exception(ctx, EXCP_DBp);
10108             } else {
10109                 generate_exception(ctx, EXCP_DBp);
10110             }
10111             break;
10112         case RR_SLT:
10113             gen_slt(env, ctx, OPC_SLT, 24, rx, ry);
10114             break;
10115         case RR_SLTU:
10116             gen_slt(env, ctx, OPC_SLTU, 24, rx, ry);
10117             break;
10118         case RR_BREAK:
10119             generate_exception(ctx, EXCP_BREAK);
10120             break;
10121         case RR_SLLV:
10122             gen_shift(env, ctx, OPC_SLLV, ry, rx, ry);
10123             break;
10124         case RR_SRLV:
10125             gen_shift(env, ctx, OPC_SRLV, ry, rx, ry);
10126             break;
10127         case RR_SRAV:
10128             gen_shift(env, ctx, OPC_SRAV, ry, rx, ry);
10129             break;
10130 #if defined (TARGET_MIPS64)
10131         case RR_DSRL:
10132             check_mips_64(ctx);
10133             gen_shift_imm(env, ctx, OPC_DSRL, ry, ry, sa);
10134             break;
10135 #endif
10136         case RR_CMP:
10137             gen_logic(env, ctx, OPC_XOR, 24, rx, ry);
10138             break;
10139         case RR_NEG:
10140             gen_arith(env, ctx, OPC_SUBU, rx, 0, ry);
10141             break;
10142         case RR_AND:
10143             gen_logic(env, ctx, OPC_AND, rx, rx, ry);
10144             break;
10145         case RR_OR:
10146             gen_logic(env, ctx, OPC_OR, rx, rx, ry);
10147             break;
10148         case RR_XOR:
10149             gen_logic(env, ctx, OPC_XOR, rx, rx, ry);
10150             break;
10151         case RR_NOT:
10152             gen_logic(env, ctx, OPC_NOR, rx, ry, 0);
10153             break;
10154         case RR_MFHI:
10155             gen_HILO(ctx, OPC_MFHI, rx);
10156             break;
10157         case RR_CNVT:
10158             switch (cnvt_op) {
10159             case RR_RY_CNVT_ZEB:
10160                 tcg_gen_ext8u_tl(cpu_gpr[rx], cpu_gpr[rx]);
10161                 break;
10162             case RR_RY_CNVT_ZEH:
10163                 tcg_gen_ext16u_tl(cpu_gpr[rx], cpu_gpr[rx]);
10164                 break;
10165             case RR_RY_CNVT_SEB:
10166                 tcg_gen_ext8s_tl(cpu_gpr[rx], cpu_gpr[rx]);
10167                 break;
10168             case RR_RY_CNVT_SEH:
10169                 tcg_gen_ext16s_tl(cpu_gpr[rx], cpu_gpr[rx]);
10170                 break;
10171 #if defined (TARGET_MIPS64)
10172             case RR_RY_CNVT_ZEW:
10173                 check_mips_64(ctx);
10174                 tcg_gen_ext32u_tl(cpu_gpr[rx], cpu_gpr[rx]);
10175                 break;
10176             case RR_RY_CNVT_SEW:
10177                 check_mips_64(ctx);
10178                 tcg_gen_ext32s_tl(cpu_gpr[rx], cpu_gpr[rx]);
10179                 break;
10180 #endif
10181             default:
10182                 generate_exception(ctx, EXCP_RI);
10183                 break;
10184             }
10185             break;
10186         case RR_MFLO:
10187             gen_HILO(ctx, OPC_MFLO, rx);
10188             break;
10189 #if defined (TARGET_MIPS64)
10190         case RR_DSRA:
10191             check_mips_64(ctx);
10192             gen_shift_imm(env, ctx, OPC_DSRA, ry, ry, sa);
10193             break;
10194         case RR_DSLLV:
10195             check_mips_64(ctx);
10196             gen_shift(env, ctx, OPC_DSLLV, ry, rx, ry);
10197             break;
10198         case RR_DSRLV:
10199             check_mips_64(ctx);
10200             gen_shift(env, ctx, OPC_DSRLV, ry, rx, ry);
10201             break;
10202         case RR_DSRAV:
10203             check_mips_64(ctx);
10204             gen_shift(env, ctx, OPC_DSRAV, ry, rx, ry);
10205             break;
10206 #endif
10207         case RR_MULT:
10208             gen_muldiv(ctx, OPC_MULT, rx, ry);
10209             break;
10210         case RR_MULTU:
10211             gen_muldiv(ctx, OPC_MULTU, rx, ry);
10212             break;
10213         case RR_DIV:
10214             gen_muldiv(ctx, OPC_DIV, rx, ry);
10215             break;
10216         case RR_DIVU:
10217             gen_muldiv(ctx, OPC_DIVU, rx, ry);
10218             break;
10219 #if defined (TARGET_MIPS64)
10220         case RR_DMULT:
10221             check_mips_64(ctx);
10222             gen_muldiv(ctx, OPC_DMULT, rx, ry);
10223             break;
10224         case RR_DMULTU:
10225             check_mips_64(ctx);
10226             gen_muldiv(ctx, OPC_DMULTU, rx, ry);
10227             break;
10228         case RR_DDIV:
10229             check_mips_64(ctx);
10230             gen_muldiv(ctx, OPC_DDIV, rx, ry);
10231             break;
10232         case RR_DDIVU:
10233             check_mips_64(ctx);
10234             gen_muldiv(ctx, OPC_DDIVU, rx, ry);
10235             break;
10236 #endif
10237         default:
10238             generate_exception(ctx, EXCP_RI);
10239             break;
10240         }
10241         break;
10242     case M16_OPC_EXTEND:
10243         decode_extended_mips16_opc(env, ctx, is_branch);
10244         n_bytes = 4;
10245         break;
10246 #if defined(TARGET_MIPS64)
10247     case M16_OPC_I64:
10248         funct = (ctx->opcode >> 8) & 0x7;
10249         decode_i64_mips16(env, ctx, ry, funct, offset, 0);
10250         break;
10251 #endif
10252     default:
10253         generate_exception(ctx, EXCP_RI);
10254         break;
10255     }
10256
10257     return n_bytes;
10258 }
10259
10260 /* microMIPS extension to MIPS32 */
10261
10262 /* microMIPS32 major opcodes */
10263
10264 enum {
10265     POOL32A = 0x00,
10266     POOL16A = 0x01,
10267     LBU16 = 0x02,
10268     MOVE16 = 0x03,
10269     ADDI32 = 0x04,
10270     LBU32 = 0x05,
10271     SB32 = 0x06,
10272     LB32 = 0x07,
10273
10274     POOL32B = 0x08,
10275     POOL16B = 0x09,
10276     LHU16 = 0x0a,
10277     ANDI16 = 0x0b,
10278     ADDIU32 = 0x0c,
10279     LHU32 = 0x0d,
10280     SH32 = 0x0e,
10281     LH32 = 0x0f,
10282
10283     POOL32I = 0x10,
10284     POOL16C = 0x11,
10285     LWSP16 = 0x12,
10286     POOL16D = 0x13,
10287     ORI32 = 0x14,
10288     POOL32F = 0x15,
10289     POOL32S = 0x16,
10290     DADDIU32 = 0x17,
10291
10292     POOL32C = 0x18,
10293     LWGP16 = 0x19,
10294     LW16 = 0x1a,
10295     POOL16E = 0x1b,
10296     XORI32 = 0x1c,
10297     JALS32 = 0x1d,
10298     ADDIUPC = 0x1e,
10299     POOL48A = 0x1f,
10300
10301     /* 0x20 is reserved */
10302     RES_20 = 0x20,
10303     POOL16F = 0x21,
10304     SB16 = 0x22,
10305     BEQZ16 = 0x23,
10306     SLTI32 = 0x24,
10307     BEQ32 = 0x25,
10308     SWC132 = 0x26,
10309     LWC132 = 0x27,
10310
10311     /* 0x28 and 0x29 are reserved */
10312     RES_28 = 0x28,
10313     RES_29 = 0x29,
10314     SH16 = 0x2a,
10315     BNEZ16 = 0x2b,
10316     SLTIU32 = 0x2c,
10317     BNE32 = 0x2d,
10318     SDC132 = 0x2e,
10319     LDC132 = 0x2f,
10320
10321     /* 0x30 and 0x31 are reserved */
10322     RES_30 = 0x30,
10323     RES_31 = 0x31,
10324     SWSP16 = 0x32,
10325     B16 = 0x33,
10326     ANDI32 = 0x34,
10327     J32 = 0x35,
10328     SD32 = 0x36,
10329     LD32 = 0x37,
10330
10331     /* 0x38 and 0x39 are reserved */
10332     RES_38 = 0x38,
10333     RES_39 = 0x39,
10334     SW16 = 0x3a,
10335     LI16 = 0x3b,
10336     JALX32 = 0x3c,
10337     JAL32 = 0x3d,
10338     SW32 = 0x3e,
10339     LW32 = 0x3f
10340 };
10341
10342 /* POOL32A encoding of minor opcode field */
10343
10344 enum {
10345     /* These opcodes are distinguished only by bits 9..6; those bits are
10346      * what are recorded below. */
10347     SLL32 = 0x0,
10348     SRL32 = 0x1,
10349     SRA = 0x2,
10350     ROTR = 0x3,
10351
10352     SLLV = 0x0,
10353     SRLV = 0x1,
10354     SRAV = 0x2,
10355     ROTRV = 0x3,
10356     ADD = 0x4,
10357     ADDU32 = 0x5,
10358     SUB = 0x6,
10359     SUBU32 = 0x7,
10360     MUL = 0x8,
10361     AND = 0x9,
10362     OR32 = 0xa,
10363     NOR = 0xb,
10364     XOR32 = 0xc,
10365     SLT = 0xd,
10366     SLTU = 0xe,
10367
10368     MOVN = 0x0,
10369     MOVZ = 0x1,
10370     LWXS = 0x4,
10371
10372     /* The following can be distinguished by their lower 6 bits. */
10373     INS = 0x0c,
10374     EXT = 0x2c,
10375     POOL32AXF = 0x3c
10376 };
10377
10378 /* POOL32AXF encoding of minor opcode field extension */
10379
10380 enum {
10381     /* bits 11..6 */
10382     TEQ = 0x00,
10383     TGE = 0x08,
10384     TGEU = 0x10,
10385     TLT = 0x20,
10386     TLTU = 0x28,
10387     TNE = 0x30,
10388
10389     MFC0 = 0x03,
10390     MTC0 = 0x0b,
10391
10392     /* bits 13..12 for 0x01 */
10393     MFHI_ACC = 0x0,
10394     MFLO_ACC = 0x1,
10395     MTHI_ACC = 0x2,
10396     MTLO_ACC = 0x3,
10397
10398     /* bits 13..12 for 0x2a */
10399     MADD_ACC = 0x0,
10400     MADDU_ACC = 0x1,
10401     MSUB_ACC = 0x2,
10402     MSUBU_ACC = 0x3,
10403
10404     /* bits 13..12 for 0x32 */
10405     MULT_ACC = 0x0,
10406     MULTU_ACC = 0x0,
10407
10408     /* bits 15..12 for 0x2c */
10409     SEB = 0x2,
10410     SEH = 0x3,
10411     CLO = 0x4,
10412     CLZ = 0x5,
10413     RDHWR = 0x6,
10414     WSBH = 0x7,
10415     MULT = 0x8,
10416     MULTU = 0x9,
10417     DIV = 0xa,
10418     DIVU = 0xb,
10419     MADD = 0xc,
10420     MADDU = 0xd,
10421     MSUB = 0xe,
10422     MSUBU = 0xf,
10423
10424     /* bits 15..12 for 0x34 */
10425     MFC2 = 0x4,
10426     MTC2 = 0x5,
10427     MFHC2 = 0x8,
10428     MTHC2 = 0x9,
10429     CFC2 = 0xc,
10430     CTC2 = 0xd,
10431
10432     /* bits 15..12 for 0x3c */
10433     JALR = 0x0,
10434     JR = 0x0,                   /* alias */
10435     JALR_HB = 0x1,
10436     JALRS = 0x4,
10437     JALRS_HB = 0x5,
10438
10439     /* bits 15..12 for 0x05 */
10440     RDPGPR = 0xe,
10441     WRPGPR = 0xf,
10442
10443     /* bits 15..12 for 0x0d */
10444     TLBP = 0x0,
10445     TLBR = 0x1,
10446     TLBWI = 0x2,
10447     TLBWR = 0x3,
10448     WAIT = 0x9,
10449     IRET = 0xd,
10450     DERET = 0xe,
10451     ERET = 0xf,
10452
10453     /* bits 15..12 for 0x15 */
10454     DMT = 0x0,
10455     DVPE = 0x1,
10456     EMT = 0x2,
10457     EVPE = 0x3,
10458
10459     /* bits 15..12 for 0x1d */
10460     DI = 0x4,
10461     EI = 0x5,
10462
10463     /* bits 15..12 for 0x2d */
10464     SYNC = 0x6,
10465     SYSCALL = 0x8,
10466     SDBBP = 0xd,
10467
10468     /* bits 15..12 for 0x35 */
10469     MFHI32 = 0x0,
10470     MFLO32 = 0x1,
10471     MTHI32 = 0x2,
10472     MTLO32 = 0x3,
10473 };
10474
10475 /* POOL32B encoding of minor opcode field (bits 15..12) */
10476
10477 enum {
10478     LWC2 = 0x0,
10479     LWP = 0x1,
10480     LDP = 0x4,
10481     LWM32 = 0x5,
10482     CACHE = 0x6,
10483     LDM = 0x7,
10484     SWC2 = 0x8,
10485     SWP = 0x9,
10486     SDP = 0xc,
10487     SWM32 = 0xd,
10488     SDM = 0xf
10489 };
10490
10491 /* POOL32C encoding of minor opcode field (bits 15..12) */
10492
10493 enum {
10494     LWL = 0x0,
10495     SWL = 0x8,
10496     LWR = 0x1,
10497     SWR = 0x9,
10498     PREF = 0x2,
10499     /* 0xa is reserved */
10500     LL = 0x3,
10501     SC = 0xb,
10502     LDL = 0x4,
10503     SDL = 0xc,
10504     LDR = 0x5,
10505     SDR = 0xd,
10506     /* 0x6 is reserved */
10507     LWU = 0xe,
10508     LLD = 0x7,
10509     SCD = 0xf
10510 };
10511
10512 /* POOL32F encoding of minor opcode field (bits 5..0) */
10513
10514 enum {
10515     /* These are the bit 7..6 values */
10516     ADD_FMT = 0x0,
10517     MOVN_FMT = 0x0,
10518
10519     SUB_FMT = 0x1,
10520     MOVZ_FMT = 0x1,
10521
10522     MUL_FMT = 0x2,
10523
10524     DIV_FMT = 0x3,
10525
10526     /* These are the bit 8..6 values */
10527     RSQRT2_FMT = 0x0,
10528     MOVF_FMT = 0x0,
10529
10530     LWXC1 = 0x1,
10531     MOVT_FMT = 0x1,
10532
10533     PLL_PS = 0x2,
10534     SWXC1 = 0x2,
10535
10536     PLU_PS = 0x3,
10537     LDXC1 = 0x3,
10538
10539     PUL_PS = 0x4,
10540     SDXC1 = 0x4,
10541     RECIP2_FMT = 0x4,
10542
10543     PUU_PS = 0x5,
10544     LUXC1 = 0x5,
10545
10546     CVT_PS_S = 0x6,
10547     SUXC1 = 0x6,
10548     ADDR_PS = 0x6,
10549     PREFX = 0x6,
10550
10551     MULR_PS = 0x7,
10552
10553     MADD_S = 0x01,
10554     MADD_D = 0x09,
10555     MADD_PS = 0x11,
10556     ALNV_PS = 0x19,
10557     MSUB_S = 0x21,
10558     MSUB_D = 0x29,
10559     MSUB_PS = 0x31,
10560
10561     NMADD_S = 0x02,
10562     NMADD_D = 0x0a,
10563     NMADD_PS = 0x12,
10564     NMSUB_S = 0x22,
10565     NMSUB_D = 0x2a,
10566     NMSUB_PS = 0x32,
10567
10568     POOL32FXF = 0x3b,
10569
10570     CABS_COND_FMT = 0x1c,              /* MIPS3D */
10571     C_COND_FMT = 0x3c
10572 };
10573
10574 /* POOL32Fxf encoding of minor opcode extension field */
10575
10576 enum {
10577     CVT_L = 0x04,
10578     RSQRT_FMT = 0x08,
10579     FLOOR_L = 0x0c,
10580     CVT_PW_PS = 0x1c,
10581     CVT_W = 0x24,
10582     SQRT_FMT = 0x28,
10583     FLOOR_W = 0x2c,
10584     CVT_PS_PW = 0x3c,
10585     CFC1 = 0x40,
10586     RECIP_FMT = 0x48,
10587     CEIL_L = 0x4c,
10588     CTC1 = 0x60,
10589     CEIL_W = 0x6c,
10590     MFC1 = 0x80,
10591     CVT_S_PL = 0x84,
10592     TRUNC_L = 0x8c,
10593     MTC1 = 0xa0,
10594     CVT_S_PU = 0xa4,
10595     TRUNC_W = 0xac,
10596     MFHC1 = 0xc0,
10597     ROUND_L = 0xcc,
10598     MTHC1 = 0xe0,
10599     ROUND_W = 0xec,
10600
10601     MOV_FMT = 0x01,
10602     MOVF = 0x05,
10603     ABS_FMT = 0x0d,
10604     RSQRT1_FMT = 0x1d,
10605     MOVT = 0x25,
10606     NEG_FMT = 0x2d,
10607     CVT_D = 0x4d,
10608     RECIP1_FMT = 0x5d,
10609     CVT_S = 0x6d
10610 };
10611
10612 /* POOL32I encoding of minor opcode field (bits 25..21) */
10613
10614 enum {
10615     BLTZ = 0x00,
10616     BLTZAL = 0x01,
10617     BGEZ = 0x02,
10618     BGEZAL = 0x03,
10619     BLEZ = 0x04,
10620     BNEZC = 0x05,
10621     BGTZ = 0x06,
10622     BEQZC = 0x07,
10623     TLTI = 0x08,
10624     TGEI = 0x09,
10625     TLTIU = 0x0a,
10626     TGEIU = 0x0b,
10627     TNEI = 0x0c,
10628     LUI = 0x0d,
10629     TEQI = 0x0e,
10630     SYNCI = 0x10,
10631     BLTZALS = 0x11,
10632     BGEZALS = 0x13,
10633     BC2F = 0x14,
10634     BC2T = 0x15,
10635     BPOSGE64 = 0x1a,
10636     BPOSGE32 = 0x1b,
10637     /* These overlap and are distinguished by bit16 of the instruction */
10638     BC1F = 0x1c,
10639     BC1T = 0x1d,
10640     BC1ANY2F = 0x1c,
10641     BC1ANY2T = 0x1d,
10642     BC1ANY4F = 0x1e,
10643     BC1ANY4T = 0x1f
10644 };
10645
10646 /* POOL16A encoding of minor opcode field */
10647
10648 enum {
10649     ADDU16 = 0x0,
10650     SUBU16 = 0x1
10651 };
10652
10653 /* POOL16B encoding of minor opcode field */
10654
10655 enum {
10656     SLL16 = 0x0,
10657     SRL16 = 0x1
10658 };
10659
10660 /* POOL16C encoding of minor opcode field */
10661
10662 enum {
10663     NOT16 = 0x00,
10664     XOR16 = 0x04,
10665     AND16 = 0x08,
10666     OR16 = 0x0c,
10667     LWM16 = 0x10,
10668     SWM16 = 0x14,
10669     JR16 = 0x18,
10670     JRC16 = 0x1a,
10671     JALR16 = 0x1c,
10672     JALR16S = 0x1e,
10673     MFHI16 = 0x20,
10674     MFLO16 = 0x24,
10675     BREAK16 = 0x28,
10676     SDBBP16 = 0x2c,
10677     JRADDIUSP = 0x30
10678 };
10679
10680 /* POOL16D encoding of minor opcode field */
10681
10682 enum {
10683     ADDIUS5 = 0x0,
10684     ADDIUSP = 0x1
10685 };
10686
10687 /* POOL16E encoding of minor opcode field */
10688
10689 enum {
10690     ADDIUR2 = 0x0,
10691     ADDIUR1SP = 0x1
10692 };
10693
10694 static int mmreg (int r)
10695 {
10696     static const int map[] = { 16, 17, 2, 3, 4, 5, 6, 7 };
10697
10698     return map[r];
10699 }
10700
10701 /* Used for 16-bit store instructions.  */
10702 static int mmreg2 (int r)
10703 {
10704     static const int map[] = { 0, 17, 2, 3, 4, 5, 6, 7 };
10705
10706     return map[r];
10707 }
10708
10709 #define uMIPS_RD(op) ((op >> 7) & 0x7)
10710 #define uMIPS_RS(op) ((op >> 4) & 0x7)
10711 #define uMIPS_RS2(op) uMIPS_RS(op)
10712 #define uMIPS_RS1(op) ((op >> 1) & 0x7)
10713 #define uMIPS_RD5(op) ((op >> 5) & 0x1f)
10714 #define uMIPS_RS5(op) (op & 0x1f)
10715
10716 /* Signed immediate */
10717 #define SIMM(op, start, width)                                          \
10718     ((int32_t)(((op >> start) & ((~0U) >> (32-width)))                 \
10719                << (32-width))                                           \
10720      >> (32-width))
10721 /* Zero-extended immediate */
10722 #define ZIMM(op, start, width) ((op >> start) & ((~0U) >> (32-width)))
10723
10724 static void gen_addiur1sp (CPUMIPSState *env, DisasContext *ctx)
10725 {
10726     int rd = mmreg(uMIPS_RD(ctx->opcode));
10727
10728     gen_arith_imm(env, ctx, OPC_ADDIU, rd, 29, ((ctx->opcode >> 1) & 0x3f) << 2);
10729 }
10730
10731 static void gen_addiur2 (CPUMIPSState *env, DisasContext *ctx)
10732 {
10733     static const int decoded_imm[] = { 1, 4, 8, 12, 16, 20, 24, -1 };
10734     int rd = mmreg(uMIPS_RD(ctx->opcode));
10735     int rs = mmreg(uMIPS_RS(ctx->opcode));
10736
10737     gen_arith_imm(env, ctx, OPC_ADDIU, rd, rs, decoded_imm[ZIMM(ctx->opcode, 1, 3)]);
10738 }
10739
10740 static void gen_addiusp (CPUMIPSState *env, DisasContext *ctx)
10741 {
10742     int encoded = ZIMM(ctx->opcode, 1, 9);
10743     int decoded;
10744
10745     if (encoded <= 1) {
10746         decoded = 256 + encoded;
10747     } else if (encoded <= 255) {
10748         decoded = encoded;
10749     } else if (encoded <= 509) {
10750         decoded = encoded - 512;
10751     } else {
10752         decoded = encoded - 768;
10753     }
10754
10755     gen_arith_imm(env, ctx, OPC_ADDIU, 29, 29, decoded << 2);
10756 }
10757
10758 static void gen_addius5 (CPUMIPSState *env, DisasContext *ctx)
10759 {
10760     int imm = SIMM(ctx->opcode, 1, 4);
10761     int rd = (ctx->opcode >> 5) & 0x1f;
10762
10763     gen_arith_imm(env, ctx, OPC_ADDIU, rd, rd, imm);
10764 }
10765
10766 static void gen_andi16 (CPUMIPSState *env, DisasContext *ctx)
10767 {
10768     static const int decoded_imm[] = { 128, 1, 2, 3, 4, 7, 8, 15, 16,
10769                                  31, 32, 63, 64, 255, 32768, 65535 };
10770     int rd = mmreg(uMIPS_RD(ctx->opcode));
10771     int rs = mmreg(uMIPS_RS(ctx->opcode));
10772     int encoded = ZIMM(ctx->opcode, 0, 4);
10773
10774     gen_logic_imm(env, ctx, OPC_ANDI, rd, rs, decoded_imm[encoded]);
10775 }
10776
10777 static void gen_ldst_multiple (DisasContext *ctx, uint32_t opc, int reglist,
10778                                int base, int16_t offset)
10779 {
10780     const char *opn = "ldst_multiple";
10781     TCGv t0, t1;
10782     TCGv_i32 t2;
10783
10784     if (ctx->hflags & MIPS_HFLAG_BMASK) {
10785         generate_exception(ctx, EXCP_RI);
10786         return;
10787     }
10788
10789     t0 = tcg_temp_new();
10790
10791     gen_base_offset_addr(ctx, t0, base, offset);
10792
10793     t1 = tcg_const_tl(reglist);
10794     t2 = tcg_const_i32(ctx->mem_idx);
10795
10796     save_cpu_state(ctx, 1);
10797     switch (opc) {
10798     case LWM32:
10799         gen_helper_lwm(cpu_env, t0, t1, t2);
10800         opn = "lwm";
10801         break;
10802     case SWM32:
10803         gen_helper_swm(cpu_env, t0, t1, t2);
10804         opn = "swm";
10805         break;
10806 #ifdef TARGET_MIPS64
10807     case LDM:
10808         gen_helper_ldm(cpu_env, t0, t1, t2);
10809         opn = "ldm";
10810         break;
10811     case SDM:
10812         gen_helper_sdm(cpu_env, t0, t1, t2);
10813         opn = "sdm";
10814         break;
10815 #endif
10816     }
10817     (void)opn;
10818     MIPS_DEBUG("%s, %x, %d(%s)", opn, reglist, offset, regnames[base]);
10819     tcg_temp_free(t0);
10820     tcg_temp_free(t1);
10821     tcg_temp_free_i32(t2);
10822 }
10823
10824
10825 static void gen_pool16c_insn (CPUMIPSState *env, DisasContext *ctx, int *is_branch)
10826 {
10827     int rd = mmreg((ctx->opcode >> 3) & 0x7);
10828     int rs = mmreg(ctx->opcode & 0x7);
10829     int opc;
10830
10831     switch (((ctx->opcode) >> 4) & 0x3f) {
10832     case NOT16 + 0:
10833     case NOT16 + 1:
10834     case NOT16 + 2:
10835     case NOT16 + 3:
10836         gen_logic(env, ctx, OPC_NOR, rd, rs, 0);
10837         break;
10838     case XOR16 + 0:
10839     case XOR16 + 1:
10840     case XOR16 + 2:
10841     case XOR16 + 3:
10842         gen_logic(env, ctx, OPC_XOR, rd, rd, rs);
10843         break;
10844     case AND16 + 0:
10845     case AND16 + 1:
10846     case AND16 + 2:
10847     case AND16 + 3:
10848         gen_logic(env, ctx, OPC_AND, rd, rd, rs);
10849         break;
10850     case OR16 + 0:
10851     case OR16 + 1:
10852     case OR16 + 2:
10853     case OR16 + 3:
10854         gen_logic(env, ctx, OPC_OR, rd, rd, rs);
10855         break;
10856     case LWM16 + 0:
10857     case LWM16 + 1:
10858     case LWM16 + 2:
10859     case LWM16 + 3:
10860         {
10861             static const int lwm_convert[] = { 0x11, 0x12, 0x13, 0x14 };
10862             int offset = ZIMM(ctx->opcode, 0, 4);
10863
10864             gen_ldst_multiple(ctx, LWM32, lwm_convert[(ctx->opcode >> 4) & 0x3],
10865                               29, offset << 2);
10866         }
10867         break;
10868     case SWM16 + 0:
10869     case SWM16 + 1:
10870     case SWM16 + 2:
10871     case SWM16 + 3:
10872         {
10873             static const int swm_convert[] = { 0x11, 0x12, 0x13, 0x14 };
10874             int offset = ZIMM(ctx->opcode, 0, 4);
10875
10876             gen_ldst_multiple(ctx, SWM32, swm_convert[(ctx->opcode >> 4) & 0x3],
10877                               29, offset << 2);
10878         }
10879         break;
10880     case JR16 + 0:
10881     case JR16 + 1:
10882         {
10883             int reg = ctx->opcode & 0x1f;
10884
10885             gen_compute_branch(ctx, OPC_JR, 2, reg, 0, 0);
10886         }
10887         *is_branch = 1;
10888         break;
10889     case JRC16 + 0:
10890     case JRC16 + 1:
10891         {
10892             int reg = ctx->opcode & 0x1f;
10893
10894             gen_compute_branch(ctx, OPC_JR, 2, reg, 0, 0);
10895             /* Let normal delay slot handling in our caller take us
10896                to the branch target.  */
10897         }
10898         break;
10899     case JALR16 + 0:
10900     case JALR16 + 1:
10901         opc = OPC_JALR;
10902         goto do_jalr;
10903     case JALR16S + 0:
10904     case JALR16S + 1:
10905         opc = OPC_JALRS;
10906     do_jalr:
10907         {
10908             int reg = ctx->opcode & 0x1f;
10909
10910             gen_compute_branch(ctx, opc, 2, reg, 31, 0);
10911         }
10912         *is_branch = 1;
10913         break;
10914     case MFHI16 + 0:
10915     case MFHI16 + 1:
10916         gen_HILO(ctx, OPC_MFHI, uMIPS_RS5(ctx->opcode));
10917         break;
10918     case MFLO16 + 0:
10919     case MFLO16 + 1:
10920         gen_HILO(ctx, OPC_MFLO, uMIPS_RS5(ctx->opcode));
10921         break;
10922     case BREAK16:
10923         generate_exception(ctx, EXCP_BREAK);
10924         break;
10925     case SDBBP16:
10926         /* XXX: not clear which exception should be raised
10927          *      when in debug mode...
10928          */
10929         check_insn(env, ctx, ISA_MIPS32);
10930         if (!(ctx->hflags & MIPS_HFLAG_DM)) {
10931             generate_exception(ctx, EXCP_DBp);
10932         } else {
10933             generate_exception(ctx, EXCP_DBp);
10934         }
10935         break;
10936     case JRADDIUSP + 0:
10937     case JRADDIUSP + 1:
10938         {
10939             int imm = ZIMM(ctx->opcode, 0, 5);
10940
10941             gen_compute_branch(ctx, OPC_JR, 2, 31, 0, 0);
10942             gen_arith_imm(env, ctx, OPC_ADDIU, 29, 29, imm << 2);
10943             /* Let normal delay slot handling in our caller take us
10944                to the branch target.  */
10945         }
10946         break;
10947     default:
10948         generate_exception(ctx, EXCP_RI);
10949         break;
10950     }
10951 }
10952
10953 static void gen_ldxs (DisasContext *ctx, int base, int index, int rd)
10954 {
10955     TCGv t0 = tcg_temp_new();
10956     TCGv t1 = tcg_temp_new();
10957
10958     gen_load_gpr(t0, base);
10959
10960     if (index != 0) {
10961         gen_load_gpr(t1, index);
10962         tcg_gen_shli_tl(t1, t1, 2);
10963         gen_op_addr_add(ctx, t0, t1, t0);
10964     }
10965
10966     save_cpu_state(ctx, 0);
10967     op_ld_lw(t1, t0, ctx);
10968     gen_store_gpr(t1, rd);
10969
10970     tcg_temp_free(t0);
10971     tcg_temp_free(t1);
10972 }
10973
10974 static void gen_ldst_pair (DisasContext *ctx, uint32_t opc, int rd,
10975                            int base, int16_t offset)
10976 {
10977     const char *opn = "ldst_pair";
10978     TCGv t0, t1;
10979
10980     if (ctx->hflags & MIPS_HFLAG_BMASK || rd == 31) {
10981         generate_exception(ctx, EXCP_RI);
10982         return;
10983     }
10984
10985     t0 = tcg_temp_new();
10986     t1 = tcg_temp_new();
10987
10988     gen_base_offset_addr(ctx, t0, base, offset);
10989
10990     switch (opc) {
10991     case LWP:
10992         if (rd == base) {
10993             generate_exception(ctx, EXCP_RI);
10994             return;
10995         }
10996         save_cpu_state(ctx, 0);
10997         op_ld_lw(t1, t0, ctx);
10998         gen_store_gpr(t1, rd);
10999         tcg_gen_movi_tl(t1, 4);
11000         gen_op_addr_add(ctx, t0, t0, t1);
11001         op_ld_lw(t1, t0, ctx);
11002         gen_store_gpr(t1, rd+1);
11003         opn = "lwp";
11004         break;
11005     case SWP:
11006         save_cpu_state(ctx, 0);
11007         gen_load_gpr(t1, rd);
11008         op_st_sw(t1, t0, ctx);
11009         tcg_gen_movi_tl(t1, 4);
11010         gen_op_addr_add(ctx, t0, t0, t1);
11011         gen_load_gpr(t1, rd+1);
11012         op_st_sw(t1, t0, ctx);
11013         opn = "swp";
11014         break;
11015 #ifdef TARGET_MIPS64
11016     case LDP:
11017         if (rd == base) {
11018             generate_exception(ctx, EXCP_RI);
11019             return;
11020         }
11021         save_cpu_state(ctx, 0);
11022         op_ld_ld(t1, t0, ctx);
11023         gen_store_gpr(t1, rd);
11024         tcg_gen_movi_tl(t1, 8);
11025         gen_op_addr_add(ctx, t0, t0, t1);
11026         op_ld_ld(t1, t0, ctx);
11027         gen_store_gpr(t1, rd+1);
11028         opn = "ldp";
11029         break;
11030     case SDP:
11031         save_cpu_state(ctx, 0);
11032         gen_load_gpr(t1, rd);
11033         op_st_sd(t1, t0, ctx);
11034         tcg_gen_movi_tl(t1, 8);
11035         gen_op_addr_add(ctx, t0, t0, t1);
11036         gen_load_gpr(t1, rd+1);
11037         op_st_sd(t1, t0, ctx);
11038         opn = "sdp";
11039         break;
11040 #endif
11041     }
11042     (void)opn; /* avoid a compiler warning */
11043     MIPS_DEBUG("%s, %s, %d(%s)", opn, regnames[rd], offset, regnames[base]);
11044     tcg_temp_free(t0);
11045     tcg_temp_free(t1);
11046 }
11047
11048 static void gen_pool32axf (CPUMIPSState *env, DisasContext *ctx, int rt, int rs,
11049                            int *is_branch)
11050 {
11051     int extension = (ctx->opcode >> 6) & 0x3f;
11052     int minor = (ctx->opcode >> 12) & 0xf;
11053     uint32_t mips32_op;
11054
11055     switch (extension) {
11056     case TEQ:
11057         mips32_op = OPC_TEQ;
11058         goto do_trap;
11059     case TGE:
11060         mips32_op = OPC_TGE;
11061         goto do_trap;
11062     case TGEU:
11063         mips32_op = OPC_TGEU;
11064         goto do_trap;
11065     case TLT:
11066         mips32_op = OPC_TLT;
11067         goto do_trap;
11068     case TLTU:
11069         mips32_op = OPC_TLTU;
11070         goto do_trap;
11071     case TNE:
11072         mips32_op = OPC_TNE;
11073     do_trap:
11074         gen_trap(ctx, mips32_op, rs, rt, -1);
11075         break;
11076 #ifndef CONFIG_USER_ONLY
11077     case MFC0:
11078     case MFC0 + 32:
11079         check_cp0_enabled(ctx);
11080         if (rt == 0) {
11081             /* Treat as NOP. */
11082             break;
11083         }
11084         gen_mfc0(env, ctx, cpu_gpr[rt], rs, (ctx->opcode >> 11) & 0x7);
11085         break;
11086     case MTC0:
11087     case MTC0 + 32:
11088         check_cp0_enabled(ctx);
11089         {
11090             TCGv t0 = tcg_temp_new();
11091
11092             gen_load_gpr(t0, rt);
11093             gen_mtc0(env, ctx, t0, rs, (ctx->opcode >> 11) & 0x7);
11094             tcg_temp_free(t0);
11095         }
11096         break;
11097 #endif
11098     case 0x2c:
11099         switch (minor) {
11100         case SEB:
11101             gen_bshfl(ctx, OPC_SEB, rs, rt);
11102             break;
11103         case SEH:
11104             gen_bshfl(ctx, OPC_SEH, rs, rt);
11105             break;
11106         case CLO:
11107             mips32_op = OPC_CLO;
11108             goto do_cl;
11109         case CLZ:
11110             mips32_op = OPC_CLZ;
11111         do_cl:
11112             check_insn(env, ctx, ISA_MIPS32);
11113             gen_cl(ctx, mips32_op, rt, rs);
11114             break;
11115         case RDHWR:
11116             gen_rdhwr(env, ctx, rt, rs);
11117             break;
11118         case WSBH:
11119             gen_bshfl(ctx, OPC_WSBH, rs, rt);
11120             break;
11121         case MULT:
11122             mips32_op = OPC_MULT;
11123             goto do_muldiv;
11124         case MULTU:
11125             mips32_op = OPC_MULTU;
11126             goto do_muldiv;
11127         case DIV:
11128             mips32_op = OPC_DIV;
11129             goto do_muldiv;
11130         case DIVU:
11131             mips32_op = OPC_DIVU;
11132             goto do_muldiv;
11133         case MADD:
11134             mips32_op = OPC_MADD;
11135             goto do_muldiv;
11136         case MADDU:
11137             mips32_op = OPC_MADDU;
11138             goto do_muldiv;
11139         case MSUB:
11140             mips32_op = OPC_MSUB;
11141             goto do_muldiv;
11142         case MSUBU:
11143             mips32_op = OPC_MSUBU;
11144         do_muldiv:
11145             check_insn(env, ctx, ISA_MIPS32);
11146             gen_muldiv(ctx, mips32_op, rs, rt);
11147             break;
11148         default:
11149             goto pool32axf_invalid;
11150         }
11151         break;
11152     case 0x34:
11153         switch (minor) {
11154         case MFC2:
11155         case MTC2:
11156         case MFHC2:
11157         case MTHC2:
11158         case CFC2:
11159         case CTC2:
11160             generate_exception_err(ctx, EXCP_CpU, 2);
11161             break;
11162         default:
11163             goto pool32axf_invalid;
11164         }
11165         break;
11166     case 0x3c:
11167         switch (minor) {
11168         case JALR:
11169         case JALR_HB:
11170             gen_compute_branch (ctx, OPC_JALR, 4, rs, rt, 0);
11171             *is_branch = 1;
11172             break;
11173         case JALRS:
11174         case JALRS_HB:
11175             gen_compute_branch (ctx, OPC_JALRS, 4, rs, rt, 0);
11176             *is_branch = 1;
11177             break;
11178         default:
11179             goto pool32axf_invalid;
11180         }
11181         break;
11182     case 0x05:
11183         switch (minor) {
11184         case RDPGPR:
11185             check_cp0_enabled(ctx);
11186             check_insn(env, ctx, ISA_MIPS32R2);
11187             gen_load_srsgpr(rt, rs);
11188             break;
11189         case WRPGPR:
11190             check_cp0_enabled(ctx);
11191             check_insn(env, ctx, ISA_MIPS32R2);
11192             gen_store_srsgpr(rt, rs);
11193             break;
11194         default:
11195             goto pool32axf_invalid;
11196         }
11197         break;
11198 #ifndef CONFIG_USER_ONLY
11199     case 0x0d:
11200         switch (minor) {
11201         case TLBP:
11202             mips32_op = OPC_TLBP;
11203             goto do_cp0;
11204         case TLBR:
11205             mips32_op = OPC_TLBR;
11206             goto do_cp0;
11207         case TLBWI:
11208             mips32_op = OPC_TLBWI;
11209             goto do_cp0;
11210         case TLBWR:
11211             mips32_op = OPC_TLBWR;
11212             goto do_cp0;
11213         case WAIT:
11214             mips32_op = OPC_WAIT;
11215             goto do_cp0;
11216         case DERET:
11217             mips32_op = OPC_DERET;
11218             goto do_cp0;
11219         case ERET:
11220             mips32_op = OPC_ERET;
11221         do_cp0:
11222             gen_cp0(env, ctx, mips32_op, rt, rs);
11223             break;
11224         default:
11225             goto pool32axf_invalid;
11226         }
11227         break;
11228     case 0x1d:
11229         switch (minor) {
11230         case DI:
11231             check_cp0_enabled(ctx);
11232             {
11233                 TCGv t0 = tcg_temp_new();
11234
11235                 save_cpu_state(ctx, 1);
11236                 gen_helper_di(t0, cpu_env);
11237                 gen_store_gpr(t0, rs);
11238                 /* Stop translation as we may have switched the execution mode */
11239                 ctx->bstate = BS_STOP;
11240                 tcg_temp_free(t0);
11241             }
11242             break;
11243         case EI:
11244             check_cp0_enabled(ctx);
11245             {
11246                 TCGv t0 = tcg_temp_new();
11247
11248                 save_cpu_state(ctx, 1);
11249                 gen_helper_ei(t0, cpu_env);
11250                 gen_store_gpr(t0, rs);
11251                 /* Stop translation as we may have switched the execution mode */
11252                 ctx->bstate = BS_STOP;
11253                 tcg_temp_free(t0);
11254             }
11255             break;
11256         default:
11257             goto pool32axf_invalid;
11258         }
11259         break;
11260 #endif
11261     case 0x2d:
11262         switch (minor) {
11263         case SYNC:
11264             /* NOP */
11265             break;
11266         case SYSCALL:
11267             generate_exception(ctx, EXCP_SYSCALL);
11268             ctx->bstate = BS_STOP;
11269             break;
11270         case SDBBP:
11271             check_insn(env, ctx, ISA_MIPS32);
11272             if (!(ctx->hflags & MIPS_HFLAG_DM)) {
11273                 generate_exception(ctx, EXCP_DBp);
11274             } else {
11275                 generate_exception(ctx, EXCP_DBp);
11276             }
11277             break;
11278         default:
11279             goto pool32axf_invalid;
11280         }
11281         break;
11282     case 0x35:
11283         switch (minor) {
11284         case MFHI32:
11285             gen_HILO(ctx, OPC_MFHI, rs);
11286             break;
11287         case MFLO32:
11288             gen_HILO(ctx, OPC_MFLO, rs);
11289             break;
11290         case MTHI32:
11291             gen_HILO(ctx, OPC_MTHI, rs);
11292             break;
11293         case MTLO32:
11294             gen_HILO(ctx, OPC_MTLO, rs);
11295             break;
11296         default:
11297             goto pool32axf_invalid;
11298         }
11299         break;
11300     default:
11301     pool32axf_invalid:
11302         MIPS_INVAL("pool32axf");
11303         generate_exception(ctx, EXCP_RI);
11304         break;
11305     }
11306 }
11307
11308 /* Values for microMIPS fmt field.  Variable-width, depending on which
11309    formats the instruction supports.  */
11310
11311 enum {
11312     FMT_SD_S = 0,
11313     FMT_SD_D = 1,
11314
11315     FMT_SDPS_S = 0,
11316     FMT_SDPS_D = 1,
11317     FMT_SDPS_PS = 2,
11318
11319     FMT_SWL_S = 0,
11320     FMT_SWL_W = 1,
11321     FMT_SWL_L = 2,
11322
11323     FMT_DWL_D = 0,
11324     FMT_DWL_W = 1,
11325     FMT_DWL_L = 2
11326 };
11327
11328 static void gen_pool32fxf (CPUMIPSState *env, DisasContext *ctx, int rt, int rs)
11329 {
11330     int extension = (ctx->opcode >> 6) & 0x3ff;
11331     uint32_t mips32_op;
11332
11333 #define FLOAT_1BIT_FMT(opc, fmt) (fmt << 8) | opc
11334 #define FLOAT_2BIT_FMT(opc, fmt) (fmt << 7) | opc
11335 #define COND_FLOAT_MOV(opc, cond) (cond << 7) | opc
11336
11337     switch (extension) {
11338     case FLOAT_1BIT_FMT(CFC1, 0):
11339         mips32_op = OPC_CFC1;
11340         goto do_cp1;
11341     case FLOAT_1BIT_FMT(CTC1, 0):
11342         mips32_op = OPC_CTC1;
11343         goto do_cp1;
11344     case FLOAT_1BIT_FMT(MFC1, 0):
11345         mips32_op = OPC_MFC1;
11346         goto do_cp1;
11347     case FLOAT_1BIT_FMT(MTC1, 0):
11348         mips32_op = OPC_MTC1;
11349         goto do_cp1;
11350     case FLOAT_1BIT_FMT(MFHC1, 0):
11351         mips32_op = OPC_MFHC1;
11352         goto do_cp1;
11353     case FLOAT_1BIT_FMT(MTHC1, 0):
11354         mips32_op = OPC_MTHC1;
11355     do_cp1:
11356         gen_cp1(ctx, mips32_op, rt, rs);
11357         break;
11358
11359         /* Reciprocal square root */
11360     case FLOAT_1BIT_FMT(RSQRT_FMT, FMT_SD_S):
11361         mips32_op = OPC_RSQRT_S;
11362         goto do_unaryfp;
11363     case FLOAT_1BIT_FMT(RSQRT_FMT, FMT_SD_D):
11364         mips32_op = OPC_RSQRT_D;
11365         goto do_unaryfp;
11366
11367         /* Square root */
11368     case FLOAT_1BIT_FMT(SQRT_FMT, FMT_SD_S):
11369         mips32_op = OPC_SQRT_S;
11370         goto do_unaryfp;
11371     case FLOAT_1BIT_FMT(SQRT_FMT, FMT_SD_D):
11372         mips32_op = OPC_SQRT_D;
11373         goto do_unaryfp;
11374
11375         /* Reciprocal */
11376     case FLOAT_1BIT_FMT(RECIP_FMT, FMT_SD_S):
11377         mips32_op = OPC_RECIP_S;
11378         goto do_unaryfp;
11379     case FLOAT_1BIT_FMT(RECIP_FMT, FMT_SD_D):
11380         mips32_op = OPC_RECIP_D;
11381         goto do_unaryfp;
11382
11383         /* Floor */
11384     case FLOAT_1BIT_FMT(FLOOR_L, FMT_SD_S):
11385         mips32_op = OPC_FLOOR_L_S;
11386         goto do_unaryfp;
11387     case FLOAT_1BIT_FMT(FLOOR_L, FMT_SD_D):
11388         mips32_op = OPC_FLOOR_L_D;
11389         goto do_unaryfp;
11390     case FLOAT_1BIT_FMT(FLOOR_W, FMT_SD_S):
11391         mips32_op = OPC_FLOOR_W_S;
11392         goto do_unaryfp;
11393     case FLOAT_1BIT_FMT(FLOOR_W, FMT_SD_D):
11394         mips32_op = OPC_FLOOR_W_D;
11395         goto do_unaryfp;
11396
11397         /* Ceiling */
11398     case FLOAT_1BIT_FMT(CEIL_L, FMT_SD_S):
11399         mips32_op = OPC_CEIL_L_S;
11400         goto do_unaryfp;
11401     case FLOAT_1BIT_FMT(CEIL_L, FMT_SD_D):
11402         mips32_op = OPC_CEIL_L_D;
11403         goto do_unaryfp;
11404     case FLOAT_1BIT_FMT(CEIL_W, FMT_SD_S):
11405         mips32_op = OPC_CEIL_W_S;
11406         goto do_unaryfp;
11407     case FLOAT_1BIT_FMT(CEIL_W, FMT_SD_D):
11408         mips32_op = OPC_CEIL_W_D;
11409         goto do_unaryfp;
11410
11411         /* Truncation */
11412     case FLOAT_1BIT_FMT(TRUNC_L, FMT_SD_S):
11413         mips32_op = OPC_TRUNC_L_S;
11414         goto do_unaryfp;
11415     case FLOAT_1BIT_FMT(TRUNC_L, FMT_SD_D):
11416         mips32_op = OPC_TRUNC_L_D;
11417         goto do_unaryfp;
11418     case FLOAT_1BIT_FMT(TRUNC_W, FMT_SD_S):
11419         mips32_op = OPC_TRUNC_W_S;
11420         goto do_unaryfp;
11421     case FLOAT_1BIT_FMT(TRUNC_W, FMT_SD_D):
11422         mips32_op = OPC_TRUNC_W_D;
11423         goto do_unaryfp;
11424
11425         /* Round */
11426     case FLOAT_1BIT_FMT(ROUND_L, FMT_SD_S):
11427         mips32_op = OPC_ROUND_L_S;
11428         goto do_unaryfp;
11429     case FLOAT_1BIT_FMT(ROUND_L, FMT_SD_D):
11430         mips32_op = OPC_ROUND_L_D;
11431         goto do_unaryfp;
11432     case FLOAT_1BIT_FMT(ROUND_W, FMT_SD_S):
11433         mips32_op = OPC_ROUND_W_S;
11434         goto do_unaryfp;
11435     case FLOAT_1BIT_FMT(ROUND_W, FMT_SD_D):
11436         mips32_op = OPC_ROUND_W_D;
11437         goto do_unaryfp;
11438
11439         /* Integer to floating-point conversion */
11440     case FLOAT_1BIT_FMT(CVT_L, FMT_SD_S):
11441         mips32_op = OPC_CVT_L_S;
11442         goto do_unaryfp;
11443     case FLOAT_1BIT_FMT(CVT_L, FMT_SD_D):
11444         mips32_op = OPC_CVT_L_D;
11445         goto do_unaryfp;
11446     case FLOAT_1BIT_FMT(CVT_W, FMT_SD_S):
11447         mips32_op = OPC_CVT_W_S;
11448         goto do_unaryfp;
11449     case FLOAT_1BIT_FMT(CVT_W, FMT_SD_D):
11450         mips32_op = OPC_CVT_W_D;
11451         goto do_unaryfp;
11452
11453         /* Paired-foo conversions */
11454     case FLOAT_1BIT_FMT(CVT_S_PL, 0):
11455         mips32_op = OPC_CVT_S_PL;
11456         goto do_unaryfp;
11457     case FLOAT_1BIT_FMT(CVT_S_PU, 0):
11458         mips32_op = OPC_CVT_S_PU;
11459         goto do_unaryfp;
11460     case FLOAT_1BIT_FMT(CVT_PW_PS, 0):
11461         mips32_op = OPC_CVT_PW_PS;
11462         goto do_unaryfp;
11463     case FLOAT_1BIT_FMT(CVT_PS_PW, 0):
11464         mips32_op = OPC_CVT_PS_PW;
11465         goto do_unaryfp;
11466
11467         /* Floating-point moves */
11468     case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_S):
11469         mips32_op = OPC_MOV_S;
11470         goto do_unaryfp;
11471     case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_D):
11472         mips32_op = OPC_MOV_D;
11473         goto do_unaryfp;
11474     case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_PS):
11475         mips32_op = OPC_MOV_PS;
11476         goto do_unaryfp;
11477
11478         /* Absolute value */
11479     case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_S):
11480         mips32_op = OPC_ABS_S;
11481         goto do_unaryfp;
11482     case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_D):
11483         mips32_op = OPC_ABS_D;
11484         goto do_unaryfp;
11485     case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_PS):
11486         mips32_op = OPC_ABS_PS;
11487         goto do_unaryfp;
11488
11489         /* Negation */
11490     case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_S):
11491         mips32_op = OPC_NEG_S;
11492         goto do_unaryfp;
11493     case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_D):
11494         mips32_op = OPC_NEG_D;
11495         goto do_unaryfp;
11496     case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_PS):
11497         mips32_op = OPC_NEG_PS;
11498         goto do_unaryfp;
11499
11500         /* Reciprocal square root step */
11501     case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_S):
11502         mips32_op = OPC_RSQRT1_S;
11503         goto do_unaryfp;
11504     case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_D):
11505         mips32_op = OPC_RSQRT1_D;
11506         goto do_unaryfp;
11507     case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_PS):
11508         mips32_op = OPC_RSQRT1_PS;
11509         goto do_unaryfp;
11510
11511         /* Reciprocal step */
11512     case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_S):
11513         mips32_op = OPC_RECIP1_S;
11514         goto do_unaryfp;
11515     case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_D):
11516         mips32_op = OPC_RECIP1_S;
11517         goto do_unaryfp;
11518     case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_PS):
11519         mips32_op = OPC_RECIP1_PS;
11520         goto do_unaryfp;
11521
11522         /* Conversions from double */
11523     case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_S):
11524         mips32_op = OPC_CVT_D_S;
11525         goto do_unaryfp;
11526     case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_W):
11527         mips32_op = OPC_CVT_D_W;
11528         goto do_unaryfp;
11529     case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_L):
11530         mips32_op = OPC_CVT_D_L;
11531         goto do_unaryfp;
11532
11533         /* Conversions from single */
11534     case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_D):
11535         mips32_op = OPC_CVT_S_D;
11536         goto do_unaryfp;
11537     case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_W):
11538         mips32_op = OPC_CVT_S_W;
11539         goto do_unaryfp;
11540     case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_L):
11541         mips32_op = OPC_CVT_S_L;
11542     do_unaryfp:
11543         gen_farith(ctx, mips32_op, -1, rs, rt, 0);
11544         break;
11545
11546         /* Conditional moves on floating-point codes */
11547     case COND_FLOAT_MOV(MOVT, 0):
11548     case COND_FLOAT_MOV(MOVT, 1):
11549     case COND_FLOAT_MOV(MOVT, 2):
11550     case COND_FLOAT_MOV(MOVT, 3):
11551     case COND_FLOAT_MOV(MOVT, 4):
11552     case COND_FLOAT_MOV(MOVT, 5):
11553     case COND_FLOAT_MOV(MOVT, 6):
11554     case COND_FLOAT_MOV(MOVT, 7):
11555         gen_movci(ctx, rt, rs, (ctx->opcode >> 13) & 0x7, 1);
11556         break;
11557     case COND_FLOAT_MOV(MOVF, 0):
11558     case COND_FLOAT_MOV(MOVF, 1):
11559     case COND_FLOAT_MOV(MOVF, 2):
11560     case COND_FLOAT_MOV(MOVF, 3):
11561     case COND_FLOAT_MOV(MOVF, 4):
11562     case COND_FLOAT_MOV(MOVF, 5):
11563     case COND_FLOAT_MOV(MOVF, 6):
11564     case COND_FLOAT_MOV(MOVF, 7):
11565         gen_movci(ctx, rt, rs, (ctx->opcode >> 13) & 0x7, 0);
11566         break;
11567     default:
11568         MIPS_INVAL("pool32fxf");
11569         generate_exception(ctx, EXCP_RI);
11570         break;
11571     }
11572 }
11573
11574 static void decode_micromips32_opc (CPUMIPSState *env, DisasContext *ctx,
11575                                     uint16_t insn_hw1, int *is_branch)
11576 {
11577     int32_t offset;
11578     uint16_t insn;
11579     int rt, rs, rd, rr;
11580     int16_t imm;
11581     uint32_t op, minor, mips32_op;
11582     uint32_t cond, fmt, cc;
11583
11584     insn = cpu_lduw_code(env, ctx->pc + 2);
11585     ctx->opcode = (ctx->opcode << 16) | insn;
11586
11587     rt = (ctx->opcode >> 21) & 0x1f;
11588     rs = (ctx->opcode >> 16) & 0x1f;
11589     rd = (ctx->opcode >> 11) & 0x1f;
11590     rr = (ctx->opcode >> 6) & 0x1f;
11591     imm = (int16_t) ctx->opcode;
11592
11593     op = (ctx->opcode >> 26) & 0x3f;
11594     switch (op) {
11595     case POOL32A:
11596         minor = ctx->opcode & 0x3f;
11597         switch (minor) {
11598         case 0x00:
11599             minor = (ctx->opcode >> 6) & 0xf;
11600             switch (minor) {
11601             case SLL32:
11602                 mips32_op = OPC_SLL;
11603                 goto do_shifti;
11604             case SRA:
11605                 mips32_op = OPC_SRA;
11606                 goto do_shifti;
11607             case SRL32:
11608                 mips32_op = OPC_SRL;
11609                 goto do_shifti;
11610             case ROTR:
11611                 mips32_op = OPC_ROTR;
11612             do_shifti:
11613                 gen_shift_imm(env, ctx, mips32_op, rt, rs, rd);
11614                 break;
11615             default:
11616                 goto pool32a_invalid;
11617             }
11618             break;
11619         case 0x10:
11620             minor = (ctx->opcode >> 6) & 0xf;
11621             switch (minor) {
11622                 /* Arithmetic */
11623             case ADD:
11624                 mips32_op = OPC_ADD;
11625                 goto do_arith;
11626             case ADDU32:
11627                 mips32_op = OPC_ADDU;
11628                 goto do_arith;
11629             case SUB:
11630                 mips32_op = OPC_SUB;
11631                 goto do_arith;
11632             case SUBU32:
11633                 mips32_op = OPC_SUBU;
11634                 goto do_arith;
11635             case MUL:
11636                 mips32_op = OPC_MUL;
11637             do_arith:
11638                 gen_arith(env, ctx, mips32_op, rd, rs, rt);
11639                 break;
11640                 /* Shifts */
11641             case SLLV:
11642                 mips32_op = OPC_SLLV;
11643                 goto do_shift;
11644             case SRLV:
11645                 mips32_op = OPC_SRLV;
11646                 goto do_shift;
11647             case SRAV:
11648                 mips32_op = OPC_SRAV;
11649                 goto do_shift;
11650             case ROTRV:
11651                 mips32_op = OPC_ROTRV;
11652             do_shift:
11653                 gen_shift(env, ctx, mips32_op, rd, rs, rt);
11654                 break;
11655                 /* Logical operations */
11656             case AND:
11657                 mips32_op = OPC_AND;
11658                 goto do_logic;
11659             case OR32:
11660                 mips32_op = OPC_OR;
11661                 goto do_logic;
11662             case NOR:
11663                 mips32_op = OPC_NOR;
11664                 goto do_logic;
11665             case XOR32:
11666                 mips32_op = OPC_XOR;
11667             do_logic:
11668                 gen_logic(env, ctx, mips32_op, rd, rs, rt);
11669                 break;
11670                 /* Set less than */
11671             case SLT:
11672                 mips32_op = OPC_SLT;
11673                 goto do_slt;
11674             case SLTU:
11675                 mips32_op = OPC_SLTU;
11676             do_slt:
11677                 gen_slt(env, ctx, mips32_op, rd, rs, rt);
11678                 break;
11679             default:
11680                 goto pool32a_invalid;
11681             }
11682             break;
11683         case 0x18:
11684             minor = (ctx->opcode >> 6) & 0xf;
11685             switch (minor) {
11686                 /* Conditional moves */
11687             case MOVN:
11688                 mips32_op = OPC_MOVN;
11689                 goto do_cmov;
11690             case MOVZ:
11691                 mips32_op = OPC_MOVZ;
11692             do_cmov:
11693                 gen_cond_move(env, ctx, mips32_op, rd, rs, rt);
11694                 break;
11695             case LWXS:
11696                 gen_ldxs(ctx, rs, rt, rd);
11697                 break;
11698             default:
11699                 goto pool32a_invalid;
11700             }
11701             break;
11702         case INS:
11703             gen_bitops(ctx, OPC_INS, rt, rs, rr, rd);
11704             return;
11705         case EXT:
11706             gen_bitops(ctx, OPC_EXT, rt, rs, rr, rd);
11707             return;
11708         case POOL32AXF:
11709             gen_pool32axf(env, ctx, rt, rs, is_branch);
11710             break;
11711         case 0x07:
11712             generate_exception(ctx, EXCP_BREAK);
11713             break;
11714         default:
11715         pool32a_invalid:
11716                 MIPS_INVAL("pool32a");
11717                 generate_exception(ctx, EXCP_RI);
11718                 break;
11719         }
11720         break;
11721     case POOL32B:
11722         minor = (ctx->opcode >> 12) & 0xf;
11723         switch (minor) {
11724         case CACHE:
11725             check_cp0_enabled(ctx);
11726             /* Treat as no-op. */
11727             break;
11728         case LWC2:
11729         case SWC2:
11730             /* COP2: Not implemented. */
11731             generate_exception_err(ctx, EXCP_CpU, 2);
11732             break;
11733         case LWP:
11734         case SWP:
11735 #ifdef TARGET_MIPS64
11736         case LDP:
11737         case SDP:
11738 #endif
11739             gen_ldst_pair(ctx, minor, rt, rs, SIMM(ctx->opcode, 0, 12));
11740             break;
11741         case LWM32:
11742         case SWM32:
11743 #ifdef TARGET_MIPS64
11744         case LDM:
11745         case SDM:
11746 #endif
11747             gen_ldst_multiple(ctx, minor, rt, rs, SIMM(ctx->opcode, 0, 12));
11748             break;
11749         default:
11750             MIPS_INVAL("pool32b");
11751             generate_exception(ctx, EXCP_RI);
11752             break;
11753         }
11754         break;
11755     case POOL32F:
11756         if (env->CP0_Config1 & (1 << CP0C1_FP)) {
11757             minor = ctx->opcode & 0x3f;
11758             check_cp1_enabled(ctx);
11759             switch (minor) {
11760             case ALNV_PS:
11761                 mips32_op = OPC_ALNV_PS;
11762                 goto do_madd;
11763             case MADD_S:
11764                 mips32_op = OPC_MADD_S;
11765                 goto do_madd;
11766             case MADD_D:
11767                 mips32_op = OPC_MADD_D;
11768                 goto do_madd;
11769             case MADD_PS:
11770                 mips32_op = OPC_MADD_PS;
11771                 goto do_madd;
11772             case MSUB_S:
11773                 mips32_op = OPC_MSUB_S;
11774                 goto do_madd;
11775             case MSUB_D:
11776                 mips32_op = OPC_MSUB_D;
11777                 goto do_madd;
11778             case MSUB_PS:
11779                 mips32_op = OPC_MSUB_PS;
11780                 goto do_madd;
11781             case NMADD_S:
11782                 mips32_op = OPC_NMADD_S;
11783                 goto do_madd;
11784             case NMADD_D:
11785                 mips32_op = OPC_NMADD_D;
11786                 goto do_madd;
11787             case NMADD_PS:
11788                 mips32_op = OPC_NMADD_PS;
11789                 goto do_madd;
11790             case NMSUB_S:
11791                 mips32_op = OPC_NMSUB_S;
11792                 goto do_madd;
11793             case NMSUB_D:
11794                 mips32_op = OPC_NMSUB_D;
11795                 goto do_madd;
11796             case NMSUB_PS:
11797                 mips32_op = OPC_NMSUB_PS;
11798             do_madd:
11799                 gen_flt3_arith(ctx, mips32_op, rd, rr, rs, rt);
11800                 break;
11801             case CABS_COND_FMT:
11802                 cond = (ctx->opcode >> 6) & 0xf;
11803                 cc = (ctx->opcode >> 13) & 0x7;
11804                 fmt = (ctx->opcode >> 10) & 0x3;
11805                 switch (fmt) {
11806                 case 0x0:
11807                     gen_cmpabs_s(ctx, cond, rt, rs, cc);
11808                     break;
11809                 case 0x1:
11810                     gen_cmpabs_d(ctx, cond, rt, rs, cc);
11811                     break;
11812                 case 0x2:
11813                     gen_cmpabs_ps(ctx, cond, rt, rs, cc);
11814                     break;
11815                 default:
11816                     goto pool32f_invalid;
11817                 }
11818                 break;
11819             case C_COND_FMT:
11820                 cond = (ctx->opcode >> 6) & 0xf;
11821                 cc = (ctx->opcode >> 13) & 0x7;
11822                 fmt = (ctx->opcode >> 10) & 0x3;
11823                 switch (fmt) {
11824                 case 0x0:
11825                     gen_cmp_s(ctx, cond, rt, rs, cc);
11826                     break;
11827                 case 0x1:
11828                     gen_cmp_d(ctx, cond, rt, rs, cc);
11829                     break;
11830                 case 0x2:
11831                     gen_cmp_ps(ctx, cond, rt, rs, cc);
11832                     break;
11833                 default:
11834                     goto pool32f_invalid;
11835                 }
11836                 break;
11837             case POOL32FXF:
11838                 gen_pool32fxf(env, ctx, rt, rs);
11839                 break;
11840             case 0x00:
11841                 /* PLL foo */
11842                 switch ((ctx->opcode >> 6) & 0x7) {
11843                 case PLL_PS:
11844                     mips32_op = OPC_PLL_PS;
11845                     goto do_ps;
11846                 case PLU_PS:
11847                     mips32_op = OPC_PLU_PS;
11848                     goto do_ps;
11849                 case PUL_PS:
11850                     mips32_op = OPC_PUL_PS;
11851                     goto do_ps;
11852                 case PUU_PS:
11853                     mips32_op = OPC_PUU_PS;
11854                     goto do_ps;
11855                 case CVT_PS_S:
11856                     mips32_op = OPC_CVT_PS_S;
11857                 do_ps:
11858                     gen_farith(ctx, mips32_op, rt, rs, rd, 0);
11859                     break;
11860                 default:
11861                     goto pool32f_invalid;
11862                 }
11863                 break;
11864             case 0x08:
11865                 /* [LS][WDU]XC1 */
11866                 switch ((ctx->opcode >> 6) & 0x7) {
11867                 case LWXC1:
11868                     mips32_op = OPC_LWXC1;
11869                     goto do_ldst_cp1;
11870                 case SWXC1:
11871                     mips32_op = OPC_SWXC1;
11872                     goto do_ldst_cp1;
11873                 case LDXC1:
11874                     mips32_op = OPC_LDXC1;
11875                     goto do_ldst_cp1;
11876                 case SDXC1:
11877                     mips32_op = OPC_SDXC1;
11878                     goto do_ldst_cp1;
11879                 case LUXC1:
11880                     mips32_op = OPC_LUXC1;
11881                     goto do_ldst_cp1;
11882                 case SUXC1:
11883                     mips32_op = OPC_SUXC1;
11884                 do_ldst_cp1:
11885                     gen_flt3_ldst(ctx, mips32_op, rd, rd, rt, rs);
11886                     break;
11887                 default:
11888                     goto pool32f_invalid;
11889                 }
11890                 break;
11891             case 0x18:
11892                 /* 3D insns */
11893                 fmt = (ctx->opcode >> 9) & 0x3;
11894                 switch ((ctx->opcode >> 6) & 0x7) {
11895                 case RSQRT2_FMT:
11896                     switch (fmt) {
11897                     case FMT_SDPS_S:
11898                         mips32_op = OPC_RSQRT2_S;
11899                         goto do_3d;
11900                     case FMT_SDPS_D:
11901                         mips32_op = OPC_RSQRT2_D;
11902                         goto do_3d;
11903                     case FMT_SDPS_PS:
11904                         mips32_op = OPC_RSQRT2_PS;
11905                         goto do_3d;
11906                     default:
11907                         goto pool32f_invalid;
11908                     }
11909                     break;
11910                 case RECIP2_FMT:
11911                     switch (fmt) {
11912                     case FMT_SDPS_S:
11913                         mips32_op = OPC_RECIP2_S;
11914                         goto do_3d;
11915                     case FMT_SDPS_D:
11916                         mips32_op = OPC_RECIP2_D;
11917                         goto do_3d;
11918                     case FMT_SDPS_PS:
11919                         mips32_op = OPC_RECIP2_PS;
11920                         goto do_3d;
11921                     default:
11922                         goto pool32f_invalid;
11923                     }
11924                     break;
11925                 case ADDR_PS:
11926                     mips32_op = OPC_ADDR_PS;
11927                     goto do_3d;
11928                 case MULR_PS:
11929                     mips32_op = OPC_MULR_PS;
11930                 do_3d:
11931                     gen_farith(ctx, mips32_op, rt, rs, rd, 0);
11932                     break;
11933                 default:
11934                     goto pool32f_invalid;
11935                 }
11936                 break;
11937             case 0x20:
11938                 /* MOV[FT].fmt and PREFX */
11939                 cc = (ctx->opcode >> 13) & 0x7;
11940                 fmt = (ctx->opcode >> 9) & 0x3;
11941                 switch ((ctx->opcode >> 6) & 0x7) {
11942                 case MOVF_FMT:
11943                     switch (fmt) {
11944                     case FMT_SDPS_S:
11945                         gen_movcf_s(rs, rt, cc, 0);
11946                         break;
11947                     case FMT_SDPS_D:
11948                         gen_movcf_d(ctx, rs, rt, cc, 0);
11949                         break;
11950                     case FMT_SDPS_PS:
11951                         gen_movcf_ps(rs, rt, cc, 0);
11952                         break;
11953                     default:
11954                         goto pool32f_invalid;
11955                     }
11956                     break;
11957                 case MOVT_FMT:
11958                     switch (fmt) {
11959                     case FMT_SDPS_S:
11960                         gen_movcf_s(rs, rt, cc, 1);
11961                         break;
11962                     case FMT_SDPS_D:
11963                         gen_movcf_d(ctx, rs, rt, cc, 1);
11964                         break;
11965                     case FMT_SDPS_PS:
11966                         gen_movcf_ps(rs, rt, cc, 1);
11967                         break;
11968                     default:
11969                         goto pool32f_invalid;
11970                     }
11971                     break;
11972                 case PREFX:
11973                     break;
11974                 default:
11975                     goto pool32f_invalid;
11976                 }
11977                 break;
11978 #define FINSN_3ARG_SDPS(prfx)                           \
11979                 switch ((ctx->opcode >> 8) & 0x3) {     \
11980                 case FMT_SDPS_S:                        \
11981                     mips32_op = OPC_##prfx##_S;         \
11982                     goto do_fpop;                       \
11983                 case FMT_SDPS_D:                        \
11984                     mips32_op = OPC_##prfx##_D;         \
11985                     goto do_fpop;                       \
11986                 case FMT_SDPS_PS:                       \
11987                     mips32_op = OPC_##prfx##_PS;        \
11988                     goto do_fpop;                       \
11989                 default:                                \
11990                     goto pool32f_invalid;               \
11991                 }
11992             case 0x30:
11993                 /* regular FP ops */
11994                 switch ((ctx->opcode >> 6) & 0x3) {
11995                 case ADD_FMT:
11996                     FINSN_3ARG_SDPS(ADD);
11997                     break;
11998                 case SUB_FMT:
11999                     FINSN_3ARG_SDPS(SUB);
12000                     break;
12001                 case MUL_FMT:
12002                     FINSN_3ARG_SDPS(MUL);
12003                     break;
12004                 case DIV_FMT:
12005                     fmt = (ctx->opcode >> 8) & 0x3;
12006                     if (fmt == 1) {
12007                         mips32_op = OPC_DIV_D;
12008                     } else if (fmt == 0) {
12009                         mips32_op = OPC_DIV_S;
12010                     } else {
12011                         goto pool32f_invalid;
12012                     }
12013                     goto do_fpop;
12014                 default:
12015                     goto pool32f_invalid;
12016                 }
12017                 break;
12018             case 0x38:
12019                 /* cmovs */
12020                 switch ((ctx->opcode >> 6) & 0x3) {
12021                 case MOVN_FMT:
12022                     FINSN_3ARG_SDPS(MOVN);
12023                     break;
12024                 case MOVZ_FMT:
12025                     FINSN_3ARG_SDPS(MOVZ);
12026                     break;
12027                 default:
12028                     goto pool32f_invalid;
12029                 }
12030                 break;
12031             do_fpop:
12032                 gen_farith(ctx, mips32_op, rt, rs, rd, 0);
12033                 break;
12034             default:
12035             pool32f_invalid:
12036                 MIPS_INVAL("pool32f");
12037                 generate_exception(ctx, EXCP_RI);
12038                 break;
12039             }
12040         } else {
12041             generate_exception_err(ctx, EXCP_CpU, 1);
12042         }
12043         break;
12044     case POOL32I:
12045         minor = (ctx->opcode >> 21) & 0x1f;
12046         switch (minor) {
12047         case BLTZ:
12048             mips32_op = OPC_BLTZ;
12049             goto do_branch;
12050         case BLTZAL:
12051             mips32_op = OPC_BLTZAL;
12052             goto do_branch;
12053         case BLTZALS:
12054             mips32_op = OPC_BLTZALS;
12055             goto do_branch;
12056         case BGEZ:
12057             mips32_op = OPC_BGEZ;
12058             goto do_branch;
12059         case BGEZAL:
12060             mips32_op = OPC_BGEZAL;
12061             goto do_branch;
12062         case BGEZALS:
12063             mips32_op = OPC_BGEZALS;
12064             goto do_branch;
12065         case BLEZ:
12066             mips32_op = OPC_BLEZ;
12067             goto do_branch;
12068         case BGTZ:
12069             mips32_op = OPC_BGTZ;
12070         do_branch:
12071             gen_compute_branch(ctx, mips32_op, 4, rs, -1, imm << 1);
12072             *is_branch = 1;
12073             break;
12074
12075             /* Traps */
12076         case TLTI:
12077             mips32_op = OPC_TLTI;
12078             goto do_trapi;
12079         case TGEI:
12080             mips32_op = OPC_TGEI;
12081             goto do_trapi;
12082         case TLTIU:
12083             mips32_op = OPC_TLTIU;
12084             goto do_trapi;
12085         case TGEIU:
12086             mips32_op = OPC_TGEIU;
12087             goto do_trapi;
12088         case TNEI:
12089             mips32_op = OPC_TNEI;
12090             goto do_trapi;
12091         case TEQI:
12092             mips32_op = OPC_TEQI;
12093         do_trapi:
12094             gen_trap(ctx, mips32_op, rs, -1, imm);
12095             break;
12096
12097         case BNEZC:
12098         case BEQZC:
12099             gen_compute_branch(ctx, minor == BNEZC ? OPC_BNE : OPC_BEQ,
12100                                4, rs, 0, imm << 1);
12101             /* Compact branches don't have a delay slot, so just let
12102                the normal delay slot handling take us to the branch
12103                target. */
12104             break;
12105         case LUI:
12106             gen_logic_imm(env, ctx, OPC_LUI, rs, -1, imm);
12107             break;
12108         case SYNCI:
12109             break;
12110         case BC2F:
12111         case BC2T:
12112             /* COP2: Not implemented. */
12113             generate_exception_err(ctx, EXCP_CpU, 2);
12114             break;
12115         case BC1F:
12116             mips32_op = (ctx->opcode & (1 << 16)) ? OPC_BC1FANY2 : OPC_BC1F;
12117             goto do_cp1branch;
12118         case BC1T:
12119             mips32_op = (ctx->opcode & (1 << 16)) ? OPC_BC1TANY2 : OPC_BC1T;
12120             goto do_cp1branch;
12121         case BC1ANY4F:
12122             mips32_op = OPC_BC1FANY4;
12123             goto do_cp1mips3d;
12124         case BC1ANY4T:
12125             mips32_op = OPC_BC1TANY4;
12126         do_cp1mips3d:
12127             check_cop1x(ctx);
12128             check_insn(env, ctx, ASE_MIPS3D);
12129             /* Fall through */
12130         do_cp1branch:
12131             gen_compute_branch1(env, ctx, mips32_op,
12132                                 (ctx->opcode >> 18) & 0x7, imm << 1);
12133             *is_branch = 1;
12134             break;
12135         case BPOSGE64:
12136         case BPOSGE32:
12137             /* MIPS DSP: not implemented */
12138             /* Fall through */
12139         default:
12140             MIPS_INVAL("pool32i");
12141             generate_exception(ctx, EXCP_RI);
12142             break;
12143         }
12144         break;
12145     case POOL32C:
12146         minor = (ctx->opcode >> 12) & 0xf;
12147         switch (minor) {
12148         case LWL:
12149             mips32_op = OPC_LWL;
12150             goto do_ld_lr;
12151         case SWL:
12152             mips32_op = OPC_SWL;
12153             goto do_st_lr;
12154         case LWR:
12155             mips32_op = OPC_LWR;
12156             goto do_ld_lr;
12157         case SWR:
12158             mips32_op = OPC_SWR;
12159             goto do_st_lr;
12160 #if defined(TARGET_MIPS64)
12161         case LDL:
12162             mips32_op = OPC_LDL;
12163             goto do_ld_lr;
12164         case SDL:
12165             mips32_op = OPC_SDL;
12166             goto do_st_lr;
12167         case LDR:
12168             mips32_op = OPC_LDR;
12169             goto do_ld_lr;
12170         case SDR:
12171             mips32_op = OPC_SDR;
12172             goto do_st_lr;
12173         case LWU:
12174             mips32_op = OPC_LWU;
12175             goto do_ld_lr;
12176         case LLD:
12177             mips32_op = OPC_LLD;
12178             goto do_ld_lr;
12179 #endif
12180         case LL:
12181             mips32_op = OPC_LL;
12182             goto do_ld_lr;
12183         do_ld_lr:
12184             gen_ld(env, ctx, mips32_op, rt, rs, SIMM(ctx->opcode, 0, 12));
12185             break;
12186         do_st_lr:
12187             gen_st(ctx, mips32_op, rt, rs, SIMM(ctx->opcode, 0, 12));
12188             break;
12189         case SC:
12190             gen_st_cond(ctx, OPC_SC, rt, rs, SIMM(ctx->opcode, 0, 12));
12191             break;
12192 #if defined(TARGET_MIPS64)
12193         case SCD:
12194             gen_st_cond(ctx, OPC_SCD, rt, rs, SIMM(ctx->opcode, 0, 12));
12195             break;
12196 #endif
12197         case PREF:
12198             /* Treat as no-op */
12199             break;
12200         default:
12201             MIPS_INVAL("pool32c");
12202             generate_exception(ctx, EXCP_RI);
12203             break;
12204         }
12205         break;
12206     case ADDI32:
12207         mips32_op = OPC_ADDI;
12208         goto do_addi;
12209     case ADDIU32:
12210         mips32_op = OPC_ADDIU;
12211     do_addi:
12212         gen_arith_imm(env, ctx, mips32_op, rt, rs, imm);
12213         break;
12214
12215         /* Logical operations */
12216     case ORI32:
12217         mips32_op = OPC_ORI;
12218         goto do_logici;
12219     case XORI32:
12220         mips32_op = OPC_XORI;
12221         goto do_logici;
12222     case ANDI32:
12223         mips32_op = OPC_ANDI;
12224     do_logici:
12225         gen_logic_imm(env, ctx, mips32_op, rt, rs, imm);
12226         break;
12227
12228         /* Set less than immediate */
12229     case SLTI32:
12230         mips32_op = OPC_SLTI;
12231         goto do_slti;
12232     case SLTIU32:
12233         mips32_op = OPC_SLTIU;
12234     do_slti:
12235         gen_slt_imm(env, ctx, mips32_op, rt, rs, imm);
12236         break;
12237     case JALX32:
12238         offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
12239         gen_compute_branch(ctx, OPC_JALX, 4, rt, rs, offset);
12240         *is_branch = 1;
12241         break;
12242     case JALS32:
12243         offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 1;
12244         gen_compute_branch(ctx, OPC_JALS, 4, rt, rs, offset);
12245         *is_branch = 1;
12246         break;
12247     case BEQ32:
12248         gen_compute_branch(ctx, OPC_BEQ, 4, rt, rs, imm << 1);
12249         *is_branch = 1;
12250         break;
12251     case BNE32:
12252         gen_compute_branch(ctx, OPC_BNE, 4, rt, rs, imm << 1);
12253         *is_branch = 1;
12254         break;
12255     case J32:
12256         gen_compute_branch(ctx, OPC_J, 4, rt, rs,
12257                            (int32_t)(ctx->opcode & 0x3FFFFFF) << 1);
12258         *is_branch = 1;
12259         break;
12260     case JAL32:
12261         gen_compute_branch(ctx, OPC_JAL, 4, rt, rs,
12262                            (int32_t)(ctx->opcode & 0x3FFFFFF) << 1);
12263         *is_branch = 1;
12264         break;
12265         /* Floating point (COP1) */
12266     case LWC132:
12267         mips32_op = OPC_LWC1;
12268         goto do_cop1;
12269     case LDC132:
12270         mips32_op = OPC_LDC1;
12271         goto do_cop1;
12272     case SWC132:
12273         mips32_op = OPC_SWC1;
12274         goto do_cop1;
12275     case SDC132:
12276         mips32_op = OPC_SDC1;
12277     do_cop1:
12278         gen_cop1_ldst(env, ctx, mips32_op, rt, rs, imm);
12279         break;
12280     case ADDIUPC:
12281         {
12282             int reg = mmreg(ZIMM(ctx->opcode, 23, 3));
12283             int offset = SIMM(ctx->opcode, 0, 23) << 2;
12284
12285             gen_addiupc(ctx, reg, offset, 0, 0);
12286         }
12287         break;
12288         /* Loads and stores */
12289     case LB32:
12290         mips32_op = OPC_LB;
12291         goto do_ld;
12292     case LBU32:
12293         mips32_op = OPC_LBU;
12294         goto do_ld;
12295     case LH32:
12296         mips32_op = OPC_LH;
12297         goto do_ld;
12298     case LHU32:
12299         mips32_op = OPC_LHU;
12300         goto do_ld;
12301     case LW32:
12302         mips32_op = OPC_LW;
12303         goto do_ld;
12304 #ifdef TARGET_MIPS64
12305     case LD32:
12306         mips32_op = OPC_LD;
12307         goto do_ld;
12308     case SD32:
12309         mips32_op = OPC_SD;
12310         goto do_st;
12311 #endif
12312     case SB32:
12313         mips32_op = OPC_SB;
12314         goto do_st;
12315     case SH32:
12316         mips32_op = OPC_SH;
12317         goto do_st;
12318     case SW32:
12319         mips32_op = OPC_SW;
12320         goto do_st;
12321     do_ld:
12322         gen_ld(env, ctx, mips32_op, rt, rs, imm);
12323         break;
12324     do_st:
12325         gen_st(ctx, mips32_op, rt, rs, imm);
12326         break;
12327     default:
12328         generate_exception(ctx, EXCP_RI);
12329         break;
12330     }
12331 }
12332
12333 static int decode_micromips_opc (CPUMIPSState *env, DisasContext *ctx, int *is_branch)
12334 {
12335     uint32_t op;
12336
12337     /* make sure instructions are on a halfword boundary */
12338     if (ctx->pc & 0x1) {
12339         env->CP0_BadVAddr = ctx->pc;
12340         generate_exception(ctx, EXCP_AdEL);
12341         ctx->bstate = BS_STOP;
12342         return 2;
12343     }
12344
12345     op = (ctx->opcode >> 10) & 0x3f;
12346     /* Enforce properly-sized instructions in a delay slot */
12347     if (ctx->hflags & MIPS_HFLAG_BMASK) {
12348         int bits = ctx->hflags & MIPS_HFLAG_BMASK_EXT;
12349
12350         switch (op) {
12351         case POOL32A:
12352         case POOL32B:
12353         case POOL32I:
12354         case POOL32C:
12355         case ADDI32:
12356         case ADDIU32:
12357         case ORI32:
12358         case XORI32:
12359         case SLTI32:
12360         case SLTIU32:
12361         case ANDI32:
12362         case JALX32:
12363         case LBU32:
12364         case LHU32:
12365         case POOL32F:
12366         case JALS32:
12367         case BEQ32:
12368         case BNE32:
12369         case J32:
12370         case JAL32:
12371         case SB32:
12372         case SH32:
12373         case POOL32S:
12374         case ADDIUPC:
12375         case SWC132:
12376         case SDC132:
12377         case SD32:
12378         case SW32:
12379         case LB32:
12380         case LH32:
12381         case DADDIU32:
12382         case POOL48A:           /* ??? */
12383         case LWC132:
12384         case LDC132:
12385         case LD32:
12386         case LW32:
12387             if (bits & MIPS_HFLAG_BDS16) {
12388                 generate_exception(ctx, EXCP_RI);
12389                 /* Just stop translation; the user is confused.  */
12390                 ctx->bstate = BS_STOP;
12391                 return 2;
12392             }
12393             break;
12394         case POOL16A:
12395         case POOL16B:
12396         case POOL16C:
12397         case LWGP16:
12398         case POOL16F:
12399         case LBU16:
12400         case LHU16:
12401         case LWSP16:
12402         case LW16:
12403         case SB16:
12404         case SH16:
12405         case SWSP16:
12406         case SW16:
12407         case MOVE16:
12408         case ANDI16:
12409         case POOL16D:
12410         case POOL16E:
12411         case BEQZ16:
12412         case BNEZ16:
12413         case B16:
12414         case LI16:
12415             if (bits & MIPS_HFLAG_BDS32) {
12416                 generate_exception(ctx, EXCP_RI);
12417                 /* Just stop translation; the user is confused.  */
12418                 ctx->bstate = BS_STOP;
12419                 return 2;
12420             }
12421             break;
12422         default:
12423             break;
12424         }
12425     }
12426     switch (op) {
12427     case POOL16A:
12428         {
12429             int rd = mmreg(uMIPS_RD(ctx->opcode));
12430             int rs1 = mmreg(uMIPS_RS1(ctx->opcode));
12431             int rs2 = mmreg(uMIPS_RS2(ctx->opcode));
12432             uint32_t opc = 0;
12433
12434             switch (ctx->opcode & 0x1) {
12435             case ADDU16:
12436                 opc = OPC_ADDU;
12437                 break;
12438             case SUBU16:
12439                 opc = OPC_SUBU;
12440                 break;
12441             }
12442
12443             gen_arith(env, ctx, opc, rd, rs1, rs2);
12444         }
12445         break;
12446     case POOL16B:
12447         {
12448             int rd = mmreg(uMIPS_RD(ctx->opcode));
12449             int rs = mmreg(uMIPS_RS(ctx->opcode));
12450             int amount = (ctx->opcode >> 1) & 0x7;
12451             uint32_t opc = 0;
12452             amount = amount == 0 ? 8 : amount;
12453
12454             switch (ctx->opcode & 0x1) {
12455             case SLL16:
12456                 opc = OPC_SLL;
12457                 break;
12458             case SRL16:
12459                 opc = OPC_SRL;
12460                 break;
12461             }
12462
12463             gen_shift_imm(env, ctx, opc, rd, rs, amount);
12464         }
12465         break;
12466     case POOL16C:
12467         gen_pool16c_insn(env, ctx, is_branch);
12468         break;
12469     case LWGP16:
12470         {
12471             int rd = mmreg(uMIPS_RD(ctx->opcode));
12472             int rb = 28;            /* GP */
12473             int16_t offset = SIMM(ctx->opcode, 0, 7) << 2;
12474
12475             gen_ld(env, ctx, OPC_LW, rd, rb, offset);
12476         }
12477         break;
12478     case POOL16F:
12479         if (ctx->opcode & 1) {
12480             generate_exception(ctx, EXCP_RI);
12481         } else {
12482             /* MOVEP */
12483             int enc_dest = uMIPS_RD(ctx->opcode);
12484             int enc_rt = uMIPS_RS2(ctx->opcode);
12485             int enc_rs = uMIPS_RS1(ctx->opcode);
12486             int rd, rs, re, rt;
12487             static const int rd_enc[] = { 5, 5, 6, 4, 4, 4, 4, 4 };
12488             static const int re_enc[] = { 6, 7, 7, 21, 22, 5, 6, 7 };
12489             static const int rs_rt_enc[] = { 0, 17, 2, 3, 16, 18, 19, 20 };
12490
12491             rd = rd_enc[enc_dest];
12492             re = re_enc[enc_dest];
12493             rs = rs_rt_enc[enc_rs];
12494             rt = rs_rt_enc[enc_rt];
12495
12496             gen_arith_imm(env, ctx, OPC_ADDIU, rd, rs, 0);
12497             gen_arith_imm(env, ctx, OPC_ADDIU, re, rt, 0);
12498         }
12499         break;
12500     case LBU16:
12501         {
12502             int rd = mmreg(uMIPS_RD(ctx->opcode));
12503             int rb = mmreg(uMIPS_RS(ctx->opcode));
12504             int16_t offset = ZIMM(ctx->opcode, 0, 4);
12505             offset = (offset == 0xf ? -1 : offset);
12506
12507             gen_ld(env, ctx, OPC_LBU, rd, rb, offset);
12508         }
12509         break;
12510     case LHU16:
12511         {
12512             int rd = mmreg(uMIPS_RD(ctx->opcode));
12513             int rb = mmreg(uMIPS_RS(ctx->opcode));
12514             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 1;
12515
12516             gen_ld(env, ctx, OPC_LHU, rd, rb, offset);
12517         }
12518         break;
12519     case LWSP16:
12520         {
12521             int rd = (ctx->opcode >> 5) & 0x1f;
12522             int rb = 29;            /* SP */
12523             int16_t offset = ZIMM(ctx->opcode, 0, 5) << 2;
12524
12525             gen_ld(env, ctx, OPC_LW, rd, rb, offset);
12526         }
12527         break;
12528     case LW16:
12529         {
12530             int rd = mmreg(uMIPS_RD(ctx->opcode));
12531             int rb = mmreg(uMIPS_RS(ctx->opcode));
12532             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 2;
12533
12534             gen_ld(env, ctx, OPC_LW, rd, rb, offset);
12535         }
12536         break;
12537     case SB16:
12538         {
12539             int rd = mmreg2(uMIPS_RD(ctx->opcode));
12540             int rb = mmreg(uMIPS_RS(ctx->opcode));
12541             int16_t offset = ZIMM(ctx->opcode, 0, 4);
12542
12543             gen_st(ctx, OPC_SB, rd, rb, offset);
12544         }
12545         break;
12546     case SH16:
12547         {
12548             int rd = mmreg2(uMIPS_RD(ctx->opcode));
12549             int rb = mmreg(uMIPS_RS(ctx->opcode));
12550             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 1;
12551
12552             gen_st(ctx, OPC_SH, rd, rb, offset);
12553         }
12554         break;
12555     case SWSP16:
12556         {
12557             int rd = (ctx->opcode >> 5) & 0x1f;
12558             int rb = 29;            /* SP */
12559             int16_t offset = ZIMM(ctx->opcode, 0, 5) << 2;
12560
12561             gen_st(ctx, OPC_SW, rd, rb, offset);
12562         }
12563         break;
12564     case SW16:
12565         {
12566             int rd = mmreg2(uMIPS_RD(ctx->opcode));
12567             int rb = mmreg(uMIPS_RS(ctx->opcode));
12568             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 2;
12569
12570             gen_st(ctx, OPC_SW, rd, rb, offset);
12571         }
12572         break;
12573     case MOVE16:
12574         {
12575             int rd = uMIPS_RD5(ctx->opcode);
12576             int rs = uMIPS_RS5(ctx->opcode);
12577
12578             gen_arith_imm(env, ctx, OPC_ADDIU, rd, rs, 0);
12579         }
12580         break;
12581     case ANDI16:
12582         gen_andi16(env, ctx);
12583         break;
12584     case POOL16D:
12585         switch (ctx->opcode & 0x1) {
12586         case ADDIUS5:
12587             gen_addius5(env, ctx);
12588             break;
12589         case ADDIUSP:
12590             gen_addiusp(env, ctx);
12591             break;
12592         }
12593         break;
12594     case POOL16E:
12595         switch (ctx->opcode & 0x1) {
12596         case ADDIUR2:
12597             gen_addiur2(env, ctx);
12598             break;
12599         case ADDIUR1SP:
12600             gen_addiur1sp(env, ctx);
12601             break;
12602         }
12603         break;
12604     case B16:
12605         gen_compute_branch(ctx, OPC_BEQ, 2, 0, 0,
12606                            SIMM(ctx->opcode, 0, 10) << 1);
12607         *is_branch = 1;
12608         break;
12609     case BNEZ16:
12610     case BEQZ16:
12611         gen_compute_branch(ctx, op == BNEZ16 ? OPC_BNE : OPC_BEQ, 2,
12612                            mmreg(uMIPS_RD(ctx->opcode)),
12613                            0, SIMM(ctx->opcode, 0, 7) << 1);
12614         *is_branch = 1;
12615         break;
12616     case LI16:
12617         {
12618             int reg = mmreg(uMIPS_RD(ctx->opcode));
12619             int imm = ZIMM(ctx->opcode, 0, 7);
12620
12621             imm = (imm == 0x7f ? -1 : imm);
12622             tcg_gen_movi_tl(cpu_gpr[reg], imm);
12623         }
12624         break;
12625     case RES_20:
12626     case RES_28:
12627     case RES_29:
12628     case RES_30:
12629     case RES_31:
12630     case RES_38:
12631     case RES_39:
12632         generate_exception(ctx, EXCP_RI);
12633         break;
12634     default:
12635         decode_micromips32_opc (env, ctx, op, is_branch);
12636         return 4;
12637     }
12638
12639     return 2;
12640 }
12641
12642 /* SmartMIPS extension to MIPS32 */
12643
12644 #if defined(TARGET_MIPS64)
12645
12646 /* MDMX extension to MIPS64 */
12647
12648 #endif
12649
12650 /* MIPSDSP functions. */
12651 static void gen_mipsdsp_ld(CPUMIPSState *env, DisasContext *ctx, uint32_t opc,
12652                            int rd, int base, int offset)
12653 {
12654     const char *opn = "ldx";
12655     TCGv t0;
12656
12657     if (rd == 0) {
12658         MIPS_DEBUG("NOP");
12659         return;
12660     }
12661
12662     check_dsp(ctx);
12663     t0 = tcg_temp_new();
12664
12665     if (base == 0) {
12666         gen_load_gpr(t0, offset);
12667     } else if (offset == 0) {
12668         gen_load_gpr(t0, base);
12669     } else {
12670         gen_op_addr_add(ctx, t0, cpu_gpr[base], cpu_gpr[offset]);
12671     }
12672
12673     save_cpu_state(ctx, 0);
12674     switch (opc) {
12675     case OPC_LBUX:
12676         op_ld_lbu(t0, t0, ctx);
12677         gen_store_gpr(t0, rd);
12678         opn = "lbux";
12679         break;
12680     case OPC_LHX:
12681         op_ld_lh(t0, t0, ctx);
12682         gen_store_gpr(t0, rd);
12683         opn = "lhx";
12684         break;
12685     case OPC_LWX:
12686         op_ld_lw(t0, t0, ctx);
12687         gen_store_gpr(t0, rd);
12688         opn = "lwx";
12689         break;
12690 #if defined(TARGET_MIPS64)
12691     case OPC_LDX:
12692         op_ld_ld(t0, t0, ctx);
12693         gen_store_gpr(t0, rd);
12694         opn = "ldx";
12695         break;
12696 #endif
12697     }
12698     (void)opn; /* avoid a compiler warning */
12699     MIPS_DEBUG("%s %s, %s(%s)", opn,
12700                regnames[rd], regnames[offset], regnames[base]);
12701     tcg_temp_free(t0);
12702 }
12703
12704 static void gen_mipsdsp_arith(DisasContext *ctx, uint32_t op1, uint32_t op2,
12705                               int ret, int v1, int v2)
12706 {
12707     const char *opn = "mipsdsp arith";
12708     TCGv v1_t;
12709     TCGv v2_t;
12710
12711     if (ret == 0) {
12712         /* Treat as NOP. */
12713         MIPS_DEBUG("NOP");
12714         return;
12715     }
12716
12717     v1_t = tcg_temp_new();
12718     v2_t = tcg_temp_new();
12719
12720     gen_load_gpr(v1_t, v1);
12721     gen_load_gpr(v2_t, v2);
12722
12723     switch (op1) {
12724     /* OPC_MULT_G_2E is equal OPC_ADDUH_QB_DSP */
12725     case OPC_MULT_G_2E:
12726         check_dspr2(ctx);
12727         switch (op2) {
12728         case OPC_ADDUH_QB:
12729             gen_helper_adduh_qb(cpu_gpr[ret], v1_t, v2_t);
12730             break;
12731         case OPC_ADDUH_R_QB:
12732             gen_helper_adduh_r_qb(cpu_gpr[ret], v1_t, v2_t);
12733             break;
12734         case OPC_ADDQH_PH:
12735             gen_helper_addqh_ph(cpu_gpr[ret], v1_t, v2_t);
12736             break;
12737         case OPC_ADDQH_R_PH:
12738             gen_helper_addqh_r_ph(cpu_gpr[ret], v1_t, v2_t);
12739             break;
12740         case OPC_ADDQH_W:
12741             gen_helper_addqh_w(cpu_gpr[ret], v1_t, v2_t);
12742             break;
12743         case OPC_ADDQH_R_W:
12744             gen_helper_addqh_r_w(cpu_gpr[ret], v1_t, v2_t);
12745             break;
12746         case OPC_SUBUH_QB:
12747             gen_helper_subuh_qb(cpu_gpr[ret], v1_t, v2_t);
12748             break;
12749         case OPC_SUBUH_R_QB:
12750             gen_helper_subuh_r_qb(cpu_gpr[ret], v1_t, v2_t);
12751             break;
12752         case OPC_SUBQH_PH:
12753             gen_helper_subqh_ph(cpu_gpr[ret], v1_t, v2_t);
12754             break;
12755         case OPC_SUBQH_R_PH:
12756             gen_helper_subqh_r_ph(cpu_gpr[ret], v1_t, v2_t);
12757             break;
12758         case OPC_SUBQH_W:
12759             gen_helper_subqh_w(cpu_gpr[ret], v1_t, v2_t);
12760             break;
12761         case OPC_SUBQH_R_W:
12762             gen_helper_subqh_r_w(cpu_gpr[ret], v1_t, v2_t);
12763             break;
12764         }
12765         break;
12766     case OPC_ABSQ_S_PH_DSP:
12767         switch (op2) {
12768         case OPC_ABSQ_S_QB:
12769             check_dspr2(ctx);
12770             gen_helper_absq_s_qb(cpu_gpr[ret], v2_t, cpu_env);
12771             break;
12772         case OPC_ABSQ_S_PH:
12773             check_dsp(ctx);
12774             gen_helper_absq_s_ph(cpu_gpr[ret], v2_t, cpu_env);
12775             break;
12776         case OPC_ABSQ_S_W:
12777             check_dsp(ctx);
12778             gen_helper_absq_s_w(cpu_gpr[ret], v2_t, cpu_env);
12779             break;
12780         case OPC_PRECEQ_W_PHL:
12781             check_dsp(ctx);
12782             tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0xFFFF0000);
12783             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
12784             break;
12785         case OPC_PRECEQ_W_PHR:
12786             check_dsp(ctx);
12787             tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0x0000FFFF);
12788             tcg_gen_shli_tl(cpu_gpr[ret], cpu_gpr[ret], 16);
12789             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
12790             break;
12791         case OPC_PRECEQU_PH_QBL:
12792             check_dsp(ctx);
12793             gen_helper_precequ_ph_qbl(cpu_gpr[ret], v2_t);
12794             break;
12795         case OPC_PRECEQU_PH_QBR:
12796             check_dsp(ctx);
12797             gen_helper_precequ_ph_qbr(cpu_gpr[ret], v2_t);
12798             break;
12799         case OPC_PRECEQU_PH_QBLA:
12800             check_dsp(ctx);
12801             gen_helper_precequ_ph_qbla(cpu_gpr[ret], v2_t);
12802             break;
12803         case OPC_PRECEQU_PH_QBRA:
12804             check_dsp(ctx);
12805             gen_helper_precequ_ph_qbra(cpu_gpr[ret], v2_t);
12806             break;
12807         case OPC_PRECEU_PH_QBL:
12808             check_dsp(ctx);
12809             gen_helper_preceu_ph_qbl(cpu_gpr[ret], v2_t);
12810             break;
12811         case OPC_PRECEU_PH_QBR:
12812             check_dsp(ctx);
12813             gen_helper_preceu_ph_qbr(cpu_gpr[ret], v2_t);
12814             break;
12815         case OPC_PRECEU_PH_QBLA:
12816             check_dsp(ctx);
12817             gen_helper_preceu_ph_qbla(cpu_gpr[ret], v2_t);
12818             break;
12819         case OPC_PRECEU_PH_QBRA:
12820             check_dsp(ctx);
12821             gen_helper_preceu_ph_qbra(cpu_gpr[ret], v2_t);
12822             break;
12823         }
12824         break;
12825     case OPC_ADDU_QB_DSP:
12826         switch (op2) {
12827         case OPC_ADDQ_PH:
12828             check_dsp(ctx);
12829             gen_helper_addq_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12830             break;
12831         case OPC_ADDQ_S_PH:
12832             check_dsp(ctx);
12833             gen_helper_addq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12834             break;
12835         case OPC_ADDQ_S_W:
12836             check_dsp(ctx);
12837             gen_helper_addq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12838             break;
12839         case OPC_ADDU_QB:
12840             check_dsp(ctx);
12841             gen_helper_addu_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12842             break;
12843         case OPC_ADDU_S_QB:
12844             check_dsp(ctx);
12845             gen_helper_addu_s_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12846             break;
12847         case OPC_ADDU_PH:
12848             check_dspr2(ctx);
12849             gen_helper_addu_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12850             break;
12851         case OPC_ADDU_S_PH:
12852             check_dspr2(ctx);
12853             gen_helper_addu_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12854             break;
12855         case OPC_SUBQ_PH:
12856             check_dsp(ctx);
12857             gen_helper_subq_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12858             break;
12859         case OPC_SUBQ_S_PH:
12860             check_dsp(ctx);
12861             gen_helper_subq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12862             break;
12863         case OPC_SUBQ_S_W:
12864             check_dsp(ctx);
12865             gen_helper_subq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12866             break;
12867         case OPC_SUBU_QB:
12868             check_dsp(ctx);
12869             gen_helper_subu_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12870             break;
12871         case OPC_SUBU_S_QB:
12872             check_dsp(ctx);
12873             gen_helper_subu_s_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12874             break;
12875         case OPC_SUBU_PH:
12876             check_dspr2(ctx);
12877             gen_helper_subu_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12878             break;
12879         case OPC_SUBU_S_PH:
12880             check_dspr2(ctx);
12881             gen_helper_subu_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12882             break;
12883         case OPC_ADDSC:
12884             check_dsp(ctx);
12885             gen_helper_addsc(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12886             break;
12887         case OPC_ADDWC:
12888             check_dsp(ctx);
12889             gen_helper_addwc(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12890             break;
12891         case OPC_MODSUB:
12892             check_dsp(ctx);
12893             gen_helper_modsub(cpu_gpr[ret], v1_t, v2_t);
12894             break;
12895         case OPC_RADDU_W_QB:
12896             check_dsp(ctx);
12897             gen_helper_raddu_w_qb(cpu_gpr[ret], v1_t);
12898             break;
12899         }
12900         break;
12901     case OPC_CMPU_EQ_QB_DSP:
12902         switch (op2) {
12903         case OPC_PRECR_QB_PH:
12904             check_dspr2(ctx);
12905             gen_helper_precr_qb_ph(cpu_gpr[ret], v1_t, v2_t);
12906             break;
12907         case OPC_PRECRQ_QB_PH:
12908             check_dsp(ctx);
12909             gen_helper_precrq_qb_ph(cpu_gpr[ret], v1_t, v2_t);
12910             break;
12911         case OPC_PRECR_SRA_PH_W:
12912             check_dspr2(ctx);
12913             {
12914                 TCGv_i32 sa_t = tcg_const_i32(v2);
12915                 gen_helper_precr_sra_ph_w(cpu_gpr[ret], sa_t, v1_t,
12916                                           cpu_gpr[ret]);
12917                 tcg_temp_free_i32(sa_t);
12918                 break;
12919             }
12920         case OPC_PRECR_SRA_R_PH_W:
12921             check_dspr2(ctx);
12922             {
12923                 TCGv_i32 sa_t = tcg_const_i32(v2);
12924                 gen_helper_precr_sra_r_ph_w(cpu_gpr[ret], sa_t, v1_t,
12925                                             cpu_gpr[ret]);
12926                 tcg_temp_free_i32(sa_t);
12927                 break;
12928             }
12929         case OPC_PRECRQ_PH_W:
12930             check_dsp(ctx);
12931             gen_helper_precrq_ph_w(cpu_gpr[ret], v1_t, v2_t);
12932             break;
12933         case OPC_PRECRQ_RS_PH_W:
12934             check_dsp(ctx);
12935             gen_helper_precrq_rs_ph_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12936             break;
12937         case OPC_PRECRQU_S_QB_PH:
12938             check_dsp(ctx);
12939             gen_helper_precrqu_s_qb_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12940             break;
12941         }
12942         break;
12943 #ifdef TARGET_MIPS64
12944     case OPC_ABSQ_S_QH_DSP:
12945         switch (op2) {
12946         case OPC_PRECEQ_L_PWL:
12947             check_dsp(ctx);
12948             tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0xFFFFFFFF00000000ull);
12949             break;
12950         case OPC_PRECEQ_L_PWR:
12951             check_dsp(ctx);
12952             tcg_gen_shli_tl(cpu_gpr[ret], v2_t, 32);
12953             break;
12954         case OPC_PRECEQ_PW_QHL:
12955             check_dsp(ctx);
12956             gen_helper_preceq_pw_qhl(cpu_gpr[ret], v2_t);
12957             break;
12958         case OPC_PRECEQ_PW_QHR:
12959             check_dsp(ctx);
12960             gen_helper_preceq_pw_qhr(cpu_gpr[ret], v2_t);
12961             break;
12962         case OPC_PRECEQ_PW_QHLA:
12963             check_dsp(ctx);
12964             gen_helper_preceq_pw_qhla(cpu_gpr[ret], v2_t);
12965             break;
12966         case OPC_PRECEQ_PW_QHRA:
12967             check_dsp(ctx);
12968             gen_helper_preceq_pw_qhra(cpu_gpr[ret], v2_t);
12969             break;
12970         case OPC_PRECEQU_QH_OBL:
12971             check_dsp(ctx);
12972             gen_helper_precequ_qh_obl(cpu_gpr[ret], v2_t);
12973             break;
12974         case OPC_PRECEQU_QH_OBR:
12975             check_dsp(ctx);
12976             gen_helper_precequ_qh_obr(cpu_gpr[ret], v2_t);
12977             break;
12978         case OPC_PRECEQU_QH_OBLA:
12979             check_dsp(ctx);
12980             gen_helper_precequ_qh_obla(cpu_gpr[ret], v2_t);
12981             break;
12982         case OPC_PRECEQU_QH_OBRA:
12983             check_dsp(ctx);
12984             gen_helper_precequ_qh_obra(cpu_gpr[ret], v2_t);
12985             break;
12986         case OPC_PRECEU_QH_OBL:
12987             check_dsp(ctx);
12988             gen_helper_preceu_qh_obl(cpu_gpr[ret], v2_t);
12989             break;
12990         case OPC_PRECEU_QH_OBR:
12991             check_dsp(ctx);
12992             gen_helper_preceu_qh_obr(cpu_gpr[ret], v2_t);
12993             break;
12994         case OPC_PRECEU_QH_OBLA:
12995             check_dsp(ctx);
12996             gen_helper_preceu_qh_obla(cpu_gpr[ret], v2_t);
12997             break;
12998         case OPC_PRECEU_QH_OBRA:
12999             check_dsp(ctx);
13000             gen_helper_preceu_qh_obra(cpu_gpr[ret], v2_t);
13001             break;
13002         case OPC_ABSQ_S_OB:
13003             check_dspr2(ctx);
13004             gen_helper_absq_s_ob(cpu_gpr[ret], v2_t, cpu_env);
13005             break;
13006         case OPC_ABSQ_S_PW:
13007             check_dsp(ctx);
13008             gen_helper_absq_s_pw(cpu_gpr[ret], v2_t, cpu_env);
13009             break;
13010         case OPC_ABSQ_S_QH:
13011             check_dsp(ctx);
13012             gen_helper_absq_s_qh(cpu_gpr[ret], v2_t, cpu_env);
13013             break;
13014         }
13015         break;
13016     case OPC_ADDU_OB_DSP:
13017         switch (op2) {
13018         case OPC_RADDU_L_OB:
13019             check_dsp(ctx);
13020             gen_helper_raddu_l_ob(cpu_gpr[ret], v1_t);
13021             break;
13022         case OPC_SUBQ_PW:
13023             check_dsp(ctx);
13024             gen_helper_subq_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13025             break;
13026         case OPC_SUBQ_S_PW:
13027             check_dsp(ctx);
13028             gen_helper_subq_s_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13029             break;
13030         case OPC_SUBQ_QH:
13031             check_dsp(ctx);
13032             gen_helper_subq_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13033             break;
13034         case OPC_SUBQ_S_QH:
13035             check_dsp(ctx);
13036             gen_helper_subq_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13037             break;
13038         case OPC_SUBU_OB:
13039             check_dsp(ctx);
13040             gen_helper_subu_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13041             break;
13042         case OPC_SUBU_S_OB:
13043             check_dsp(ctx);
13044             gen_helper_subu_s_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13045             break;
13046         case OPC_SUBU_QH:
13047             check_dspr2(ctx);
13048             gen_helper_subu_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13049             break;
13050         case OPC_SUBU_S_QH:
13051             check_dspr2(ctx);
13052             gen_helper_subu_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13053             break;
13054         case OPC_SUBUH_OB:
13055             check_dspr2(ctx);
13056             gen_helper_subuh_ob(cpu_gpr[ret], v1_t, v2_t);
13057             break;
13058         case OPC_SUBUH_R_OB:
13059             check_dspr2(ctx);
13060             gen_helper_subuh_r_ob(cpu_gpr[ret], v1_t, v2_t);
13061             break;
13062         case OPC_ADDQ_PW:
13063             check_dsp(ctx);
13064             gen_helper_addq_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13065             break;
13066         case OPC_ADDQ_S_PW:
13067             check_dsp(ctx);
13068             gen_helper_addq_s_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13069             break;
13070         case OPC_ADDQ_QH:
13071             check_dsp(ctx);
13072             gen_helper_addq_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13073             break;
13074         case OPC_ADDQ_S_QH:
13075             check_dsp(ctx);
13076             gen_helper_addq_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13077             break;
13078         case OPC_ADDU_OB:
13079             check_dsp(ctx);
13080             gen_helper_addu_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13081             break;
13082         case OPC_ADDU_S_OB:
13083             check_dsp(ctx);
13084             gen_helper_addu_s_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13085             break;
13086         case OPC_ADDU_QH:
13087             check_dspr2(ctx);
13088             gen_helper_addu_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13089             break;
13090         case OPC_ADDU_S_QH:
13091             check_dspr2(ctx);
13092             gen_helper_addu_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13093             break;
13094         case OPC_ADDUH_OB:
13095             check_dspr2(ctx);
13096             gen_helper_adduh_ob(cpu_gpr[ret], v1_t, v2_t);
13097             break;
13098         case OPC_ADDUH_R_OB:
13099             check_dspr2(ctx);
13100             gen_helper_adduh_r_ob(cpu_gpr[ret], v1_t, v2_t);
13101             break;
13102         }
13103         break;
13104     case OPC_CMPU_EQ_OB_DSP:
13105         switch (op2) {
13106         case OPC_PRECR_OB_QH:
13107             check_dspr2(ctx);
13108             gen_helper_precr_ob_qh(cpu_gpr[ret], v1_t, v2_t);
13109             break;
13110         case OPC_PRECR_SRA_QH_PW:
13111             check_dspr2(ctx);
13112             {
13113                 TCGv_i32 ret_t = tcg_const_i32(ret);
13114                 gen_helper_precr_sra_qh_pw(v2_t, v1_t, v2_t, ret_t);
13115                 tcg_temp_free_i32(ret_t);
13116                 break;
13117             }
13118         case OPC_PRECR_SRA_R_QH_PW:
13119             check_dspr2(ctx);
13120             {
13121                 TCGv_i32 sa_v = tcg_const_i32(ret);
13122                 gen_helper_precr_sra_r_qh_pw(v2_t, v1_t, v2_t, sa_v);
13123                 tcg_temp_free_i32(sa_v);
13124                 break;
13125             }
13126         case OPC_PRECRQ_OB_QH:
13127             check_dsp(ctx);
13128             gen_helper_precrq_ob_qh(cpu_gpr[ret], v1_t, v2_t);
13129             break;
13130         case OPC_PRECRQ_PW_L:
13131             check_dsp(ctx);
13132             gen_helper_precrq_pw_l(cpu_gpr[ret], v1_t, v2_t);
13133             break;
13134         case OPC_PRECRQ_QH_PW:
13135             check_dsp(ctx);
13136             gen_helper_precrq_qh_pw(cpu_gpr[ret], v1_t, v2_t);
13137             break;
13138         case OPC_PRECRQ_RS_QH_PW:
13139             check_dsp(ctx);
13140             gen_helper_precrq_rs_qh_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13141             break;
13142         case OPC_PRECRQU_S_OB_QH:
13143             check_dsp(ctx);
13144             gen_helper_precrqu_s_ob_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13145             break;
13146         }
13147         break;
13148 #endif
13149     }
13150
13151     tcg_temp_free(v1_t);
13152     tcg_temp_free(v2_t);
13153
13154     (void)opn; /* avoid a compiler warning */
13155     MIPS_DEBUG("%s", opn);
13156 }
13157
13158 static void gen_mipsdsp_shift(DisasContext *ctx, uint32_t opc,
13159                               int ret, int v1, int v2)
13160 {
13161     uint32_t op2;
13162     const char *opn = "mipsdsp shift";
13163     TCGv t0;
13164     TCGv v1_t;
13165     TCGv v2_t;
13166
13167     if (ret == 0) {
13168         /* Treat as NOP. */
13169         MIPS_DEBUG("NOP");
13170         return;
13171     }
13172
13173     t0 = tcg_temp_new();
13174     v1_t = tcg_temp_new();
13175     v2_t = tcg_temp_new();
13176
13177     tcg_gen_movi_tl(t0, v1);
13178     gen_load_gpr(v1_t, v1);
13179     gen_load_gpr(v2_t, v2);
13180
13181     switch (opc) {
13182     case OPC_SHLL_QB_DSP:
13183         {
13184             op2 = MASK_SHLL_QB(ctx->opcode);
13185             switch (op2) {
13186             case OPC_SHLL_QB:
13187                 check_dsp(ctx);
13188                 gen_helper_shll_qb(cpu_gpr[ret], t0, v2_t, cpu_env);
13189                 break;
13190             case OPC_SHLLV_QB:
13191                 check_dsp(ctx);
13192                 gen_helper_shll_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13193                 break;
13194             case OPC_SHLL_PH:
13195                 check_dsp(ctx);
13196                 gen_helper_shll_ph(cpu_gpr[ret], t0, v2_t, cpu_env);
13197                 break;
13198             case OPC_SHLLV_PH:
13199                 check_dsp(ctx);
13200                 gen_helper_shll_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13201                 break;
13202             case OPC_SHLL_S_PH:
13203                 check_dsp(ctx);
13204                 gen_helper_shll_s_ph(cpu_gpr[ret], t0, v2_t, cpu_env);
13205                 break;
13206             case OPC_SHLLV_S_PH:
13207                 check_dsp(ctx);
13208                 gen_helper_shll_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13209                 break;
13210             case OPC_SHLL_S_W:
13211                 check_dsp(ctx);
13212                 gen_helper_shll_s_w(cpu_gpr[ret], t0, v2_t, cpu_env);
13213                 break;
13214             case OPC_SHLLV_S_W:
13215                 check_dsp(ctx);
13216                 gen_helper_shll_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13217                 break;
13218             case OPC_SHRL_QB:
13219                 check_dsp(ctx);
13220                 gen_helper_shrl_qb(cpu_gpr[ret], t0, v2_t);
13221                 break;
13222             case OPC_SHRLV_QB:
13223                 check_dsp(ctx);
13224                 gen_helper_shrl_qb(cpu_gpr[ret], v1_t, v2_t);
13225                 break;
13226             case OPC_SHRL_PH:
13227                 check_dspr2(ctx);
13228                 gen_helper_shrl_ph(cpu_gpr[ret], t0, v2_t);
13229                 break;
13230             case OPC_SHRLV_PH:
13231                 check_dspr2(ctx);
13232                 gen_helper_shrl_ph(cpu_gpr[ret], v1_t, v2_t);
13233                 break;
13234             case OPC_SHRA_QB:
13235                 check_dspr2(ctx);
13236                 gen_helper_shra_qb(cpu_gpr[ret], t0, v2_t);
13237                 break;
13238             case OPC_SHRA_R_QB:
13239                 check_dspr2(ctx);
13240                 gen_helper_shra_r_qb(cpu_gpr[ret], t0, v2_t);
13241                 break;
13242             case OPC_SHRAV_QB:
13243                 check_dspr2(ctx);
13244                 gen_helper_shra_qb(cpu_gpr[ret], v1_t, v2_t);
13245                 break;
13246             case OPC_SHRAV_R_QB:
13247                 check_dspr2(ctx);
13248                 gen_helper_shra_r_qb(cpu_gpr[ret], v1_t, v2_t);
13249                 break;
13250             case OPC_SHRA_PH:
13251                 check_dsp(ctx);
13252                 gen_helper_shra_ph(cpu_gpr[ret], t0, v2_t);
13253                 break;
13254             case OPC_SHRA_R_PH:
13255                 check_dsp(ctx);
13256                 gen_helper_shra_r_ph(cpu_gpr[ret], t0, v2_t);
13257                 break;
13258             case OPC_SHRAV_PH:
13259                 check_dsp(ctx);
13260                 gen_helper_shra_ph(cpu_gpr[ret], v1_t, v2_t);
13261                 break;
13262             case OPC_SHRAV_R_PH:
13263                 check_dsp(ctx);
13264                 gen_helper_shra_r_ph(cpu_gpr[ret], v1_t, v2_t);
13265                 break;
13266             case OPC_SHRA_R_W:
13267                 check_dsp(ctx);
13268                 gen_helper_shra_r_w(cpu_gpr[ret], t0, v2_t);
13269                 break;
13270             case OPC_SHRAV_R_W:
13271                 check_dsp(ctx);
13272                 gen_helper_shra_r_w(cpu_gpr[ret], v1_t, v2_t);
13273                 break;
13274             default:            /* Invalid */
13275                 MIPS_INVAL("MASK SHLL.QB");
13276                 generate_exception(ctx, EXCP_RI);
13277                 break;
13278             }
13279             break;
13280         }
13281 #ifdef TARGET_MIPS64
13282     case OPC_SHLL_OB_DSP:
13283         op2 = MASK_SHLL_OB(ctx->opcode);
13284         switch (op2) {
13285         case OPC_SHLL_PW:
13286             check_dsp(ctx);
13287             gen_helper_shll_pw(cpu_gpr[ret], v2_t, t0, cpu_env);
13288             break;
13289         case OPC_SHLLV_PW:
13290             check_dsp(ctx);
13291             gen_helper_shll_pw(cpu_gpr[ret], v2_t, v1_t, cpu_env);
13292             break;
13293         case OPC_SHLL_S_PW:
13294             check_dsp(ctx);
13295             gen_helper_shll_s_pw(cpu_gpr[ret], v2_t, t0, cpu_env);
13296             break;
13297         case OPC_SHLLV_S_PW:
13298             check_dsp(ctx);
13299             gen_helper_shll_s_pw(cpu_gpr[ret], v2_t, v1_t, cpu_env);
13300             break;
13301         case OPC_SHLL_OB:
13302             check_dsp(ctx);
13303             gen_helper_shll_ob(cpu_gpr[ret], v2_t, t0, cpu_env);
13304             break;
13305         case OPC_SHLLV_OB:
13306             check_dsp(ctx);
13307             gen_helper_shll_ob(cpu_gpr[ret], v2_t, v1_t, cpu_env);
13308             break;
13309         case OPC_SHLL_QH:
13310             check_dsp(ctx);
13311             gen_helper_shll_qh(cpu_gpr[ret], v2_t, t0, cpu_env);
13312             break;
13313         case OPC_SHLLV_QH:
13314             check_dsp(ctx);
13315             gen_helper_shll_qh(cpu_gpr[ret], v2_t, v1_t, cpu_env);
13316             break;
13317         case OPC_SHLL_S_QH:
13318             check_dsp(ctx);
13319             gen_helper_shll_s_qh(cpu_gpr[ret], v2_t, t0, cpu_env);
13320             break;
13321         case OPC_SHLLV_S_QH:
13322             check_dsp(ctx);
13323             gen_helper_shll_s_qh(cpu_gpr[ret], v2_t, v1_t, cpu_env);
13324             break;
13325         case OPC_SHRA_OB:
13326             check_dspr2(ctx);
13327             gen_helper_shra_ob(cpu_gpr[ret], v2_t, t0);
13328             break;
13329         case OPC_SHRAV_OB:
13330             check_dspr2(ctx);
13331             gen_helper_shra_ob(cpu_gpr[ret], v2_t, v1_t);
13332             break;
13333         case OPC_SHRA_R_OB:
13334             check_dspr2(ctx);
13335             gen_helper_shra_r_ob(cpu_gpr[ret], v2_t, t0);
13336             break;
13337         case OPC_SHRAV_R_OB:
13338             check_dspr2(ctx);
13339             gen_helper_shra_r_ob(cpu_gpr[ret], v2_t, v1_t);
13340             break;
13341         case OPC_SHRA_PW:
13342             check_dsp(ctx);
13343             gen_helper_shra_pw(cpu_gpr[ret], v2_t, t0);
13344             break;
13345         case OPC_SHRAV_PW:
13346             check_dsp(ctx);
13347             gen_helper_shra_pw(cpu_gpr[ret], v2_t, v1_t);
13348             break;
13349         case OPC_SHRA_R_PW:
13350             check_dsp(ctx);
13351             gen_helper_shra_r_pw(cpu_gpr[ret], v2_t, t0);
13352             break;
13353         case OPC_SHRAV_R_PW:
13354             check_dsp(ctx);
13355             gen_helper_shra_r_pw(cpu_gpr[ret], v2_t, v1_t);
13356             break;
13357         case OPC_SHRA_QH:
13358             check_dsp(ctx);
13359             gen_helper_shra_qh(cpu_gpr[ret], v2_t, t0);
13360             break;
13361         case OPC_SHRAV_QH:
13362             check_dsp(ctx);
13363             gen_helper_shra_qh(cpu_gpr[ret], v2_t, v1_t);
13364             break;
13365         case OPC_SHRA_R_QH:
13366             check_dsp(ctx);
13367             gen_helper_shra_r_qh(cpu_gpr[ret], v2_t, t0);
13368             break;
13369         case OPC_SHRAV_R_QH:
13370             check_dsp(ctx);
13371             gen_helper_shra_r_qh(cpu_gpr[ret], v2_t, v1_t);
13372             break;
13373         case OPC_SHRL_OB:
13374             check_dsp(ctx);
13375             gen_helper_shrl_ob(cpu_gpr[ret], v2_t, t0);
13376             break;
13377         case OPC_SHRLV_OB:
13378             check_dsp(ctx);
13379             gen_helper_shrl_ob(cpu_gpr[ret], v2_t, v1_t);
13380             break;
13381         case OPC_SHRL_QH:
13382             check_dspr2(ctx);
13383             gen_helper_shrl_qh(cpu_gpr[ret], v2_t, t0);
13384             break;
13385         case OPC_SHRLV_QH:
13386             check_dspr2(ctx);
13387             gen_helper_shrl_qh(cpu_gpr[ret], v2_t, v1_t);
13388             break;
13389         default:            /* Invalid */
13390             MIPS_INVAL("MASK SHLL.OB");
13391             generate_exception(ctx, EXCP_RI);
13392             break;
13393         }
13394         break;
13395 #endif
13396     }
13397
13398     tcg_temp_free(t0);
13399     tcg_temp_free(v1_t);
13400     tcg_temp_free(v2_t);
13401     (void)opn; /* avoid a compiler warning */
13402     MIPS_DEBUG("%s", opn);
13403 }
13404
13405 static void gen_mipsdsp_multiply(DisasContext *ctx, uint32_t op1, uint32_t op2,
13406                                  int ret, int v1, int v2, int check_ret)
13407 {
13408     const char *opn = "mipsdsp multiply";
13409     TCGv_i32 t0;
13410     TCGv v1_t;
13411     TCGv v2_t;
13412
13413     if ((ret == 0) && (check_ret == 1)) {
13414         /* Treat as NOP. */
13415         MIPS_DEBUG("NOP");
13416         return;
13417     }
13418
13419     t0 = tcg_temp_new_i32();
13420     v1_t = tcg_temp_new();
13421     v2_t = tcg_temp_new();
13422
13423     tcg_gen_movi_i32(t0, ret);
13424     gen_load_gpr(v1_t, v1);
13425     gen_load_gpr(v2_t, v2);
13426
13427     switch (op1) {
13428     /* OPC_MULT_G_2E, OPC_ADDUH_QB_DSP, OPC_MUL_PH_DSP have
13429      * the same mask and op1. */
13430     case OPC_MULT_G_2E:
13431         switch (op2) {
13432         case  OPC_MUL_PH:
13433             gen_helper_mul_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13434             break;
13435         case  OPC_MUL_S_PH:
13436             gen_helper_mul_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13437             break;
13438         case OPC_MULQ_S_W:
13439             gen_helper_mulq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13440             break;
13441         case OPC_MULQ_RS_W:
13442             gen_helper_mulq_rs_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13443             break;
13444         }
13445         break;
13446     case OPC_DPA_W_PH_DSP:
13447         switch (op2) {
13448         case OPC_DPAU_H_QBL:
13449             check_dsp(ctx);
13450             gen_helper_dpau_h_qbl(t0, v1_t, v2_t, cpu_env);
13451             break;
13452         case OPC_DPAU_H_QBR:
13453             check_dsp(ctx);
13454             gen_helper_dpau_h_qbr(t0, v1_t, v2_t, cpu_env);
13455             break;
13456         case OPC_DPSU_H_QBL:
13457             check_dsp(ctx);
13458             gen_helper_dpsu_h_qbl(t0, v1_t, v2_t, cpu_env);
13459             break;
13460         case OPC_DPSU_H_QBR:
13461             check_dsp(ctx);
13462             gen_helper_dpsu_h_qbr(t0, v1_t, v2_t, cpu_env);
13463             break;
13464         case OPC_DPA_W_PH:
13465             check_dspr2(ctx);
13466             gen_helper_dpa_w_ph(t0, v1_t, v2_t, cpu_env);
13467             break;
13468         case OPC_DPAX_W_PH:
13469             check_dspr2(ctx);
13470             gen_helper_dpax_w_ph(t0, v1_t, v2_t, cpu_env);
13471             break;
13472         case OPC_DPAQ_S_W_PH:
13473             check_dsp(ctx);
13474             gen_helper_dpaq_s_w_ph(t0, v1_t, v2_t, cpu_env);
13475             break;
13476         case OPC_DPAQX_S_W_PH:
13477             check_dspr2(ctx);
13478             gen_helper_dpaqx_s_w_ph(t0, v1_t, v2_t, cpu_env);
13479             break;
13480         case OPC_DPAQX_SA_W_PH:
13481             check_dspr2(ctx);
13482             gen_helper_dpaqx_sa_w_ph(t0, v1_t, v2_t, cpu_env);
13483             break;
13484         case OPC_DPS_W_PH:
13485             check_dspr2(ctx);
13486             gen_helper_dps_w_ph(t0, v1_t, v2_t, cpu_env);
13487             break;
13488         case OPC_DPSX_W_PH:
13489             check_dspr2(ctx);
13490             gen_helper_dpsx_w_ph(t0, v1_t, v2_t, cpu_env);
13491             break;
13492         case OPC_DPSQ_S_W_PH:
13493             check_dsp(ctx);
13494             gen_helper_dpsq_s_w_ph(t0, v1_t, v2_t, cpu_env);
13495             break;
13496         case OPC_DPSQX_S_W_PH:
13497             check_dspr2(ctx);
13498             gen_helper_dpsqx_s_w_ph(t0, v1_t, v2_t, cpu_env);
13499             break;
13500         case OPC_DPSQX_SA_W_PH:
13501             check_dspr2(ctx);
13502             gen_helper_dpsqx_sa_w_ph(t0, v1_t, v2_t, cpu_env);
13503             break;
13504         case OPC_MULSAQ_S_W_PH:
13505             check_dsp(ctx);
13506             gen_helper_mulsaq_s_w_ph(t0, v1_t, v2_t, cpu_env);
13507             break;
13508         case OPC_DPAQ_SA_L_W:
13509             check_dsp(ctx);
13510             gen_helper_dpaq_sa_l_w(t0, v1_t, v2_t, cpu_env);
13511             break;
13512         case OPC_DPSQ_SA_L_W:
13513             check_dsp(ctx);
13514             gen_helper_dpsq_sa_l_w(t0, v1_t, v2_t, cpu_env);
13515             break;
13516         case OPC_MAQ_S_W_PHL:
13517             check_dsp(ctx);
13518             gen_helper_maq_s_w_phl(t0, v1_t, v2_t, cpu_env);
13519             break;
13520         case OPC_MAQ_S_W_PHR:
13521             check_dsp(ctx);
13522             gen_helper_maq_s_w_phr(t0, v1_t, v2_t, cpu_env);
13523             break;
13524         case OPC_MAQ_SA_W_PHL:
13525             check_dsp(ctx);
13526             gen_helper_maq_sa_w_phl(t0, v1_t, v2_t, cpu_env);
13527             break;
13528         case OPC_MAQ_SA_W_PHR:
13529             check_dsp(ctx);
13530             gen_helper_maq_sa_w_phr(t0, v1_t, v2_t, cpu_env);
13531             break;
13532         case OPC_MULSA_W_PH:
13533             check_dspr2(ctx);
13534             gen_helper_mulsa_w_ph(t0, v1_t, v2_t, cpu_env);
13535             break;
13536         }
13537         break;
13538 #ifdef TARGET_MIPS64
13539     case OPC_DPAQ_W_QH_DSP:
13540         {
13541             int ac = ret & 0x03;
13542             tcg_gen_movi_i32(t0, ac);
13543
13544             switch (op2) {
13545             case OPC_DMADD:
13546                 check_dsp(ctx);
13547                 gen_helper_dmadd(v1_t, v2_t, t0, cpu_env);
13548                 break;
13549             case OPC_DMADDU:
13550                 check_dsp(ctx);
13551                 gen_helper_dmaddu(v1_t, v2_t, t0, cpu_env);
13552                 break;
13553             case OPC_DMSUB:
13554                 check_dsp(ctx);
13555                 gen_helper_dmsub(v1_t, v2_t, t0, cpu_env);
13556                 break;
13557             case OPC_DMSUBU:
13558                 check_dsp(ctx);
13559                 gen_helper_dmsubu(v1_t, v2_t, t0, cpu_env);
13560                 break;
13561             case OPC_DPA_W_QH:
13562                 check_dspr2(ctx);
13563                 gen_helper_dpa_w_qh(v1_t, v2_t, t0, cpu_env);
13564                 break;
13565             case OPC_DPAQ_S_W_QH:
13566                 check_dsp(ctx);
13567                 gen_helper_dpaq_s_w_qh(v1_t, v2_t, t0, cpu_env);
13568                 break;
13569             case OPC_DPAQ_SA_L_PW:
13570                 check_dsp(ctx);
13571                 gen_helper_dpaq_sa_l_pw(v1_t, v2_t, t0, cpu_env);
13572                 break;
13573             case OPC_DPAU_H_OBL:
13574                 check_dsp(ctx);
13575                 gen_helper_dpau_h_obl(v1_t, v2_t, t0, cpu_env);
13576                 break;
13577             case OPC_DPAU_H_OBR:
13578                 check_dsp(ctx);
13579                 gen_helper_dpau_h_obr(v1_t, v2_t, t0, cpu_env);
13580                 break;
13581             case OPC_DPS_W_QH:
13582                 check_dspr2(ctx);
13583                 gen_helper_dps_w_qh(v1_t, v2_t, t0, cpu_env);
13584                 break;
13585             case OPC_DPSQ_S_W_QH:
13586                 check_dsp(ctx);
13587                 gen_helper_dpsq_s_w_qh(v1_t, v2_t, t0, cpu_env);
13588                 break;
13589             case OPC_DPSQ_SA_L_PW:
13590                 check_dsp(ctx);
13591                 gen_helper_dpsq_sa_l_pw(v1_t, v2_t, t0, cpu_env);
13592                 break;
13593             case OPC_DPSU_H_OBL:
13594                 check_dsp(ctx);
13595                 gen_helper_dpsu_h_obl(v1_t, v2_t, t0, cpu_env);
13596                 break;
13597             case OPC_DPSU_H_OBR:
13598                 check_dsp(ctx);
13599                 gen_helper_dpsu_h_obr(v1_t, v2_t, t0, cpu_env);
13600                 break;
13601             case OPC_MAQ_S_L_PWL:
13602                 check_dsp(ctx);
13603                 gen_helper_maq_s_l_pwl(v1_t, v2_t, t0, cpu_env);
13604                 break;
13605             case OPC_MAQ_S_L_PWR:
13606                 check_dsp(ctx);
13607                 gen_helper_maq_s_l_pwr(v1_t, v2_t, t0, cpu_env);
13608                 break;
13609             case OPC_MAQ_S_W_QHLL:
13610                 check_dsp(ctx);
13611                 gen_helper_maq_s_w_qhll(v1_t, v2_t, t0, cpu_env);
13612                 break;
13613             case OPC_MAQ_SA_W_QHLL:
13614                 check_dsp(ctx);
13615                 gen_helper_maq_sa_w_qhll(v1_t, v2_t, t0, cpu_env);
13616                 break;
13617             case OPC_MAQ_S_W_QHLR:
13618                 check_dsp(ctx);
13619                 gen_helper_maq_s_w_qhlr(v1_t, v2_t, t0, cpu_env);
13620                 break;
13621             case OPC_MAQ_SA_W_QHLR:
13622                 check_dsp(ctx);
13623                 gen_helper_maq_sa_w_qhlr(v1_t, v2_t, t0, cpu_env);
13624                 break;
13625             case OPC_MAQ_S_W_QHRL:
13626                 check_dsp(ctx);
13627                 gen_helper_maq_s_w_qhrl(v1_t, v2_t, t0, cpu_env);
13628                 break;
13629             case OPC_MAQ_SA_W_QHRL:
13630                 check_dsp(ctx);
13631                 gen_helper_maq_sa_w_qhrl(v1_t, v2_t, t0, cpu_env);
13632                 break;
13633             case OPC_MAQ_S_W_QHRR:
13634                 check_dsp(ctx);
13635                 gen_helper_maq_s_w_qhrr(v1_t, v2_t, t0, cpu_env);
13636                 break;
13637             case OPC_MAQ_SA_W_QHRR:
13638                 check_dsp(ctx);
13639                 gen_helper_maq_sa_w_qhrr(v1_t, v2_t, t0, cpu_env);
13640                 break;
13641             case OPC_MULSAQ_S_L_PW:
13642                 check_dsp(ctx);
13643                 gen_helper_mulsaq_s_l_pw(v1_t, v2_t, t0, cpu_env);
13644                 break;
13645             case OPC_MULSAQ_S_W_QH:
13646                 check_dsp(ctx);
13647                 gen_helper_mulsaq_s_w_qh(v1_t, v2_t, t0, cpu_env);
13648                 break;
13649             }
13650         }
13651         break;
13652 #endif
13653     case OPC_ADDU_QB_DSP:
13654         switch (op2) {
13655         case OPC_MULEU_S_PH_QBL:
13656             check_dsp(ctx);
13657             gen_helper_muleu_s_ph_qbl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13658             break;
13659         case OPC_MULEU_S_PH_QBR:
13660             check_dsp(ctx);
13661             gen_helper_muleu_s_ph_qbr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13662             break;
13663         case OPC_MULQ_RS_PH:
13664             check_dsp(ctx);
13665             gen_helper_mulq_rs_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13666             break;
13667         case OPC_MULEQ_S_W_PHL:
13668             check_dsp(ctx);
13669             gen_helper_muleq_s_w_phl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13670             break;
13671         case OPC_MULEQ_S_W_PHR:
13672             check_dsp(ctx);
13673             gen_helper_muleq_s_w_phr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13674             break;
13675         case OPC_MULQ_S_PH:
13676             check_dspr2(ctx);
13677             gen_helper_mulq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13678             break;
13679         }
13680         break;
13681 #ifdef TARGET_MIPS64
13682     case OPC_ADDU_OB_DSP:
13683         switch (op2) {
13684         case OPC_MULEQ_S_PW_QHL:
13685             check_dsp(ctx);
13686             gen_helper_muleq_s_pw_qhl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13687             break;
13688         case OPC_MULEQ_S_PW_QHR:
13689             check_dsp(ctx);
13690             gen_helper_muleq_s_pw_qhr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13691             break;
13692         case OPC_MULEU_S_QH_OBL:
13693             check_dsp(ctx);
13694             gen_helper_muleu_s_qh_obl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13695             break;
13696         case OPC_MULEU_S_QH_OBR:
13697             check_dsp(ctx);
13698             gen_helper_muleu_s_qh_obr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13699             break;
13700         case OPC_MULQ_RS_QH:
13701             check_dsp(ctx);
13702             gen_helper_mulq_rs_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13703             break;
13704         }
13705         break;
13706 #endif
13707     }
13708
13709     tcg_temp_free_i32(t0);
13710     tcg_temp_free(v1_t);
13711     tcg_temp_free(v2_t);
13712
13713     (void)opn; /* avoid a compiler warning */
13714     MIPS_DEBUG("%s", opn);
13715
13716 }
13717
13718 static void gen_mipsdsp_bitinsn(CPUMIPSState *env, DisasContext *ctx,
13719                                 uint32_t op1, uint32_t op2,
13720                                 int ret, int val)
13721 {
13722     const char *opn = "mipsdsp Bit/ Manipulation";
13723     int16_t imm;
13724     TCGv t0;
13725     TCGv val_t;
13726
13727     if (ret == 0) {
13728         /* Treat as NOP. */
13729         MIPS_DEBUG("NOP");
13730         return;
13731     }
13732
13733     t0 = tcg_temp_new();
13734     val_t = tcg_temp_new();
13735     gen_load_gpr(val_t, val);
13736
13737     switch (op1) {
13738     case OPC_ABSQ_S_PH_DSP:
13739         switch (op2) {
13740         case OPC_BITREV:
13741             check_dsp(ctx);
13742             gen_helper_bitrev(cpu_gpr[ret], val_t);
13743             break;
13744         case OPC_REPL_QB:
13745             check_dsp(ctx);
13746             {
13747                 target_long result;
13748                 imm = (ctx->opcode >> 16) & 0xFF;
13749                 result = (uint32_t)imm << 24 |
13750                          (uint32_t)imm << 16 |
13751                          (uint32_t)imm << 8  |
13752                          (uint32_t)imm;
13753                 result = (int32_t)result;
13754                 tcg_gen_movi_tl(cpu_gpr[ret], result);
13755             }
13756             break;
13757         case OPC_REPLV_QB:
13758             check_dsp(ctx);
13759             tcg_gen_ext8u_tl(cpu_gpr[ret], val_t);
13760             tcg_gen_shli_tl(t0, cpu_gpr[ret], 8);
13761             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13762             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
13763             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13764             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
13765             break;
13766         case OPC_REPL_PH:
13767             check_dsp(ctx);
13768             {
13769                 imm = (ctx->opcode >> 16) & 0x03FF;
13770                 tcg_gen_movi_tl(cpu_gpr[ret], \
13771                                 (target_long)((int32_t)imm << 16 | \
13772                                 (uint32_t)(uint16_t)imm));
13773             }
13774             break;
13775         case OPC_REPLV_PH:
13776             check_dsp(ctx);
13777             tcg_gen_ext16u_tl(cpu_gpr[ret], val_t);
13778             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
13779             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13780             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
13781             break;
13782         }
13783         break;
13784 #ifdef TARGET_MIPS64
13785     case OPC_ABSQ_S_QH_DSP:
13786         switch (op2) {
13787         case OPC_REPL_OB:
13788             check_dsp(ctx);
13789             {
13790                 target_long temp;
13791
13792                 imm = (ctx->opcode >> 16) & 0xFF;
13793                 temp = ((uint64_t)imm << 8) | (uint64_t)imm;
13794                 temp = (temp << 16) | temp;
13795                 temp = (temp << 32) | temp;
13796                 tcg_gen_movi_tl(cpu_gpr[ret], temp);
13797                 break;
13798             }
13799         case OPC_REPL_PW:
13800             check_dsp(ctx);
13801             {
13802                 target_long temp;
13803
13804                 imm = (ctx->opcode >> 16) & 0x03FF;
13805                 imm = (int16_t)(imm << 6) >> 6;
13806                 temp = ((target_long)imm << 32) \
13807                        | ((target_long)imm & 0xFFFFFFFF);
13808                 tcg_gen_movi_tl(cpu_gpr[ret], temp);
13809                 break;
13810             }
13811         case OPC_REPL_QH:
13812             check_dsp(ctx);
13813             {
13814                 target_long temp;
13815
13816                 imm = (ctx->opcode >> 16) & 0x03FF;
13817                 imm = (int16_t)(imm << 6) >> 6;
13818
13819                 temp = ((uint64_t)(uint16_t)imm << 48) |
13820                        ((uint64_t)(uint16_t)imm << 32) |
13821                        ((uint64_t)(uint16_t)imm << 16) |
13822                        (uint64_t)(uint16_t)imm;
13823                 tcg_gen_movi_tl(cpu_gpr[ret], temp);
13824                 break;
13825             }
13826         case OPC_REPLV_OB:
13827             check_dsp(ctx);
13828             tcg_gen_ext8u_tl(cpu_gpr[ret], val_t);
13829             tcg_gen_shli_tl(t0, cpu_gpr[ret], 8);
13830             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13831             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
13832             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13833             tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
13834             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13835             break;
13836         case OPC_REPLV_PW:
13837             check_dsp(ctx);
13838             tcg_gen_ext32u_i64(cpu_gpr[ret], val_t);
13839             tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
13840             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13841             break;
13842         case OPC_REPLV_QH:
13843             check_dsp(ctx);
13844             tcg_gen_ext16u_tl(cpu_gpr[ret], val_t);
13845             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
13846             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13847             tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
13848             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13849             break;
13850         }
13851         break;
13852 #endif
13853     }
13854     tcg_temp_free(t0);
13855     tcg_temp_free(val_t);
13856
13857     (void)opn; /* avoid a compiler warning */
13858     MIPS_DEBUG("%s", opn);
13859 }
13860
13861 static void gen_mipsdsp_add_cmp_pick(DisasContext *ctx,
13862                                      uint32_t op1, uint32_t op2,
13863                                      int ret, int v1, int v2, int check_ret)
13864 {
13865     const char *opn = "mipsdsp add compare pick";
13866     TCGv_i32 t0;
13867     TCGv t1;
13868     TCGv v1_t;
13869     TCGv v2_t;
13870
13871     if ((ret == 0) && (check_ret == 1)) {
13872         /* Treat as NOP. */
13873         MIPS_DEBUG("NOP");
13874         return;
13875     }
13876
13877     t0 = tcg_temp_new_i32();
13878     t1 = tcg_temp_new();
13879     v1_t = tcg_temp_new();
13880     v2_t = tcg_temp_new();
13881
13882     gen_load_gpr(v1_t, v1);
13883     gen_load_gpr(v2_t, v2);
13884
13885     switch (op1) {
13886     case OPC_APPEND_DSP:
13887         switch (op2) {
13888         case OPC_APPEND:
13889             tcg_gen_movi_i32(t0, v2);
13890             gen_helper_append(cpu_gpr[ret], cpu_gpr[ret], v1_t, t0);
13891             break;
13892         case OPC_PREPEND:
13893             tcg_gen_movi_i32(t0, v2);
13894             gen_helper_prepend(cpu_gpr[ret], v1_t, cpu_gpr[ret], t0);
13895             break;
13896         case OPC_BALIGN:
13897             tcg_gen_movi_i32(t0, v2);
13898             gen_helper_balign(cpu_gpr[ret], v1_t, cpu_gpr[ret], t0);
13899             break;
13900         default:            /* Invid */
13901             MIPS_INVAL("MASK APPEND");
13902             generate_exception(ctx, EXCP_RI);
13903             break;
13904         }
13905         break;
13906     case OPC_CMPU_EQ_QB_DSP:
13907         switch (op2) {
13908         case OPC_CMPU_EQ_QB:
13909             check_dsp(ctx);
13910             gen_helper_cmpu_eq_qb(v1_t, v2_t, cpu_env);
13911             break;
13912         case OPC_CMPU_LT_QB:
13913             check_dsp(ctx);
13914             gen_helper_cmpu_lt_qb(v1_t, v2_t, cpu_env);
13915             break;
13916         case OPC_CMPU_LE_QB:
13917             check_dsp(ctx);
13918             gen_helper_cmpu_le_qb(v1_t, v2_t, cpu_env);
13919             break;
13920         case OPC_CMPGU_EQ_QB:
13921             check_dsp(ctx);
13922             gen_helper_cmpgu_eq_qb(cpu_gpr[ret], v1_t, v2_t);
13923             break;
13924         case OPC_CMPGU_LT_QB:
13925             check_dsp(ctx);
13926             gen_helper_cmpgu_lt_qb(cpu_gpr[ret], v1_t, v2_t);
13927             break;
13928         case OPC_CMPGU_LE_QB:
13929             check_dsp(ctx);
13930             gen_helper_cmpgu_le_qb(cpu_gpr[ret], v1_t, v2_t);
13931             break;
13932         case OPC_CMPGDU_EQ_QB:
13933             check_dspr2(ctx);
13934             gen_helper_cmpgu_eq_qb(t1, v1_t, v2_t);
13935             tcg_gen_mov_tl(cpu_gpr[ret], t1);
13936             tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
13937             tcg_gen_shli_tl(t1, t1, 24);
13938             tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
13939             break;
13940         case OPC_CMPGDU_LT_QB:
13941             check_dspr2(ctx);
13942             gen_helper_cmpgu_lt_qb(t1, v1_t, v2_t);
13943             tcg_gen_mov_tl(cpu_gpr[ret], t1);
13944             tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
13945             tcg_gen_shli_tl(t1, t1, 24);
13946             tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
13947             break;
13948         case OPC_CMPGDU_LE_QB:
13949             check_dspr2(ctx);
13950             gen_helper_cmpgu_le_qb(t1, v1_t, v2_t);
13951             tcg_gen_mov_tl(cpu_gpr[ret], t1);
13952             tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
13953             tcg_gen_shli_tl(t1, t1, 24);
13954             tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
13955             break;
13956         case OPC_CMP_EQ_PH:
13957             check_dsp(ctx);
13958             gen_helper_cmp_eq_ph(v1_t, v2_t, cpu_env);
13959             break;
13960         case OPC_CMP_LT_PH:
13961             check_dsp(ctx);
13962             gen_helper_cmp_lt_ph(v1_t, v2_t, cpu_env);
13963             break;
13964         case OPC_CMP_LE_PH:
13965             check_dsp(ctx);
13966             gen_helper_cmp_le_ph(v1_t, v2_t, cpu_env);
13967             break;
13968         case OPC_PICK_QB:
13969             check_dsp(ctx);
13970             gen_helper_pick_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13971             break;
13972         case OPC_PICK_PH:
13973             check_dsp(ctx);
13974             gen_helper_pick_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13975             break;
13976         case OPC_PACKRL_PH:
13977             check_dsp(ctx);
13978             gen_helper_packrl_ph(cpu_gpr[ret], v1_t, v2_t);
13979             break;
13980         }
13981         break;
13982 #ifdef TARGET_MIPS64
13983     case OPC_CMPU_EQ_OB_DSP:
13984         switch (op2) {
13985         case OPC_CMP_EQ_PW:
13986             check_dsp(ctx);
13987             gen_helper_cmp_eq_pw(v1_t, v2_t, cpu_env);
13988             break;
13989         case OPC_CMP_LT_PW:
13990             check_dsp(ctx);
13991             gen_helper_cmp_lt_pw(v1_t, v2_t, cpu_env);
13992             break;
13993         case OPC_CMP_LE_PW:
13994             check_dsp(ctx);
13995             gen_helper_cmp_le_pw(v1_t, v2_t, cpu_env);
13996             break;
13997         case OPC_CMP_EQ_QH:
13998             check_dsp(ctx);
13999             gen_helper_cmp_eq_qh(v1_t, v2_t, cpu_env);
14000             break;
14001         case OPC_CMP_LT_QH:
14002             check_dsp(ctx);
14003             gen_helper_cmp_lt_qh(v1_t, v2_t, cpu_env);
14004             break;
14005         case OPC_CMP_LE_QH:
14006             check_dsp(ctx);
14007             gen_helper_cmp_le_qh(v1_t, v2_t, cpu_env);
14008             break;
14009         case OPC_CMPGDU_EQ_OB:
14010             check_dspr2(ctx);
14011             gen_helper_cmpgdu_eq_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14012             break;
14013         case OPC_CMPGDU_LT_OB:
14014             check_dspr2(ctx);
14015             gen_helper_cmpgdu_lt_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14016             break;
14017         case OPC_CMPGDU_LE_OB:
14018             check_dspr2(ctx);
14019             gen_helper_cmpgdu_le_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14020             break;
14021         case OPC_CMPGU_EQ_OB:
14022             check_dsp(ctx);
14023             gen_helper_cmpgu_eq_ob(cpu_gpr[ret], v1_t, v2_t);
14024             break;
14025         case OPC_CMPGU_LT_OB:
14026             check_dsp(ctx);
14027             gen_helper_cmpgu_lt_ob(cpu_gpr[ret], v1_t, v2_t);
14028             break;
14029         case OPC_CMPGU_LE_OB:
14030             check_dsp(ctx);
14031             gen_helper_cmpgu_le_ob(cpu_gpr[ret], v1_t, v2_t);
14032             break;
14033         case OPC_CMPU_EQ_OB:
14034             check_dsp(ctx);
14035             gen_helper_cmpu_eq_ob(v1_t, v2_t, cpu_env);
14036             break;
14037         case OPC_CMPU_LT_OB:
14038             check_dsp(ctx);
14039             gen_helper_cmpu_lt_ob(v1_t, v2_t, cpu_env);
14040             break;
14041         case OPC_CMPU_LE_OB:
14042             check_dsp(ctx);
14043             gen_helper_cmpu_le_ob(v1_t, v2_t, cpu_env);
14044             break;
14045         case OPC_PACKRL_PW:
14046             check_dsp(ctx);
14047             gen_helper_packrl_pw(cpu_gpr[ret], v1_t, v2_t);
14048             break;
14049         case OPC_PICK_OB:
14050             check_dsp(ctx);
14051             gen_helper_pick_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14052             break;
14053         case OPC_PICK_PW:
14054             check_dsp(ctx);
14055             gen_helper_pick_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14056             break;
14057         case OPC_PICK_QH:
14058             check_dsp(ctx);
14059             gen_helper_pick_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14060             break;
14061         }
14062         break;
14063     case OPC_DAPPEND_DSP:
14064         switch (op2) {
14065         case OPC_DAPPEND:
14066             tcg_gen_movi_i32(t0, v2);
14067             gen_helper_dappend(cpu_gpr[ret], v1_t, cpu_gpr[ret], t0);
14068             break;
14069         case OPC_PREPENDD:
14070             tcg_gen_movi_i32(t0, v2);
14071             gen_helper_prependd(cpu_gpr[ret], v1_t, cpu_gpr[ret], t0);
14072             break;
14073         case OPC_PREPENDW:
14074             tcg_gen_movi_i32(t0, v2);
14075             gen_helper_prependw(cpu_gpr[ret], v1_t, cpu_gpr[ret], t0);
14076             break;
14077         case OPC_DBALIGN:
14078             tcg_gen_movi_i32(t0, v2);
14079             gen_helper_dbalign(cpu_gpr[ret], v1_t, cpu_gpr[ret], t0);
14080             break;
14081         default:            /* Invalid */
14082             MIPS_INVAL("MASK DAPPEND");
14083             generate_exception(ctx, EXCP_RI);
14084             break;
14085         }
14086         break;
14087 #endif
14088     }
14089
14090     tcg_temp_free_i32(t0);
14091     tcg_temp_free(t1);
14092     tcg_temp_free(v1_t);
14093     tcg_temp_free(v2_t);
14094
14095     (void)opn; /* avoid a compiler warning */
14096     MIPS_DEBUG("%s", opn);
14097 }
14098
14099 static void gen_mipsdsp_accinsn(DisasContext *ctx, uint32_t op1, uint32_t op2,
14100                                 int ret, int v1, int v2, int check_ret)
14101
14102 {
14103     const char *opn = "mipsdsp accumulator";
14104     TCGv t0;
14105     TCGv t1;
14106     TCGv v1_t;
14107     TCGv v2_t;
14108     int16_t imm;
14109
14110     if ((ret == 0) && (check_ret == 1)) {
14111         /* Treat as NOP. */
14112         MIPS_DEBUG("NOP");
14113         return;
14114     }
14115
14116     t0 = tcg_temp_new();
14117     t1 = tcg_temp_new();
14118     v1_t = tcg_temp_new();
14119     v2_t = tcg_temp_new();
14120
14121     gen_load_gpr(v1_t, v1);
14122     gen_load_gpr(v2_t, v2);
14123
14124     switch (op1) {
14125     case OPC_EXTR_W_DSP:
14126         check_dsp(ctx);
14127         switch (op2) {
14128         case OPC_EXTR_W:
14129             tcg_gen_movi_tl(t0, v2);
14130             tcg_gen_movi_tl(t1, v1);
14131             gen_helper_extr_w(cpu_gpr[ret], t0, t1, cpu_env);
14132             break;
14133         case OPC_EXTR_R_W:
14134             tcg_gen_movi_tl(t0, v2);
14135             tcg_gen_movi_tl(t1, v1);
14136             gen_helper_extr_r_w(cpu_gpr[ret], t0, t1, cpu_env);
14137             break;
14138         case OPC_EXTR_RS_W:
14139             tcg_gen_movi_tl(t0, v2);
14140             tcg_gen_movi_tl(t1, v1);
14141             gen_helper_extr_rs_w(cpu_gpr[ret], t0, t1, cpu_env);
14142             break;
14143         case OPC_EXTR_S_H:
14144             tcg_gen_movi_tl(t0, v2);
14145             tcg_gen_movi_tl(t1, v1);
14146             gen_helper_extr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
14147             break;
14148         case OPC_EXTRV_S_H:
14149             tcg_gen_movi_tl(t0, v2);
14150             gen_helper_extr_s_h(cpu_gpr[ret], t0, v1_t, cpu_env);
14151             break;
14152         case OPC_EXTRV_W:
14153             tcg_gen_movi_tl(t0, v2);
14154             gen_helper_extr_w(cpu_gpr[ret], t0, v1_t, cpu_env);
14155             break;
14156         case OPC_EXTRV_R_W:
14157             tcg_gen_movi_tl(t0, v2);
14158             gen_helper_extr_r_w(cpu_gpr[ret], t0, v1_t, cpu_env);
14159             break;
14160         case OPC_EXTRV_RS_W:
14161             tcg_gen_movi_tl(t0, v2);
14162             gen_helper_extr_rs_w(cpu_gpr[ret], t0, v1_t, cpu_env);
14163             break;
14164         case OPC_EXTP:
14165             tcg_gen_movi_tl(t0, v2);
14166             tcg_gen_movi_tl(t1, v1);
14167             gen_helper_extp(cpu_gpr[ret], t0, t1, cpu_env);
14168             break;
14169         case OPC_EXTPV:
14170             tcg_gen_movi_tl(t0, v2);
14171             gen_helper_extp(cpu_gpr[ret], t0, v1_t, cpu_env);
14172             break;
14173         case OPC_EXTPDP:
14174             tcg_gen_movi_tl(t0, v2);
14175             tcg_gen_movi_tl(t1, v1);
14176             gen_helper_extpdp(cpu_gpr[ret], t0, t1, cpu_env);
14177             break;
14178         case OPC_EXTPDPV:
14179             tcg_gen_movi_tl(t0, v2);
14180             gen_helper_extpdp(cpu_gpr[ret], t0, v1_t, cpu_env);
14181             break;
14182         case OPC_SHILO:
14183             imm = (ctx->opcode >> 20) & 0x3F;
14184             tcg_gen_movi_tl(t0, ret);
14185             tcg_gen_movi_tl(t1, imm);
14186             gen_helper_shilo(t0, t1, cpu_env);
14187             break;
14188         case OPC_SHILOV:
14189             tcg_gen_movi_tl(t0, ret);
14190             gen_helper_shilo(t0, v1_t, cpu_env);
14191             break;
14192         case OPC_MTHLIP:
14193             tcg_gen_movi_tl(t0, ret);
14194             gen_helper_mthlip(t0, v1_t, cpu_env);
14195             break;
14196         case OPC_WRDSP:
14197             imm = (ctx->opcode >> 11) & 0x3FF;
14198             tcg_gen_movi_tl(t0, imm);
14199             gen_helper_wrdsp(v1_t, t0, cpu_env);
14200             break;
14201         case OPC_RDDSP:
14202             imm = (ctx->opcode >> 16) & 0x03FF;
14203             tcg_gen_movi_tl(t0, imm);
14204             gen_helper_rddsp(cpu_gpr[ret], t0, cpu_env);
14205             break;
14206         }
14207         break;
14208 #ifdef TARGET_MIPS64
14209     case OPC_DEXTR_W_DSP:
14210         check_dsp(ctx);
14211         switch (op2) {
14212         case OPC_DMTHLIP:
14213             tcg_gen_movi_tl(t0, ret);
14214             gen_helper_dmthlip(v1_t, t0, cpu_env);
14215             break;
14216         case OPC_DSHILO:
14217             {
14218                 int shift = (ctx->opcode >> 19) & 0x7F;
14219                 int ac = (ctx->opcode >> 11) & 0x03;
14220                 tcg_gen_movi_tl(t0, shift);
14221                 tcg_gen_movi_tl(t1, ac);
14222                 gen_helper_dshilo(t0, t1, cpu_env);
14223                 break;
14224             }
14225         case OPC_DSHILOV:
14226             {
14227                 int ac = (ctx->opcode >> 11) & 0x03;
14228                 tcg_gen_movi_tl(t0, ac);
14229                 gen_helper_dshilo(v1_t, t0, cpu_env);
14230                 break;
14231             }
14232         case OPC_DEXTP:
14233             tcg_gen_movi_tl(t0, v2);
14234             tcg_gen_movi_tl(t1, v1);
14235
14236             gen_helper_dextp(cpu_gpr[ret], t0, t1, cpu_env);
14237             break;
14238         case OPC_DEXTPV:
14239             tcg_gen_movi_tl(t0, v2);
14240             gen_helper_dextp(cpu_gpr[ret], t0, v1_t, cpu_env);
14241             break;
14242         case OPC_DEXTPDP:
14243             tcg_gen_movi_tl(t0, v2);
14244             tcg_gen_movi_tl(t1, v1);
14245             gen_helper_dextpdp(cpu_gpr[ret], t0, t1, cpu_env);
14246             break;
14247         case OPC_DEXTPDPV:
14248             tcg_gen_movi_tl(t0, v2);
14249             gen_helper_dextpdp(cpu_gpr[ret], t0, v1_t, cpu_env);
14250             break;
14251         case OPC_DEXTR_L:
14252             tcg_gen_movi_tl(t0, v2);
14253             tcg_gen_movi_tl(t1, v1);
14254             gen_helper_dextr_l(cpu_gpr[ret], t0, t1, cpu_env);
14255             break;
14256         case OPC_DEXTR_R_L:
14257             tcg_gen_movi_tl(t0, v2);
14258             tcg_gen_movi_tl(t1, v1);
14259             gen_helper_dextr_r_l(cpu_gpr[ret], t0, t1, cpu_env);
14260             break;
14261         case OPC_DEXTR_RS_L:
14262             tcg_gen_movi_tl(t0, v2);
14263             tcg_gen_movi_tl(t1, v1);
14264             gen_helper_dextr_rs_l(cpu_gpr[ret], t0, t1, cpu_env);
14265             break;
14266         case OPC_DEXTR_W:
14267             tcg_gen_movi_tl(t0, v2);
14268             tcg_gen_movi_tl(t1, v1);
14269             gen_helper_dextr_w(cpu_gpr[ret], t0, t1, cpu_env);
14270             break;
14271         case OPC_DEXTR_R_W:
14272             tcg_gen_movi_tl(t0, v2);
14273             tcg_gen_movi_tl(t1, v1);
14274             gen_helper_dextr_r_w(cpu_gpr[ret], t0, t1, cpu_env);
14275             break;
14276         case OPC_DEXTR_RS_W:
14277             tcg_gen_movi_tl(t0, v2);
14278             tcg_gen_movi_tl(t1, v1);
14279             gen_helper_dextr_rs_w(cpu_gpr[ret], t0, t1, cpu_env);
14280             break;
14281         case OPC_DEXTR_S_H:
14282             tcg_gen_movi_tl(t0, v2);
14283             tcg_gen_movi_tl(t1, v1);
14284             gen_helper_dextr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
14285             break;
14286         case OPC_DEXTRV_S_H:
14287             tcg_gen_movi_tl(t0, v2);
14288             tcg_gen_movi_tl(t1, v1);
14289             gen_helper_dextr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
14290             break;
14291         case OPC_DEXTRV_L:
14292             tcg_gen_movi_tl(t0, v2);
14293             gen_helper_dextr_l(cpu_gpr[ret], t0, v1_t, cpu_env);
14294             break;
14295         case OPC_DEXTRV_R_L:
14296             tcg_gen_movi_tl(t0, v2);
14297             gen_helper_dextr_r_l(cpu_gpr[ret], t0, v1_t, cpu_env);
14298             break;
14299         case OPC_DEXTRV_RS_L:
14300             tcg_gen_movi_tl(t0, v2);
14301             gen_helper_dextr_rs_l(cpu_gpr[ret], t0, v1_t, cpu_env);
14302             break;
14303         case OPC_DEXTRV_W:
14304             tcg_gen_movi_tl(t0, v2);
14305             gen_helper_dextr_w(cpu_gpr[ret], t0, v1_t, cpu_env);
14306             break;
14307         case OPC_DEXTRV_R_W:
14308             tcg_gen_movi_tl(t0, v2);
14309             gen_helper_dextr_r_w(cpu_gpr[ret], t0, v1_t, cpu_env);
14310             break;
14311         case OPC_DEXTRV_RS_W:
14312             tcg_gen_movi_tl(t0, v2);
14313             gen_helper_dextr_rs_w(cpu_gpr[ret], t0, v1_t, cpu_env);
14314             break;
14315         }
14316         break;
14317 #endif
14318     }
14319
14320     tcg_temp_free(t0);
14321     tcg_temp_free(t1);
14322     tcg_temp_free(v1_t);
14323     tcg_temp_free(v2_t);
14324
14325     (void)opn; /* avoid a compiler warning */
14326     MIPS_DEBUG("%s", opn);
14327 }
14328
14329 /* End MIPSDSP functions. */
14330
14331 static void decode_opc (CPUMIPSState *env, DisasContext *ctx, int *is_branch)
14332 {
14333     int32_t offset;
14334     int rs, rt, rd, sa;
14335     uint32_t op, op1, op2;
14336     int16_t imm;
14337
14338     /* make sure instructions are on a word boundary */
14339     if (ctx->pc & 0x3) {
14340         env->CP0_BadVAddr = ctx->pc;
14341         generate_exception(ctx, EXCP_AdEL);
14342         return;
14343     }
14344
14345     /* Handle blikely not taken case */
14346     if ((ctx->hflags & MIPS_HFLAG_BMASK_BASE) == MIPS_HFLAG_BL) {
14347         int l1 = gen_new_label();
14348
14349         MIPS_DEBUG("blikely condition (" TARGET_FMT_lx ")", ctx->pc + 4);
14350         tcg_gen_brcondi_tl(TCG_COND_NE, bcond, 0, l1);
14351         tcg_gen_movi_i32(hflags, ctx->hflags & ~MIPS_HFLAG_BMASK);
14352         gen_goto_tb(ctx, 1, ctx->pc + 4);
14353         gen_set_label(l1);
14354     }
14355
14356     if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP | CPU_LOG_TB_OP_OPT))) {
14357         tcg_gen_debug_insn_start(ctx->pc);
14358     }
14359
14360     op = MASK_OP_MAJOR(ctx->opcode);
14361     rs = (ctx->opcode >> 21) & 0x1f;
14362     rt = (ctx->opcode >> 16) & 0x1f;
14363     rd = (ctx->opcode >> 11) & 0x1f;
14364     sa = (ctx->opcode >> 6) & 0x1f;
14365     imm = (int16_t)ctx->opcode;
14366     switch (op) {
14367     case OPC_SPECIAL:
14368         op1 = MASK_SPECIAL(ctx->opcode);
14369         switch (op1) {
14370         case OPC_SLL:          /* Shift with immediate */
14371         case OPC_SRA:
14372             gen_shift_imm(env, ctx, op1, rd, rt, sa);
14373             break;
14374         case OPC_SRL:
14375             switch ((ctx->opcode >> 21) & 0x1f) {
14376             case 1:
14377                 /* rotr is decoded as srl on non-R2 CPUs */
14378                 if (env->insn_flags & ISA_MIPS32R2) {
14379                     op1 = OPC_ROTR;
14380                 }
14381                 /* Fallthrough */
14382             case 0:
14383                 gen_shift_imm(env, ctx, op1, rd, rt, sa);
14384                 break;
14385             default:
14386                 generate_exception(ctx, EXCP_RI);
14387                 break;
14388             }
14389             break;
14390         case OPC_MOVN:         /* Conditional move */
14391         case OPC_MOVZ:
14392             check_insn(env, ctx, ISA_MIPS4 | ISA_MIPS32 |
14393                                  INSN_LOONGSON2E | INSN_LOONGSON2F);
14394             gen_cond_move(env, ctx, op1, rd, rs, rt);
14395             break;
14396         case OPC_ADD ... OPC_SUBU:
14397             gen_arith(env, ctx, op1, rd, rs, rt);
14398             break;
14399         case OPC_SLLV:         /* Shifts */
14400         case OPC_SRAV:
14401             gen_shift(env, ctx, op1, rd, rs, rt);
14402             break;
14403         case OPC_SRLV:
14404             switch ((ctx->opcode >> 6) & 0x1f) {
14405             case 1:
14406                 /* rotrv is decoded as srlv on non-R2 CPUs */
14407                 if (env->insn_flags & ISA_MIPS32R2) {
14408                     op1 = OPC_ROTRV;
14409                 }
14410                 /* Fallthrough */
14411             case 0:
14412                 gen_shift(env, ctx, op1, rd, rs, rt);
14413                 break;
14414             default:
14415                 generate_exception(ctx, EXCP_RI);
14416                 break;
14417             }
14418             break;
14419         case OPC_SLT:          /* Set on less than */
14420         case OPC_SLTU:
14421             gen_slt(env, ctx, op1, rd, rs, rt);
14422             break;
14423         case OPC_AND:          /* Logic*/
14424         case OPC_OR:
14425         case OPC_NOR:
14426         case OPC_XOR:
14427             gen_logic(env, ctx, op1, rd, rs, rt);
14428             break;
14429         case OPC_MULT ... OPC_DIVU:
14430             if (sa) {
14431                 check_insn(env, ctx, INSN_VR54XX);
14432                 op1 = MASK_MUL_VR54XX(ctx->opcode);
14433                 gen_mul_vr54xx(ctx, op1, rd, rs, rt);
14434             } else
14435                 gen_muldiv(ctx, op1, rs, rt);
14436             break;
14437         case OPC_JR ... OPC_JALR:
14438             gen_compute_branch(ctx, op1, 4, rs, rd, sa);
14439             *is_branch = 1;
14440             break;
14441         case OPC_TGE ... OPC_TEQ: /* Traps */
14442         case OPC_TNE:
14443             gen_trap(ctx, op1, rs, rt, -1);
14444             break;
14445         case OPC_MFHI:          /* Move from HI/LO */
14446         case OPC_MFLO:
14447             gen_HILO(ctx, op1, rd);
14448             break;
14449         case OPC_MTHI:
14450         case OPC_MTLO:          /* Move to HI/LO */
14451             gen_HILO(ctx, op1, rs);
14452             break;
14453         case OPC_PMON:          /* Pmon entry point, also R4010 selsl */
14454 #ifdef MIPS_STRICT_STANDARD
14455             MIPS_INVAL("PMON / selsl");
14456             generate_exception(ctx, EXCP_RI);
14457 #else
14458             gen_helper_0e0i(pmon, sa);
14459 #endif
14460             break;
14461         case OPC_SYSCALL:
14462             generate_exception(ctx, EXCP_SYSCALL);
14463             ctx->bstate = BS_STOP;
14464             break;
14465         case OPC_BREAK:
14466             generate_exception(ctx, EXCP_BREAK);
14467             break;
14468         case OPC_SPIM:
14469 #ifdef MIPS_STRICT_STANDARD
14470             MIPS_INVAL("SPIM");
14471             generate_exception(ctx, EXCP_RI);
14472 #else
14473            /* Implemented as RI exception for now. */
14474             MIPS_INVAL("spim (unofficial)");
14475             generate_exception(ctx, EXCP_RI);
14476 #endif
14477             break;
14478         case OPC_SYNC:
14479             /* Treat as NOP. */
14480             break;
14481
14482         case OPC_MOVCI:
14483             check_insn(env, ctx, ISA_MIPS4 | ISA_MIPS32);
14484             if (env->CP0_Config1 & (1 << CP0C1_FP)) {
14485                 check_cp1_enabled(ctx);
14486                 gen_movci(ctx, rd, rs, (ctx->opcode >> 18) & 0x7,
14487                           (ctx->opcode >> 16) & 1);
14488             } else {
14489                 generate_exception_err(ctx, EXCP_CpU, 1);
14490             }
14491             break;
14492
14493 #if defined(TARGET_MIPS64)
14494        /* MIPS64 specific opcodes */
14495         case OPC_DSLL:
14496         case OPC_DSRA:
14497         case OPC_DSLL32:
14498         case OPC_DSRA32:
14499             check_insn(env, ctx, ISA_MIPS3);
14500             check_mips_64(ctx);
14501             gen_shift_imm(env, ctx, op1, rd, rt, sa);
14502             break;
14503         case OPC_DSRL:
14504             switch ((ctx->opcode >> 21) & 0x1f) {
14505             case 1:
14506                 /* drotr is decoded as dsrl on non-R2 CPUs */
14507                 if (env->insn_flags & ISA_MIPS32R2) {
14508                     op1 = OPC_DROTR;
14509                 }
14510                 /* Fallthrough */
14511             case 0:
14512                 check_insn(env, ctx, ISA_MIPS3);
14513                 check_mips_64(ctx);
14514                 gen_shift_imm(env, ctx, op1, rd, rt, sa);
14515                 break;
14516             default:
14517                 generate_exception(ctx, EXCP_RI);
14518                 break;
14519             }
14520             break;
14521         case OPC_DSRL32:
14522             switch ((ctx->opcode >> 21) & 0x1f) {
14523             case 1:
14524                 /* drotr32 is decoded as dsrl32 on non-R2 CPUs */
14525                 if (env->insn_flags & ISA_MIPS32R2) {
14526                     op1 = OPC_DROTR32;
14527                 }
14528                 /* Fallthrough */
14529             case 0:
14530                 check_insn(env, ctx, ISA_MIPS3);
14531                 check_mips_64(ctx);
14532                 gen_shift_imm(env, ctx, op1, rd, rt, sa);
14533                 break;
14534             default:
14535                 generate_exception(ctx, EXCP_RI);
14536                 break;
14537             }
14538             break;
14539         case OPC_DADD ... OPC_DSUBU:
14540             check_insn(env, ctx, ISA_MIPS3);
14541             check_mips_64(ctx);
14542             gen_arith(env, ctx, op1, rd, rs, rt);
14543             break;
14544         case OPC_DSLLV:
14545         case OPC_DSRAV:
14546             check_insn(env, ctx, ISA_MIPS3);
14547             check_mips_64(ctx);
14548             gen_shift(env, ctx, op1, rd, rs, rt);
14549             break;
14550         case OPC_DSRLV:
14551             switch ((ctx->opcode >> 6) & 0x1f) {
14552             case 1:
14553                 /* drotrv is decoded as dsrlv on non-R2 CPUs */
14554                 if (env->insn_flags & ISA_MIPS32R2) {
14555                     op1 = OPC_DROTRV;
14556                 }
14557                 /* Fallthrough */
14558             case 0:
14559                 check_insn(env, ctx, ISA_MIPS3);
14560                 check_mips_64(ctx);
14561                 gen_shift(env, ctx, op1, rd, rs, rt);
14562                 break;
14563             default:
14564                 generate_exception(ctx, EXCP_RI);
14565                 break;
14566             }
14567             break;
14568         case OPC_DMULT ... OPC_DDIVU:
14569             check_insn(env, ctx, ISA_MIPS3);
14570             check_mips_64(ctx);
14571             gen_muldiv(ctx, op1, rs, rt);
14572             break;
14573 #endif
14574         default:            /* Invalid */
14575             MIPS_INVAL("special");
14576             generate_exception(ctx, EXCP_RI);
14577             break;
14578         }
14579         break;
14580     case OPC_SPECIAL2:
14581         op1 = MASK_SPECIAL2(ctx->opcode);
14582         switch (op1) {
14583         case OPC_MADD ... OPC_MADDU: /* Multiply and add/sub */
14584         case OPC_MSUB ... OPC_MSUBU:
14585             check_insn(env, ctx, ISA_MIPS32);
14586             gen_muldiv(ctx, op1, rs, rt);
14587             break;
14588         case OPC_MUL:
14589             gen_arith(env, ctx, op1, rd, rs, rt);
14590             break;
14591         case OPC_CLO:
14592         case OPC_CLZ:
14593             check_insn(env, ctx, ISA_MIPS32);
14594             gen_cl(ctx, op1, rd, rs);
14595             break;
14596         case OPC_SDBBP:
14597             /* XXX: not clear which exception should be raised
14598              *      when in debug mode...
14599              */
14600             check_insn(env, ctx, ISA_MIPS32);
14601             if (!(ctx->hflags & MIPS_HFLAG_DM)) {
14602                 generate_exception(ctx, EXCP_DBp);
14603             } else {
14604                 generate_exception(ctx, EXCP_DBp);
14605             }
14606             /* Treat as NOP. */
14607             break;
14608         case OPC_DIV_G_2F:
14609         case OPC_DIVU_G_2F:
14610         case OPC_MULT_G_2F:
14611         case OPC_MULTU_G_2F:
14612         case OPC_MOD_G_2F:
14613         case OPC_MODU_G_2F:
14614             check_insn(env, ctx, INSN_LOONGSON2F);
14615             gen_loongson_integer(ctx, op1, rd, rs, rt);
14616             break;
14617 #if defined(TARGET_MIPS64)
14618         case OPC_DCLO:
14619         case OPC_DCLZ:
14620             check_insn(env, ctx, ISA_MIPS64);
14621             check_mips_64(ctx);
14622             gen_cl(ctx, op1, rd, rs);
14623             break;
14624         case OPC_DMULT_G_2F:
14625         case OPC_DMULTU_G_2F:
14626         case OPC_DDIV_G_2F:
14627         case OPC_DDIVU_G_2F:
14628         case OPC_DMOD_G_2F:
14629         case OPC_DMODU_G_2F:
14630             check_insn(env, ctx, INSN_LOONGSON2F);
14631             gen_loongson_integer(ctx, op1, rd, rs, rt);
14632             break;
14633 #endif
14634         default:            /* Invalid */
14635             MIPS_INVAL("special2");
14636             generate_exception(ctx, EXCP_RI);
14637             break;
14638         }
14639         break;
14640     case OPC_SPECIAL3:
14641         op1 = MASK_SPECIAL3(ctx->opcode);
14642         switch (op1) {
14643         case OPC_EXT:
14644         case OPC_INS:
14645             check_insn(env, ctx, ISA_MIPS32R2);
14646             gen_bitops(ctx, op1, rt, rs, sa, rd);
14647             break;
14648         case OPC_BSHFL:
14649             check_insn(env, ctx, ISA_MIPS32R2);
14650             op2 = MASK_BSHFL(ctx->opcode);
14651             gen_bshfl(ctx, op2, rt, rd);
14652             break;
14653         case OPC_RDHWR:
14654             gen_rdhwr(env, ctx, rt, rd);
14655             break;
14656         case OPC_FORK:
14657             check_insn(env, ctx, ASE_MT);
14658             {
14659                 TCGv t0 = tcg_temp_new();
14660                 TCGv t1 = tcg_temp_new();
14661
14662                 gen_load_gpr(t0, rt);
14663                 gen_load_gpr(t1, rs);
14664                 gen_helper_fork(t0, t1);
14665                 tcg_temp_free(t0);
14666                 tcg_temp_free(t1);
14667             }
14668             break;
14669         case OPC_YIELD:
14670             check_insn(env, ctx, ASE_MT);
14671             {
14672                 TCGv t0 = tcg_temp_new();
14673
14674                 save_cpu_state(ctx, 1);
14675                 gen_load_gpr(t0, rs);
14676                 gen_helper_yield(t0, cpu_env, t0);
14677                 gen_store_gpr(t0, rd);
14678                 tcg_temp_free(t0);
14679             }
14680             break;
14681         case OPC_DIV_G_2E ... OPC_DIVU_G_2E:
14682         case OPC_MOD_G_2E ... OPC_MODU_G_2E:
14683         case OPC_MULT_G_2E ... OPC_MULTU_G_2E:
14684         /* OPC_MULT_G_2E, OPC_ADDUH_QB_DSP, OPC_MUL_PH_DSP have
14685          * the same mask and op1. */
14686             if ((env->insn_flags & ASE_DSPR2) && (op1 == OPC_MULT_G_2E)) {
14687                 op2 = MASK_ADDUH_QB(ctx->opcode);
14688                 switch (op2) {
14689                 case OPC_ADDUH_QB:
14690                 case OPC_ADDUH_R_QB:
14691                 case OPC_ADDQH_PH:
14692                 case OPC_ADDQH_R_PH:
14693                 case OPC_ADDQH_W:
14694                 case OPC_ADDQH_R_W:
14695                 case OPC_SUBUH_QB:
14696                 case OPC_SUBUH_R_QB:
14697                 case OPC_SUBQH_PH:
14698                 case OPC_SUBQH_R_PH:
14699                 case OPC_SUBQH_W:
14700                 case OPC_SUBQH_R_W:
14701                     gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
14702                     break;
14703                 case OPC_MUL_PH:
14704                 case OPC_MUL_S_PH:
14705                 case OPC_MULQ_S_W:
14706                 case OPC_MULQ_RS_W:
14707                     gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
14708                     break;
14709                 default:
14710                     MIPS_INVAL("MASK ADDUH.QB");
14711                     generate_exception(ctx, EXCP_RI);
14712                     break;
14713                 }
14714             } else if (env->insn_flags & INSN_LOONGSON2E) {
14715                 gen_loongson_integer(ctx, op1, rd, rs, rt);
14716             } else {
14717                 generate_exception(ctx, EXCP_RI);
14718             }
14719             break;
14720         case OPC_LX_DSP:
14721             op2 = MASK_LX(ctx->opcode);
14722             switch (op2) {
14723 #if defined(TARGET_MIPS64)
14724             case OPC_LDX:
14725 #endif
14726             case OPC_LBUX:
14727             case OPC_LHX:
14728             case OPC_LWX:
14729                 gen_mipsdsp_ld(env, ctx, op2, rd, rs, rt);
14730                 break;
14731             default:            /* Invalid */
14732                 MIPS_INVAL("MASK LX");
14733                 generate_exception(ctx, EXCP_RI);
14734                 break;
14735             }
14736             break;
14737         case OPC_ABSQ_S_PH_DSP:
14738             op2 = MASK_ABSQ_S_PH(ctx->opcode);
14739             switch (op2) {
14740             case OPC_ABSQ_S_QB:
14741             case OPC_ABSQ_S_PH:
14742             case OPC_ABSQ_S_W:
14743             case OPC_PRECEQ_W_PHL:
14744             case OPC_PRECEQ_W_PHR:
14745             case OPC_PRECEQU_PH_QBL:
14746             case OPC_PRECEQU_PH_QBR:
14747             case OPC_PRECEQU_PH_QBLA:
14748             case OPC_PRECEQU_PH_QBRA:
14749             case OPC_PRECEU_PH_QBL:
14750             case OPC_PRECEU_PH_QBR:
14751             case OPC_PRECEU_PH_QBLA:
14752             case OPC_PRECEU_PH_QBRA:
14753                 gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
14754                 break;
14755             case OPC_BITREV:
14756             case OPC_REPL_QB:
14757             case OPC_REPLV_QB:
14758             case OPC_REPL_PH:
14759             case OPC_REPLV_PH:
14760                 gen_mipsdsp_bitinsn(env, ctx, op1, op2, rd, rt);
14761                 break;
14762             default:
14763                 MIPS_INVAL("MASK ABSQ_S.PH");
14764                 generate_exception(ctx, EXCP_RI);
14765                 break;
14766             }
14767             break;
14768         case OPC_ADDU_QB_DSP:
14769             op2 = MASK_ADDU_QB(ctx->opcode);
14770             switch (op2) {
14771             case OPC_ADDQ_PH:
14772             case OPC_ADDQ_S_PH:
14773             case OPC_ADDQ_S_W:
14774             case OPC_ADDU_QB:
14775             case OPC_ADDU_S_QB:
14776             case OPC_ADDU_PH:
14777             case OPC_ADDU_S_PH:
14778             case OPC_SUBQ_PH:
14779             case OPC_SUBQ_S_PH:
14780             case OPC_SUBQ_S_W:
14781             case OPC_SUBU_QB:
14782             case OPC_SUBU_S_QB:
14783             case OPC_SUBU_PH:
14784             case OPC_SUBU_S_PH:
14785             case OPC_ADDSC:
14786             case OPC_ADDWC:
14787             case OPC_MODSUB:
14788             case OPC_RADDU_W_QB:
14789                 gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
14790                 break;
14791             case OPC_MULEU_S_PH_QBL:
14792             case OPC_MULEU_S_PH_QBR:
14793             case OPC_MULQ_RS_PH:
14794             case OPC_MULEQ_S_W_PHL:
14795             case OPC_MULEQ_S_W_PHR:
14796             case OPC_MULQ_S_PH:
14797                 gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
14798                 break;
14799             default:            /* Invalid */
14800                 MIPS_INVAL("MASK ADDU.QB");
14801                 generate_exception(ctx, EXCP_RI);
14802                 break;
14803
14804             }
14805             break;
14806         case OPC_CMPU_EQ_QB_DSP:
14807             op2 = MASK_CMPU_EQ_QB(ctx->opcode);
14808             switch (op2) {
14809             case OPC_PRECR_SRA_PH_W:
14810             case OPC_PRECR_SRA_R_PH_W:
14811                 gen_mipsdsp_arith(ctx, op1, op2, rt, rs, rd);
14812                 break;
14813             case OPC_PRECR_QB_PH:
14814             case OPC_PRECRQ_QB_PH:
14815             case OPC_PRECRQ_PH_W:
14816             case OPC_PRECRQ_RS_PH_W:
14817             case OPC_PRECRQU_S_QB_PH:
14818                 gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
14819                 break;
14820             case OPC_CMPU_EQ_QB:
14821             case OPC_CMPU_LT_QB:
14822             case OPC_CMPU_LE_QB:
14823             case OPC_CMP_EQ_PH:
14824             case OPC_CMP_LT_PH:
14825             case OPC_CMP_LE_PH:
14826                 gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 0);
14827                 break;
14828             case OPC_CMPGU_EQ_QB:
14829             case OPC_CMPGU_LT_QB:
14830             case OPC_CMPGU_LE_QB:
14831             case OPC_CMPGDU_EQ_QB:
14832             case OPC_CMPGDU_LT_QB:
14833             case OPC_CMPGDU_LE_QB:
14834             case OPC_PICK_QB:
14835             case OPC_PICK_PH:
14836             case OPC_PACKRL_PH:
14837                 gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 1);
14838                 break;
14839             default:            /* Invalid */
14840                 MIPS_INVAL("MASK CMPU.EQ.QB");
14841                 generate_exception(ctx, EXCP_RI);
14842                 break;
14843             }
14844             break;
14845         case OPC_SHLL_QB_DSP:
14846             gen_mipsdsp_shift(ctx, op1, rd, rs, rt);
14847             break;
14848         case OPC_DPA_W_PH_DSP:
14849             op2 = MASK_DPA_W_PH(ctx->opcode);
14850             switch (op2) {
14851             case OPC_DPAU_H_QBL:
14852             case OPC_DPAU_H_QBR:
14853             case OPC_DPSU_H_QBL:
14854             case OPC_DPSU_H_QBR:
14855             case OPC_DPA_W_PH:
14856             case OPC_DPAX_W_PH:
14857             case OPC_DPAQ_S_W_PH:
14858             case OPC_DPAQX_S_W_PH:
14859             case OPC_DPAQX_SA_W_PH:
14860             case OPC_DPS_W_PH:
14861             case OPC_DPSX_W_PH:
14862             case OPC_DPSQ_S_W_PH:
14863             case OPC_DPSQX_S_W_PH:
14864             case OPC_DPSQX_SA_W_PH:
14865             case OPC_MULSAQ_S_W_PH:
14866             case OPC_DPAQ_SA_L_W:
14867             case OPC_DPSQ_SA_L_W:
14868             case OPC_MAQ_S_W_PHL:
14869             case OPC_MAQ_S_W_PHR:
14870             case OPC_MAQ_SA_W_PHL:
14871             case OPC_MAQ_SA_W_PHR:
14872             case OPC_MULSA_W_PH:
14873                 gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
14874                 break;
14875             default:            /* Invalid */
14876                 MIPS_INVAL("MASK DPAW.PH");
14877                 generate_exception(ctx, EXCP_RI);
14878                 break;
14879             }
14880             break;
14881         case OPC_INSV_DSP:
14882             op2 = MASK_INSV(ctx->opcode);
14883             switch (op2) {
14884             case OPC_INSV:
14885                 check_dsp(ctx);
14886                 {
14887                     TCGv t0, t1;
14888
14889                     if (rt == 0) {
14890                         MIPS_DEBUG("NOP");
14891                         break;
14892                     }
14893
14894                     t0 = tcg_temp_new();
14895                     t1 = tcg_temp_new();
14896
14897                     gen_load_gpr(t0, rt);
14898                     gen_load_gpr(t1, rs);
14899
14900                     gen_helper_insv(cpu_gpr[rt], cpu_env, t1, t0);
14901
14902                     tcg_temp_free(t0);
14903                     tcg_temp_free(t1);
14904                     break;
14905                 }
14906             default:            /* Invalid */
14907                 MIPS_INVAL("MASK INSV");
14908                 generate_exception(ctx, EXCP_RI);
14909                 break;
14910             }
14911             break;
14912         case OPC_APPEND_DSP:
14913             check_dspr2(ctx);
14914             op2 = MASK_APPEND(ctx->opcode);
14915             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rt, rs, rd, 1);
14916             break;
14917         case OPC_EXTR_W_DSP:
14918             op2 = MASK_EXTR_W(ctx->opcode);
14919             switch (op2) {
14920             case OPC_EXTR_W:
14921             case OPC_EXTR_R_W:
14922             case OPC_EXTR_RS_W:
14923             case OPC_EXTR_S_H:
14924             case OPC_EXTRV_S_H:
14925             case OPC_EXTRV_W:
14926             case OPC_EXTRV_R_W:
14927             case OPC_EXTRV_RS_W:
14928             case OPC_EXTP:
14929             case OPC_EXTPV:
14930             case OPC_EXTPDP:
14931             case OPC_EXTPDPV:
14932                 gen_mipsdsp_accinsn(ctx, op1, op2, rt, rs, rd, 1);
14933                 break;
14934             case OPC_RDDSP:
14935                 gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 1);
14936                 break;
14937             case OPC_SHILO:
14938             case OPC_SHILOV:
14939             case OPC_MTHLIP:
14940             case OPC_WRDSP:
14941                 gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 0);
14942                 break;
14943             default:            /* Invalid */
14944                 MIPS_INVAL("MASK EXTR.W");
14945                 generate_exception(ctx, EXCP_RI);
14946                 break;
14947             }
14948             break;
14949 #if defined(TARGET_MIPS64)
14950         case OPC_DEXTM ... OPC_DEXT:
14951         case OPC_DINSM ... OPC_DINS:
14952             check_insn(env, ctx, ISA_MIPS64R2);
14953             check_mips_64(ctx);
14954             gen_bitops(ctx, op1, rt, rs, sa, rd);
14955             break;
14956         case OPC_DBSHFL:
14957             check_insn(env, ctx, ISA_MIPS64R2);
14958             check_mips_64(ctx);
14959             op2 = MASK_DBSHFL(ctx->opcode);
14960             gen_bshfl(ctx, op2, rt, rd);
14961             break;
14962         case OPC_DDIV_G_2E ... OPC_DDIVU_G_2E:
14963         case OPC_DMULT_G_2E ... OPC_DMULTU_G_2E:
14964         case OPC_DMOD_G_2E ... OPC_DMODU_G_2E:
14965             check_insn(env, ctx, INSN_LOONGSON2E);
14966             gen_loongson_integer(ctx, op1, rd, rs, rt);
14967             break;
14968         case OPC_ABSQ_S_QH_DSP:
14969             op2 = MASK_ABSQ_S_QH(ctx->opcode);
14970             switch (op2) {
14971             case OPC_PRECEQ_L_PWL:
14972             case OPC_PRECEQ_L_PWR:
14973             case OPC_PRECEQ_PW_QHL:
14974             case OPC_PRECEQ_PW_QHR:
14975             case OPC_PRECEQ_PW_QHLA:
14976             case OPC_PRECEQ_PW_QHRA:
14977             case OPC_PRECEQU_QH_OBL:
14978             case OPC_PRECEQU_QH_OBR:
14979             case OPC_PRECEQU_QH_OBLA:
14980             case OPC_PRECEQU_QH_OBRA:
14981             case OPC_PRECEU_QH_OBL:
14982             case OPC_PRECEU_QH_OBR:
14983             case OPC_PRECEU_QH_OBLA:
14984             case OPC_PRECEU_QH_OBRA:
14985             case OPC_ABSQ_S_OB:
14986             case OPC_ABSQ_S_PW:
14987             case OPC_ABSQ_S_QH:
14988                 gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
14989                 break;
14990             case OPC_REPL_OB:
14991             case OPC_REPL_PW:
14992             case OPC_REPL_QH:
14993             case OPC_REPLV_OB:
14994             case OPC_REPLV_PW:
14995             case OPC_REPLV_QH:
14996                 gen_mipsdsp_bitinsn(env, ctx, op1, op2, rd, rt);
14997                 break;
14998             default:            /* Invalid */
14999                 MIPS_INVAL("MASK ABSQ_S.QH");
15000                 generate_exception(ctx, EXCP_RI);
15001                 break;
15002             }
15003             break;
15004         case OPC_ADDU_OB_DSP:
15005             op2 = MASK_ADDU_OB(ctx->opcode);
15006             switch (op2) {
15007             case OPC_RADDU_L_OB:
15008             case OPC_SUBQ_PW:
15009             case OPC_SUBQ_S_PW:
15010             case OPC_SUBQ_QH:
15011             case OPC_SUBQ_S_QH:
15012             case OPC_SUBU_OB:
15013             case OPC_SUBU_S_OB:
15014             case OPC_SUBU_QH:
15015             case OPC_SUBU_S_QH:
15016             case OPC_SUBUH_OB:
15017             case OPC_SUBUH_R_OB:
15018             case OPC_ADDQ_PW:
15019             case OPC_ADDQ_S_PW:
15020             case OPC_ADDQ_QH:
15021             case OPC_ADDQ_S_QH:
15022             case OPC_ADDU_OB:
15023             case OPC_ADDU_S_OB:
15024             case OPC_ADDU_QH:
15025             case OPC_ADDU_S_QH:
15026             case OPC_ADDUH_OB:
15027             case OPC_ADDUH_R_OB:
15028                 gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
15029                 break;
15030             case OPC_MULEQ_S_PW_QHL:
15031             case OPC_MULEQ_S_PW_QHR:
15032             case OPC_MULEU_S_QH_OBL:
15033             case OPC_MULEU_S_QH_OBR:
15034             case OPC_MULQ_RS_QH:
15035                 gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
15036                 break;
15037             default:            /* Invalid */
15038                 MIPS_INVAL("MASK ADDU.OB");
15039                 generate_exception(ctx, EXCP_RI);
15040                 break;
15041             }
15042             break;
15043         case OPC_CMPU_EQ_OB_DSP:
15044             op2 = MASK_CMPU_EQ_OB(ctx->opcode);
15045             switch (op2) {
15046             case OPC_PRECR_SRA_QH_PW:
15047             case OPC_PRECR_SRA_R_QH_PW:
15048                 /* Return value is rt. */
15049                 gen_mipsdsp_arith(ctx, op1, op2, rt, rs, rd);
15050                 break;
15051             case OPC_PRECR_OB_QH:
15052             case OPC_PRECRQ_OB_QH:
15053             case OPC_PRECRQ_PW_L:
15054             case OPC_PRECRQ_QH_PW:
15055             case OPC_PRECRQ_RS_QH_PW:
15056             case OPC_PRECRQU_S_OB_QH:
15057                 gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
15058                 break;
15059             case OPC_CMPU_EQ_OB:
15060             case OPC_CMPU_LT_OB:
15061             case OPC_CMPU_LE_OB:
15062             case OPC_CMP_EQ_QH:
15063             case OPC_CMP_LT_QH:
15064             case OPC_CMP_LE_QH:
15065             case OPC_CMP_EQ_PW:
15066             case OPC_CMP_LT_PW:
15067             case OPC_CMP_LE_PW:
15068                 gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 0);
15069                 break;
15070             case OPC_CMPGDU_EQ_OB:
15071             case OPC_CMPGDU_LT_OB:
15072             case OPC_CMPGDU_LE_OB:
15073             case OPC_CMPGU_EQ_OB:
15074             case OPC_CMPGU_LT_OB:
15075             case OPC_CMPGU_LE_OB:
15076             case OPC_PACKRL_PW:
15077             case OPC_PICK_OB:
15078             case OPC_PICK_PW:
15079             case OPC_PICK_QH:
15080                 gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 1);
15081                 break;
15082             default:            /* Invalid */
15083                 MIPS_INVAL("MASK CMPU_EQ.OB");
15084                 generate_exception(ctx, EXCP_RI);
15085                 break;
15086             }
15087             break;
15088         case OPC_DAPPEND_DSP:
15089             check_dspr2(ctx);
15090             op2 = MASK_DAPPEND(ctx->opcode);
15091             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rt, rs, rd, 1);
15092             break;
15093         case OPC_DEXTR_W_DSP:
15094             op2 = MASK_DEXTR_W(ctx->opcode);
15095             switch (op2) {
15096             case OPC_DEXTP:
15097             case OPC_DEXTPDP:
15098             case OPC_DEXTPDPV:
15099             case OPC_DEXTPV:
15100             case OPC_DEXTR_L:
15101             case OPC_DEXTR_R_L:
15102             case OPC_DEXTR_RS_L:
15103             case OPC_DEXTR_W:
15104             case OPC_DEXTR_R_W:
15105             case OPC_DEXTR_RS_W:
15106             case OPC_DEXTR_S_H:
15107             case OPC_DEXTRV_L:
15108             case OPC_DEXTRV_R_L:
15109             case OPC_DEXTRV_RS_L:
15110             case OPC_DEXTRV_S_H:
15111             case OPC_DEXTRV_W:
15112             case OPC_DEXTRV_R_W:
15113             case OPC_DEXTRV_RS_W:
15114                 gen_mipsdsp_accinsn(ctx, op1, op2, rt, rs, rd, 1);
15115                 break;
15116             case OPC_DMTHLIP:
15117             case OPC_DSHILO:
15118             case OPC_DSHILOV:
15119                 gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 0);
15120                 break;
15121             default:            /* Invalid */
15122                 MIPS_INVAL("MASK EXTR.W");
15123                 generate_exception(ctx, EXCP_RI);
15124                 break;
15125             }
15126             break;
15127         case OPC_DPAQ_W_QH_DSP:
15128             op2 = MASK_DPAQ_W_QH(ctx->opcode);
15129             switch (op2) {
15130             case OPC_DPAU_H_OBL:
15131             case OPC_DPAU_H_OBR:
15132             case OPC_DPSU_H_OBL:
15133             case OPC_DPSU_H_OBR:
15134             case OPC_DPA_W_QH:
15135             case OPC_DPAQ_S_W_QH:
15136             case OPC_DPS_W_QH:
15137             case OPC_DPSQ_S_W_QH:
15138             case OPC_MULSAQ_S_W_QH:
15139             case OPC_DPAQ_SA_L_PW:
15140             case OPC_DPSQ_SA_L_PW:
15141             case OPC_MULSAQ_S_L_PW:
15142                 gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
15143                 break;
15144             case OPC_MAQ_S_W_QHLL:
15145             case OPC_MAQ_S_W_QHLR:
15146             case OPC_MAQ_S_W_QHRL:
15147             case OPC_MAQ_S_W_QHRR:
15148             case OPC_MAQ_SA_W_QHLL:
15149             case OPC_MAQ_SA_W_QHLR:
15150             case OPC_MAQ_SA_W_QHRL:
15151             case OPC_MAQ_SA_W_QHRR:
15152             case OPC_MAQ_S_L_PWL:
15153             case OPC_MAQ_S_L_PWR:
15154             case OPC_DMADD:
15155             case OPC_DMADDU:
15156             case OPC_DMSUB:
15157             case OPC_DMSUBU:
15158                 gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
15159                 break;
15160             default:            /* Invalid */
15161                 MIPS_INVAL("MASK DPAQ.W.QH");
15162                 generate_exception(ctx, EXCP_RI);
15163                 break;
15164             }
15165             break;
15166         case OPC_DINSV_DSP:
15167             op2 = MASK_INSV(ctx->opcode);
15168             switch (op2) {
15169             case OPC_DINSV:
15170                 {
15171                     TCGv t0, t1;
15172
15173                     if (rt == 0) {
15174                         MIPS_DEBUG("NOP");
15175                         break;
15176                     }
15177                     check_dsp(ctx);
15178
15179                     t0 = tcg_temp_new();
15180                     t1 = tcg_temp_new();
15181
15182                     gen_load_gpr(t0, rt);
15183                     gen_load_gpr(t1, rs);
15184
15185                     gen_helper_dinsv(cpu_gpr[rt], cpu_env, t1, t0);
15186                     break;
15187                 }
15188             default:            /* Invalid */
15189                 MIPS_INVAL("MASK DINSV");
15190                 generate_exception(ctx, EXCP_RI);
15191                 break;
15192             }
15193             break;
15194         case OPC_SHLL_OB_DSP:
15195             gen_mipsdsp_shift(ctx, op1, rd, rs, rt);
15196             break;
15197 #endif
15198         default:            /* Invalid */
15199             MIPS_INVAL("special3");
15200             generate_exception(ctx, EXCP_RI);
15201             break;
15202         }
15203         break;
15204     case OPC_REGIMM:
15205         op1 = MASK_REGIMM(ctx->opcode);
15206         switch (op1) {
15207         case OPC_BLTZ ... OPC_BGEZL: /* REGIMM branches */
15208         case OPC_BLTZAL ... OPC_BGEZALL:
15209             gen_compute_branch(ctx, op1, 4, rs, -1, imm << 2);
15210             *is_branch = 1;
15211             break;
15212         case OPC_TGEI ... OPC_TEQI: /* REGIMM traps */
15213         case OPC_TNEI:
15214             gen_trap(ctx, op1, rs, -1, imm);
15215             break;
15216         case OPC_SYNCI:
15217             check_insn(env, ctx, ISA_MIPS32R2);
15218             /* Treat as NOP. */
15219             break;
15220         case OPC_BPOSGE32:    /* MIPS DSP branch */
15221 #if defined(TARGET_MIPS64)
15222         case OPC_BPOSGE64:
15223 #endif
15224             check_dsp(ctx);
15225             gen_compute_branch(ctx, op1, 4, -1, -2, (int32_t)imm << 2);
15226             *is_branch = 1;
15227             break;
15228         default:            /* Invalid */
15229             MIPS_INVAL("regimm");
15230             generate_exception(ctx, EXCP_RI);
15231             break;
15232         }
15233         break;
15234     case OPC_CP0:
15235         check_cp0_enabled(ctx);
15236         op1 = MASK_CP0(ctx->opcode);
15237         switch (op1) {
15238         case OPC_MFC0:
15239         case OPC_MTC0:
15240         case OPC_MFTR:
15241         case OPC_MTTR:
15242 #if defined(TARGET_MIPS64)
15243         case OPC_DMFC0:
15244         case OPC_DMTC0:
15245 #endif
15246 #ifndef CONFIG_USER_ONLY
15247             gen_cp0(env, ctx, op1, rt, rd);
15248 #endif /* !CONFIG_USER_ONLY */
15249             break;
15250         case OPC_C0_FIRST ... OPC_C0_LAST:
15251 #ifndef CONFIG_USER_ONLY
15252             gen_cp0(env, ctx, MASK_C0(ctx->opcode), rt, rd);
15253 #endif /* !CONFIG_USER_ONLY */
15254             break;
15255         case OPC_MFMC0:
15256 #ifndef CONFIG_USER_ONLY
15257             {
15258                 TCGv t0 = tcg_temp_new();
15259
15260                 op2 = MASK_MFMC0(ctx->opcode);
15261                 switch (op2) {
15262                 case OPC_DMT:
15263                     check_insn(env, ctx, ASE_MT);
15264                     gen_helper_dmt(t0);
15265                     gen_store_gpr(t0, rt);
15266                     break;
15267                 case OPC_EMT:
15268                     check_insn(env, ctx, ASE_MT);
15269                     gen_helper_emt(t0);
15270                     gen_store_gpr(t0, rt);
15271                     break;
15272                 case OPC_DVPE:
15273                     check_insn(env, ctx, ASE_MT);
15274                     gen_helper_dvpe(t0, cpu_env);
15275                     gen_store_gpr(t0, rt);
15276                     break;
15277                 case OPC_EVPE:
15278                     check_insn(env, ctx, ASE_MT);
15279                     gen_helper_evpe(t0, cpu_env);
15280                     gen_store_gpr(t0, rt);
15281                     break;
15282                 case OPC_DI:
15283                     check_insn(env, ctx, ISA_MIPS32R2);
15284                     save_cpu_state(ctx, 1);
15285                     gen_helper_di(t0, cpu_env);
15286                     gen_store_gpr(t0, rt);
15287                     /* Stop translation as we may have switched the execution mode */
15288                     ctx->bstate = BS_STOP;
15289                     break;
15290                 case OPC_EI:
15291                     check_insn(env, ctx, ISA_MIPS32R2);
15292                     save_cpu_state(ctx, 1);
15293                     gen_helper_ei(t0, cpu_env);
15294                     gen_store_gpr(t0, rt);
15295                     /* Stop translation as we may have switched the execution mode */
15296                     ctx->bstate = BS_STOP;
15297                     break;
15298                 default:            /* Invalid */
15299                     MIPS_INVAL("mfmc0");
15300                     generate_exception(ctx, EXCP_RI);
15301                     break;
15302                 }
15303                 tcg_temp_free(t0);
15304             }
15305 #endif /* !CONFIG_USER_ONLY */
15306             break;
15307         case OPC_RDPGPR:
15308             check_insn(env, ctx, ISA_MIPS32R2);
15309             gen_load_srsgpr(rt, rd);
15310             break;
15311         case OPC_WRPGPR:
15312             check_insn(env, ctx, ISA_MIPS32R2);
15313             gen_store_srsgpr(rt, rd);
15314             break;
15315         default:
15316             MIPS_INVAL("cp0");
15317             generate_exception(ctx, EXCP_RI);
15318             break;
15319         }
15320         break;
15321     case OPC_ADDI: /* Arithmetic with immediate opcode */
15322     case OPC_ADDIU:
15323          gen_arith_imm(env, ctx, op, rt, rs, imm);
15324          break;
15325     case OPC_SLTI: /* Set on less than with immediate opcode */
15326     case OPC_SLTIU:
15327          gen_slt_imm(env, ctx, op, rt, rs, imm);
15328          break;
15329     case OPC_ANDI: /* Arithmetic with immediate opcode */
15330     case OPC_LUI:
15331     case OPC_ORI:
15332     case OPC_XORI:
15333          gen_logic_imm(env, ctx, op, rt, rs, imm);
15334          break;
15335     case OPC_J ... OPC_JAL: /* Jump */
15336          offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
15337          gen_compute_branch(ctx, op, 4, rs, rt, offset);
15338          *is_branch = 1;
15339          break;
15340     case OPC_BEQ ... OPC_BGTZ: /* Branch */
15341     case OPC_BEQL ... OPC_BGTZL:
15342          gen_compute_branch(ctx, op, 4, rs, rt, imm << 2);
15343          *is_branch = 1;
15344          break;
15345     case OPC_LB ... OPC_LWR: /* Load and stores */
15346     case OPC_LL:
15347          gen_ld(env, ctx, op, rt, rs, imm);
15348          break;
15349     case OPC_SB ... OPC_SW:
15350     case OPC_SWR:
15351          gen_st(ctx, op, rt, rs, imm);
15352          break;
15353     case OPC_SC:
15354          gen_st_cond(ctx, op, rt, rs, imm);
15355          break;
15356     case OPC_CACHE:
15357         check_cp0_enabled(ctx);
15358         check_insn(env, ctx, ISA_MIPS3 | ISA_MIPS32);
15359         /* Treat as NOP. */
15360         break;
15361     case OPC_PREF:
15362         check_insn(env, ctx, ISA_MIPS4 | ISA_MIPS32);
15363         /* Treat as NOP. */
15364         break;
15365
15366     /* Floating point (COP1). */
15367     case OPC_LWC1:
15368     case OPC_LDC1:
15369     case OPC_SWC1:
15370     case OPC_SDC1:
15371         gen_cop1_ldst(env, ctx, op, rt, rs, imm);
15372         break;
15373
15374     case OPC_CP1:
15375         if (env->CP0_Config1 & (1 << CP0C1_FP)) {
15376             check_cp1_enabled(ctx);
15377             op1 = MASK_CP1(ctx->opcode);
15378             switch (op1) {
15379             case OPC_MFHC1:
15380             case OPC_MTHC1:
15381                 check_insn(env, ctx, ISA_MIPS32R2);
15382             case OPC_MFC1:
15383             case OPC_CFC1:
15384             case OPC_MTC1:
15385             case OPC_CTC1:
15386                 gen_cp1(ctx, op1, rt, rd);
15387                 break;
15388 #if defined(TARGET_MIPS64)
15389             case OPC_DMFC1:
15390             case OPC_DMTC1:
15391                 check_insn(env, ctx, ISA_MIPS3);
15392                 gen_cp1(ctx, op1, rt, rd);
15393                 break;
15394 #endif
15395             case OPC_BC1ANY2:
15396             case OPC_BC1ANY4:
15397                 check_cop1x(ctx);
15398                 check_insn(env, ctx, ASE_MIPS3D);
15399                 /* fall through */
15400             case OPC_BC1:
15401                 gen_compute_branch1(env, ctx, MASK_BC1(ctx->opcode),
15402                                     (rt >> 2) & 0x7, imm << 2);
15403                 *is_branch = 1;
15404                 break;
15405             case OPC_S_FMT:
15406             case OPC_D_FMT:
15407             case OPC_W_FMT:
15408             case OPC_L_FMT:
15409             case OPC_PS_FMT:
15410                 gen_farith(ctx, ctx->opcode & FOP(0x3f, 0x1f), rt, rd, sa,
15411                            (imm >> 8) & 0x7);
15412                 break;
15413             default:
15414                 MIPS_INVAL("cp1");
15415                 generate_exception (ctx, EXCP_RI);
15416                 break;
15417             }
15418         } else {
15419             generate_exception_err(ctx, EXCP_CpU, 1);
15420         }
15421         break;
15422
15423     /* COP2.  */
15424     case OPC_LWC2:
15425     case OPC_LDC2:
15426     case OPC_SWC2:
15427     case OPC_SDC2:
15428         /* COP2: Not implemented. */
15429         generate_exception_err(ctx, EXCP_CpU, 2);
15430         break;
15431     case OPC_CP2:
15432         check_insn(env, ctx, INSN_LOONGSON2F);
15433         /* Note that these instructions use different fields.  */
15434         gen_loongson_multimedia(ctx, sa, rd, rt);
15435         break;
15436
15437     case OPC_CP3:
15438         if (env->CP0_Config1 & (1 << CP0C1_FP)) {
15439             check_cp1_enabled(ctx);
15440             op1 = MASK_CP3(ctx->opcode);
15441             switch (op1) {
15442             case OPC_LWXC1:
15443             case OPC_LDXC1:
15444             case OPC_LUXC1:
15445             case OPC_SWXC1:
15446             case OPC_SDXC1:
15447             case OPC_SUXC1:
15448                 gen_flt3_ldst(ctx, op1, sa, rd, rs, rt);
15449                 break;
15450             case OPC_PREFX:
15451                 /* Treat as NOP. */
15452                 break;
15453             case OPC_ALNV_PS:
15454             case OPC_MADD_S:
15455             case OPC_MADD_D:
15456             case OPC_MADD_PS:
15457             case OPC_MSUB_S:
15458             case OPC_MSUB_D:
15459             case OPC_MSUB_PS:
15460             case OPC_NMADD_S:
15461             case OPC_NMADD_D:
15462             case OPC_NMADD_PS:
15463             case OPC_NMSUB_S:
15464             case OPC_NMSUB_D:
15465             case OPC_NMSUB_PS:
15466                 gen_flt3_arith(ctx, op1, sa, rs, rd, rt);
15467                 break;
15468             default:
15469                 MIPS_INVAL("cp3");
15470                 generate_exception (ctx, EXCP_RI);
15471                 break;
15472             }
15473         } else {
15474             generate_exception_err(ctx, EXCP_CpU, 1);
15475         }
15476         break;
15477
15478 #if defined(TARGET_MIPS64)
15479     /* MIPS64 opcodes */
15480     case OPC_LWU:
15481     case OPC_LDL ... OPC_LDR:
15482     case OPC_LLD:
15483     case OPC_LD:
15484         check_insn(env, ctx, ISA_MIPS3);
15485         check_mips_64(ctx);
15486         gen_ld(env, ctx, op, rt, rs, imm);
15487         break;
15488     case OPC_SDL ... OPC_SDR:
15489     case OPC_SD:
15490         check_insn(env, ctx, ISA_MIPS3);
15491         check_mips_64(ctx);
15492         gen_st(ctx, op, rt, rs, imm);
15493         break;
15494     case OPC_SCD:
15495         check_insn(env, ctx, ISA_MIPS3);
15496         check_mips_64(ctx);
15497         gen_st_cond(ctx, op, rt, rs, imm);
15498         break;
15499     case OPC_DADDI:
15500     case OPC_DADDIU:
15501         check_insn(env, ctx, ISA_MIPS3);
15502         check_mips_64(ctx);
15503         gen_arith_imm(env, ctx, op, rt, rs, imm);
15504         break;
15505 #endif
15506     case OPC_JALX:
15507         check_insn(env, ctx, ASE_MIPS16 | ASE_MICROMIPS);
15508         offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
15509         gen_compute_branch(ctx, op, 4, rs, rt, offset);
15510         *is_branch = 1;
15511         break;
15512     case OPC_MDMX:
15513         check_insn(env, ctx, ASE_MDMX);
15514         /* MDMX: Not implemented. */
15515     default:            /* Invalid */
15516         MIPS_INVAL("major opcode");
15517         generate_exception(ctx, EXCP_RI);
15518         break;
15519     }
15520 }
15521
15522 static inline void
15523 gen_intermediate_code_internal (CPUMIPSState *env, TranslationBlock *tb,
15524                                 int search_pc)
15525 {
15526     DisasContext ctx;
15527     target_ulong pc_start;
15528     uint16_t *gen_opc_end;
15529     CPUBreakpoint *bp;
15530     int j, lj = -1;
15531     int num_insns;
15532     int max_insns;
15533     int insn_bytes;
15534     int is_branch;
15535
15536     if (search_pc)
15537         qemu_log("search pc %d\n", search_pc);
15538
15539     pc_start = tb->pc;
15540     gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
15541     ctx.pc = pc_start;
15542     ctx.saved_pc = -1;
15543     ctx.singlestep_enabled = env->singlestep_enabled;
15544     ctx.tb = tb;
15545     ctx.bstate = BS_NONE;
15546     /* Restore delay slot state from the tb context.  */
15547     ctx.hflags = (uint32_t)tb->flags; /* FIXME: maybe use 64 bits here? */
15548     restore_cpu_state(env, &ctx);
15549 #ifdef CONFIG_USER_ONLY
15550         ctx.mem_idx = MIPS_HFLAG_UM;
15551 #else
15552         ctx.mem_idx = ctx.hflags & MIPS_HFLAG_KSU;
15553 #endif
15554     num_insns = 0;
15555     max_insns = tb->cflags & CF_COUNT_MASK;
15556     if (max_insns == 0)
15557         max_insns = CF_COUNT_MASK;
15558     LOG_DISAS("\ntb %p idx %d hflags %04x\n", tb, ctx.mem_idx, ctx.hflags);
15559     gen_icount_start();
15560     while (ctx.bstate == BS_NONE) {
15561         if (unlikely(!QTAILQ_EMPTY(&env->breakpoints))) {
15562             QTAILQ_FOREACH(bp, &env->breakpoints, entry) {
15563                 if (bp->pc == ctx.pc) {
15564                     save_cpu_state(&ctx, 1);
15565                     ctx.bstate = BS_BRANCH;
15566                     gen_helper_0e0i(raise_exception, EXCP_DEBUG);
15567                     /* Include the breakpoint location or the tb won't
15568                      * be flushed when it must be.  */
15569                     ctx.pc += 4;
15570                     goto done_generating;
15571                 }
15572             }
15573         }
15574
15575         if (search_pc) {
15576             j = gen_opc_ptr - gen_opc_buf;
15577             if (lj < j) {
15578                 lj++;
15579                 while (lj < j)
15580                     gen_opc_instr_start[lj++] = 0;
15581             }
15582             gen_opc_pc[lj] = ctx.pc;
15583             gen_opc_hflags[lj] = ctx.hflags & MIPS_HFLAG_BMASK;
15584             gen_opc_instr_start[lj] = 1;
15585             gen_opc_icount[lj] = num_insns;
15586         }
15587         if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO))
15588             gen_io_start();
15589
15590         is_branch = 0;
15591         if (!(ctx.hflags & MIPS_HFLAG_M16)) {
15592             ctx.opcode = cpu_ldl_code(env, ctx.pc);
15593             insn_bytes = 4;
15594             decode_opc(env, &ctx, &is_branch);
15595         } else if (env->insn_flags & ASE_MICROMIPS) {
15596             ctx.opcode = cpu_lduw_code(env, ctx.pc);
15597             insn_bytes = decode_micromips_opc(env, &ctx, &is_branch);
15598         } else if (env->insn_flags & ASE_MIPS16) {
15599             ctx.opcode = cpu_lduw_code(env, ctx.pc);
15600             insn_bytes = decode_mips16_opc(env, &ctx, &is_branch);
15601         } else {
15602             generate_exception(&ctx, EXCP_RI);
15603             ctx.bstate = BS_STOP;
15604             break;
15605         }
15606         if (!is_branch) {
15607             handle_delay_slot(env, &ctx, insn_bytes);
15608         }
15609         ctx.pc += insn_bytes;
15610
15611         num_insns++;
15612
15613         /* Execute a branch and its delay slot as a single instruction.
15614            This is what GDB expects and is consistent with what the
15615            hardware does (e.g. if a delay slot instruction faults, the
15616            reported PC is the PC of the branch).  */
15617         if (env->singlestep_enabled && (ctx.hflags & MIPS_HFLAG_BMASK) == 0)
15618             break;
15619
15620         if ((ctx.pc & (TARGET_PAGE_SIZE - 1)) == 0)
15621             break;
15622
15623         if (gen_opc_ptr >= gen_opc_end)
15624             break;
15625
15626         if (num_insns >= max_insns)
15627             break;
15628
15629         if (singlestep)
15630             break;
15631     }
15632     if (tb->cflags & CF_LAST_IO)
15633         gen_io_end();
15634     if (env->singlestep_enabled && ctx.bstate != BS_BRANCH) {
15635         save_cpu_state(&ctx, ctx.bstate == BS_NONE);
15636         gen_helper_0e0i(raise_exception, EXCP_DEBUG);
15637     } else {
15638         switch (ctx.bstate) {
15639         case BS_STOP:
15640             gen_goto_tb(&ctx, 0, ctx.pc);
15641             break;
15642         case BS_NONE:
15643             save_cpu_state(&ctx, 0);
15644             gen_goto_tb(&ctx, 0, ctx.pc);
15645             break;
15646         case BS_EXCP:
15647             tcg_gen_exit_tb(0);
15648             break;
15649         case BS_BRANCH:
15650         default:
15651             break;
15652         }
15653     }
15654 done_generating:
15655     gen_icount_end(tb, num_insns);
15656     *gen_opc_ptr = INDEX_op_end;
15657     if (search_pc) {
15658         j = gen_opc_ptr - gen_opc_buf;
15659         lj++;
15660         while (lj <= j)
15661             gen_opc_instr_start[lj++] = 0;
15662     } else {
15663         tb->size = ctx.pc - pc_start;
15664         tb->icount = num_insns;
15665     }
15666 #ifdef DEBUG_DISAS
15667     LOG_DISAS("\n");
15668     if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)) {
15669         qemu_log("IN: %s\n", lookup_symbol(pc_start));
15670         log_target_disas(pc_start, ctx.pc - pc_start, 0);
15671         qemu_log("\n");
15672     }
15673 #endif
15674 }
15675
15676 void gen_intermediate_code (CPUMIPSState *env, struct TranslationBlock *tb)
15677 {
15678     gen_intermediate_code_internal(env, tb, 0);
15679 }
15680
15681 void gen_intermediate_code_pc (CPUMIPSState *env, struct TranslationBlock *tb)
15682 {
15683     gen_intermediate_code_internal(env, tb, 1);
15684 }
15685
15686 static void fpu_dump_state(CPUMIPSState *env, FILE *f, fprintf_function fpu_fprintf,
15687                            int flags)
15688 {
15689     int i;
15690     int is_fpu64 = !!(env->hflags & MIPS_HFLAG_F64);
15691
15692 #define printfpr(fp)                                                    \
15693     do {                                                                \
15694         if (is_fpu64)                                                   \
15695             fpu_fprintf(f, "w:%08x d:%016" PRIx64                       \
15696                         " fd:%13g fs:%13g psu: %13g\n",                 \
15697                         (fp)->w[FP_ENDIAN_IDX], (fp)->d,                \
15698                         (double)(fp)->fd,                               \
15699                         (double)(fp)->fs[FP_ENDIAN_IDX],                \
15700                         (double)(fp)->fs[!FP_ENDIAN_IDX]);              \
15701         else {                                                          \
15702             fpr_t tmp;                                                  \
15703             tmp.w[FP_ENDIAN_IDX] = (fp)->w[FP_ENDIAN_IDX];              \
15704             tmp.w[!FP_ENDIAN_IDX] = ((fp) + 1)->w[FP_ENDIAN_IDX];       \
15705             fpu_fprintf(f, "w:%08x d:%016" PRIx64                       \
15706                         " fd:%13g fs:%13g psu:%13g\n",                  \
15707                         tmp.w[FP_ENDIAN_IDX], tmp.d,                    \
15708                         (double)tmp.fd,                                 \
15709                         (double)tmp.fs[FP_ENDIAN_IDX],                  \
15710                         (double)tmp.fs[!FP_ENDIAN_IDX]);                \
15711         }                                                               \
15712     } while(0)
15713
15714
15715     fpu_fprintf(f, "CP1 FCR0 0x%08x  FCR31 0x%08x  SR.FR %d  fp_status 0x%02x\n",
15716                 env->active_fpu.fcr0, env->active_fpu.fcr31, is_fpu64,
15717                 get_float_exception_flags(&env->active_fpu.fp_status));
15718     for (i = 0; i < 32; (is_fpu64) ? i++ : (i += 2)) {
15719         fpu_fprintf(f, "%3s: ", fregnames[i]);
15720         printfpr(&env->active_fpu.fpr[i]);
15721     }
15722
15723 #undef printfpr
15724 }
15725
15726 #if defined(TARGET_MIPS64) && defined(MIPS_DEBUG_SIGN_EXTENSIONS)
15727 /* Debug help: The architecture requires 32bit code to maintain proper
15728    sign-extended values on 64bit machines.  */
15729
15730 #define SIGN_EXT_P(val) ((((val) & ~0x7fffffff) == 0) || (((val) & ~0x7fffffff) == ~0x7fffffff))
15731
15732 static void
15733 cpu_mips_check_sign_extensions (CPUMIPSState *env, FILE *f,
15734                                 fprintf_function cpu_fprintf,
15735                                 int flags)
15736 {
15737     int i;
15738
15739     if (!SIGN_EXT_P(env->active_tc.PC))
15740         cpu_fprintf(f, "BROKEN: pc=0x" TARGET_FMT_lx "\n", env->active_tc.PC);
15741     if (!SIGN_EXT_P(env->active_tc.HI[0]))
15742         cpu_fprintf(f, "BROKEN: HI=0x" TARGET_FMT_lx "\n", env->active_tc.HI[0]);
15743     if (!SIGN_EXT_P(env->active_tc.LO[0]))
15744         cpu_fprintf(f, "BROKEN: LO=0x" TARGET_FMT_lx "\n", env->active_tc.LO[0]);
15745     if (!SIGN_EXT_P(env->btarget))
15746         cpu_fprintf(f, "BROKEN: btarget=0x" TARGET_FMT_lx "\n", env->btarget);
15747
15748     for (i = 0; i < 32; i++) {
15749         if (!SIGN_EXT_P(env->active_tc.gpr[i]))
15750             cpu_fprintf(f, "BROKEN: %s=0x" TARGET_FMT_lx "\n", regnames[i], env->active_tc.gpr[i]);
15751     }
15752
15753     if (!SIGN_EXT_P(env->CP0_EPC))
15754         cpu_fprintf(f, "BROKEN: EPC=0x" TARGET_FMT_lx "\n", env->CP0_EPC);
15755     if (!SIGN_EXT_P(env->lladdr))
15756         cpu_fprintf(f, "BROKEN: LLAddr=0x" TARGET_FMT_lx "\n", env->lladdr);
15757 }
15758 #endif
15759
15760 void cpu_dump_state (CPUMIPSState *env, FILE *f, fprintf_function cpu_fprintf,
15761                      int flags)
15762 {
15763     int i;
15764
15765     cpu_fprintf(f, "pc=0x" TARGET_FMT_lx " HI=0x" TARGET_FMT_lx
15766                 " LO=0x" TARGET_FMT_lx " ds %04x "
15767                 TARGET_FMT_lx " " TARGET_FMT_ld "\n",
15768                 env->active_tc.PC, env->active_tc.HI[0], env->active_tc.LO[0],
15769                 env->hflags, env->btarget, env->bcond);
15770     for (i = 0; i < 32; i++) {
15771         if ((i & 3) == 0)
15772             cpu_fprintf(f, "GPR%02d:", i);
15773         cpu_fprintf(f, " %s " TARGET_FMT_lx, regnames[i], env->active_tc.gpr[i]);
15774         if ((i & 3) == 3)
15775             cpu_fprintf(f, "\n");
15776     }
15777
15778     cpu_fprintf(f, "CP0 Status  0x%08x Cause   0x%08x EPC    0x" TARGET_FMT_lx "\n",
15779                 env->CP0_Status, env->CP0_Cause, env->CP0_EPC);
15780     cpu_fprintf(f, "    Config0 0x%08x Config1 0x%08x LLAddr 0x" TARGET_FMT_lx "\n",
15781                 env->CP0_Config0, env->CP0_Config1, env->lladdr);
15782     if (env->hflags & MIPS_HFLAG_FPU)
15783         fpu_dump_state(env, f, cpu_fprintf, flags);
15784 #if defined(TARGET_MIPS64) && defined(MIPS_DEBUG_SIGN_EXTENSIONS)
15785     cpu_mips_check_sign_extensions(env, f, cpu_fprintf, flags);
15786 #endif
15787 }
15788
15789 static void mips_tcg_init(void)
15790 {
15791     int i;
15792     static int inited;
15793
15794     /* Initialize various static tables. */
15795     if (inited)
15796         return;
15797
15798     cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env");
15799     TCGV_UNUSED(cpu_gpr[0]);
15800     for (i = 1; i < 32; i++)
15801         cpu_gpr[i] = tcg_global_mem_new(TCG_AREG0,
15802                                         offsetof(CPUMIPSState, active_tc.gpr[i]),
15803                                         regnames[i]);
15804
15805     for (i = 0; i < 32; i++) {
15806         int off = offsetof(CPUMIPSState, active_fpu.fpr[i]);
15807         fpu_f64[i] = tcg_global_mem_new_i64(TCG_AREG0, off, fregnames[i]);
15808     }
15809
15810     cpu_PC = tcg_global_mem_new(TCG_AREG0,
15811                                 offsetof(CPUMIPSState, active_tc.PC), "PC");
15812     for (i = 0; i < MIPS_DSP_ACC; i++) {
15813         cpu_HI[i] = tcg_global_mem_new(TCG_AREG0,
15814                                        offsetof(CPUMIPSState, active_tc.HI[i]),
15815                                        regnames_HI[i]);
15816         cpu_LO[i] = tcg_global_mem_new(TCG_AREG0,
15817                                        offsetof(CPUMIPSState, active_tc.LO[i]),
15818                                        regnames_LO[i]);
15819         cpu_ACX[i] = tcg_global_mem_new(TCG_AREG0,
15820                                         offsetof(CPUMIPSState, active_tc.ACX[i]),
15821                                         regnames_ACX[i]);
15822     }
15823     cpu_dspctrl = tcg_global_mem_new(TCG_AREG0,
15824                                      offsetof(CPUMIPSState, active_tc.DSPControl),
15825                                      "DSPControl");
15826     bcond = tcg_global_mem_new(TCG_AREG0,
15827                                offsetof(CPUMIPSState, bcond), "bcond");
15828     btarget = tcg_global_mem_new(TCG_AREG0,
15829                                  offsetof(CPUMIPSState, btarget), "btarget");
15830     hflags = tcg_global_mem_new_i32(TCG_AREG0,
15831                                     offsetof(CPUMIPSState, hflags), "hflags");
15832
15833     fpu_fcr0 = tcg_global_mem_new_i32(TCG_AREG0,
15834                                       offsetof(CPUMIPSState, active_fpu.fcr0),
15835                                       "fcr0");
15836     fpu_fcr31 = tcg_global_mem_new_i32(TCG_AREG0,
15837                                        offsetof(CPUMIPSState, active_fpu.fcr31),
15838                                        "fcr31");
15839
15840     /* register helpers */
15841 #define GEN_HELPER 2
15842 #include "helper.h"
15843
15844     inited = 1;
15845 }
15846
15847 #include "translate_init.c"
15848
15849 MIPSCPU *cpu_mips_init(const char *cpu_model)
15850 {
15851     MIPSCPU *cpu;
15852     CPUMIPSState *env;
15853     const mips_def_t *def;
15854
15855     def = cpu_mips_find_by_name(cpu_model);
15856     if (!def)
15857         return NULL;
15858     cpu = MIPS_CPU(object_new(TYPE_MIPS_CPU));
15859     env = &cpu->env;
15860     env->cpu_model = def;
15861     env->cpu_model_str = cpu_model;
15862
15863 #ifndef CONFIG_USER_ONLY
15864     mmu_init(env, def);
15865 #endif
15866     fpu_init(env, def);
15867     mvp_init(env, def);
15868     mips_tcg_init();
15869     cpu_reset(CPU(cpu));
15870     qemu_init_vcpu(env);
15871     return cpu;
15872 }
15873
15874 void cpu_state_reset(CPUMIPSState *env)
15875 {
15876     if (qemu_loglevel_mask(CPU_LOG_RESET)) {
15877         qemu_log("CPU Reset (CPU %d)\n", env->cpu_index);
15878         log_cpu_state(env, 0);
15879     }
15880
15881     memset(env, 0, offsetof(CPUMIPSState, breakpoints));
15882     tlb_flush(env, 1);
15883
15884     /* Reset registers to their default values */
15885     env->CP0_PRid = env->cpu_model->CP0_PRid;
15886     env->CP0_Config0 = env->cpu_model->CP0_Config0;
15887 #ifdef TARGET_WORDS_BIGENDIAN
15888     env->CP0_Config0 |= (1 << CP0C0_BE);
15889 #endif
15890     env->CP0_Config1 = env->cpu_model->CP0_Config1;
15891     env->CP0_Config2 = env->cpu_model->CP0_Config2;
15892     env->CP0_Config3 = env->cpu_model->CP0_Config3;
15893     env->CP0_Config6 = env->cpu_model->CP0_Config6;
15894     env->CP0_Config7 = env->cpu_model->CP0_Config7;
15895     env->CP0_LLAddr_rw_bitmask = env->cpu_model->CP0_LLAddr_rw_bitmask
15896                                  << env->cpu_model->CP0_LLAddr_shift;
15897     env->CP0_LLAddr_shift = env->cpu_model->CP0_LLAddr_shift;
15898     env->SYNCI_Step = env->cpu_model->SYNCI_Step;
15899     env->CCRes = env->cpu_model->CCRes;
15900     env->CP0_Status_rw_bitmask = env->cpu_model->CP0_Status_rw_bitmask;
15901     env->CP0_TCStatus_rw_bitmask = env->cpu_model->CP0_TCStatus_rw_bitmask;
15902     env->CP0_SRSCtl = env->cpu_model->CP0_SRSCtl;
15903     env->current_tc = 0;
15904     env->SEGBITS = env->cpu_model->SEGBITS;
15905     env->SEGMask = (target_ulong)((1ULL << env->cpu_model->SEGBITS) - 1);
15906 #if defined(TARGET_MIPS64)
15907     if (env->cpu_model->insn_flags & ISA_MIPS3) {
15908         env->SEGMask |= 3ULL << 62;
15909     }
15910 #endif
15911     env->PABITS = env->cpu_model->PABITS;
15912     env->PAMask = (target_ulong)((1ULL << env->cpu_model->PABITS) - 1);
15913     env->CP0_SRSConf0_rw_bitmask = env->cpu_model->CP0_SRSConf0_rw_bitmask;
15914     env->CP0_SRSConf0 = env->cpu_model->CP0_SRSConf0;
15915     env->CP0_SRSConf1_rw_bitmask = env->cpu_model->CP0_SRSConf1_rw_bitmask;
15916     env->CP0_SRSConf1 = env->cpu_model->CP0_SRSConf1;
15917     env->CP0_SRSConf2_rw_bitmask = env->cpu_model->CP0_SRSConf2_rw_bitmask;
15918     env->CP0_SRSConf2 = env->cpu_model->CP0_SRSConf2;
15919     env->CP0_SRSConf3_rw_bitmask = env->cpu_model->CP0_SRSConf3_rw_bitmask;
15920     env->CP0_SRSConf3 = env->cpu_model->CP0_SRSConf3;
15921     env->CP0_SRSConf4_rw_bitmask = env->cpu_model->CP0_SRSConf4_rw_bitmask;
15922     env->CP0_SRSConf4 = env->cpu_model->CP0_SRSConf4;
15923     env->active_fpu.fcr0 = env->cpu_model->CP1_fcr0;
15924     env->insn_flags = env->cpu_model->insn_flags;
15925
15926 #if defined(CONFIG_USER_ONLY)
15927     env->CP0_Status = (MIPS_HFLAG_UM << CP0St_KSU);
15928     /* Enable access to the CPUNum, SYNCI_Step, CC, and CCRes RDHWR
15929        hardware registers.  */
15930     env->CP0_HWREna |= 0x0000000F;
15931     if (env->CP0_Config1 & (1 << CP0C1_FP)) {
15932         env->CP0_Status |= (1 << CP0St_CU1);
15933     }
15934     if (env->cpu_model->insn_flags & ASE_DSPR2) {
15935         env->hflags |= MIPS_HFLAG_DSP | MIPS_HFLAG_DSPR2;
15936     } else if (env->cpu_model->insn_flags & ASE_DSP) {
15937         env->hflags |= MIPS_HFLAG_DSP;
15938     }
15939 #else
15940     if (env->hflags & MIPS_HFLAG_BMASK) {
15941         /* If the exception was raised from a delay slot,
15942            come back to the jump.  */
15943         env->CP0_ErrorEPC = env->active_tc.PC - 4;
15944     } else {
15945         env->CP0_ErrorEPC = env->active_tc.PC;
15946     }
15947     env->active_tc.PC = (int32_t)0xBFC00000;
15948     env->CP0_Random = env->tlb->nb_tlb - 1;
15949     env->tlb->tlb_in_use = env->tlb->nb_tlb;
15950     env->CP0_Wired = 0;
15951     env->CP0_EBase = 0x80000000 | (env->cpu_index & 0x3FF);
15952     env->CP0_Status = (1 << CP0St_BEV) | (1 << CP0St_ERL);
15953     /* vectored interrupts not implemented, timer on int 7,
15954        no performance counters. */
15955     env->CP0_IntCtl = 0xe0000000;
15956     {
15957         int i;
15958
15959         for (i = 0; i < 7; i++) {
15960             env->CP0_WatchLo[i] = 0;
15961             env->CP0_WatchHi[i] = 0x80000000;
15962         }
15963         env->CP0_WatchLo[7] = 0;
15964         env->CP0_WatchHi[7] = 0;
15965     }
15966     /* Count register increments in debug mode, EJTAG version 1 */
15967     env->CP0_Debug = (1 << CP0DB_CNT) | (0x1 << CP0DB_VER);
15968
15969     if (env->CP0_Config3 & (1 << CP0C3_MT)) {
15970         int i;
15971
15972         /* Only TC0 on VPE 0 starts as active.  */
15973         for (i = 0; i < ARRAY_SIZE(env->tcs); i++) {
15974             env->tcs[i].CP0_TCBind = env->cpu_index << CP0TCBd_CurVPE;
15975             env->tcs[i].CP0_TCHalt = 1;
15976         }
15977         env->active_tc.CP0_TCHalt = 1;
15978         env->halted = 1;
15979
15980         if (!env->cpu_index) {
15981             /* VPE0 starts up enabled.  */
15982             env->mvp->CP0_MVPControl |= (1 << CP0MVPCo_EVP);
15983             env->CP0_VPEConf0 |= (1 << CP0VPEC0_MVP) | (1 << CP0VPEC0_VPA);
15984
15985             /* TC0 starts up unhalted.  */
15986             env->halted = 0;
15987             env->active_tc.CP0_TCHalt = 0;
15988             env->tcs[0].CP0_TCHalt = 0;
15989             /* With thread 0 active.  */
15990             env->active_tc.CP0_TCStatus = (1 << CP0TCSt_A);
15991             env->tcs[0].CP0_TCStatus = (1 << CP0TCSt_A);
15992         }
15993     }
15994 #endif
15995     compute_hflags(env);
15996     env->exception_index = EXCP_NONE;
15997 }
15998
15999 void restore_state_to_opc(CPUMIPSState *env, TranslationBlock *tb, int pc_pos)
16000 {
16001     env->active_tc.PC = gen_opc_pc[pc_pos];
16002     env->hflags &= ~MIPS_HFLAG_BMASK;
16003     env->hflags |= gen_opc_hflags[pc_pos];
16004 }