target-mips: correctly restore btarget upon exception
[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 static target_ulong gen_opc_btarget[OPC_BUF_SIZE];
1019
1020 #include "gen-icount.h"
1021
1022 #define gen_helper_0e0i(name, arg) do {                           \
1023     TCGv_i32 helper_tmp = tcg_const_i32(arg);                     \
1024     gen_helper_##name(cpu_env, helper_tmp);                       \
1025     tcg_temp_free_i32(helper_tmp);                                \
1026     } while(0)
1027
1028 #define gen_helper_0e1i(name, arg1, arg2) do {                    \
1029     TCGv_i32 helper_tmp = tcg_const_i32(arg2);                    \
1030     gen_helper_##name(cpu_env, arg1, helper_tmp);                 \
1031     tcg_temp_free_i32(helper_tmp);                                \
1032     } while(0)
1033
1034 #define gen_helper_1e0i(name, ret, arg1) do {                     \
1035     TCGv_i32 helper_tmp = tcg_const_i32(arg1);                    \
1036     gen_helper_##name(ret, cpu_env, helper_tmp);                  \
1037     tcg_temp_free_i32(helper_tmp);                                \
1038     } while(0)
1039
1040 #define gen_helper_1e1i(name, ret, arg1, arg2) do {               \
1041     TCGv_i32 helper_tmp = tcg_const_i32(arg2);                    \
1042     gen_helper_##name(ret, cpu_env, arg1, helper_tmp);            \
1043     tcg_temp_free_i32(helper_tmp);                                \
1044     } while(0)
1045
1046 #define gen_helper_0e2i(name, arg1, arg2, arg3) do {              \
1047     TCGv_i32 helper_tmp = tcg_const_i32(arg3);                    \
1048     gen_helper_##name(cpu_env, arg1, arg2, helper_tmp);           \
1049     tcg_temp_free_i32(helper_tmp);                                \
1050     } while(0)
1051
1052 #define gen_helper_1e2i(name, ret, arg1, arg2, arg3) do {         \
1053     TCGv_i32 helper_tmp = tcg_const_i32(arg3);                    \
1054     gen_helper_##name(ret, cpu_env, arg1, arg2, helper_tmp);      \
1055     tcg_temp_free_i32(helper_tmp);                                \
1056     } while(0)
1057
1058 #define gen_helper_0e3i(name, arg1, arg2, arg3, arg4) do {        \
1059     TCGv_i32 helper_tmp = tcg_const_i32(arg4);                    \
1060     gen_helper_##name(cpu_env, arg1, arg2, arg3, helper_tmp);     \
1061     tcg_temp_free_i32(helper_tmp);                                \
1062     } while(0)
1063
1064 typedef struct DisasContext {
1065     struct TranslationBlock *tb;
1066     target_ulong pc, saved_pc;
1067     uint32_t opcode;
1068     int singlestep_enabled;
1069     /* Routine used to access memory */
1070     int mem_idx;
1071     uint32_t hflags, saved_hflags;
1072     int bstate;
1073     target_ulong btarget;
1074 } DisasContext;
1075
1076 enum {
1077     BS_NONE     = 0, /* We go out of the TB without reaching a branch or an
1078                       * exception condition */
1079     BS_STOP     = 1, /* We want to stop translation for any reason */
1080     BS_BRANCH   = 2, /* We reached a branch condition     */
1081     BS_EXCP     = 3, /* We reached an exception condition */
1082 };
1083
1084 static const char * const regnames[] = {
1085     "r0", "at", "v0", "v1", "a0", "a1", "a2", "a3",
1086     "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
1087     "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1088     "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra",
1089 };
1090
1091 static const char * const regnames_HI[] = {
1092     "HI0", "HI1", "HI2", "HI3",
1093 };
1094
1095 static const char * const regnames_LO[] = {
1096     "LO0", "LO1", "LO2", "LO3",
1097 };
1098
1099 static const char * const regnames_ACX[] = {
1100     "ACX0", "ACX1", "ACX2", "ACX3",
1101 };
1102
1103 static const char * const fregnames[] = {
1104     "f0",  "f1",  "f2",  "f3",  "f4",  "f5",  "f6",  "f7",
1105     "f8",  "f9",  "f10", "f11", "f12", "f13", "f14", "f15",
1106     "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1107     "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
1108 };
1109
1110 #define MIPS_DEBUG(fmt, ...)                                                  \
1111     do {                                                                      \
1112         if (MIPS_DEBUG_DISAS) {                                               \
1113             qemu_log_mask(CPU_LOG_TB_IN_ASM,                                  \
1114                           TARGET_FMT_lx ": %08x " fmt "\n",                   \
1115                           ctx->pc, ctx->opcode , ## __VA_ARGS__);             \
1116         }                                                                     \
1117     } while (0)
1118
1119 #define LOG_DISAS(...)                                                        \
1120     do {                                                                      \
1121         if (MIPS_DEBUG_DISAS) {                                               \
1122             qemu_log_mask(CPU_LOG_TB_IN_ASM, ## __VA_ARGS__);                 \
1123         }                                                                     \
1124     } while (0)
1125
1126 #define MIPS_INVAL(op)                                                        \
1127     MIPS_DEBUG("Invalid %s %03x %03x %03x", op, ctx->opcode >> 26,            \
1128                ctx->opcode & 0x3F, ((ctx->opcode >> 16) & 0x1F))
1129
1130 /* General purpose registers moves. */
1131 static inline void gen_load_gpr (TCGv t, int reg)
1132 {
1133     if (reg == 0)
1134         tcg_gen_movi_tl(t, 0);
1135     else
1136         tcg_gen_mov_tl(t, cpu_gpr[reg]);
1137 }
1138
1139 static inline void gen_store_gpr (TCGv t, int reg)
1140 {
1141     if (reg != 0)
1142         tcg_gen_mov_tl(cpu_gpr[reg], t);
1143 }
1144
1145 /* Moves to/from ACX register.  */
1146 static inline void gen_load_ACX (TCGv t, int reg)
1147 {
1148     tcg_gen_mov_tl(t, cpu_ACX[reg]);
1149 }
1150
1151 static inline void gen_store_ACX (TCGv t, int reg)
1152 {
1153     tcg_gen_mov_tl(cpu_ACX[reg], t);
1154 }
1155
1156 /* Moves to/from shadow registers. */
1157 static inline void gen_load_srsgpr (int from, int to)
1158 {
1159     TCGv t0 = tcg_temp_new();
1160
1161     if (from == 0)
1162         tcg_gen_movi_tl(t0, 0);
1163     else {
1164         TCGv_i32 t2 = tcg_temp_new_i32();
1165         TCGv_ptr addr = tcg_temp_new_ptr();
1166
1167         tcg_gen_ld_i32(t2, cpu_env, offsetof(CPUMIPSState, CP0_SRSCtl));
1168         tcg_gen_shri_i32(t2, t2, CP0SRSCtl_PSS);
1169         tcg_gen_andi_i32(t2, t2, 0xf);
1170         tcg_gen_muli_i32(t2, t2, sizeof(target_ulong) * 32);
1171         tcg_gen_ext_i32_ptr(addr, t2);
1172         tcg_gen_add_ptr(addr, cpu_env, addr);
1173
1174         tcg_gen_ld_tl(t0, addr, sizeof(target_ulong) * from);
1175         tcg_temp_free_ptr(addr);
1176         tcg_temp_free_i32(t2);
1177     }
1178     gen_store_gpr(t0, to);
1179     tcg_temp_free(t0);
1180 }
1181
1182 static inline void gen_store_srsgpr (int from, int to)
1183 {
1184     if (to != 0) {
1185         TCGv t0 = tcg_temp_new();
1186         TCGv_i32 t2 = tcg_temp_new_i32();
1187         TCGv_ptr addr = tcg_temp_new_ptr();
1188
1189         gen_load_gpr(t0, from);
1190         tcg_gen_ld_i32(t2, cpu_env, offsetof(CPUMIPSState, CP0_SRSCtl));
1191         tcg_gen_shri_i32(t2, t2, CP0SRSCtl_PSS);
1192         tcg_gen_andi_i32(t2, t2, 0xf);
1193         tcg_gen_muli_i32(t2, t2, sizeof(target_ulong) * 32);
1194         tcg_gen_ext_i32_ptr(addr, t2);
1195         tcg_gen_add_ptr(addr, cpu_env, addr);
1196
1197         tcg_gen_st_tl(t0, addr, sizeof(target_ulong) * to);
1198         tcg_temp_free_ptr(addr);
1199         tcg_temp_free_i32(t2);
1200         tcg_temp_free(t0);
1201     }
1202 }
1203
1204 /* Floating point register moves. */
1205 static void gen_load_fpr32(TCGv_i32 t, int reg)
1206 {
1207     tcg_gen_trunc_i64_i32(t, fpu_f64[reg]);
1208 }
1209
1210 static void gen_store_fpr32(TCGv_i32 t, int reg)
1211 {
1212     TCGv_i64 t64 = tcg_temp_new_i64();
1213     tcg_gen_extu_i32_i64(t64, t);
1214     tcg_gen_deposit_i64(fpu_f64[reg], fpu_f64[reg], t64, 0, 32);
1215     tcg_temp_free_i64(t64);
1216 }
1217
1218 static void gen_load_fpr32h(TCGv_i32 t, int reg)
1219 {
1220     TCGv_i64 t64 = tcg_temp_new_i64();
1221     tcg_gen_shri_i64(t64, fpu_f64[reg], 32);
1222     tcg_gen_trunc_i64_i32(t, t64);
1223     tcg_temp_free_i64(t64);
1224 }
1225
1226 static void gen_store_fpr32h(TCGv_i32 t, int reg)
1227 {
1228     TCGv_i64 t64 = tcg_temp_new_i64();
1229     tcg_gen_extu_i32_i64(t64, t);
1230     tcg_gen_deposit_i64(fpu_f64[reg], fpu_f64[reg], t64, 32, 32);
1231     tcg_temp_free_i64(t64);
1232 }
1233
1234 static void gen_load_fpr64(DisasContext *ctx, TCGv_i64 t, int reg)
1235 {
1236     if (ctx->hflags & MIPS_HFLAG_F64) {
1237         tcg_gen_mov_i64(t, fpu_f64[reg]);
1238     } else {
1239         tcg_gen_concat32_i64(t, fpu_f64[reg & ~1], fpu_f64[reg | 1]);
1240     }
1241 }
1242
1243 static void gen_store_fpr64(DisasContext *ctx, TCGv_i64 t, int reg)
1244 {
1245     if (ctx->hflags & MIPS_HFLAG_F64) {
1246         tcg_gen_mov_i64(fpu_f64[reg], t);
1247     } else {
1248         TCGv_i64 t0;
1249         tcg_gen_deposit_i64(fpu_f64[reg & ~1], fpu_f64[reg & ~1], t, 0, 32);
1250         t0 = tcg_temp_new_i64();
1251         tcg_gen_shri_i64(t0, t, 32);
1252         tcg_gen_deposit_i64(fpu_f64[reg | 1], fpu_f64[reg | 1], t0, 0, 32);
1253         tcg_temp_free_i64(t0);
1254     }
1255 }
1256
1257 static inline int get_fp_bit (int cc)
1258 {
1259     if (cc)
1260         return 24 + cc;
1261     else
1262         return 23;
1263 }
1264
1265 /* Tests */
1266 static inline void gen_save_pc(target_ulong pc)
1267 {
1268     tcg_gen_movi_tl(cpu_PC, pc);
1269 }
1270
1271 static inline void save_cpu_state (DisasContext *ctx, int do_save_pc)
1272 {
1273     LOG_DISAS("hflags %08x saved %08x\n", ctx->hflags, ctx->saved_hflags);
1274     if (do_save_pc && ctx->pc != ctx->saved_pc) {
1275         gen_save_pc(ctx->pc);
1276         ctx->saved_pc = ctx->pc;
1277     }
1278     if (ctx->hflags != ctx->saved_hflags) {
1279         tcg_gen_movi_i32(hflags, ctx->hflags);
1280         ctx->saved_hflags = ctx->hflags;
1281         switch (ctx->hflags & MIPS_HFLAG_BMASK_BASE) {
1282         case MIPS_HFLAG_BR:
1283             break;
1284         case MIPS_HFLAG_BC:
1285         case MIPS_HFLAG_BL:
1286         case MIPS_HFLAG_B:
1287             tcg_gen_movi_tl(btarget, ctx->btarget);
1288             break;
1289         }
1290     }
1291 }
1292
1293 static inline void restore_cpu_state (CPUMIPSState *env, DisasContext *ctx)
1294 {
1295     ctx->saved_hflags = ctx->hflags;
1296     switch (ctx->hflags & MIPS_HFLAG_BMASK_BASE) {
1297     case MIPS_HFLAG_BR:
1298         break;
1299     case MIPS_HFLAG_BC:
1300     case MIPS_HFLAG_BL:
1301     case MIPS_HFLAG_B:
1302         ctx->btarget = env->btarget;
1303         break;
1304     }
1305 }
1306
1307 static inline void
1308 generate_exception_err (DisasContext *ctx, int excp, int err)
1309 {
1310     TCGv_i32 texcp = tcg_const_i32(excp);
1311     TCGv_i32 terr = tcg_const_i32(err);
1312     save_cpu_state(ctx, 1);
1313     gen_helper_raise_exception_err(cpu_env, texcp, terr);
1314     tcg_temp_free_i32(terr);
1315     tcg_temp_free_i32(texcp);
1316 }
1317
1318 static inline void
1319 generate_exception (DisasContext *ctx, int excp)
1320 {
1321     save_cpu_state(ctx, 1);
1322     gen_helper_0e0i(raise_exception, excp);
1323 }
1324
1325 /* Addresses computation */
1326 static inline void gen_op_addr_add (DisasContext *ctx, TCGv ret, TCGv arg0, TCGv arg1)
1327 {
1328     tcg_gen_add_tl(ret, arg0, arg1);
1329
1330 #if defined(TARGET_MIPS64)
1331     /* For compatibility with 32-bit code, data reference in user mode
1332        with Status_UX = 0 should be casted to 32-bit and sign extended.
1333        See the MIPS64 PRA manual, section 4.10. */
1334     if (((ctx->hflags & MIPS_HFLAG_KSU) == MIPS_HFLAG_UM) &&
1335         !(ctx->hflags & MIPS_HFLAG_UX)) {
1336         tcg_gen_ext32s_i64(ret, ret);
1337     }
1338 #endif
1339 }
1340
1341 static inline void check_cp0_enabled(DisasContext *ctx)
1342 {
1343     if (unlikely(!(ctx->hflags & MIPS_HFLAG_CP0)))
1344         generate_exception_err(ctx, EXCP_CpU, 0);
1345 }
1346
1347 static inline void check_cp1_enabled(DisasContext *ctx)
1348 {
1349     if (unlikely(!(ctx->hflags & MIPS_HFLAG_FPU)))
1350         generate_exception_err(ctx, EXCP_CpU, 1);
1351 }
1352
1353 /* Verify that the processor is running with COP1X instructions enabled.
1354    This is associated with the nabla symbol in the MIPS32 and MIPS64
1355    opcode tables.  */
1356
1357 static inline void check_cop1x(DisasContext *ctx)
1358 {
1359     if (unlikely(!(ctx->hflags & MIPS_HFLAG_COP1X)))
1360         generate_exception(ctx, EXCP_RI);
1361 }
1362
1363 /* Verify that the processor is running with 64-bit floating-point
1364    operations enabled.  */
1365
1366 static inline void check_cp1_64bitmode(DisasContext *ctx)
1367 {
1368     if (unlikely(~ctx->hflags & (MIPS_HFLAG_F64 | MIPS_HFLAG_COP1X)))
1369         generate_exception(ctx, EXCP_RI);
1370 }
1371
1372 /*
1373  * Verify if floating point register is valid; an operation is not defined
1374  * if bit 0 of any register specification is set and the FR bit in the
1375  * Status register equals zero, since the register numbers specify an
1376  * even-odd pair of adjacent coprocessor general registers. When the FR bit
1377  * in the Status register equals one, both even and odd register numbers
1378  * are valid. This limitation exists only for 64 bit wide (d,l,ps) registers.
1379  *
1380  * Multiple 64 bit wide registers can be checked by calling
1381  * gen_op_cp1_registers(freg1 | freg2 | ... | fregN);
1382  */
1383 static inline void check_cp1_registers(DisasContext *ctx, int regs)
1384 {
1385     if (unlikely(!(ctx->hflags & MIPS_HFLAG_F64) && (regs & 1)))
1386         generate_exception(ctx, EXCP_RI);
1387 }
1388
1389 /* Verify that the processor is running with DSP instructions enabled.
1390    This is enabled by CP0 Status register MX(24) bit.
1391  */
1392
1393 static inline void check_dsp(DisasContext *ctx)
1394 {
1395     if (unlikely(!(ctx->hflags & MIPS_HFLAG_DSP))) {
1396         generate_exception(ctx, EXCP_DSPDIS);
1397     }
1398 }
1399
1400 static inline void check_dspr2(DisasContext *ctx)
1401 {
1402     if (unlikely(!(ctx->hflags & MIPS_HFLAG_DSPR2))) {
1403         generate_exception(ctx, EXCP_DSPDIS);
1404     }
1405 }
1406
1407 /* This code generates a "reserved instruction" exception if the
1408    CPU does not support the instruction set corresponding to flags. */
1409 static inline void check_insn(CPUMIPSState *env, DisasContext *ctx, int flags)
1410 {
1411     if (unlikely(!(env->insn_flags & flags)))
1412         generate_exception(ctx, EXCP_RI);
1413 }
1414
1415 /* This code generates a "reserved instruction" exception if 64-bit
1416    instructions are not enabled. */
1417 static inline void check_mips_64(DisasContext *ctx)
1418 {
1419     if (unlikely(!(ctx->hflags & MIPS_HFLAG_64)))
1420         generate_exception(ctx, EXCP_RI);
1421 }
1422
1423 /* Define small wrappers for gen_load_fpr* so that we have a uniform
1424    calling interface for 32 and 64-bit FPRs.  No sense in changing
1425    all callers for gen_load_fpr32 when we need the CTX parameter for
1426    this one use.  */
1427 #define gen_ldcmp_fpr32(ctx, x, y) gen_load_fpr32(x, y)
1428 #define gen_ldcmp_fpr64(ctx, x, y) gen_load_fpr64(ctx, x, y)
1429 #define FOP_CONDS(type, abs, fmt, ifmt, bits)                                 \
1430 static inline void gen_cmp ## type ## _ ## fmt(DisasContext *ctx, int n,      \
1431                                                int ft, int fs, int cc)        \
1432 {                                                                             \
1433     TCGv_i##bits fp0 = tcg_temp_new_i##bits ();                               \
1434     TCGv_i##bits fp1 = tcg_temp_new_i##bits ();                               \
1435     switch (ifmt) {                                                           \
1436     case FMT_PS:                                                              \
1437         check_cp1_64bitmode(ctx);                                             \
1438         break;                                                                \
1439     case FMT_D:                                                               \
1440         if (abs) {                                                            \
1441             check_cop1x(ctx);                                                 \
1442         }                                                                     \
1443         check_cp1_registers(ctx, fs | ft);                                    \
1444         break;                                                                \
1445     case FMT_S:                                                               \
1446         if (abs) {                                                            \
1447             check_cop1x(ctx);                                                 \
1448         }                                                                     \
1449         break;                                                                \
1450     }                                                                         \
1451     gen_ldcmp_fpr##bits (ctx, fp0, fs);                                       \
1452     gen_ldcmp_fpr##bits (ctx, fp1, ft);                                       \
1453     switch (n) {                                                              \
1454     case  0: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _f, fp0, fp1, cc);    break;\
1455     case  1: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _un, fp0, fp1, cc);   break;\
1456     case  2: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _eq, fp0, fp1, cc);   break;\
1457     case  3: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ueq, fp0, fp1, cc);  break;\
1458     case  4: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _olt, fp0, fp1, cc);  break;\
1459     case  5: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ult, fp0, fp1, cc);  break;\
1460     case  6: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ole, fp0, fp1, cc);  break;\
1461     case  7: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ule, fp0, fp1, cc);  break;\
1462     case  8: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _sf, fp0, fp1, cc);   break;\
1463     case  9: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngle, fp0, fp1, cc); break;\
1464     case 10: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _seq, fp0, fp1, cc);  break;\
1465     case 11: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngl, fp0, fp1, cc);  break;\
1466     case 12: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _lt, fp0, fp1, cc);   break;\
1467     case 13: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _nge, fp0, fp1, cc);  break;\
1468     case 14: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _le, fp0, fp1, cc);   break;\
1469     case 15: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngt, fp0, fp1, cc);  break;\
1470     default: abort();                                                         \
1471     }                                                                         \
1472     tcg_temp_free_i##bits (fp0);                                              \
1473     tcg_temp_free_i##bits (fp1);                                              \
1474 }
1475
1476 FOP_CONDS(, 0, d, FMT_D, 64)
1477 FOP_CONDS(abs, 1, d, FMT_D, 64)
1478 FOP_CONDS(, 0, s, FMT_S, 32)
1479 FOP_CONDS(abs, 1, s, FMT_S, 32)
1480 FOP_CONDS(, 0, ps, FMT_PS, 64)
1481 FOP_CONDS(abs, 1, ps, FMT_PS, 64)
1482 #undef FOP_CONDS
1483 #undef gen_ldcmp_fpr32
1484 #undef gen_ldcmp_fpr64
1485
1486 /* load/store instructions. */
1487 #define OP_LD(insn,fname)                                                 \
1488 static inline void op_ld_##insn(TCGv ret, TCGv arg1, DisasContext *ctx)   \
1489 {                                                                         \
1490     tcg_gen_qemu_##fname(ret, arg1, ctx->mem_idx);                        \
1491 }
1492 OP_LD(lb,ld8s);
1493 OP_LD(lbu,ld8u);
1494 OP_LD(lh,ld16s);
1495 OP_LD(lhu,ld16u);
1496 OP_LD(lw,ld32s);
1497 #if defined(TARGET_MIPS64)
1498 OP_LD(lwu,ld32u);
1499 OP_LD(ld,ld64);
1500 #endif
1501 #undef OP_LD
1502
1503 #define OP_ST(insn,fname)                                                  \
1504 static inline void op_st_##insn(TCGv arg1, TCGv arg2, DisasContext *ctx)   \
1505 {                                                                          \
1506     tcg_gen_qemu_##fname(arg1, arg2, ctx->mem_idx);                        \
1507 }
1508 OP_ST(sb,st8);
1509 OP_ST(sh,st16);
1510 OP_ST(sw,st32);
1511 #if defined(TARGET_MIPS64)
1512 OP_ST(sd,st64);
1513 #endif
1514 #undef OP_ST
1515
1516 #ifdef CONFIG_USER_ONLY
1517 #define OP_LD_ATOMIC(insn,fname)                                           \
1518 static inline void op_ld_##insn(TCGv ret, TCGv arg1, DisasContext *ctx)    \
1519 {                                                                          \
1520     TCGv t0 = tcg_temp_new();                                              \
1521     tcg_gen_mov_tl(t0, arg1);                                              \
1522     tcg_gen_qemu_##fname(ret, arg1, ctx->mem_idx);                         \
1523     tcg_gen_st_tl(t0, cpu_env, offsetof(CPUMIPSState, lladdr));                \
1524     tcg_gen_st_tl(ret, cpu_env, offsetof(CPUMIPSState, llval));                \
1525     tcg_temp_free(t0);                                                     \
1526 }
1527 #else
1528 #define OP_LD_ATOMIC(insn,fname)                                           \
1529 static inline void op_ld_##insn(TCGv ret, TCGv arg1, DisasContext *ctx)    \
1530 {                                                                          \
1531     gen_helper_1e1i(insn, ret, arg1, ctx->mem_idx);                        \
1532 }
1533 #endif
1534 OP_LD_ATOMIC(ll,ld32s);
1535 #if defined(TARGET_MIPS64)
1536 OP_LD_ATOMIC(lld,ld64);
1537 #endif
1538 #undef OP_LD_ATOMIC
1539
1540 #ifdef CONFIG_USER_ONLY
1541 #define OP_ST_ATOMIC(insn,fname,ldname,almask)                               \
1542 static inline void op_st_##insn(TCGv arg1, TCGv arg2, int rt, DisasContext *ctx) \
1543 {                                                                            \
1544     TCGv t0 = tcg_temp_new();                                                \
1545     int l1 = gen_new_label();                                                \
1546     int l2 = gen_new_label();                                                \
1547                                                                              \
1548     tcg_gen_andi_tl(t0, arg2, almask);                                       \
1549     tcg_gen_brcondi_tl(TCG_COND_EQ, t0, 0, l1);                              \
1550     tcg_gen_st_tl(arg2, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));          \
1551     generate_exception(ctx, EXCP_AdES);                                      \
1552     gen_set_label(l1);                                                       \
1553     tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUMIPSState, lladdr));                  \
1554     tcg_gen_brcond_tl(TCG_COND_NE, arg2, t0, l2);                            \
1555     tcg_gen_movi_tl(t0, rt | ((almask << 3) & 0x20));                        \
1556     tcg_gen_st_tl(t0, cpu_env, offsetof(CPUMIPSState, llreg));                   \
1557     tcg_gen_st_tl(arg1, cpu_env, offsetof(CPUMIPSState, llnewval));              \
1558     gen_helper_0e0i(raise_exception, EXCP_SC);                               \
1559     gen_set_label(l2);                                                       \
1560     tcg_gen_movi_tl(t0, 0);                                                  \
1561     gen_store_gpr(t0, rt);                                                   \
1562     tcg_temp_free(t0);                                                       \
1563 }
1564 #else
1565 #define OP_ST_ATOMIC(insn,fname,ldname,almask)                               \
1566 static inline void op_st_##insn(TCGv arg1, TCGv arg2, int rt, DisasContext *ctx) \
1567 {                                                                            \
1568     TCGv t0 = tcg_temp_new();                                                \
1569     gen_helper_1e2i(insn, t0, arg1, arg2, ctx->mem_idx);                     \
1570     gen_store_gpr(t0, rt);                                                   \
1571     tcg_temp_free(t0);                                                       \
1572 }
1573 #endif
1574 OP_ST_ATOMIC(sc,st32,ld32s,0x3);
1575 #if defined(TARGET_MIPS64)
1576 OP_ST_ATOMIC(scd,st64,ld64,0x7);
1577 #endif
1578 #undef OP_ST_ATOMIC
1579
1580 static void gen_base_offset_addr (DisasContext *ctx, TCGv addr,
1581                                   int base, int16_t offset)
1582 {
1583     if (base == 0) {
1584         tcg_gen_movi_tl(addr, offset);
1585     } else if (offset == 0) {
1586         gen_load_gpr(addr, base);
1587     } else {
1588         tcg_gen_movi_tl(addr, offset);
1589         gen_op_addr_add(ctx, addr, cpu_gpr[base], addr);
1590     }
1591 }
1592
1593 static target_ulong pc_relative_pc (DisasContext *ctx)
1594 {
1595     target_ulong pc = ctx->pc;
1596
1597     if (ctx->hflags & MIPS_HFLAG_BMASK) {
1598         int branch_bytes = ctx->hflags & MIPS_HFLAG_BDS16 ? 2 : 4;
1599
1600         pc -= branch_bytes;
1601     }
1602
1603     pc &= ~(target_ulong)3;
1604     return pc;
1605 }
1606
1607 /* Load */
1608 static void gen_ld (CPUMIPSState *env, DisasContext *ctx, uint32_t opc,
1609                     int rt, int base, int16_t offset)
1610 {
1611     const char *opn = "ld";
1612     TCGv t0, t1;
1613
1614     if (rt == 0 && env->insn_flags & (INSN_LOONGSON2E | INSN_LOONGSON2F)) {
1615         /* Loongson CPU uses a load to zero register for prefetch.
1616            We emulate it as a NOP. On other CPU we must perform the
1617            actual memory access. */
1618         MIPS_DEBUG("NOP");
1619         return;
1620     }
1621
1622     t0 = tcg_temp_new();
1623     t1 = tcg_temp_new();
1624     gen_base_offset_addr(ctx, t0, base, offset);
1625
1626     switch (opc) {
1627 #if defined(TARGET_MIPS64)
1628     case OPC_LWU:
1629         save_cpu_state(ctx, 0);
1630         op_ld_lwu(t0, t0, ctx);
1631         gen_store_gpr(t0, rt);
1632         opn = "lwu";
1633         break;
1634     case OPC_LD:
1635         save_cpu_state(ctx, 0);
1636         op_ld_ld(t0, t0, ctx);
1637         gen_store_gpr(t0, rt);
1638         opn = "ld";
1639         break;
1640     case OPC_LLD:
1641         save_cpu_state(ctx, 1);
1642         op_ld_lld(t0, t0, ctx);
1643         gen_store_gpr(t0, rt);
1644         opn = "lld";
1645         break;
1646     case OPC_LDL:
1647         save_cpu_state(ctx, 1);
1648         gen_load_gpr(t1, rt);
1649         gen_helper_1e2i(ldl, t1, t1, t0, ctx->mem_idx);
1650         gen_store_gpr(t1, rt);
1651         opn = "ldl";
1652         break;
1653     case OPC_LDR:
1654         save_cpu_state(ctx, 1);
1655         gen_load_gpr(t1, rt);
1656         gen_helper_1e2i(ldr, t1, t1, t0, ctx->mem_idx);
1657         gen_store_gpr(t1, rt);
1658         opn = "ldr";
1659         break;
1660     case OPC_LDPC:
1661         save_cpu_state(ctx, 0);
1662         tcg_gen_movi_tl(t1, pc_relative_pc(ctx));
1663         gen_op_addr_add(ctx, t0, t0, t1);
1664         op_ld_ld(t0, t0, ctx);
1665         gen_store_gpr(t0, rt);
1666         opn = "ldpc";
1667         break;
1668 #endif
1669     case OPC_LWPC:
1670         save_cpu_state(ctx, 0);
1671         tcg_gen_movi_tl(t1, pc_relative_pc(ctx));
1672         gen_op_addr_add(ctx, t0, t0, t1);
1673         op_ld_lw(t0, t0, ctx);
1674         gen_store_gpr(t0, rt);
1675         opn = "lwpc";
1676         break;
1677     case OPC_LW:
1678         save_cpu_state(ctx, 0);
1679         op_ld_lw(t0, t0, ctx);
1680         gen_store_gpr(t0, rt);
1681         opn = "lw";
1682         break;
1683     case OPC_LH:
1684         save_cpu_state(ctx, 0);
1685         op_ld_lh(t0, t0, ctx);
1686         gen_store_gpr(t0, rt);
1687         opn = "lh";
1688         break;
1689     case OPC_LHU:
1690         save_cpu_state(ctx, 0);
1691         op_ld_lhu(t0, t0, ctx);
1692         gen_store_gpr(t0, rt);
1693         opn = "lhu";
1694         break;
1695     case OPC_LB:
1696         save_cpu_state(ctx, 0);
1697         op_ld_lb(t0, t0, ctx);
1698         gen_store_gpr(t0, rt);
1699         opn = "lb";
1700         break;
1701     case OPC_LBU:
1702         save_cpu_state(ctx, 0);
1703         op_ld_lbu(t0, t0, ctx);
1704         gen_store_gpr(t0, rt);
1705         opn = "lbu";
1706         break;
1707     case OPC_LWL:
1708         save_cpu_state(ctx, 1);
1709         gen_load_gpr(t1, rt);
1710         gen_helper_1e2i(lwl, t1, t1, t0, ctx->mem_idx);
1711         gen_store_gpr(t1, rt);
1712         opn = "lwl";
1713         break;
1714     case OPC_LWR:
1715         save_cpu_state(ctx, 1);
1716         gen_load_gpr(t1, rt);
1717         gen_helper_1e2i(lwr, t1, t1, t0, ctx->mem_idx);
1718         gen_store_gpr(t1, rt);
1719         opn = "lwr";
1720         break;
1721     case OPC_LL:
1722         save_cpu_state(ctx, 1);
1723         op_ld_ll(t0, t0, ctx);
1724         gen_store_gpr(t0, rt);
1725         opn = "ll";
1726         break;
1727     }
1728     (void)opn; /* avoid a compiler warning */
1729     MIPS_DEBUG("%s %s, %d(%s)", opn, regnames[rt], offset, regnames[base]);
1730     tcg_temp_free(t0);
1731     tcg_temp_free(t1);
1732 }
1733
1734 /* Store */
1735 static void gen_st (DisasContext *ctx, uint32_t opc, int rt,
1736                     int base, int16_t offset)
1737 {
1738     const char *opn = "st";
1739     TCGv t0 = tcg_temp_new();
1740     TCGv t1 = tcg_temp_new();
1741
1742     gen_base_offset_addr(ctx, t0, base, offset);
1743     gen_load_gpr(t1, rt);
1744     switch (opc) {
1745 #if defined(TARGET_MIPS64)
1746     case OPC_SD:
1747         save_cpu_state(ctx, 0);
1748         op_st_sd(t1, t0, ctx);
1749         opn = "sd";
1750         break;
1751     case OPC_SDL:
1752         save_cpu_state(ctx, 1);
1753         gen_helper_0e2i(sdl, t1, t0, ctx->mem_idx);
1754         opn = "sdl";
1755         break;
1756     case OPC_SDR:
1757         save_cpu_state(ctx, 1);
1758         gen_helper_0e2i(sdr, t1, t0, ctx->mem_idx);
1759         opn = "sdr";
1760         break;
1761 #endif
1762     case OPC_SW:
1763         save_cpu_state(ctx, 0);
1764         op_st_sw(t1, t0, ctx);
1765         opn = "sw";
1766         break;
1767     case OPC_SH:
1768         save_cpu_state(ctx, 0);
1769         op_st_sh(t1, t0, ctx);
1770         opn = "sh";
1771         break;
1772     case OPC_SB:
1773         save_cpu_state(ctx, 0);
1774         op_st_sb(t1, t0, ctx);
1775         opn = "sb";
1776         break;
1777     case OPC_SWL:
1778         save_cpu_state(ctx, 1);
1779         gen_helper_0e2i(swl, t1, t0, ctx->mem_idx);
1780         opn = "swl";
1781         break;
1782     case OPC_SWR:
1783         save_cpu_state(ctx, 1);
1784         gen_helper_0e2i(swr, t1, t0, ctx->mem_idx);
1785         opn = "swr";
1786         break;
1787     }
1788     (void)opn; /* avoid a compiler warning */
1789     MIPS_DEBUG("%s %s, %d(%s)", opn, regnames[rt], offset, regnames[base]);
1790     tcg_temp_free(t0);
1791     tcg_temp_free(t1);
1792 }
1793
1794
1795 /* Store conditional */
1796 static void gen_st_cond (DisasContext *ctx, uint32_t opc, int rt,
1797                          int base, int16_t offset)
1798 {
1799     const char *opn = "st_cond";
1800     TCGv t0, t1;
1801
1802     t0 = tcg_temp_local_new();
1803
1804     gen_base_offset_addr(ctx, t0, base, offset);
1805     /* Don't do NOP if destination is zero: we must perform the actual
1806        memory access. */
1807
1808     t1 = tcg_temp_local_new();
1809     gen_load_gpr(t1, rt);
1810     switch (opc) {
1811 #if defined(TARGET_MIPS64)
1812     case OPC_SCD:
1813         save_cpu_state(ctx, 1);
1814         op_st_scd(t1, t0, rt, ctx);
1815         opn = "scd";
1816         break;
1817 #endif
1818     case OPC_SC:
1819         save_cpu_state(ctx, 1);
1820         op_st_sc(t1, t0, rt, ctx);
1821         opn = "sc";
1822         break;
1823     }
1824     (void)opn; /* avoid a compiler warning */
1825     MIPS_DEBUG("%s %s, %d(%s)", opn, regnames[rt], offset, regnames[base]);
1826     tcg_temp_free(t1);
1827     tcg_temp_free(t0);
1828 }
1829
1830 /* Load and store */
1831 static void gen_flt_ldst (DisasContext *ctx, uint32_t opc, int ft,
1832                           int base, int16_t offset)
1833 {
1834     const char *opn = "flt_ldst";
1835     TCGv t0 = tcg_temp_new();
1836
1837     gen_base_offset_addr(ctx, t0, base, offset);
1838     /* Don't do NOP if destination is zero: we must perform the actual
1839        memory access. */
1840     switch (opc) {
1841     case OPC_LWC1:
1842         {
1843             TCGv_i32 fp0 = tcg_temp_new_i32();
1844
1845             tcg_gen_qemu_ld32s(t0, t0, ctx->mem_idx);
1846             tcg_gen_trunc_tl_i32(fp0, t0);
1847             gen_store_fpr32(fp0, ft);
1848             tcg_temp_free_i32(fp0);
1849         }
1850         opn = "lwc1";
1851         break;
1852     case OPC_SWC1:
1853         {
1854             TCGv_i32 fp0 = tcg_temp_new_i32();
1855             TCGv t1 = tcg_temp_new();
1856
1857             gen_load_fpr32(fp0, ft);
1858             tcg_gen_extu_i32_tl(t1, fp0);
1859             tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);
1860             tcg_temp_free(t1);
1861             tcg_temp_free_i32(fp0);
1862         }
1863         opn = "swc1";
1864         break;
1865     case OPC_LDC1:
1866         {
1867             TCGv_i64 fp0 = tcg_temp_new_i64();
1868
1869             tcg_gen_qemu_ld64(fp0, t0, ctx->mem_idx);
1870             gen_store_fpr64(ctx, fp0, ft);
1871             tcg_temp_free_i64(fp0);
1872         }
1873         opn = "ldc1";
1874         break;
1875     case OPC_SDC1:
1876         {
1877             TCGv_i64 fp0 = tcg_temp_new_i64();
1878
1879             gen_load_fpr64(ctx, fp0, ft);
1880             tcg_gen_qemu_st64(fp0, t0, ctx->mem_idx);
1881             tcg_temp_free_i64(fp0);
1882         }
1883         opn = "sdc1";
1884         break;
1885     default:
1886         MIPS_INVAL(opn);
1887         generate_exception(ctx, EXCP_RI);
1888         goto out;
1889     }
1890     (void)opn; /* avoid a compiler warning */
1891     MIPS_DEBUG("%s %s, %d(%s)", opn, fregnames[ft], offset, regnames[base]);
1892  out:
1893     tcg_temp_free(t0);
1894 }
1895
1896 static void gen_cop1_ldst(CPUMIPSState *env, DisasContext *ctx,
1897                           uint32_t op, int rt, int rs, int16_t imm)
1898 {
1899     if (env->CP0_Config1 & (1 << CP0C1_FP)) {
1900         check_cp1_enabled(ctx);
1901         gen_flt_ldst(ctx, op, rt, rs, imm);
1902     } else {
1903         generate_exception_err(ctx, EXCP_CpU, 1);
1904     }
1905 }
1906
1907 /* Arithmetic with immediate operand */
1908 static void gen_arith_imm (CPUMIPSState *env, DisasContext *ctx, uint32_t opc,
1909                            int rt, int rs, int16_t imm)
1910 {
1911     target_ulong uimm = (target_long)imm; /* Sign extend to 32/64 bits */
1912     const char *opn = "imm arith";
1913
1914     if (rt == 0 && opc != OPC_ADDI && opc != OPC_DADDI) {
1915         /* If no destination, treat it as a NOP.
1916            For addi, we must generate the overflow exception when needed. */
1917         MIPS_DEBUG("NOP");
1918         return;
1919     }
1920     switch (opc) {
1921     case OPC_ADDI:
1922         {
1923             TCGv t0 = tcg_temp_local_new();
1924             TCGv t1 = tcg_temp_new();
1925             TCGv t2 = tcg_temp_new();
1926             int l1 = gen_new_label();
1927
1928             gen_load_gpr(t1, rs);
1929             tcg_gen_addi_tl(t0, t1, uimm);
1930             tcg_gen_ext32s_tl(t0, t0);
1931
1932             tcg_gen_xori_tl(t1, t1, ~uimm);
1933             tcg_gen_xori_tl(t2, t0, uimm);
1934             tcg_gen_and_tl(t1, t1, t2);
1935             tcg_temp_free(t2);
1936             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
1937             tcg_temp_free(t1);
1938             /* operands of same sign, result different sign */
1939             generate_exception(ctx, EXCP_OVERFLOW);
1940             gen_set_label(l1);
1941             tcg_gen_ext32s_tl(t0, t0);
1942             gen_store_gpr(t0, rt);
1943             tcg_temp_free(t0);
1944         }
1945         opn = "addi";
1946         break;
1947     case OPC_ADDIU:
1948         if (rs != 0) {
1949             tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
1950             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
1951         } else {
1952             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
1953         }
1954         opn = "addiu";
1955         break;
1956 #if defined(TARGET_MIPS64)
1957     case OPC_DADDI:
1958         {
1959             TCGv t0 = tcg_temp_local_new();
1960             TCGv t1 = tcg_temp_new();
1961             TCGv t2 = tcg_temp_new();
1962             int l1 = gen_new_label();
1963
1964             gen_load_gpr(t1, rs);
1965             tcg_gen_addi_tl(t0, t1, uimm);
1966
1967             tcg_gen_xori_tl(t1, t1, ~uimm);
1968             tcg_gen_xori_tl(t2, t0, uimm);
1969             tcg_gen_and_tl(t1, t1, t2);
1970             tcg_temp_free(t2);
1971             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
1972             tcg_temp_free(t1);
1973             /* operands of same sign, result different sign */
1974             generate_exception(ctx, EXCP_OVERFLOW);
1975             gen_set_label(l1);
1976             gen_store_gpr(t0, rt);
1977             tcg_temp_free(t0);
1978         }
1979         opn = "daddi";
1980         break;
1981     case OPC_DADDIU:
1982         if (rs != 0) {
1983             tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
1984         } else {
1985             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
1986         }
1987         opn = "daddiu";
1988         break;
1989 #endif
1990     }
1991     (void)opn; /* avoid a compiler warning */
1992     MIPS_DEBUG("%s %s, %s, " TARGET_FMT_lx, opn, regnames[rt], regnames[rs], uimm);
1993 }
1994
1995 /* Logic with immediate operand */
1996 static void gen_logic_imm(CPUMIPSState *env, DisasContext *ctx, uint32_t opc,
1997                           int rt, int rs, int16_t imm)
1998 {
1999     target_ulong uimm;
2000     const char *opn = "imm logic";
2001
2002     if (rt == 0) {
2003         /* If no destination, treat it as a NOP. */
2004         MIPS_DEBUG("NOP");
2005         return;
2006     }
2007     uimm = (uint16_t)imm;
2008     switch (opc) {
2009     case OPC_ANDI:
2010         if (likely(rs != 0))
2011             tcg_gen_andi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2012         else
2013             tcg_gen_movi_tl(cpu_gpr[rt], 0);
2014         opn = "andi";
2015         break;
2016     case OPC_ORI:
2017         if (rs != 0)
2018             tcg_gen_ori_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2019         else
2020             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
2021         opn = "ori";
2022         break;
2023     case OPC_XORI:
2024         if (likely(rs != 0))
2025             tcg_gen_xori_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2026         else
2027             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
2028         opn = "xori";
2029         break;
2030     case OPC_LUI:
2031         tcg_gen_movi_tl(cpu_gpr[rt], imm << 16);
2032         opn = "lui";
2033         break;
2034     }
2035     (void)opn; /* avoid a compiler warning */
2036     MIPS_DEBUG("%s %s, %s, " TARGET_FMT_lx, opn, regnames[rt], regnames[rs], uimm);
2037 }
2038
2039 /* Set on less than with immediate operand */
2040 static void gen_slt_imm(CPUMIPSState *env, DisasContext *ctx, uint32_t opc,
2041                         int rt, int rs, int16_t imm)
2042 {
2043     target_ulong uimm = (target_long)imm; /* Sign extend to 32/64 bits */
2044     const char *opn = "imm arith";
2045     TCGv t0;
2046
2047     if (rt == 0) {
2048         /* If no destination, treat it as a NOP. */
2049         MIPS_DEBUG("NOP");
2050         return;
2051     }
2052     t0 = tcg_temp_new();
2053     gen_load_gpr(t0, rs);
2054     switch (opc) {
2055     case OPC_SLTI:
2056         tcg_gen_setcondi_tl(TCG_COND_LT, cpu_gpr[rt], t0, uimm);
2057         opn = "slti";
2058         break;
2059     case OPC_SLTIU:
2060         tcg_gen_setcondi_tl(TCG_COND_LTU, cpu_gpr[rt], t0, uimm);
2061         opn = "sltiu";
2062         break;
2063     }
2064     (void)opn; /* avoid a compiler warning */
2065     MIPS_DEBUG("%s %s, %s, " TARGET_FMT_lx, opn, regnames[rt], regnames[rs], uimm);
2066     tcg_temp_free(t0);
2067 }
2068
2069 /* Shifts with immediate operand */
2070 static void gen_shift_imm(CPUMIPSState *env, DisasContext *ctx, uint32_t opc,
2071                           int rt, int rs, int16_t imm)
2072 {
2073     target_ulong uimm = ((uint16_t)imm) & 0x1f;
2074     const char *opn = "imm shift";
2075     TCGv t0;
2076
2077     if (rt == 0) {
2078         /* If no destination, treat it as a NOP. */
2079         MIPS_DEBUG("NOP");
2080         return;
2081     }
2082
2083     t0 = tcg_temp_new();
2084     gen_load_gpr(t0, rs);
2085     switch (opc) {
2086     case OPC_SLL:
2087         tcg_gen_shli_tl(t0, t0, uimm);
2088         tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
2089         opn = "sll";
2090         break;
2091     case OPC_SRA:
2092         tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm);
2093         opn = "sra";
2094         break;
2095     case OPC_SRL:
2096         if (uimm != 0) {
2097             tcg_gen_ext32u_tl(t0, t0);
2098             tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm);
2099         } else {
2100             tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
2101         }
2102         opn = "srl";
2103         break;
2104     case OPC_ROTR:
2105         if (uimm != 0) {
2106             TCGv_i32 t1 = tcg_temp_new_i32();
2107
2108             tcg_gen_trunc_tl_i32(t1, t0);
2109             tcg_gen_rotri_i32(t1, t1, uimm);
2110             tcg_gen_ext_i32_tl(cpu_gpr[rt], t1);
2111             tcg_temp_free_i32(t1);
2112         } else {
2113             tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
2114         }
2115         opn = "rotr";
2116         break;
2117 #if defined(TARGET_MIPS64)
2118     case OPC_DSLL:
2119         tcg_gen_shli_tl(cpu_gpr[rt], t0, uimm);
2120         opn = "dsll";
2121         break;
2122     case OPC_DSRA:
2123         tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm);
2124         opn = "dsra";
2125         break;
2126     case OPC_DSRL:
2127         tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm);
2128         opn = "dsrl";
2129         break;
2130     case OPC_DROTR:
2131         if (uimm != 0) {
2132             tcg_gen_rotri_tl(cpu_gpr[rt], t0, uimm);
2133         } else {
2134             tcg_gen_mov_tl(cpu_gpr[rt], t0);
2135         }
2136         opn = "drotr";
2137         break;
2138     case OPC_DSLL32:
2139         tcg_gen_shli_tl(cpu_gpr[rt], t0, uimm + 32);
2140         opn = "dsll32";
2141         break;
2142     case OPC_DSRA32:
2143         tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm + 32);
2144         opn = "dsra32";
2145         break;
2146     case OPC_DSRL32:
2147         tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm + 32);
2148         opn = "dsrl32";
2149         break;
2150     case OPC_DROTR32:
2151         tcg_gen_rotri_tl(cpu_gpr[rt], t0, uimm + 32);
2152         opn = "drotr32";
2153         break;
2154 #endif
2155     }
2156     (void)opn; /* avoid a compiler warning */
2157     MIPS_DEBUG("%s %s, %s, " TARGET_FMT_lx, opn, regnames[rt], regnames[rs], uimm);
2158     tcg_temp_free(t0);
2159 }
2160
2161 /* Arithmetic */
2162 static void gen_arith (CPUMIPSState *env, DisasContext *ctx, uint32_t opc,
2163                        int rd, int rs, int rt)
2164 {
2165     const char *opn = "arith";
2166
2167     if (rd == 0 && opc != OPC_ADD && opc != OPC_SUB
2168        && opc != OPC_DADD && opc != OPC_DSUB) {
2169         /* If no destination, treat it as a NOP.
2170            For add & sub, we must generate the overflow exception when needed. */
2171         MIPS_DEBUG("NOP");
2172         return;
2173     }
2174
2175     switch (opc) {
2176     case OPC_ADD:
2177         {
2178             TCGv t0 = tcg_temp_local_new();
2179             TCGv t1 = tcg_temp_new();
2180             TCGv t2 = tcg_temp_new();
2181             int l1 = gen_new_label();
2182
2183             gen_load_gpr(t1, rs);
2184             gen_load_gpr(t2, rt);
2185             tcg_gen_add_tl(t0, t1, t2);
2186             tcg_gen_ext32s_tl(t0, t0);
2187             tcg_gen_xor_tl(t1, t1, t2);
2188             tcg_gen_xor_tl(t2, t0, t2);
2189             tcg_gen_andc_tl(t1, t2, t1);
2190             tcg_temp_free(t2);
2191             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2192             tcg_temp_free(t1);
2193             /* operands of same sign, result different sign */
2194             generate_exception(ctx, EXCP_OVERFLOW);
2195             gen_set_label(l1);
2196             gen_store_gpr(t0, rd);
2197             tcg_temp_free(t0);
2198         }
2199         opn = "add";
2200         break;
2201     case OPC_ADDU:
2202         if (rs != 0 && rt != 0) {
2203             tcg_gen_add_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2204             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2205         } else if (rs == 0 && rt != 0) {
2206             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
2207         } else if (rs != 0 && rt == 0) {
2208             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2209         } else {
2210             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2211         }
2212         opn = "addu";
2213         break;
2214     case OPC_SUB:
2215         {
2216             TCGv t0 = tcg_temp_local_new();
2217             TCGv t1 = tcg_temp_new();
2218             TCGv t2 = tcg_temp_new();
2219             int l1 = gen_new_label();
2220
2221             gen_load_gpr(t1, rs);
2222             gen_load_gpr(t2, rt);
2223             tcg_gen_sub_tl(t0, t1, t2);
2224             tcg_gen_ext32s_tl(t0, t0);
2225             tcg_gen_xor_tl(t2, t1, t2);
2226             tcg_gen_xor_tl(t1, t0, t1);
2227             tcg_gen_and_tl(t1, t1, t2);
2228             tcg_temp_free(t2);
2229             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2230             tcg_temp_free(t1);
2231             /* operands of different sign, first operand and result different sign */
2232             generate_exception(ctx, EXCP_OVERFLOW);
2233             gen_set_label(l1);
2234             gen_store_gpr(t0, rd);
2235             tcg_temp_free(t0);
2236         }
2237         opn = "sub";
2238         break;
2239     case OPC_SUBU:
2240         if (rs != 0 && rt != 0) {
2241             tcg_gen_sub_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2242             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2243         } else if (rs == 0 && rt != 0) {
2244             tcg_gen_neg_tl(cpu_gpr[rd], cpu_gpr[rt]);
2245             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2246         } else if (rs != 0 && rt == 0) {
2247             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2248         } else {
2249             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2250         }
2251         opn = "subu";
2252         break;
2253 #if defined(TARGET_MIPS64)
2254     case OPC_DADD:
2255         {
2256             TCGv t0 = tcg_temp_local_new();
2257             TCGv t1 = tcg_temp_new();
2258             TCGv t2 = tcg_temp_new();
2259             int l1 = gen_new_label();
2260
2261             gen_load_gpr(t1, rs);
2262             gen_load_gpr(t2, rt);
2263             tcg_gen_add_tl(t0, t1, t2);
2264             tcg_gen_xor_tl(t1, t1, t2);
2265             tcg_gen_xor_tl(t2, t0, t2);
2266             tcg_gen_andc_tl(t1, t2, t1);
2267             tcg_temp_free(t2);
2268             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2269             tcg_temp_free(t1);
2270             /* operands of same sign, result different sign */
2271             generate_exception(ctx, EXCP_OVERFLOW);
2272             gen_set_label(l1);
2273             gen_store_gpr(t0, rd);
2274             tcg_temp_free(t0);
2275         }
2276         opn = "dadd";
2277         break;
2278     case OPC_DADDU:
2279         if (rs != 0 && rt != 0) {
2280             tcg_gen_add_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2281         } else if (rs == 0 && rt != 0) {
2282             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
2283         } else if (rs != 0 && rt == 0) {
2284             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2285         } else {
2286             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2287         }
2288         opn = "daddu";
2289         break;
2290     case OPC_DSUB:
2291         {
2292             TCGv t0 = tcg_temp_local_new();
2293             TCGv t1 = tcg_temp_new();
2294             TCGv t2 = tcg_temp_new();
2295             int l1 = gen_new_label();
2296
2297             gen_load_gpr(t1, rs);
2298             gen_load_gpr(t2, rt);
2299             tcg_gen_sub_tl(t0, t1, t2);
2300             tcg_gen_xor_tl(t2, t1, t2);
2301             tcg_gen_xor_tl(t1, t0, t1);
2302             tcg_gen_and_tl(t1, t1, t2);
2303             tcg_temp_free(t2);
2304             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2305             tcg_temp_free(t1);
2306             /* operands of different sign, first operand and result different sign */
2307             generate_exception(ctx, EXCP_OVERFLOW);
2308             gen_set_label(l1);
2309             gen_store_gpr(t0, rd);
2310             tcg_temp_free(t0);
2311         }
2312         opn = "dsub";
2313         break;
2314     case OPC_DSUBU:
2315         if (rs != 0 && rt != 0) {
2316             tcg_gen_sub_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2317         } else if (rs == 0 && rt != 0) {
2318             tcg_gen_neg_tl(cpu_gpr[rd], cpu_gpr[rt]);
2319         } else if (rs != 0 && rt == 0) {
2320             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2321         } else {
2322             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2323         }
2324         opn = "dsubu";
2325         break;
2326 #endif
2327     case OPC_MUL:
2328         if (likely(rs != 0 && rt != 0)) {
2329             tcg_gen_mul_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2330             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2331         } else {
2332             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2333         }
2334         opn = "mul";
2335         break;
2336     }
2337     (void)opn; /* avoid a compiler warning */
2338     MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
2339 }
2340
2341 /* Conditional move */
2342 static void gen_cond_move(CPUMIPSState *env, DisasContext *ctx, uint32_t opc,
2343                           int rd, int rs, int rt)
2344 {
2345     const char *opn = "cond move";
2346     int l1;
2347
2348     if (rd == 0) {
2349         /* If no destination, treat it as a NOP.
2350            For add & sub, we must generate the overflow exception when needed. */
2351         MIPS_DEBUG("NOP");
2352         return;
2353     }
2354
2355     l1 = gen_new_label();
2356     switch (opc) {
2357     case OPC_MOVN:
2358         if (likely(rt != 0))
2359             tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[rt], 0, l1);
2360         else
2361             tcg_gen_br(l1);
2362         opn = "movn";
2363         break;
2364     case OPC_MOVZ:
2365         if (likely(rt != 0))
2366             tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[rt], 0, l1);
2367         opn = "movz";
2368         break;
2369     }
2370     if (rs != 0)
2371         tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2372     else
2373         tcg_gen_movi_tl(cpu_gpr[rd], 0);
2374     gen_set_label(l1);
2375
2376     (void)opn; /* avoid a compiler warning */
2377     MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
2378 }
2379
2380 /* Logic */
2381 static void gen_logic(CPUMIPSState *env, DisasContext *ctx, uint32_t opc,
2382                       int rd, int rs, int rt)
2383 {
2384     const char *opn = "logic";
2385
2386     if (rd == 0) {
2387         /* If no destination, treat it as a NOP. */
2388         MIPS_DEBUG("NOP");
2389         return;
2390     }
2391
2392     switch (opc) {
2393     case OPC_AND:
2394         if (likely(rs != 0 && rt != 0)) {
2395             tcg_gen_and_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2396         } else {
2397             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2398         }
2399         opn = "and";
2400         break;
2401     case OPC_NOR:
2402         if (rs != 0 && rt != 0) {
2403             tcg_gen_nor_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2404         } else if (rs == 0 && rt != 0) {
2405             tcg_gen_not_tl(cpu_gpr[rd], cpu_gpr[rt]);
2406         } else if (rs != 0 && rt == 0) {
2407             tcg_gen_not_tl(cpu_gpr[rd], cpu_gpr[rs]);
2408         } else {
2409             tcg_gen_movi_tl(cpu_gpr[rd], ~((target_ulong)0));
2410         }
2411         opn = "nor";
2412         break;
2413     case OPC_OR:
2414         if (likely(rs != 0 && rt != 0)) {
2415             tcg_gen_or_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2416         } else if (rs == 0 && rt != 0) {
2417             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
2418         } else if (rs != 0 && rt == 0) {
2419             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2420         } else {
2421             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2422         }
2423         opn = "or";
2424         break;
2425     case OPC_XOR:
2426         if (likely(rs != 0 && rt != 0)) {
2427             tcg_gen_xor_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2428         } else if (rs == 0 && rt != 0) {
2429             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
2430         } else if (rs != 0 && rt == 0) {
2431             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2432         } else {
2433             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2434         }
2435         opn = "xor";
2436         break;
2437     }
2438     (void)opn; /* avoid a compiler warning */
2439     MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
2440 }
2441
2442 /* Set on lower than */
2443 static void gen_slt(CPUMIPSState *env, DisasContext *ctx, uint32_t opc,
2444                     int rd, int rs, int rt)
2445 {
2446     const char *opn = "slt";
2447     TCGv t0, t1;
2448
2449     if (rd == 0) {
2450         /* If no destination, treat it as a NOP. */
2451         MIPS_DEBUG("NOP");
2452         return;
2453     }
2454
2455     t0 = tcg_temp_new();
2456     t1 = tcg_temp_new();
2457     gen_load_gpr(t0, rs);
2458     gen_load_gpr(t1, rt);
2459     switch (opc) {
2460     case OPC_SLT:
2461         tcg_gen_setcond_tl(TCG_COND_LT, cpu_gpr[rd], t0, t1);
2462         opn = "slt";
2463         break;
2464     case OPC_SLTU:
2465         tcg_gen_setcond_tl(TCG_COND_LTU, cpu_gpr[rd], t0, t1);
2466         opn = "sltu";
2467         break;
2468     }
2469     (void)opn; /* avoid a compiler warning */
2470     MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
2471     tcg_temp_free(t0);
2472     tcg_temp_free(t1);
2473 }
2474
2475 /* Shifts */
2476 static void gen_shift (CPUMIPSState *env, DisasContext *ctx, uint32_t opc,
2477                        int rd, int rs, int rt)
2478 {
2479     const char *opn = "shifts";
2480     TCGv t0, t1;
2481
2482     if (rd == 0) {
2483         /* If no destination, treat it as a NOP.
2484            For add & sub, we must generate the overflow exception when needed. */
2485         MIPS_DEBUG("NOP");
2486         return;
2487     }
2488
2489     t0 = tcg_temp_new();
2490     t1 = tcg_temp_new();
2491     gen_load_gpr(t0, rs);
2492     gen_load_gpr(t1, rt);
2493     switch (opc) {
2494     case OPC_SLLV:
2495         tcg_gen_andi_tl(t0, t0, 0x1f);
2496         tcg_gen_shl_tl(t0, t1, t0);
2497         tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
2498         opn = "sllv";
2499         break;
2500     case OPC_SRAV:
2501         tcg_gen_andi_tl(t0, t0, 0x1f);
2502         tcg_gen_sar_tl(cpu_gpr[rd], t1, t0);
2503         opn = "srav";
2504         break;
2505     case OPC_SRLV:
2506         tcg_gen_ext32u_tl(t1, t1);
2507         tcg_gen_andi_tl(t0, t0, 0x1f);
2508         tcg_gen_shr_tl(t0, t1, t0);
2509         tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
2510         opn = "srlv";
2511         break;
2512     case OPC_ROTRV:
2513         {
2514             TCGv_i32 t2 = tcg_temp_new_i32();
2515             TCGv_i32 t3 = tcg_temp_new_i32();
2516
2517             tcg_gen_trunc_tl_i32(t2, t0);
2518             tcg_gen_trunc_tl_i32(t3, t1);
2519             tcg_gen_andi_i32(t2, t2, 0x1f);
2520             tcg_gen_rotr_i32(t2, t3, t2);
2521             tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
2522             tcg_temp_free_i32(t2);
2523             tcg_temp_free_i32(t3);
2524             opn = "rotrv";
2525         }
2526         break;
2527 #if defined(TARGET_MIPS64)
2528     case OPC_DSLLV:
2529         tcg_gen_andi_tl(t0, t0, 0x3f);
2530         tcg_gen_shl_tl(cpu_gpr[rd], t1, t0);
2531         opn = "dsllv";
2532         break;
2533     case OPC_DSRAV:
2534         tcg_gen_andi_tl(t0, t0, 0x3f);
2535         tcg_gen_sar_tl(cpu_gpr[rd], t1, t0);
2536         opn = "dsrav";
2537         break;
2538     case OPC_DSRLV:
2539         tcg_gen_andi_tl(t0, t0, 0x3f);
2540         tcg_gen_shr_tl(cpu_gpr[rd], t1, t0);
2541         opn = "dsrlv";
2542         break;
2543     case OPC_DROTRV:
2544         tcg_gen_andi_tl(t0, t0, 0x3f);
2545         tcg_gen_rotr_tl(cpu_gpr[rd], t1, t0);
2546         opn = "drotrv";
2547         break;
2548 #endif
2549     }
2550     (void)opn; /* avoid a compiler warning */
2551     MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
2552     tcg_temp_free(t0);
2553     tcg_temp_free(t1);
2554 }
2555
2556 /* Arithmetic on HI/LO registers */
2557 static void gen_HILO (DisasContext *ctx, uint32_t opc, int reg)
2558 {
2559     const char *opn = "hilo";
2560     unsigned int acc;
2561
2562     if (reg == 0 && (opc == OPC_MFHI || opc == OPC_MFLO)) {
2563         /* Treat as NOP. */
2564         MIPS_DEBUG("NOP");
2565         return;
2566     }
2567
2568     if (opc == OPC_MFHI || opc == OPC_MFLO) {
2569         acc = ((ctx->opcode) >> 21) & 0x03;
2570     } else {
2571         acc = ((ctx->opcode) >> 11) & 0x03;
2572     }
2573
2574     if (acc != 0) {
2575         check_dsp(ctx);
2576     }
2577
2578     switch (opc) {
2579     case OPC_MFHI:
2580 #if defined(TARGET_MIPS64)
2581         if (acc != 0) {
2582             tcg_gen_ext32s_tl(cpu_gpr[reg], cpu_HI[acc]);
2583         } else
2584 #endif
2585         {
2586             tcg_gen_mov_tl(cpu_gpr[reg], cpu_HI[acc]);
2587         }
2588         opn = "mfhi";
2589         break;
2590     case OPC_MFLO:
2591 #if defined(TARGET_MIPS64)
2592         if (acc != 0) {
2593             tcg_gen_ext32s_tl(cpu_gpr[reg], cpu_LO[acc]);
2594         } else
2595 #endif
2596         {
2597             tcg_gen_mov_tl(cpu_gpr[reg], cpu_LO[acc]);
2598         }
2599         opn = "mflo";
2600         break;
2601     case OPC_MTHI:
2602         if (reg != 0) {
2603 #if defined(TARGET_MIPS64)
2604             if (acc != 0) {
2605                 tcg_gen_ext32s_tl(cpu_HI[acc], cpu_gpr[reg]);
2606             } else
2607 #endif
2608             {
2609                 tcg_gen_mov_tl(cpu_HI[acc], cpu_gpr[reg]);
2610             }
2611         } else {
2612             tcg_gen_movi_tl(cpu_HI[acc], 0);
2613         }
2614         opn = "mthi";
2615         break;
2616     case OPC_MTLO:
2617         if (reg != 0) {
2618 #if defined(TARGET_MIPS64)
2619             if (acc != 0) {
2620                 tcg_gen_ext32s_tl(cpu_LO[acc], cpu_gpr[reg]);
2621             } else
2622 #endif
2623             {
2624                 tcg_gen_mov_tl(cpu_LO[acc], cpu_gpr[reg]);
2625             }
2626         } else {
2627             tcg_gen_movi_tl(cpu_LO[acc], 0);
2628         }
2629         opn = "mtlo";
2630         break;
2631     }
2632     (void)opn; /* avoid a compiler warning */
2633     MIPS_DEBUG("%s %s", opn, regnames[reg]);
2634 }
2635
2636 static void gen_muldiv (DisasContext *ctx, uint32_t opc,
2637                         int rs, int rt)
2638 {
2639     const char *opn = "mul/div";
2640     TCGv t0, t1;
2641     unsigned int acc;
2642
2643     switch (opc) {
2644     case OPC_DIV:
2645     case OPC_DIVU:
2646 #if defined(TARGET_MIPS64)
2647     case OPC_DDIV:
2648     case OPC_DDIVU:
2649 #endif
2650         t0 = tcg_temp_local_new();
2651         t1 = tcg_temp_local_new();
2652         break;
2653     default:
2654         t0 = tcg_temp_new();
2655         t1 = tcg_temp_new();
2656         break;
2657     }
2658
2659     gen_load_gpr(t0, rs);
2660     gen_load_gpr(t1, rt);
2661     switch (opc) {
2662     case OPC_DIV:
2663         {
2664             int l1 = gen_new_label();
2665             int l2 = gen_new_label();
2666
2667             tcg_gen_ext32s_tl(t0, t0);
2668             tcg_gen_ext32s_tl(t1, t1);
2669             tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
2670             tcg_gen_brcondi_tl(TCG_COND_NE, t0, INT_MIN, l2);
2671             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1, l2);
2672
2673             tcg_gen_mov_tl(cpu_LO[0], t0);
2674             tcg_gen_movi_tl(cpu_HI[0], 0);
2675             tcg_gen_br(l1);
2676             gen_set_label(l2);
2677             tcg_gen_div_tl(cpu_LO[0], t0, t1);
2678             tcg_gen_rem_tl(cpu_HI[0], t0, t1);
2679             tcg_gen_ext32s_tl(cpu_LO[0], cpu_LO[0]);
2680             tcg_gen_ext32s_tl(cpu_HI[0], cpu_HI[0]);
2681             gen_set_label(l1);
2682         }
2683         opn = "div";
2684         break;
2685     case OPC_DIVU:
2686         {
2687             int l1 = gen_new_label();
2688
2689             tcg_gen_ext32u_tl(t0, t0);
2690             tcg_gen_ext32u_tl(t1, t1);
2691             tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
2692             tcg_gen_divu_tl(cpu_LO[0], t0, t1);
2693             tcg_gen_remu_tl(cpu_HI[0], t0, t1);
2694             tcg_gen_ext32s_tl(cpu_LO[0], cpu_LO[0]);
2695             tcg_gen_ext32s_tl(cpu_HI[0], cpu_HI[0]);
2696             gen_set_label(l1);
2697         }
2698         opn = "divu";
2699         break;
2700     case OPC_MULT:
2701         {
2702             TCGv_i64 t2 = tcg_temp_new_i64();
2703             TCGv_i64 t3 = tcg_temp_new_i64();
2704             acc = ((ctx->opcode) >> 11) & 0x03;
2705             if (acc != 0) {
2706                 check_dsp(ctx);
2707             }
2708
2709             tcg_gen_ext_tl_i64(t2, t0);
2710             tcg_gen_ext_tl_i64(t3, t1);
2711             tcg_gen_mul_i64(t2, t2, t3);
2712             tcg_temp_free_i64(t3);
2713             tcg_gen_trunc_i64_tl(t0, t2);
2714             tcg_gen_shri_i64(t2, t2, 32);
2715             tcg_gen_trunc_i64_tl(t1, t2);
2716             tcg_temp_free_i64(t2);
2717             tcg_gen_ext32s_tl(cpu_LO[acc], t0);
2718             tcg_gen_ext32s_tl(cpu_HI[acc], t1);
2719         }
2720         opn = "mult";
2721         break;
2722     case OPC_MULTU:
2723         {
2724             TCGv_i64 t2 = tcg_temp_new_i64();
2725             TCGv_i64 t3 = tcg_temp_new_i64();
2726             acc = ((ctx->opcode) >> 11) & 0x03;
2727             if (acc != 0) {
2728                 check_dsp(ctx);
2729             }
2730
2731             tcg_gen_ext32u_tl(t0, t0);
2732             tcg_gen_ext32u_tl(t1, t1);
2733             tcg_gen_extu_tl_i64(t2, t0);
2734             tcg_gen_extu_tl_i64(t3, t1);
2735             tcg_gen_mul_i64(t2, t2, t3);
2736             tcg_temp_free_i64(t3);
2737             tcg_gen_trunc_i64_tl(t0, t2);
2738             tcg_gen_shri_i64(t2, t2, 32);
2739             tcg_gen_trunc_i64_tl(t1, t2);
2740             tcg_temp_free_i64(t2);
2741             tcg_gen_ext32s_tl(cpu_LO[acc], t0);
2742             tcg_gen_ext32s_tl(cpu_HI[acc], t1);
2743         }
2744         opn = "multu";
2745         break;
2746 #if defined(TARGET_MIPS64)
2747     case OPC_DDIV:
2748         {
2749             int l1 = gen_new_label();
2750             int l2 = gen_new_label();
2751
2752             tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
2753             tcg_gen_brcondi_tl(TCG_COND_NE, t0, -1LL << 63, l2);
2754             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1LL, l2);
2755             tcg_gen_mov_tl(cpu_LO[0], t0);
2756             tcg_gen_movi_tl(cpu_HI[0], 0);
2757             tcg_gen_br(l1);
2758             gen_set_label(l2);
2759             tcg_gen_div_i64(cpu_LO[0], t0, t1);
2760             tcg_gen_rem_i64(cpu_HI[0], t0, t1);
2761             gen_set_label(l1);
2762         }
2763         opn = "ddiv";
2764         break;
2765     case OPC_DDIVU:
2766         {
2767             int l1 = gen_new_label();
2768
2769             tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
2770             tcg_gen_divu_i64(cpu_LO[0], t0, t1);
2771             tcg_gen_remu_i64(cpu_HI[0], t0, t1);
2772             gen_set_label(l1);
2773         }
2774         opn = "ddivu";
2775         break;
2776     case OPC_DMULT:
2777         gen_helper_dmult(cpu_env, t0, t1);
2778         opn = "dmult";
2779         break;
2780     case OPC_DMULTU:
2781         gen_helper_dmultu(cpu_env, t0, t1);
2782         opn = "dmultu";
2783         break;
2784 #endif
2785     case OPC_MADD:
2786         {
2787             TCGv_i64 t2 = tcg_temp_new_i64();
2788             TCGv_i64 t3 = tcg_temp_new_i64();
2789             acc = ((ctx->opcode) >> 11) & 0x03;
2790             if (acc != 0) {
2791                 check_dsp(ctx);
2792             }
2793
2794             tcg_gen_ext_tl_i64(t2, t0);
2795             tcg_gen_ext_tl_i64(t3, t1);
2796             tcg_gen_mul_i64(t2, t2, t3);
2797             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
2798             tcg_gen_add_i64(t2, t2, t3);
2799             tcg_temp_free_i64(t3);
2800             tcg_gen_trunc_i64_tl(t0, t2);
2801             tcg_gen_shri_i64(t2, t2, 32);
2802             tcg_gen_trunc_i64_tl(t1, t2);
2803             tcg_temp_free_i64(t2);
2804             tcg_gen_ext32s_tl(cpu_LO[acc], t0);
2805             tcg_gen_ext32s_tl(cpu_HI[acc], t1);
2806         }
2807         opn = "madd";
2808         break;
2809     case OPC_MADDU:
2810         {
2811             TCGv_i64 t2 = tcg_temp_new_i64();
2812             TCGv_i64 t3 = tcg_temp_new_i64();
2813             acc = ((ctx->opcode) >> 11) & 0x03;
2814             if (acc != 0) {
2815                 check_dsp(ctx);
2816             }
2817
2818             tcg_gen_ext32u_tl(t0, t0);
2819             tcg_gen_ext32u_tl(t1, t1);
2820             tcg_gen_extu_tl_i64(t2, t0);
2821             tcg_gen_extu_tl_i64(t3, t1);
2822             tcg_gen_mul_i64(t2, t2, t3);
2823             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
2824             tcg_gen_add_i64(t2, t2, t3);
2825             tcg_temp_free_i64(t3);
2826             tcg_gen_trunc_i64_tl(t0, t2);
2827             tcg_gen_shri_i64(t2, t2, 32);
2828             tcg_gen_trunc_i64_tl(t1, t2);
2829             tcg_temp_free_i64(t2);
2830             tcg_gen_ext32s_tl(cpu_LO[acc], t0);
2831             tcg_gen_ext32s_tl(cpu_HI[acc], t1);
2832         }
2833         opn = "maddu";
2834         break;
2835     case OPC_MSUB:
2836         {
2837             TCGv_i64 t2 = tcg_temp_new_i64();
2838             TCGv_i64 t3 = tcg_temp_new_i64();
2839             acc = ((ctx->opcode) >> 11) & 0x03;
2840             if (acc != 0) {
2841                 check_dsp(ctx);
2842             }
2843
2844             tcg_gen_ext_tl_i64(t2, t0);
2845             tcg_gen_ext_tl_i64(t3, t1);
2846             tcg_gen_mul_i64(t2, t2, t3);
2847             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
2848             tcg_gen_sub_i64(t2, t3, t2);
2849             tcg_temp_free_i64(t3);
2850             tcg_gen_trunc_i64_tl(t0, t2);
2851             tcg_gen_shri_i64(t2, t2, 32);
2852             tcg_gen_trunc_i64_tl(t1, t2);
2853             tcg_temp_free_i64(t2);
2854             tcg_gen_ext32s_tl(cpu_LO[acc], t0);
2855             tcg_gen_ext32s_tl(cpu_HI[acc], t1);
2856         }
2857         opn = "msub";
2858         break;
2859     case OPC_MSUBU:
2860         {
2861             TCGv_i64 t2 = tcg_temp_new_i64();
2862             TCGv_i64 t3 = tcg_temp_new_i64();
2863             acc = ((ctx->opcode) >> 11) & 0x03;
2864             if (acc != 0) {
2865                 check_dsp(ctx);
2866             }
2867
2868             tcg_gen_ext32u_tl(t0, t0);
2869             tcg_gen_ext32u_tl(t1, t1);
2870             tcg_gen_extu_tl_i64(t2, t0);
2871             tcg_gen_extu_tl_i64(t3, t1);
2872             tcg_gen_mul_i64(t2, t2, t3);
2873             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
2874             tcg_gen_sub_i64(t2, t3, t2);
2875             tcg_temp_free_i64(t3);
2876             tcg_gen_trunc_i64_tl(t0, t2);
2877             tcg_gen_shri_i64(t2, t2, 32);
2878             tcg_gen_trunc_i64_tl(t1, t2);
2879             tcg_temp_free_i64(t2);
2880             tcg_gen_ext32s_tl(cpu_LO[acc], t0);
2881             tcg_gen_ext32s_tl(cpu_HI[acc], t1);
2882         }
2883         opn = "msubu";
2884         break;
2885     default:
2886         MIPS_INVAL(opn);
2887         generate_exception(ctx, EXCP_RI);
2888         goto out;
2889     }
2890     (void)opn; /* avoid a compiler warning */
2891     MIPS_DEBUG("%s %s %s", opn, regnames[rs], regnames[rt]);
2892  out:
2893     tcg_temp_free(t0);
2894     tcg_temp_free(t1);
2895 }
2896
2897 static void gen_mul_vr54xx (DisasContext *ctx, uint32_t opc,
2898                             int rd, int rs, int rt)
2899 {
2900     const char *opn = "mul vr54xx";
2901     TCGv t0 = tcg_temp_new();
2902     TCGv t1 = tcg_temp_new();
2903
2904     gen_load_gpr(t0, rs);
2905     gen_load_gpr(t1, rt);
2906
2907     switch (opc) {
2908     case OPC_VR54XX_MULS:
2909         gen_helper_muls(t0, cpu_env, t0, t1);
2910         opn = "muls";
2911         break;
2912     case OPC_VR54XX_MULSU:
2913         gen_helper_mulsu(t0, cpu_env, t0, t1);
2914         opn = "mulsu";
2915         break;
2916     case OPC_VR54XX_MACC:
2917         gen_helper_macc(t0, cpu_env, t0, t1);
2918         opn = "macc";
2919         break;
2920     case OPC_VR54XX_MACCU:
2921         gen_helper_maccu(t0, cpu_env, t0, t1);
2922         opn = "maccu";
2923         break;
2924     case OPC_VR54XX_MSAC:
2925         gen_helper_msac(t0, cpu_env, t0, t1);
2926         opn = "msac";
2927         break;
2928     case OPC_VR54XX_MSACU:
2929         gen_helper_msacu(t0, cpu_env, t0, t1);
2930         opn = "msacu";
2931         break;
2932     case OPC_VR54XX_MULHI:
2933         gen_helper_mulhi(t0, cpu_env, t0, t1);
2934         opn = "mulhi";
2935         break;
2936     case OPC_VR54XX_MULHIU:
2937         gen_helper_mulhiu(t0, cpu_env, t0, t1);
2938         opn = "mulhiu";
2939         break;
2940     case OPC_VR54XX_MULSHI:
2941         gen_helper_mulshi(t0, cpu_env, t0, t1);
2942         opn = "mulshi";
2943         break;
2944     case OPC_VR54XX_MULSHIU:
2945         gen_helper_mulshiu(t0, cpu_env, t0, t1);
2946         opn = "mulshiu";
2947         break;
2948     case OPC_VR54XX_MACCHI:
2949         gen_helper_macchi(t0, cpu_env, t0, t1);
2950         opn = "macchi";
2951         break;
2952     case OPC_VR54XX_MACCHIU:
2953         gen_helper_macchiu(t0, cpu_env, t0, t1);
2954         opn = "macchiu";
2955         break;
2956     case OPC_VR54XX_MSACHI:
2957         gen_helper_msachi(t0, cpu_env, t0, t1);
2958         opn = "msachi";
2959         break;
2960     case OPC_VR54XX_MSACHIU:
2961         gen_helper_msachiu(t0, cpu_env, t0, t1);
2962         opn = "msachiu";
2963         break;
2964     default:
2965         MIPS_INVAL("mul vr54xx");
2966         generate_exception(ctx, EXCP_RI);
2967         goto out;
2968     }
2969     gen_store_gpr(t0, rd);
2970     (void)opn; /* avoid a compiler warning */
2971     MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
2972
2973  out:
2974     tcg_temp_free(t0);
2975     tcg_temp_free(t1);
2976 }
2977
2978 static void gen_cl (DisasContext *ctx, uint32_t opc,
2979                     int rd, int rs)
2980 {
2981     const char *opn = "CLx";
2982     TCGv t0;
2983
2984     if (rd == 0) {
2985         /* Treat as NOP. */
2986         MIPS_DEBUG("NOP");
2987         return;
2988     }
2989     t0 = tcg_temp_new();
2990     gen_load_gpr(t0, rs);
2991     switch (opc) {
2992     case OPC_CLO:
2993         gen_helper_clo(cpu_gpr[rd], t0);
2994         opn = "clo";
2995         break;
2996     case OPC_CLZ:
2997         gen_helper_clz(cpu_gpr[rd], t0);
2998         opn = "clz";
2999         break;
3000 #if defined(TARGET_MIPS64)
3001     case OPC_DCLO:
3002         gen_helper_dclo(cpu_gpr[rd], t0);
3003         opn = "dclo";
3004         break;
3005     case OPC_DCLZ:
3006         gen_helper_dclz(cpu_gpr[rd], t0);
3007         opn = "dclz";
3008         break;
3009 #endif
3010     }
3011     (void)opn; /* avoid a compiler warning */
3012     MIPS_DEBUG("%s %s, %s", opn, regnames[rd], regnames[rs]);
3013     tcg_temp_free(t0);
3014 }
3015
3016 /* Godson integer instructions */
3017 static void gen_loongson_integer(DisasContext *ctx, uint32_t opc,
3018                                  int rd, int rs, int rt)
3019 {
3020     const char *opn = "loongson";
3021     TCGv t0, t1;
3022
3023     if (rd == 0) {
3024         /* Treat as NOP. */
3025         MIPS_DEBUG("NOP");
3026         return;
3027     }
3028
3029     switch (opc) {
3030     case OPC_MULT_G_2E:
3031     case OPC_MULT_G_2F:
3032     case OPC_MULTU_G_2E:
3033     case OPC_MULTU_G_2F:
3034 #if defined(TARGET_MIPS64)
3035     case OPC_DMULT_G_2E:
3036     case OPC_DMULT_G_2F:
3037     case OPC_DMULTU_G_2E:
3038     case OPC_DMULTU_G_2F:
3039 #endif
3040         t0 = tcg_temp_new();
3041         t1 = tcg_temp_new();
3042         break;
3043     default:
3044         t0 = tcg_temp_local_new();
3045         t1 = tcg_temp_local_new();
3046         break;
3047     }
3048
3049     gen_load_gpr(t0, rs);
3050     gen_load_gpr(t1, rt);
3051
3052     switch (opc) {
3053     case OPC_MULT_G_2E:
3054     case OPC_MULT_G_2F:
3055         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3056         tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3057         opn = "mult.g";
3058         break;
3059     case OPC_MULTU_G_2E:
3060     case OPC_MULTU_G_2F:
3061         tcg_gen_ext32u_tl(t0, t0);
3062         tcg_gen_ext32u_tl(t1, t1);
3063         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3064         tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3065         opn = "multu.g";
3066         break;
3067     case OPC_DIV_G_2E:
3068     case OPC_DIV_G_2F:
3069         {
3070             int l1 = gen_new_label();
3071             int l2 = gen_new_label();
3072             int l3 = gen_new_label();
3073             tcg_gen_ext32s_tl(t0, t0);
3074             tcg_gen_ext32s_tl(t1, t1);
3075             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3076             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3077             tcg_gen_br(l3);
3078             gen_set_label(l1);
3079             tcg_gen_brcondi_tl(TCG_COND_NE, t0, INT_MIN, l2);
3080             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1, l2);
3081             tcg_gen_mov_tl(cpu_gpr[rd], t0);
3082             tcg_gen_br(l3);
3083             gen_set_label(l2);
3084             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
3085             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3086             gen_set_label(l3);
3087         }
3088         opn = "div.g";
3089         break;
3090     case OPC_DIVU_G_2E:
3091     case OPC_DIVU_G_2F:
3092         {
3093             int l1 = gen_new_label();
3094             int l2 = gen_new_label();
3095             tcg_gen_ext32u_tl(t0, t0);
3096             tcg_gen_ext32u_tl(t1, t1);
3097             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3098             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3099             tcg_gen_br(l2);
3100             gen_set_label(l1);
3101             tcg_gen_divu_tl(cpu_gpr[rd], t0, t1);
3102             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3103             gen_set_label(l2);
3104         }
3105         opn = "divu.g";
3106         break;
3107     case OPC_MOD_G_2E:
3108     case OPC_MOD_G_2F:
3109         {
3110             int l1 = gen_new_label();
3111             int l2 = gen_new_label();
3112             int l3 = gen_new_label();
3113             tcg_gen_ext32u_tl(t0, t0);
3114             tcg_gen_ext32u_tl(t1, t1);
3115             tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
3116             tcg_gen_brcondi_tl(TCG_COND_NE, t0, INT_MIN, l2);
3117             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1, l2);
3118             gen_set_label(l1);
3119             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3120             tcg_gen_br(l3);
3121             gen_set_label(l2);
3122             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
3123             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3124             gen_set_label(l3);
3125         }
3126         opn = "mod.g";
3127         break;
3128     case OPC_MODU_G_2E:
3129     case OPC_MODU_G_2F:
3130         {
3131             int l1 = gen_new_label();
3132             int l2 = gen_new_label();
3133             tcg_gen_ext32u_tl(t0, t0);
3134             tcg_gen_ext32u_tl(t1, t1);
3135             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3136             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3137             tcg_gen_br(l2);
3138             gen_set_label(l1);
3139             tcg_gen_remu_tl(cpu_gpr[rd], t0, t1);
3140             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3141             gen_set_label(l2);
3142         }
3143         opn = "modu.g";
3144         break;
3145 #if defined(TARGET_MIPS64)
3146     case OPC_DMULT_G_2E:
3147     case OPC_DMULT_G_2F:
3148         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3149         opn = "dmult.g";
3150         break;
3151     case OPC_DMULTU_G_2E:
3152     case OPC_DMULTU_G_2F:
3153         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3154         opn = "dmultu.g";
3155         break;
3156     case OPC_DDIV_G_2E:
3157     case OPC_DDIV_G_2F:
3158         {
3159             int l1 = gen_new_label();
3160             int l2 = gen_new_label();
3161             int l3 = gen_new_label();
3162             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3163             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3164             tcg_gen_br(l3);
3165             gen_set_label(l1);
3166             tcg_gen_brcondi_tl(TCG_COND_NE, t0, -1LL << 63, l2);
3167             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1LL, l2);
3168             tcg_gen_mov_tl(cpu_gpr[rd], t0);
3169             tcg_gen_br(l3);
3170             gen_set_label(l2);
3171             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
3172             gen_set_label(l3);
3173         }
3174         opn = "ddiv.g";
3175         break;
3176     case OPC_DDIVU_G_2E:
3177     case OPC_DDIVU_G_2F:
3178         {
3179             int l1 = gen_new_label();
3180             int l2 = gen_new_label();
3181             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3182             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3183             tcg_gen_br(l2);
3184             gen_set_label(l1);
3185             tcg_gen_divu_tl(cpu_gpr[rd], t0, t1);
3186             gen_set_label(l2);
3187         }
3188         opn = "ddivu.g";
3189         break;
3190     case OPC_DMOD_G_2E:
3191     case OPC_DMOD_G_2F:
3192         {
3193             int l1 = gen_new_label();
3194             int l2 = gen_new_label();
3195             int l3 = gen_new_label();
3196             tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
3197             tcg_gen_brcondi_tl(TCG_COND_NE, t0, -1LL << 63, l2);
3198             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1LL, l2);
3199             gen_set_label(l1);
3200             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3201             tcg_gen_br(l3);
3202             gen_set_label(l2);
3203             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
3204             gen_set_label(l3);
3205         }
3206         opn = "dmod.g";
3207         break;
3208     case OPC_DMODU_G_2E:
3209     case OPC_DMODU_G_2F:
3210         {
3211             int l1 = gen_new_label();
3212             int l2 = gen_new_label();
3213             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3214             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3215             tcg_gen_br(l2);
3216             gen_set_label(l1);
3217             tcg_gen_remu_tl(cpu_gpr[rd], t0, t1);
3218             gen_set_label(l2);
3219         }
3220         opn = "dmodu.g";
3221         break;
3222 #endif
3223     }
3224
3225     (void)opn; /* avoid a compiler warning */
3226     MIPS_DEBUG("%s %s, %s", opn, regnames[rd], regnames[rs]);
3227     tcg_temp_free(t0);
3228     tcg_temp_free(t1);
3229 }
3230
3231 /* Loongson multimedia instructions */
3232 static void gen_loongson_multimedia(DisasContext *ctx, int rd, int rs, int rt)
3233 {
3234     const char *opn = "loongson_cp2";
3235     uint32_t opc, shift_max;
3236     TCGv_i64 t0, t1;
3237
3238     opc = MASK_LMI(ctx->opcode);
3239     switch (opc) {
3240     case OPC_ADD_CP2:
3241     case OPC_SUB_CP2:
3242     case OPC_DADD_CP2:
3243     case OPC_DSUB_CP2:
3244         t0 = tcg_temp_local_new_i64();
3245         t1 = tcg_temp_local_new_i64();
3246         break;
3247     default:
3248         t0 = tcg_temp_new_i64();
3249         t1 = tcg_temp_new_i64();
3250         break;
3251     }
3252
3253     gen_load_fpr64(ctx, t0, rs);
3254     gen_load_fpr64(ctx, t1, rt);
3255
3256 #define LMI_HELPER(UP, LO) \
3257     case OPC_##UP: gen_helper_##LO(t0, t0, t1); opn = #LO; break
3258 #define LMI_HELPER_1(UP, LO) \
3259     case OPC_##UP: gen_helper_##LO(t0, t0); opn = #LO; break
3260 #define LMI_DIRECT(UP, LO, OP) \
3261     case OPC_##UP: tcg_gen_##OP##_i64(t0, t0, t1); opn = #LO; break
3262
3263     switch (opc) {
3264     LMI_HELPER(PADDSH, paddsh);
3265     LMI_HELPER(PADDUSH, paddush);
3266     LMI_HELPER(PADDH, paddh);
3267     LMI_HELPER(PADDW, paddw);
3268     LMI_HELPER(PADDSB, paddsb);
3269     LMI_HELPER(PADDUSB, paddusb);
3270     LMI_HELPER(PADDB, paddb);
3271
3272     LMI_HELPER(PSUBSH, psubsh);
3273     LMI_HELPER(PSUBUSH, psubush);
3274     LMI_HELPER(PSUBH, psubh);
3275     LMI_HELPER(PSUBW, psubw);
3276     LMI_HELPER(PSUBSB, psubsb);
3277     LMI_HELPER(PSUBUSB, psubusb);
3278     LMI_HELPER(PSUBB, psubb);
3279
3280     LMI_HELPER(PSHUFH, pshufh);
3281     LMI_HELPER(PACKSSWH, packsswh);
3282     LMI_HELPER(PACKSSHB, packsshb);
3283     LMI_HELPER(PACKUSHB, packushb);
3284
3285     LMI_HELPER(PUNPCKLHW, punpcklhw);
3286     LMI_HELPER(PUNPCKHHW, punpckhhw);
3287     LMI_HELPER(PUNPCKLBH, punpcklbh);
3288     LMI_HELPER(PUNPCKHBH, punpckhbh);
3289     LMI_HELPER(PUNPCKLWD, punpcklwd);
3290     LMI_HELPER(PUNPCKHWD, punpckhwd);
3291
3292     LMI_HELPER(PAVGH, pavgh);
3293     LMI_HELPER(PAVGB, pavgb);
3294     LMI_HELPER(PMAXSH, pmaxsh);
3295     LMI_HELPER(PMINSH, pminsh);
3296     LMI_HELPER(PMAXUB, pmaxub);
3297     LMI_HELPER(PMINUB, pminub);
3298
3299     LMI_HELPER(PCMPEQW, pcmpeqw);
3300     LMI_HELPER(PCMPGTW, pcmpgtw);
3301     LMI_HELPER(PCMPEQH, pcmpeqh);
3302     LMI_HELPER(PCMPGTH, pcmpgth);
3303     LMI_HELPER(PCMPEQB, pcmpeqb);
3304     LMI_HELPER(PCMPGTB, pcmpgtb);
3305
3306     LMI_HELPER(PSLLW, psllw);
3307     LMI_HELPER(PSLLH, psllh);
3308     LMI_HELPER(PSRLW, psrlw);
3309     LMI_HELPER(PSRLH, psrlh);
3310     LMI_HELPER(PSRAW, psraw);
3311     LMI_HELPER(PSRAH, psrah);
3312
3313     LMI_HELPER(PMULLH, pmullh);
3314     LMI_HELPER(PMULHH, pmulhh);
3315     LMI_HELPER(PMULHUH, pmulhuh);
3316     LMI_HELPER(PMADDHW, pmaddhw);
3317
3318     LMI_HELPER(PASUBUB, pasubub);
3319     LMI_HELPER_1(BIADD, biadd);
3320     LMI_HELPER_1(PMOVMSKB, pmovmskb);
3321
3322     LMI_DIRECT(PADDD, paddd, add);
3323     LMI_DIRECT(PSUBD, psubd, sub);
3324     LMI_DIRECT(XOR_CP2, xor, xor);
3325     LMI_DIRECT(NOR_CP2, nor, nor);
3326     LMI_DIRECT(AND_CP2, and, and);
3327     LMI_DIRECT(PANDN, pandn, andc);
3328     LMI_DIRECT(OR, or, or);
3329
3330     case OPC_PINSRH_0:
3331         tcg_gen_deposit_i64(t0, t0, t1, 0, 16);
3332         opn = "pinsrh_0";
3333         break;
3334     case OPC_PINSRH_1:
3335         tcg_gen_deposit_i64(t0, t0, t1, 16, 16);
3336         opn = "pinsrh_1";
3337         break;
3338     case OPC_PINSRH_2:
3339         tcg_gen_deposit_i64(t0, t0, t1, 32, 16);
3340         opn = "pinsrh_2";
3341         break;
3342     case OPC_PINSRH_3:
3343         tcg_gen_deposit_i64(t0, t0, t1, 48, 16);
3344         opn = "pinsrh_3";
3345         break;
3346
3347     case OPC_PEXTRH:
3348         tcg_gen_andi_i64(t1, t1, 3);
3349         tcg_gen_shli_i64(t1, t1, 4);
3350         tcg_gen_shr_i64(t0, t0, t1);
3351         tcg_gen_ext16u_i64(t0, t0);
3352         opn = "pextrh";
3353         break;
3354
3355     case OPC_ADDU_CP2:
3356         tcg_gen_add_i64(t0, t0, t1);
3357         tcg_gen_ext32s_i64(t0, t0);
3358         opn = "addu";
3359         break;
3360     case OPC_SUBU_CP2:
3361         tcg_gen_sub_i64(t0, t0, t1);
3362         tcg_gen_ext32s_i64(t0, t0);
3363         opn = "addu";
3364         break;
3365
3366     case OPC_SLL_CP2:
3367         opn = "sll";
3368         shift_max = 32;
3369         goto do_shift;
3370     case OPC_SRL_CP2:
3371         opn = "srl";
3372         shift_max = 32;
3373         goto do_shift;
3374     case OPC_SRA_CP2:
3375         opn = "sra";
3376         shift_max = 32;
3377         goto do_shift;
3378     case OPC_DSLL_CP2:
3379         opn = "dsll";
3380         shift_max = 64;
3381         goto do_shift;
3382     case OPC_DSRL_CP2:
3383         opn = "dsrl";
3384         shift_max = 64;
3385         goto do_shift;
3386     case OPC_DSRA_CP2:
3387         opn = "dsra";
3388         shift_max = 64;
3389         goto do_shift;
3390     do_shift:
3391         /* Make sure shift count isn't TCG undefined behaviour.  */
3392         tcg_gen_andi_i64(t1, t1, shift_max - 1);
3393
3394         switch (opc) {
3395         case OPC_SLL_CP2:
3396         case OPC_DSLL_CP2:
3397             tcg_gen_shl_i64(t0, t0, t1);
3398             break;
3399         case OPC_SRA_CP2:
3400         case OPC_DSRA_CP2:
3401             /* Since SRA is UndefinedResult without sign-extended inputs,
3402                we can treat SRA and DSRA the same.  */
3403             tcg_gen_sar_i64(t0, t0, t1);
3404             break;
3405         case OPC_SRL_CP2:
3406             /* We want to shift in zeros for SRL; zero-extend first.  */
3407             tcg_gen_ext32u_i64(t0, t0);
3408             /* FALLTHRU */
3409         case OPC_DSRL_CP2:
3410             tcg_gen_shr_i64(t0, t0, t1);
3411             break;
3412         }
3413
3414         if (shift_max == 32) {
3415             tcg_gen_ext32s_i64(t0, t0);
3416         }
3417
3418         /* Shifts larger than MAX produce zero.  */
3419         tcg_gen_setcondi_i64(TCG_COND_LTU, t1, t1, shift_max);
3420         tcg_gen_neg_i64(t1, t1);
3421         tcg_gen_and_i64(t0, t0, t1);
3422         break;
3423
3424     case OPC_ADD_CP2:
3425     case OPC_DADD_CP2:
3426         {
3427             TCGv_i64 t2 = tcg_temp_new_i64();
3428             int lab = gen_new_label();
3429
3430             tcg_gen_mov_i64(t2, t0);
3431             tcg_gen_add_i64(t0, t1, t2);
3432             if (opc == OPC_ADD_CP2) {
3433                 tcg_gen_ext32s_i64(t0, t0);
3434             }
3435             tcg_gen_xor_i64(t1, t1, t2);
3436             tcg_gen_xor_i64(t2, t2, t0);
3437             tcg_gen_andc_i64(t1, t2, t1);
3438             tcg_temp_free_i64(t2);
3439             tcg_gen_brcondi_i64(TCG_COND_GE, t1, 0, lab);
3440             generate_exception(ctx, EXCP_OVERFLOW);
3441             gen_set_label(lab);
3442
3443             opn = (opc == OPC_ADD_CP2 ? "add" : "dadd");
3444             break;
3445         }
3446
3447     case OPC_SUB_CP2:
3448     case OPC_DSUB_CP2:
3449         {
3450             TCGv_i64 t2 = tcg_temp_new_i64();
3451             int lab = gen_new_label();
3452
3453             tcg_gen_mov_i64(t2, t0);
3454             tcg_gen_sub_i64(t0, t1, t2);
3455             if (opc == OPC_SUB_CP2) {
3456                 tcg_gen_ext32s_i64(t0, t0);
3457             }
3458             tcg_gen_xor_i64(t1, t1, t2);
3459             tcg_gen_xor_i64(t2, t2, t0);
3460             tcg_gen_and_i64(t1, t1, t2);
3461             tcg_temp_free_i64(t2);
3462             tcg_gen_brcondi_i64(TCG_COND_GE, t1, 0, lab);
3463             generate_exception(ctx, EXCP_OVERFLOW);
3464             gen_set_label(lab);
3465
3466             opn = (opc == OPC_SUB_CP2 ? "sub" : "dsub");
3467             break;
3468         }
3469
3470     case OPC_PMULUW:
3471         tcg_gen_ext32u_i64(t0, t0);
3472         tcg_gen_ext32u_i64(t1, t1);
3473         tcg_gen_mul_i64(t0, t0, t1);
3474         opn = "pmuluw";
3475         break;
3476
3477     case OPC_SEQU_CP2:
3478     case OPC_SEQ_CP2:
3479     case OPC_SLTU_CP2:
3480     case OPC_SLT_CP2:
3481     case OPC_SLEU_CP2:
3482     case OPC_SLE_CP2:
3483         /* ??? Document is unclear: Set FCC[CC].  Does that mean the
3484            FD field is the CC field?  */
3485     default:
3486         MIPS_INVAL(opn);
3487         generate_exception(ctx, EXCP_RI);
3488         return;
3489     }
3490
3491 #undef LMI_HELPER
3492 #undef LMI_DIRECT
3493
3494     gen_store_fpr64(ctx, t0, rd);
3495
3496     (void)opn; /* avoid a compiler warning */
3497     MIPS_DEBUG("%s %s, %s, %s", opn,
3498                fregnames[rd], fregnames[rs], fregnames[rt]);
3499     tcg_temp_free_i64(t0);
3500     tcg_temp_free_i64(t1);
3501 }
3502
3503 /* Traps */
3504 static void gen_trap (DisasContext *ctx, uint32_t opc,
3505                       int rs, int rt, int16_t imm)
3506 {
3507     int cond;
3508     TCGv t0 = tcg_temp_new();
3509     TCGv t1 = tcg_temp_new();
3510
3511     cond = 0;
3512     /* Load needed operands */
3513     switch (opc) {
3514     case OPC_TEQ:
3515     case OPC_TGE:
3516     case OPC_TGEU:
3517     case OPC_TLT:
3518     case OPC_TLTU:
3519     case OPC_TNE:
3520         /* Compare two registers */
3521         if (rs != rt) {
3522             gen_load_gpr(t0, rs);
3523             gen_load_gpr(t1, rt);
3524             cond = 1;
3525         }
3526         break;
3527     case OPC_TEQI:
3528     case OPC_TGEI:
3529     case OPC_TGEIU:
3530     case OPC_TLTI:
3531     case OPC_TLTIU:
3532     case OPC_TNEI:
3533         /* Compare register to immediate */
3534         if (rs != 0 || imm != 0) {
3535             gen_load_gpr(t0, rs);
3536             tcg_gen_movi_tl(t1, (int32_t)imm);
3537             cond = 1;
3538         }
3539         break;
3540     }
3541     if (cond == 0) {
3542         switch (opc) {
3543         case OPC_TEQ:   /* rs == rs */
3544         case OPC_TEQI:  /* r0 == 0  */
3545         case OPC_TGE:   /* rs >= rs */
3546         case OPC_TGEI:  /* r0 >= 0  */
3547         case OPC_TGEU:  /* rs >= rs unsigned */
3548         case OPC_TGEIU: /* r0 >= 0  unsigned */
3549             /* Always trap */
3550             generate_exception(ctx, EXCP_TRAP);
3551             break;
3552         case OPC_TLT:   /* rs < rs           */
3553         case OPC_TLTI:  /* r0 < 0            */
3554         case OPC_TLTU:  /* rs < rs unsigned  */
3555         case OPC_TLTIU: /* r0 < 0  unsigned  */
3556         case OPC_TNE:   /* rs != rs          */
3557         case OPC_TNEI:  /* r0 != 0           */
3558             /* Never trap: treat as NOP. */
3559             break;
3560         }
3561     } else {
3562         int l1 = gen_new_label();
3563
3564         switch (opc) {
3565         case OPC_TEQ:
3566         case OPC_TEQI:
3567             tcg_gen_brcond_tl(TCG_COND_NE, t0, t1, l1);
3568             break;
3569         case OPC_TGE:
3570         case OPC_TGEI:
3571             tcg_gen_brcond_tl(TCG_COND_LT, t0, t1, l1);
3572             break;
3573         case OPC_TGEU:
3574         case OPC_TGEIU:
3575             tcg_gen_brcond_tl(TCG_COND_LTU, t0, t1, l1);
3576             break;
3577         case OPC_TLT:
3578         case OPC_TLTI:
3579             tcg_gen_brcond_tl(TCG_COND_GE, t0, t1, l1);
3580             break;
3581         case OPC_TLTU:
3582         case OPC_TLTIU:
3583             tcg_gen_brcond_tl(TCG_COND_GEU, t0, t1, l1);
3584             break;
3585         case OPC_TNE:
3586         case OPC_TNEI:
3587             tcg_gen_brcond_tl(TCG_COND_EQ, t0, t1, l1);
3588             break;
3589         }
3590         generate_exception(ctx, EXCP_TRAP);
3591         gen_set_label(l1);
3592     }
3593     tcg_temp_free(t0);
3594     tcg_temp_free(t1);
3595 }
3596
3597 static inline void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
3598 {
3599     TranslationBlock *tb;
3600     tb = ctx->tb;
3601     if ((tb->pc & TARGET_PAGE_MASK) == (dest & TARGET_PAGE_MASK) &&
3602         likely(!ctx->singlestep_enabled)) {
3603         tcg_gen_goto_tb(n);
3604         gen_save_pc(dest);
3605         tcg_gen_exit_tb((tcg_target_long)tb + n);
3606     } else {
3607         gen_save_pc(dest);
3608         if (ctx->singlestep_enabled) {
3609             save_cpu_state(ctx, 0);
3610             gen_helper_0e0i(raise_exception, EXCP_DEBUG);
3611         }
3612         tcg_gen_exit_tb(0);
3613     }
3614 }
3615
3616 /* Branches (before delay slot) */
3617 static void gen_compute_branch (DisasContext *ctx, uint32_t opc,
3618                                 int insn_bytes,
3619                                 int rs, int rt, int32_t offset)
3620 {
3621     target_ulong btgt = -1;
3622     int blink = 0;
3623     int bcond_compute = 0;
3624     TCGv t0 = tcg_temp_new();
3625     TCGv t1 = tcg_temp_new();
3626
3627     if (ctx->hflags & MIPS_HFLAG_BMASK) {
3628 #ifdef MIPS_DEBUG_DISAS
3629         LOG_DISAS("Branch in delay slot at PC 0x" TARGET_FMT_lx "\n", ctx->pc);
3630 #endif
3631         generate_exception(ctx, EXCP_RI);
3632         goto out;
3633     }
3634
3635     /* Load needed operands */
3636     switch (opc) {
3637     case OPC_BEQ:
3638     case OPC_BEQL:
3639     case OPC_BNE:
3640     case OPC_BNEL:
3641         /* Compare two registers */
3642         if (rs != rt) {
3643             gen_load_gpr(t0, rs);
3644             gen_load_gpr(t1, rt);
3645             bcond_compute = 1;
3646         }
3647         btgt = ctx->pc + insn_bytes + offset;
3648         break;
3649     case OPC_BGEZ:
3650     case OPC_BGEZAL:
3651     case OPC_BGEZALS:
3652     case OPC_BGEZALL:
3653     case OPC_BGEZL:
3654     case OPC_BGTZ:
3655     case OPC_BGTZL:
3656     case OPC_BLEZ:
3657     case OPC_BLEZL:
3658     case OPC_BLTZ:
3659     case OPC_BLTZAL:
3660     case OPC_BLTZALS:
3661     case OPC_BLTZALL:
3662     case OPC_BLTZL:
3663         /* Compare to zero */
3664         if (rs != 0) {
3665             gen_load_gpr(t0, rs);
3666             bcond_compute = 1;
3667         }
3668         btgt = ctx->pc + insn_bytes + offset;
3669         break;
3670     case OPC_BPOSGE32:
3671 #if defined(TARGET_MIPS64)
3672     case OPC_BPOSGE64:
3673         tcg_gen_andi_tl(t0, cpu_dspctrl, 0x7F);
3674 #else
3675         tcg_gen_andi_tl(t0, cpu_dspctrl, 0x3F);
3676 #endif
3677         bcond_compute = 1;
3678         btgt = ctx->pc + insn_bytes + offset;
3679         break;
3680     case OPC_J:
3681     case OPC_JAL:
3682     case OPC_JALX:
3683     case OPC_JALS:
3684     case OPC_JALXS:
3685         /* Jump to immediate */
3686         btgt = ((ctx->pc + insn_bytes) & (int32_t)0xF0000000) | (uint32_t)offset;
3687         break;
3688     case OPC_JR:
3689     case OPC_JALR:
3690     case OPC_JALRC:
3691     case OPC_JALRS:
3692         /* Jump to register */
3693         if (offset != 0 && offset != 16) {
3694             /* Hint = 0 is JR/JALR, hint 16 is JR.HB/JALR.HB, the
3695                others are reserved. */
3696             MIPS_INVAL("jump hint");
3697             generate_exception(ctx, EXCP_RI);
3698             goto out;
3699         }
3700         gen_load_gpr(btarget, rs);
3701         break;
3702     default:
3703         MIPS_INVAL("branch/jump");
3704         generate_exception(ctx, EXCP_RI);
3705         goto out;
3706     }
3707     if (bcond_compute == 0) {
3708         /* No condition to be computed */
3709         switch (opc) {
3710         case OPC_BEQ:     /* rx == rx        */
3711         case OPC_BEQL:    /* rx == rx likely */
3712         case OPC_BGEZ:    /* 0 >= 0          */
3713         case OPC_BGEZL:   /* 0 >= 0 likely   */
3714         case OPC_BLEZ:    /* 0 <= 0          */
3715         case OPC_BLEZL:   /* 0 <= 0 likely   */
3716             /* Always take */
3717             ctx->hflags |= MIPS_HFLAG_B;
3718             MIPS_DEBUG("balways");
3719             break;
3720         case OPC_BGEZALS:
3721         case OPC_BGEZAL:  /* 0 >= 0          */
3722         case OPC_BGEZALL: /* 0 >= 0 likely   */
3723             ctx->hflags |= (opc == OPC_BGEZALS
3724                             ? MIPS_HFLAG_BDS16
3725                             : MIPS_HFLAG_BDS32);
3726             /* Always take and link */
3727             blink = 31;
3728             ctx->hflags |= MIPS_HFLAG_B;
3729             MIPS_DEBUG("balways and link");
3730             break;
3731         case OPC_BNE:     /* rx != rx        */
3732         case OPC_BGTZ:    /* 0 > 0           */
3733         case OPC_BLTZ:    /* 0 < 0           */
3734             /* Treat as NOP. */
3735             MIPS_DEBUG("bnever (NOP)");
3736             goto out;
3737         case OPC_BLTZALS:
3738         case OPC_BLTZAL:  /* 0 < 0           */
3739             ctx->hflags |= (opc == OPC_BLTZALS
3740                             ? MIPS_HFLAG_BDS16
3741                             : MIPS_HFLAG_BDS32);
3742             /* Handle as an unconditional branch to get correct delay
3743                slot checking.  */
3744             blink = 31;
3745             btgt = ctx->pc + (opc == OPC_BLTZALS ? 6 : 8);
3746             ctx->hflags |= MIPS_HFLAG_B;
3747             MIPS_DEBUG("bnever and link");
3748             break;
3749         case OPC_BLTZALL: /* 0 < 0 likely */
3750             tcg_gen_movi_tl(cpu_gpr[31], ctx->pc + 8);
3751             /* Skip the instruction in the delay slot */
3752             MIPS_DEBUG("bnever, link and skip");
3753             ctx->pc += 4;
3754             goto out;
3755         case OPC_BNEL:    /* rx != rx likely */
3756         case OPC_BGTZL:   /* 0 > 0 likely */
3757         case OPC_BLTZL:   /* 0 < 0 likely */
3758             /* Skip the instruction in the delay slot */
3759             MIPS_DEBUG("bnever and skip");
3760             ctx->pc += 4;
3761             goto out;
3762         case OPC_J:
3763             ctx->hflags |= MIPS_HFLAG_B;
3764             MIPS_DEBUG("j " TARGET_FMT_lx, btgt);
3765             break;
3766         case OPC_JALXS:
3767         case OPC_JALX:
3768             ctx->hflags |= MIPS_HFLAG_BX;
3769             /* Fallthrough */
3770         case OPC_JALS:
3771         case OPC_JAL:
3772             blink = 31;
3773             ctx->hflags |= MIPS_HFLAG_B;
3774             ctx->hflags |= ((opc == OPC_JALS || opc == OPC_JALXS)
3775                             ? MIPS_HFLAG_BDS16
3776                             : MIPS_HFLAG_BDS32);
3777             MIPS_DEBUG("jal " TARGET_FMT_lx, btgt);
3778             break;
3779         case OPC_JR:
3780             ctx->hflags |= MIPS_HFLAG_BR;
3781             if (insn_bytes == 4)
3782                 ctx->hflags |= MIPS_HFLAG_BDS32;
3783             MIPS_DEBUG("jr %s", regnames[rs]);
3784             break;
3785         case OPC_JALRS:
3786         case OPC_JALR:
3787         case OPC_JALRC:
3788             blink = rt;
3789             ctx->hflags |= MIPS_HFLAG_BR;
3790             ctx->hflags |= (opc == OPC_JALRS
3791                             ? MIPS_HFLAG_BDS16
3792                             : MIPS_HFLAG_BDS32);
3793             MIPS_DEBUG("jalr %s, %s", regnames[rt], regnames[rs]);
3794             break;
3795         default:
3796             MIPS_INVAL("branch/jump");
3797             generate_exception(ctx, EXCP_RI);
3798             goto out;
3799         }
3800     } else {
3801         switch (opc) {
3802         case OPC_BEQ:
3803             tcg_gen_setcond_tl(TCG_COND_EQ, bcond, t0, t1);
3804             MIPS_DEBUG("beq %s, %s, " TARGET_FMT_lx,
3805                        regnames[rs], regnames[rt], btgt);
3806             goto not_likely;
3807         case OPC_BEQL:
3808             tcg_gen_setcond_tl(TCG_COND_EQ, bcond, t0, t1);
3809             MIPS_DEBUG("beql %s, %s, " TARGET_FMT_lx,
3810                        regnames[rs], regnames[rt], btgt);
3811             goto likely;
3812         case OPC_BNE:
3813             tcg_gen_setcond_tl(TCG_COND_NE, bcond, t0, t1);
3814             MIPS_DEBUG("bne %s, %s, " TARGET_FMT_lx,
3815                        regnames[rs], regnames[rt], btgt);
3816             goto not_likely;
3817         case OPC_BNEL:
3818             tcg_gen_setcond_tl(TCG_COND_NE, bcond, t0, t1);
3819             MIPS_DEBUG("bnel %s, %s, " TARGET_FMT_lx,
3820                        regnames[rs], regnames[rt], btgt);
3821             goto likely;
3822         case OPC_BGEZ:
3823             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
3824             MIPS_DEBUG("bgez %s, " TARGET_FMT_lx, regnames[rs], btgt);
3825             goto not_likely;
3826         case OPC_BGEZL:
3827             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
3828             MIPS_DEBUG("bgezl %s, " TARGET_FMT_lx, regnames[rs], btgt);
3829             goto likely;
3830         case OPC_BGEZALS:
3831         case OPC_BGEZAL:
3832             ctx->hflags |= (opc == OPC_BGEZALS
3833                             ? MIPS_HFLAG_BDS16
3834                             : MIPS_HFLAG_BDS32);
3835             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
3836             MIPS_DEBUG("bgezal %s, " TARGET_FMT_lx, regnames[rs], btgt);
3837             blink = 31;
3838             goto not_likely;
3839         case OPC_BGEZALL:
3840             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
3841             blink = 31;
3842             MIPS_DEBUG("bgezall %s, " TARGET_FMT_lx, regnames[rs], btgt);
3843             goto likely;
3844         case OPC_BGTZ:
3845             tcg_gen_setcondi_tl(TCG_COND_GT, bcond, t0, 0);
3846             MIPS_DEBUG("bgtz %s, " TARGET_FMT_lx, regnames[rs], btgt);
3847             goto not_likely;
3848         case OPC_BGTZL:
3849             tcg_gen_setcondi_tl(TCG_COND_GT, bcond, t0, 0);
3850             MIPS_DEBUG("bgtzl %s, " TARGET_FMT_lx, regnames[rs], btgt);
3851             goto likely;
3852         case OPC_BLEZ:
3853             tcg_gen_setcondi_tl(TCG_COND_LE, bcond, t0, 0);
3854             MIPS_DEBUG("blez %s, " TARGET_FMT_lx, regnames[rs], btgt);
3855             goto not_likely;
3856         case OPC_BLEZL:
3857             tcg_gen_setcondi_tl(TCG_COND_LE, bcond, t0, 0);
3858             MIPS_DEBUG("blezl %s, " TARGET_FMT_lx, regnames[rs], btgt);
3859             goto likely;
3860         case OPC_BLTZ:
3861             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
3862             MIPS_DEBUG("bltz %s, " TARGET_FMT_lx, regnames[rs], btgt);
3863             goto not_likely;
3864         case OPC_BLTZL:
3865             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
3866             MIPS_DEBUG("bltzl %s, " TARGET_FMT_lx, regnames[rs], btgt);
3867             goto likely;
3868         case OPC_BPOSGE32:
3869             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 32);
3870             MIPS_DEBUG("bposge32 " TARGET_FMT_lx, btgt);
3871             goto not_likely;
3872 #if defined(TARGET_MIPS64)
3873         case OPC_BPOSGE64:
3874             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 64);
3875             MIPS_DEBUG("bposge64 " TARGET_FMT_lx, btgt);
3876             goto not_likely;
3877 #endif
3878         case OPC_BLTZALS:
3879         case OPC_BLTZAL:
3880             ctx->hflags |= (opc == OPC_BLTZALS
3881                             ? MIPS_HFLAG_BDS16
3882                             : MIPS_HFLAG_BDS32);
3883             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
3884             blink = 31;
3885             MIPS_DEBUG("bltzal %s, " TARGET_FMT_lx, regnames[rs], btgt);
3886         not_likely:
3887             ctx->hflags |= MIPS_HFLAG_BC;
3888             break;
3889         case OPC_BLTZALL:
3890             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
3891             blink = 31;
3892             MIPS_DEBUG("bltzall %s, " TARGET_FMT_lx, regnames[rs], btgt);
3893         likely:
3894             ctx->hflags |= MIPS_HFLAG_BL;
3895             break;
3896         default:
3897             MIPS_INVAL("conditional branch/jump");
3898             generate_exception(ctx, EXCP_RI);
3899             goto out;
3900         }
3901     }
3902     MIPS_DEBUG("enter ds: link %d cond %02x target " TARGET_FMT_lx,
3903                blink, ctx->hflags, btgt);
3904
3905     ctx->btarget = btgt;
3906     if (blink > 0) {
3907         int post_delay = insn_bytes;
3908         int lowbit = !!(ctx->hflags & MIPS_HFLAG_M16);
3909
3910         if (opc != OPC_JALRC)
3911             post_delay += ((ctx->hflags & MIPS_HFLAG_BDS16) ? 2 : 4);
3912
3913         tcg_gen_movi_tl(cpu_gpr[blink], ctx->pc + post_delay + lowbit);
3914     }
3915
3916  out:
3917     if (insn_bytes == 2)
3918         ctx->hflags |= MIPS_HFLAG_B16;
3919     tcg_temp_free(t0);
3920     tcg_temp_free(t1);
3921 }
3922
3923 /* special3 bitfield operations */
3924 static void gen_bitops (DisasContext *ctx, uint32_t opc, int rt,
3925                         int rs, int lsb, int msb)
3926 {
3927     TCGv t0 = tcg_temp_new();
3928     TCGv t1 = tcg_temp_new();
3929     target_ulong mask;
3930
3931     gen_load_gpr(t1, rs);
3932     switch (opc) {
3933     case OPC_EXT:
3934         if (lsb + msb > 31)
3935             goto fail;
3936         tcg_gen_shri_tl(t0, t1, lsb);
3937         if (msb != 31) {
3938             tcg_gen_andi_tl(t0, t0, (1 << (msb + 1)) - 1);
3939         } else {
3940             tcg_gen_ext32s_tl(t0, t0);
3941         }
3942         break;
3943 #if defined(TARGET_MIPS64)
3944     case OPC_DEXTM:
3945         tcg_gen_shri_tl(t0, t1, lsb);
3946         if (msb != 31) {
3947             tcg_gen_andi_tl(t0, t0, (1ULL << (msb + 1 + 32)) - 1);
3948         }
3949         break;
3950     case OPC_DEXTU:
3951         tcg_gen_shri_tl(t0, t1, lsb + 32);
3952         tcg_gen_andi_tl(t0, t0, (1ULL << (msb + 1)) - 1);
3953         break;
3954     case OPC_DEXT:
3955         tcg_gen_shri_tl(t0, t1, lsb);
3956         tcg_gen_andi_tl(t0, t0, (1ULL << (msb + 1)) - 1);
3957         break;
3958 #endif
3959     case OPC_INS:
3960         if (lsb > msb)
3961             goto fail;
3962         mask = ((msb - lsb + 1 < 32) ? ((1 << (msb - lsb + 1)) - 1) : ~0) << lsb;
3963         gen_load_gpr(t0, rt);
3964         tcg_gen_andi_tl(t0, t0, ~mask);
3965         tcg_gen_shli_tl(t1, t1, lsb);
3966         tcg_gen_andi_tl(t1, t1, mask);
3967         tcg_gen_or_tl(t0, t0, t1);
3968         tcg_gen_ext32s_tl(t0, t0);
3969         break;
3970 #if defined(TARGET_MIPS64)
3971     case OPC_DINSM:
3972         if (lsb > msb)
3973             goto fail;
3974         mask = ((msb - lsb + 1 + 32 < 64) ? ((1ULL << (msb - lsb + 1 + 32)) - 1) : ~0ULL) << lsb;
3975         gen_load_gpr(t0, rt);
3976         tcg_gen_andi_tl(t0, t0, ~mask);
3977         tcg_gen_shli_tl(t1, t1, lsb);
3978         tcg_gen_andi_tl(t1, t1, mask);
3979         tcg_gen_or_tl(t0, t0, t1);
3980         break;
3981     case OPC_DINSU:
3982         if (lsb > msb)
3983             goto fail;
3984         mask = ((1ULL << (msb - lsb + 1)) - 1) << (lsb + 32);
3985         gen_load_gpr(t0, rt);
3986         tcg_gen_andi_tl(t0, t0, ~mask);
3987         tcg_gen_shli_tl(t1, t1, lsb + 32);
3988         tcg_gen_andi_tl(t1, t1, mask);
3989         tcg_gen_or_tl(t0, t0, t1);
3990         break;
3991     case OPC_DINS:
3992         if (lsb > msb)
3993             goto fail;
3994         gen_load_gpr(t0, rt);
3995         mask = ((1ULL << (msb - lsb + 1)) - 1) << lsb;
3996         gen_load_gpr(t0, rt);
3997         tcg_gen_andi_tl(t0, t0, ~mask);
3998         tcg_gen_shli_tl(t1, t1, lsb);
3999         tcg_gen_andi_tl(t1, t1, mask);
4000         tcg_gen_or_tl(t0, t0, t1);
4001         break;
4002 #endif
4003     default:
4004 fail:
4005         MIPS_INVAL("bitops");
4006         generate_exception(ctx, EXCP_RI);
4007         tcg_temp_free(t0);
4008         tcg_temp_free(t1);
4009         return;
4010     }
4011     gen_store_gpr(t0, rt);
4012     tcg_temp_free(t0);
4013     tcg_temp_free(t1);
4014 }
4015
4016 static void gen_bshfl (DisasContext *ctx, uint32_t op2, int rt, int rd)
4017 {
4018     TCGv t0;
4019
4020     if (rd == 0) {
4021         /* If no destination, treat it as a NOP. */
4022         MIPS_DEBUG("NOP");
4023         return;
4024     }
4025
4026     t0 = tcg_temp_new();
4027     gen_load_gpr(t0, rt);
4028     switch (op2) {
4029     case OPC_WSBH:
4030         {
4031             TCGv t1 = tcg_temp_new();
4032
4033             tcg_gen_shri_tl(t1, t0, 8);
4034             tcg_gen_andi_tl(t1, t1, 0x00FF00FF);
4035             tcg_gen_shli_tl(t0, t0, 8);
4036             tcg_gen_andi_tl(t0, t0, ~0x00FF00FF);
4037             tcg_gen_or_tl(t0, t0, t1);
4038             tcg_temp_free(t1);
4039             tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
4040         }
4041         break;
4042     case OPC_SEB:
4043         tcg_gen_ext8s_tl(cpu_gpr[rd], t0);
4044         break;
4045     case OPC_SEH:
4046         tcg_gen_ext16s_tl(cpu_gpr[rd], t0);
4047         break;
4048 #if defined(TARGET_MIPS64)
4049     case OPC_DSBH:
4050         {
4051             TCGv t1 = tcg_temp_new();
4052
4053             tcg_gen_shri_tl(t1, t0, 8);
4054             tcg_gen_andi_tl(t1, t1, 0x00FF00FF00FF00FFULL);
4055             tcg_gen_shli_tl(t0, t0, 8);
4056             tcg_gen_andi_tl(t0, t0, ~0x00FF00FF00FF00FFULL);
4057             tcg_gen_or_tl(cpu_gpr[rd], t0, t1);
4058             tcg_temp_free(t1);
4059         }
4060         break;
4061     case OPC_DSHD:
4062         {
4063             TCGv t1 = tcg_temp_new();
4064
4065             tcg_gen_shri_tl(t1, t0, 16);
4066             tcg_gen_andi_tl(t1, t1, 0x0000FFFF0000FFFFULL);
4067             tcg_gen_shli_tl(t0, t0, 16);
4068             tcg_gen_andi_tl(t0, t0, ~0x0000FFFF0000FFFFULL);
4069             tcg_gen_or_tl(t0, t0, t1);
4070             tcg_gen_shri_tl(t1, t0, 32);
4071             tcg_gen_shli_tl(t0, t0, 32);
4072             tcg_gen_or_tl(cpu_gpr[rd], t0, t1);
4073             tcg_temp_free(t1);
4074         }
4075         break;
4076 #endif
4077     default:
4078         MIPS_INVAL("bsfhl");
4079         generate_exception(ctx, EXCP_RI);
4080         tcg_temp_free(t0);
4081         return;
4082     }
4083     tcg_temp_free(t0);
4084 }
4085
4086 #ifndef CONFIG_USER_ONLY
4087 /* CP0 (MMU and control) */
4088 static inline void gen_mfc0_load32 (TCGv arg, target_ulong off)
4089 {
4090     TCGv_i32 t0 = tcg_temp_new_i32();
4091
4092     tcg_gen_ld_i32(t0, cpu_env, off);
4093     tcg_gen_ext_i32_tl(arg, t0);
4094     tcg_temp_free_i32(t0);
4095 }
4096
4097 static inline void gen_mfc0_load64 (TCGv arg, target_ulong off)
4098 {
4099     tcg_gen_ld_tl(arg, cpu_env, off);
4100     tcg_gen_ext32s_tl(arg, arg);
4101 }
4102
4103 static inline void gen_mtc0_store32 (TCGv arg, target_ulong off)
4104 {
4105     TCGv_i32 t0 = tcg_temp_new_i32();
4106
4107     tcg_gen_trunc_tl_i32(t0, arg);
4108     tcg_gen_st_i32(t0, cpu_env, off);
4109     tcg_temp_free_i32(t0);
4110 }
4111
4112 static inline void gen_mtc0_store64 (TCGv arg, target_ulong off)
4113 {
4114     tcg_gen_ext32s_tl(arg, arg);
4115     tcg_gen_st_tl(arg, cpu_env, off);
4116 }
4117
4118 static void gen_mfc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, int sel)
4119 {
4120     const char *rn = "invalid";
4121
4122     if (sel != 0)
4123         check_insn(env, ctx, ISA_MIPS32);
4124
4125     switch (reg) {
4126     case 0:
4127         switch (sel) {
4128         case 0:
4129             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Index));
4130             rn = "Index";
4131             break;
4132         case 1:
4133             check_insn(env, ctx, ASE_MT);
4134             gen_helper_mfc0_mvpcontrol(arg, cpu_env);
4135             rn = "MVPControl";
4136             break;
4137         case 2:
4138             check_insn(env, ctx, ASE_MT);
4139             gen_helper_mfc0_mvpconf0(arg, cpu_env);
4140             rn = "MVPConf0";
4141             break;
4142         case 3:
4143             check_insn(env, ctx, ASE_MT);
4144             gen_helper_mfc0_mvpconf1(arg, cpu_env);
4145             rn = "MVPConf1";
4146             break;
4147         default:
4148             goto die;
4149         }
4150         break;
4151     case 1:
4152         switch (sel) {
4153         case 0:
4154             gen_helper_mfc0_random(arg, cpu_env);
4155             rn = "Random";
4156             break;
4157         case 1:
4158             check_insn(env, ctx, ASE_MT);
4159             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEControl));
4160             rn = "VPEControl";
4161             break;
4162         case 2:
4163             check_insn(env, ctx, ASE_MT);
4164             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf0));
4165             rn = "VPEConf0";
4166             break;
4167         case 3:
4168             check_insn(env, ctx, ASE_MT);
4169             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf1));
4170             rn = "VPEConf1";
4171             break;
4172         case 4:
4173             check_insn(env, ctx, ASE_MT);
4174             gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_YQMask));
4175             rn = "YQMask";
4176             break;
4177         case 5:
4178             check_insn(env, ctx, ASE_MT);
4179             gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_VPESchedule));
4180             rn = "VPESchedule";
4181             break;
4182         case 6:
4183             check_insn(env, ctx, ASE_MT);
4184             gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_VPEScheFBack));
4185             rn = "VPEScheFBack";
4186             break;
4187         case 7:
4188             check_insn(env, ctx, ASE_MT);
4189             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEOpt));
4190             rn = "VPEOpt";
4191             break;
4192         default:
4193             goto die;
4194         }
4195         break;
4196     case 2:
4197         switch (sel) {
4198         case 0:
4199             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryLo0));
4200             tcg_gen_ext32s_tl(arg, arg);
4201             rn = "EntryLo0";
4202             break;
4203         case 1:
4204             check_insn(env, ctx, ASE_MT);
4205             gen_helper_mfc0_tcstatus(arg, cpu_env);
4206             rn = "TCStatus";
4207             break;
4208         case 2:
4209             check_insn(env, ctx, ASE_MT);
4210             gen_helper_mfc0_tcbind(arg, cpu_env);
4211             rn = "TCBind";
4212             break;
4213         case 3:
4214             check_insn(env, ctx, ASE_MT);
4215             gen_helper_mfc0_tcrestart(arg, cpu_env);
4216             rn = "TCRestart";
4217             break;
4218         case 4:
4219             check_insn(env, ctx, ASE_MT);
4220             gen_helper_mfc0_tchalt(arg, cpu_env);
4221             rn = "TCHalt";
4222             break;
4223         case 5:
4224             check_insn(env, ctx, ASE_MT);
4225             gen_helper_mfc0_tccontext(arg, cpu_env);
4226             rn = "TCContext";
4227             break;
4228         case 6:
4229             check_insn(env, ctx, ASE_MT);
4230             gen_helper_mfc0_tcschedule(arg, cpu_env);
4231             rn = "TCSchedule";
4232             break;
4233         case 7:
4234             check_insn(env, ctx, ASE_MT);
4235             gen_helper_mfc0_tcschefback(arg, cpu_env);
4236             rn = "TCScheFBack";
4237             break;
4238         default:
4239             goto die;
4240         }
4241         break;
4242     case 3:
4243         switch (sel) {
4244         case 0:
4245             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryLo1));
4246             tcg_gen_ext32s_tl(arg, arg);
4247             rn = "EntryLo1";
4248             break;
4249         default:
4250             goto die;
4251         }
4252         break;
4253     case 4:
4254         switch (sel) {
4255         case 0:
4256             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_Context));
4257             tcg_gen_ext32s_tl(arg, arg);
4258             rn = "Context";
4259             break;
4260         case 1:
4261 //            gen_helper_mfc0_contextconfig(arg); /* SmartMIPS ASE */
4262             rn = "ContextConfig";
4263 //            break;
4264         default:
4265             goto die;
4266         }
4267         break;
4268     case 5:
4269         switch (sel) {
4270         case 0:
4271             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageMask));
4272             rn = "PageMask";
4273             break;
4274         case 1:
4275             check_insn(env, ctx, ISA_MIPS32R2);
4276             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageGrain));
4277             rn = "PageGrain";
4278             break;
4279         default:
4280             goto die;
4281         }
4282         break;
4283     case 6:
4284         switch (sel) {
4285         case 0:
4286             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Wired));
4287             rn = "Wired";
4288             break;
4289         case 1:
4290             check_insn(env, ctx, ISA_MIPS32R2);
4291             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf0));
4292             rn = "SRSConf0";
4293             break;
4294         case 2:
4295             check_insn(env, ctx, ISA_MIPS32R2);
4296             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf1));
4297             rn = "SRSConf1";
4298             break;
4299         case 3:
4300             check_insn(env, ctx, ISA_MIPS32R2);
4301             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf2));
4302             rn = "SRSConf2";
4303             break;
4304         case 4:
4305             check_insn(env, ctx, ISA_MIPS32R2);
4306             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf3));
4307             rn = "SRSConf3";
4308             break;
4309         case 5:
4310             check_insn(env, ctx, ISA_MIPS32R2);
4311             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf4));
4312             rn = "SRSConf4";
4313             break;
4314         default:
4315             goto die;
4316         }
4317         break;
4318     case 7:
4319         switch (sel) {
4320         case 0:
4321             check_insn(env, ctx, ISA_MIPS32R2);
4322             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_HWREna));
4323             rn = "HWREna";
4324             break;
4325         default:
4326             goto die;
4327         }
4328         break;
4329     case 8:
4330         switch (sel) {
4331         case 0:
4332             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));
4333             tcg_gen_ext32s_tl(arg, arg);
4334             rn = "BadVAddr";
4335             break;
4336         default:
4337             goto die;
4338        }
4339         break;
4340     case 9:
4341         switch (sel) {
4342         case 0:
4343             /* Mark as an IO operation because we read the time.  */
4344             if (use_icount)
4345                 gen_io_start();
4346             gen_helper_mfc0_count(arg, cpu_env);
4347             if (use_icount) {
4348                 gen_io_end();
4349             }
4350             /* Break the TB to be able to take timer interrupts immediately
4351                after reading count.  */
4352             ctx->bstate = BS_STOP;
4353             rn = "Count";
4354             break;
4355         /* 6,7 are implementation dependent */
4356         default:
4357             goto die;
4358         }
4359         break;
4360     case 10:
4361         switch (sel) {
4362         case 0:
4363             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryHi));
4364             tcg_gen_ext32s_tl(arg, arg);
4365             rn = "EntryHi";
4366             break;
4367         default:
4368             goto die;
4369         }
4370         break;
4371     case 11:
4372         switch (sel) {
4373         case 0:
4374             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Compare));
4375             rn = "Compare";
4376             break;
4377         /* 6,7 are implementation dependent */
4378         default:
4379             goto die;
4380         }
4381         break;
4382     case 12:
4383         switch (sel) {
4384         case 0:
4385             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Status));
4386             rn = "Status";
4387             break;
4388         case 1:
4389             check_insn(env, ctx, ISA_MIPS32R2);
4390             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_IntCtl));
4391             rn = "IntCtl";
4392             break;
4393         case 2:
4394             check_insn(env, ctx, ISA_MIPS32R2);
4395             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSCtl));
4396             rn = "SRSCtl";
4397             break;
4398         case 3:
4399             check_insn(env, ctx, ISA_MIPS32R2);
4400             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
4401             rn = "SRSMap";
4402             break;
4403         default:
4404             goto die;
4405        }
4406         break;
4407     case 13:
4408         switch (sel) {
4409         case 0:
4410             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Cause));
4411             rn = "Cause";
4412             break;
4413         default:
4414             goto die;
4415        }
4416         break;
4417     case 14:
4418         switch (sel) {
4419         case 0:
4420             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
4421             tcg_gen_ext32s_tl(arg, arg);
4422             rn = "EPC";
4423             break;
4424         default:
4425             goto die;
4426         }
4427         break;
4428     case 15:
4429         switch (sel) {
4430         case 0:
4431             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PRid));
4432             rn = "PRid";
4433             break;
4434         case 1:
4435             check_insn(env, ctx, ISA_MIPS32R2);
4436             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_EBase));
4437             rn = "EBase";
4438             break;
4439         default:
4440             goto die;
4441        }
4442         break;
4443     case 16:
4444         switch (sel) {
4445         case 0:
4446             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config0));
4447             rn = "Config";
4448             break;
4449         case 1:
4450             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config1));
4451             rn = "Config1";
4452             break;
4453         case 2:
4454             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config2));
4455             rn = "Config2";
4456             break;
4457         case 3:
4458             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config3));
4459             rn = "Config3";
4460             break;
4461         /* 4,5 are reserved */
4462         /* 6,7 are implementation dependent */
4463         case 6:
4464             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config6));
4465             rn = "Config6";
4466             break;
4467         case 7:
4468             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config7));
4469             rn = "Config7";
4470             break;
4471         default:
4472             goto die;
4473         }
4474         break;
4475     case 17:
4476         switch (sel) {
4477         case 0:
4478             gen_helper_mfc0_lladdr(arg, cpu_env);
4479             rn = "LLAddr";
4480             break;
4481         default:
4482             goto die;
4483         }
4484         break;
4485     case 18:
4486         switch (sel) {
4487         case 0 ... 7:
4488             gen_helper_1e0i(mfc0_watchlo, arg, sel);
4489             rn = "WatchLo";
4490             break;
4491         default:
4492             goto die;
4493         }
4494         break;
4495     case 19:
4496         switch (sel) {
4497         case 0 ...7:
4498             gen_helper_1e0i(mfc0_watchhi, arg, sel);
4499             rn = "WatchHi";
4500             break;
4501         default:
4502             goto die;
4503         }
4504         break;
4505     case 20:
4506         switch (sel) {
4507         case 0:
4508 #if defined(TARGET_MIPS64)
4509             check_insn(env, ctx, ISA_MIPS3);
4510             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_XContext));
4511             tcg_gen_ext32s_tl(arg, arg);
4512             rn = "XContext";
4513             break;
4514 #endif
4515         default:
4516             goto die;
4517         }
4518         break;
4519     case 21:
4520        /* Officially reserved, but sel 0 is used for R1x000 framemask */
4521         switch (sel) {
4522         case 0:
4523             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Framemask));
4524             rn = "Framemask";
4525             break;
4526         default:
4527             goto die;
4528         }
4529         break;
4530     case 22:
4531         tcg_gen_movi_tl(arg, 0); /* unimplemented */
4532         rn = "'Diagnostic"; /* implementation dependent */
4533         break;
4534     case 23:
4535         switch (sel) {
4536         case 0:
4537             gen_helper_mfc0_debug(arg, cpu_env); /* EJTAG support */
4538             rn = "Debug";
4539             break;
4540         case 1:
4541 //            gen_helper_mfc0_tracecontrol(arg); /* PDtrace support */
4542             rn = "TraceControl";
4543 //            break;
4544         case 2:
4545 //            gen_helper_mfc0_tracecontrol2(arg); /* PDtrace support */
4546             rn = "TraceControl2";
4547 //            break;
4548         case 3:
4549 //            gen_helper_mfc0_usertracedata(arg); /* PDtrace support */
4550             rn = "UserTraceData";
4551 //            break;
4552         case 4:
4553 //            gen_helper_mfc0_tracebpc(arg); /* PDtrace support */
4554             rn = "TraceBPC";
4555 //            break;
4556         default:
4557             goto die;
4558         }
4559         break;
4560     case 24:
4561         switch (sel) {
4562         case 0:
4563             /* EJTAG support */
4564             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
4565             tcg_gen_ext32s_tl(arg, arg);
4566             rn = "DEPC";
4567             break;
4568         default:
4569             goto die;
4570         }
4571         break;
4572     case 25:
4573         switch (sel) {
4574         case 0:
4575             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Performance0));
4576             rn = "Performance0";
4577             break;
4578         case 1:
4579 //            gen_helper_mfc0_performance1(arg);
4580             rn = "Performance1";
4581 //            break;
4582         case 2:
4583 //            gen_helper_mfc0_performance2(arg);
4584             rn = "Performance2";
4585 //            break;
4586         case 3:
4587 //            gen_helper_mfc0_performance3(arg);
4588             rn = "Performance3";
4589 //            break;
4590         case 4:
4591 //            gen_helper_mfc0_performance4(arg);
4592             rn = "Performance4";
4593 //            break;
4594         case 5:
4595 //            gen_helper_mfc0_performance5(arg);
4596             rn = "Performance5";
4597 //            break;
4598         case 6:
4599 //            gen_helper_mfc0_performance6(arg);
4600             rn = "Performance6";
4601 //            break;
4602         case 7:
4603 //            gen_helper_mfc0_performance7(arg);
4604             rn = "Performance7";
4605 //            break;
4606         default:
4607             goto die;
4608         }
4609         break;
4610     case 26:
4611         tcg_gen_movi_tl(arg, 0); /* unimplemented */
4612         rn = "ECC";
4613         break;
4614     case 27:
4615         switch (sel) {
4616         case 0 ... 3:
4617             tcg_gen_movi_tl(arg, 0); /* unimplemented */
4618             rn = "CacheErr";
4619             break;
4620         default:
4621             goto die;
4622         }
4623         break;
4624     case 28:
4625         switch (sel) {
4626         case 0:
4627         case 2:
4628         case 4:
4629         case 6:
4630             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagLo));
4631             rn = "TagLo";
4632             break;
4633         case 1:
4634         case 3:
4635         case 5:
4636         case 7:
4637             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataLo));
4638             rn = "DataLo";
4639             break;
4640         default:
4641             goto die;
4642         }
4643         break;
4644     case 29:
4645         switch (sel) {
4646         case 0:
4647         case 2:
4648         case 4:
4649         case 6:
4650             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagHi));
4651             rn = "TagHi";
4652             break;
4653         case 1:
4654         case 3:
4655         case 5:
4656         case 7:
4657             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataHi));
4658             rn = "DataHi";
4659             break;
4660         default:
4661             goto die;
4662         }
4663         break;
4664     case 30:
4665         switch (sel) {
4666         case 0:
4667             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
4668             tcg_gen_ext32s_tl(arg, arg);
4669             rn = "ErrorEPC";
4670             break;
4671         default:
4672             goto die;
4673         }
4674         break;
4675     case 31:
4676         switch (sel) {
4677         case 0:
4678             /* EJTAG support */
4679             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
4680             rn = "DESAVE";
4681             break;
4682         default:
4683             goto die;
4684         }
4685         break;
4686     default:
4687        goto die;
4688     }
4689     (void)rn; /* avoid a compiler warning */
4690     LOG_DISAS("mfc0 %s (reg %d sel %d)\n", rn, reg, sel);
4691     return;
4692
4693 die:
4694     LOG_DISAS("mfc0 %s (reg %d sel %d)\n", rn, reg, sel);
4695     generate_exception(ctx, EXCP_RI);
4696 }
4697
4698 static void gen_mtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, int sel)
4699 {
4700     const char *rn = "invalid";
4701
4702     if (sel != 0)
4703         check_insn(env, ctx, ISA_MIPS32);
4704
4705     if (use_icount)
4706         gen_io_start();
4707
4708     switch (reg) {
4709     case 0:
4710         switch (sel) {
4711         case 0:
4712             gen_helper_mtc0_index(cpu_env, arg);
4713             rn = "Index";
4714             break;
4715         case 1:
4716             check_insn(env, ctx, ASE_MT);
4717             gen_helper_mtc0_mvpcontrol(cpu_env, arg);
4718             rn = "MVPControl";
4719             break;
4720         case 2:
4721             check_insn(env, ctx, ASE_MT);
4722             /* ignored */
4723             rn = "MVPConf0";
4724             break;
4725         case 3:
4726             check_insn(env, ctx, ASE_MT);
4727             /* ignored */
4728             rn = "MVPConf1";
4729             break;
4730         default:
4731             goto die;
4732         }
4733         break;
4734     case 1:
4735         switch (sel) {
4736         case 0:
4737             /* ignored */
4738             rn = "Random";
4739             break;
4740         case 1:
4741             check_insn(env, ctx, ASE_MT);
4742             gen_helper_mtc0_vpecontrol(cpu_env, arg);
4743             rn = "VPEControl";
4744             break;
4745         case 2:
4746             check_insn(env, ctx, ASE_MT);
4747             gen_helper_mtc0_vpeconf0(cpu_env, arg);
4748             rn = "VPEConf0";
4749             break;
4750         case 3:
4751             check_insn(env, ctx, ASE_MT);
4752             gen_helper_mtc0_vpeconf1(cpu_env, arg);
4753             rn = "VPEConf1";
4754             break;
4755         case 4:
4756             check_insn(env, ctx, ASE_MT);
4757             gen_helper_mtc0_yqmask(cpu_env, arg);
4758             rn = "YQMask";
4759             break;
4760         case 5:
4761             check_insn(env, ctx, ASE_MT);
4762             gen_mtc0_store64(arg, offsetof(CPUMIPSState, CP0_VPESchedule));
4763             rn = "VPESchedule";
4764             break;
4765         case 6:
4766             check_insn(env, ctx, ASE_MT);
4767             gen_mtc0_store64(arg, offsetof(CPUMIPSState, CP0_VPEScheFBack));
4768             rn = "VPEScheFBack";
4769             break;
4770         case 7:
4771             check_insn(env, ctx, ASE_MT);
4772             gen_helper_mtc0_vpeopt(cpu_env, arg);
4773             rn = "VPEOpt";
4774             break;
4775         default:
4776             goto die;
4777         }
4778         break;
4779     case 2:
4780         switch (sel) {
4781         case 0:
4782             gen_helper_mtc0_entrylo0(cpu_env, arg);
4783             rn = "EntryLo0";
4784             break;
4785         case 1:
4786             check_insn(env, ctx, ASE_MT);
4787             gen_helper_mtc0_tcstatus(cpu_env, arg);
4788             rn = "TCStatus";
4789             break;
4790         case 2:
4791             check_insn(env, ctx, ASE_MT);
4792             gen_helper_mtc0_tcbind(cpu_env, arg);
4793             rn = "TCBind";
4794             break;
4795         case 3:
4796             check_insn(env, ctx, ASE_MT);
4797             gen_helper_mtc0_tcrestart(cpu_env, arg);
4798             rn = "TCRestart";
4799             break;
4800         case 4:
4801             check_insn(env, ctx, ASE_MT);
4802             gen_helper_mtc0_tchalt(cpu_env, arg);
4803             rn = "TCHalt";
4804             break;
4805         case 5:
4806             check_insn(env, ctx, ASE_MT);
4807             gen_helper_mtc0_tccontext(cpu_env, arg);
4808             rn = "TCContext";
4809             break;
4810         case 6:
4811             check_insn(env, ctx, ASE_MT);
4812             gen_helper_mtc0_tcschedule(cpu_env, arg);
4813             rn = "TCSchedule";
4814             break;
4815         case 7:
4816             check_insn(env, ctx, ASE_MT);
4817             gen_helper_mtc0_tcschefback(cpu_env, arg);
4818             rn = "TCScheFBack";
4819             break;
4820         default:
4821             goto die;
4822         }
4823         break;
4824     case 3:
4825         switch (sel) {
4826         case 0:
4827             gen_helper_mtc0_entrylo1(cpu_env, arg);
4828             rn = "EntryLo1";
4829             break;
4830         default:
4831             goto die;
4832         }
4833         break;
4834     case 4:
4835         switch (sel) {
4836         case 0:
4837             gen_helper_mtc0_context(cpu_env, arg);
4838             rn = "Context";
4839             break;
4840         case 1:
4841 //            gen_helper_mtc0_contextconfig(cpu_env, arg); /* SmartMIPS ASE */
4842             rn = "ContextConfig";
4843 //            break;
4844         default:
4845             goto die;
4846         }
4847         break;
4848     case 5:
4849         switch (sel) {
4850         case 0:
4851             gen_helper_mtc0_pagemask(cpu_env, arg);
4852             rn = "PageMask";
4853             break;
4854         case 1:
4855             check_insn(env, ctx, ISA_MIPS32R2);
4856             gen_helper_mtc0_pagegrain(cpu_env, arg);
4857             rn = "PageGrain";
4858             break;
4859         default:
4860             goto die;
4861         }
4862         break;
4863     case 6:
4864         switch (sel) {
4865         case 0:
4866             gen_helper_mtc0_wired(cpu_env, arg);
4867             rn = "Wired";
4868             break;
4869         case 1:
4870             check_insn(env, ctx, ISA_MIPS32R2);
4871             gen_helper_mtc0_srsconf0(cpu_env, arg);
4872             rn = "SRSConf0";
4873             break;
4874         case 2:
4875             check_insn(env, ctx, ISA_MIPS32R2);
4876             gen_helper_mtc0_srsconf1(cpu_env, arg);
4877             rn = "SRSConf1";
4878             break;
4879         case 3:
4880             check_insn(env, ctx, ISA_MIPS32R2);
4881             gen_helper_mtc0_srsconf2(cpu_env, arg);
4882             rn = "SRSConf2";
4883             break;
4884         case 4:
4885             check_insn(env, ctx, ISA_MIPS32R2);
4886             gen_helper_mtc0_srsconf3(cpu_env, arg);
4887             rn = "SRSConf3";
4888             break;
4889         case 5:
4890             check_insn(env, ctx, ISA_MIPS32R2);
4891             gen_helper_mtc0_srsconf4(cpu_env, arg);
4892             rn = "SRSConf4";
4893             break;
4894         default:
4895             goto die;
4896         }
4897         break;
4898     case 7:
4899         switch (sel) {
4900         case 0:
4901             check_insn(env, ctx, ISA_MIPS32R2);
4902             gen_helper_mtc0_hwrena(cpu_env, arg);
4903             rn = "HWREna";
4904             break;
4905         default:
4906             goto die;
4907         }
4908         break;
4909     case 8:
4910         /* ignored */
4911         rn = "BadVAddr";
4912         break;
4913     case 9:
4914         switch (sel) {
4915         case 0:
4916             gen_helper_mtc0_count(cpu_env, arg);
4917             rn = "Count";
4918             break;
4919         /* 6,7 are implementation dependent */
4920         default:
4921             goto die;
4922         }
4923         break;
4924     case 10:
4925         switch (sel) {
4926         case 0:
4927             gen_helper_mtc0_entryhi(cpu_env, arg);
4928             rn = "EntryHi";
4929             break;
4930         default:
4931             goto die;
4932         }
4933         break;
4934     case 11:
4935         switch (sel) {
4936         case 0:
4937             gen_helper_mtc0_compare(cpu_env, arg);
4938             rn = "Compare";
4939             break;
4940         /* 6,7 are implementation dependent */
4941         default:
4942             goto die;
4943         }
4944         break;
4945     case 12:
4946         switch (sel) {
4947         case 0:
4948             save_cpu_state(ctx, 1);
4949             gen_helper_mtc0_status(cpu_env, arg);
4950             /* BS_STOP isn't good enough here, hflags may have changed. */
4951             gen_save_pc(ctx->pc + 4);
4952             ctx->bstate = BS_EXCP;
4953             rn = "Status";
4954             break;
4955         case 1:
4956             check_insn(env, ctx, ISA_MIPS32R2);
4957             gen_helper_mtc0_intctl(cpu_env, arg);
4958             /* Stop translation as we may have switched the execution mode */
4959             ctx->bstate = BS_STOP;
4960             rn = "IntCtl";
4961             break;
4962         case 2:
4963             check_insn(env, ctx, ISA_MIPS32R2);
4964             gen_helper_mtc0_srsctl(cpu_env, arg);
4965             /* Stop translation as we may have switched the execution mode */
4966             ctx->bstate = BS_STOP;
4967             rn = "SRSCtl";
4968             break;
4969         case 3:
4970             check_insn(env, ctx, ISA_MIPS32R2);
4971             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
4972             /* Stop translation as we may have switched the execution mode */
4973             ctx->bstate = BS_STOP;
4974             rn = "SRSMap";
4975             break;
4976         default:
4977             goto die;
4978         }
4979         break;
4980     case 13:
4981         switch (sel) {
4982         case 0:
4983             save_cpu_state(ctx, 1);
4984             gen_helper_mtc0_cause(cpu_env, arg);
4985             rn = "Cause";
4986             break;
4987         default:
4988             goto die;
4989         }
4990         break;
4991     case 14:
4992         switch (sel) {
4993         case 0:
4994             gen_mtc0_store64(arg, offsetof(CPUMIPSState, CP0_EPC));
4995             rn = "EPC";
4996             break;
4997         default:
4998             goto die;
4999         }
5000         break;
5001     case 15:
5002         switch (sel) {
5003         case 0:
5004             /* ignored */
5005             rn = "PRid";
5006             break;
5007         case 1:
5008             check_insn(env, ctx, ISA_MIPS32R2);
5009             gen_helper_mtc0_ebase(cpu_env, arg);
5010             rn = "EBase";
5011             break;
5012         default:
5013             goto die;
5014         }
5015         break;
5016     case 16:
5017         switch (sel) {
5018         case 0:
5019             gen_helper_mtc0_config0(cpu_env, arg);
5020             rn = "Config";
5021             /* Stop translation as we may have switched the execution mode */
5022             ctx->bstate = BS_STOP;
5023             break;
5024         case 1:
5025             /* ignored, read only */
5026             rn = "Config1";
5027             break;
5028         case 2:
5029             gen_helper_mtc0_config2(cpu_env, arg);
5030             rn = "Config2";
5031             /* Stop translation as we may have switched the execution mode */
5032             ctx->bstate = BS_STOP;
5033             break;
5034         case 3:
5035             /* ignored, read only */
5036             rn = "Config3";
5037             break;
5038         /* 4,5 are reserved */
5039         /* 6,7 are implementation dependent */
5040         case 6:
5041             /* ignored */
5042             rn = "Config6";
5043             break;
5044         case 7:
5045             /* ignored */
5046             rn = "Config7";
5047             break;
5048         default:
5049             rn = "Invalid config selector";
5050             goto die;
5051         }
5052         break;
5053     case 17:
5054         switch (sel) {
5055         case 0:
5056             gen_helper_mtc0_lladdr(cpu_env, arg);
5057             rn = "LLAddr";
5058             break;
5059         default:
5060             goto die;
5061         }
5062         break;
5063     case 18:
5064         switch (sel) {
5065         case 0 ... 7:
5066             gen_helper_0e1i(mtc0_watchlo, arg, sel);
5067             rn = "WatchLo";
5068             break;
5069         default:
5070             goto die;
5071         }
5072         break;
5073     case 19:
5074         switch (sel) {
5075         case 0 ... 7:
5076             gen_helper_0e1i(mtc0_watchhi, arg, sel);
5077             rn = "WatchHi";
5078             break;
5079         default:
5080             goto die;
5081         }
5082         break;
5083     case 20:
5084         switch (sel) {
5085         case 0:
5086 #if defined(TARGET_MIPS64)
5087             check_insn(env, ctx, ISA_MIPS3);
5088             gen_helper_mtc0_xcontext(cpu_env, arg);
5089             rn = "XContext";
5090             break;
5091 #endif
5092         default:
5093             goto die;
5094         }
5095         break;
5096     case 21:
5097        /* Officially reserved, but sel 0 is used for R1x000 framemask */
5098         switch (sel) {
5099         case 0:
5100             gen_helper_mtc0_framemask(cpu_env, arg);
5101             rn = "Framemask";
5102             break;
5103         default:
5104             goto die;
5105         }
5106         break;
5107     case 22:
5108         /* ignored */
5109         rn = "Diagnostic"; /* implementation dependent */
5110         break;
5111     case 23:
5112         switch (sel) {
5113         case 0:
5114             gen_helper_mtc0_debug(cpu_env, arg); /* EJTAG support */
5115             /* BS_STOP isn't good enough here, hflags may have changed. */
5116             gen_save_pc(ctx->pc + 4);
5117             ctx->bstate = BS_EXCP;
5118             rn = "Debug";
5119             break;
5120         case 1:
5121 //            gen_helper_mtc0_tracecontrol(cpu_env, arg); /* PDtrace support */
5122             rn = "TraceControl";
5123             /* Stop translation as we may have switched the execution mode */
5124             ctx->bstate = BS_STOP;
5125 //            break;
5126         case 2:
5127 //            gen_helper_mtc0_tracecontrol2(cpu_env, arg); /* PDtrace support */
5128             rn = "TraceControl2";
5129             /* Stop translation as we may have switched the execution mode */
5130             ctx->bstate = BS_STOP;
5131 //            break;
5132         case 3:
5133             /* Stop translation as we may have switched the execution mode */
5134             ctx->bstate = BS_STOP;
5135 //            gen_helper_mtc0_usertracedata(cpu_env, arg); /* PDtrace support */
5136             rn = "UserTraceData";
5137             /* Stop translation as we may have switched the execution mode */
5138             ctx->bstate = BS_STOP;
5139 //            break;
5140         case 4:
5141 //            gen_helper_mtc0_tracebpc(cpu_env, arg); /* PDtrace support */
5142             /* Stop translation as we may have switched the execution mode */
5143             ctx->bstate = BS_STOP;
5144             rn = "TraceBPC";
5145 //            break;
5146         default:
5147             goto die;
5148         }
5149         break;
5150     case 24:
5151         switch (sel) {
5152         case 0:
5153             /* EJTAG support */
5154             gen_mtc0_store64(arg, offsetof(CPUMIPSState, CP0_DEPC));
5155             rn = "DEPC";
5156             break;
5157         default:
5158             goto die;
5159         }
5160         break;
5161     case 25:
5162         switch (sel) {
5163         case 0:
5164             gen_helper_mtc0_performance0(cpu_env, arg);
5165             rn = "Performance0";
5166             break;
5167         case 1:
5168 //            gen_helper_mtc0_performance1(arg);
5169             rn = "Performance1";
5170 //            break;
5171         case 2:
5172 //            gen_helper_mtc0_performance2(arg);
5173             rn = "Performance2";
5174 //            break;
5175         case 3:
5176 //            gen_helper_mtc0_performance3(arg);
5177             rn = "Performance3";
5178 //            break;
5179         case 4:
5180 //            gen_helper_mtc0_performance4(arg);
5181             rn = "Performance4";
5182 //            break;
5183         case 5:
5184 //            gen_helper_mtc0_performance5(arg);
5185             rn = "Performance5";
5186 //            break;
5187         case 6:
5188 //            gen_helper_mtc0_performance6(arg);
5189             rn = "Performance6";
5190 //            break;
5191         case 7:
5192 //            gen_helper_mtc0_performance7(arg);
5193             rn = "Performance7";
5194 //            break;
5195         default:
5196             goto die;
5197         }
5198        break;
5199     case 26:
5200         /* ignored */
5201         rn = "ECC";
5202         break;
5203     case 27:
5204         switch (sel) {
5205         case 0 ... 3:
5206             /* ignored */
5207             rn = "CacheErr";
5208             break;
5209         default:
5210             goto die;
5211         }
5212        break;
5213     case 28:
5214         switch (sel) {
5215         case 0:
5216         case 2:
5217         case 4:
5218         case 6:
5219             gen_helper_mtc0_taglo(cpu_env, arg);
5220             rn = "TagLo";
5221             break;
5222         case 1:
5223         case 3:
5224         case 5:
5225         case 7:
5226             gen_helper_mtc0_datalo(cpu_env, arg);
5227             rn = "DataLo";
5228             break;
5229         default:
5230             goto die;
5231         }
5232         break;
5233     case 29:
5234         switch (sel) {
5235         case 0:
5236         case 2:
5237         case 4:
5238         case 6:
5239             gen_helper_mtc0_taghi(cpu_env, arg);
5240             rn = "TagHi";
5241             break;
5242         case 1:
5243         case 3:
5244         case 5:
5245         case 7:
5246             gen_helper_mtc0_datahi(cpu_env, arg);
5247             rn = "DataHi";
5248             break;
5249         default:
5250             rn = "invalid sel";
5251             goto die;
5252         }
5253        break;
5254     case 30:
5255         switch (sel) {
5256         case 0:
5257             gen_mtc0_store64(arg, offsetof(CPUMIPSState, CP0_ErrorEPC));
5258             rn = "ErrorEPC";
5259             break;
5260         default:
5261             goto die;
5262         }
5263         break;
5264     case 31:
5265         switch (sel) {
5266         case 0:
5267             /* EJTAG support */
5268             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
5269             rn = "DESAVE";
5270             break;
5271         default:
5272             goto die;
5273         }
5274         /* Stop translation as we may have switched the execution mode */
5275         ctx->bstate = BS_STOP;
5276         break;
5277     default:
5278        goto die;
5279     }
5280     (void)rn; /* avoid a compiler warning */
5281     LOG_DISAS("mtc0 %s (reg %d sel %d)\n", rn, reg, sel);
5282     /* For simplicity assume that all writes can cause interrupts.  */
5283     if (use_icount) {
5284         gen_io_end();
5285         ctx->bstate = BS_STOP;
5286     }
5287     return;
5288
5289 die:
5290     LOG_DISAS("mtc0 %s (reg %d sel %d)\n", rn, reg, sel);
5291     generate_exception(ctx, EXCP_RI);
5292 }
5293
5294 #if defined(TARGET_MIPS64)
5295 static void gen_dmfc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, int sel)
5296 {
5297     const char *rn = "invalid";
5298
5299     if (sel != 0)
5300         check_insn(env, ctx, ISA_MIPS64);
5301
5302     switch (reg) {
5303     case 0:
5304         switch (sel) {
5305         case 0:
5306             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Index));
5307             rn = "Index";
5308             break;
5309         case 1:
5310             check_insn(env, ctx, ASE_MT);
5311             gen_helper_mfc0_mvpcontrol(arg, cpu_env);
5312             rn = "MVPControl";
5313             break;
5314         case 2:
5315             check_insn(env, ctx, ASE_MT);
5316             gen_helper_mfc0_mvpconf0(arg, cpu_env);
5317             rn = "MVPConf0";
5318             break;
5319         case 3:
5320             check_insn(env, ctx, ASE_MT);
5321             gen_helper_mfc0_mvpconf1(arg, cpu_env);
5322             rn = "MVPConf1";
5323             break;
5324         default:
5325             goto die;
5326         }
5327         break;
5328     case 1:
5329         switch (sel) {
5330         case 0:
5331             gen_helper_mfc0_random(arg, cpu_env);
5332             rn = "Random";
5333             break;
5334         case 1:
5335             check_insn(env, ctx, ASE_MT);
5336             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEControl));
5337             rn = "VPEControl";
5338             break;
5339         case 2:
5340             check_insn(env, ctx, ASE_MT);
5341             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf0));
5342             rn = "VPEConf0";
5343             break;
5344         case 3:
5345             check_insn(env, ctx, ASE_MT);
5346             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf1));
5347             rn = "VPEConf1";
5348             break;
5349         case 4:
5350             check_insn(env, ctx, ASE_MT);
5351             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_YQMask));
5352             rn = "YQMask";
5353             break;
5354         case 5:
5355             check_insn(env, ctx, ASE_MT);
5356             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPESchedule));
5357             rn = "VPESchedule";
5358             break;
5359         case 6:
5360             check_insn(env, ctx, ASE_MT);
5361             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPEScheFBack));
5362             rn = "VPEScheFBack";
5363             break;
5364         case 7:
5365             check_insn(env, ctx, ASE_MT);
5366             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEOpt));
5367             rn = "VPEOpt";
5368             break;
5369         default:
5370             goto die;
5371         }
5372         break;
5373     case 2:
5374         switch (sel) {
5375         case 0:
5376             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryLo0));
5377             rn = "EntryLo0";
5378             break;
5379         case 1:
5380             check_insn(env, ctx, ASE_MT);
5381             gen_helper_mfc0_tcstatus(arg, cpu_env);
5382             rn = "TCStatus";
5383             break;
5384         case 2:
5385             check_insn(env, ctx, ASE_MT);
5386             gen_helper_mfc0_tcbind(arg, cpu_env);
5387             rn = "TCBind";
5388             break;
5389         case 3:
5390             check_insn(env, ctx, ASE_MT);
5391             gen_helper_dmfc0_tcrestart(arg, cpu_env);
5392             rn = "TCRestart";
5393             break;
5394         case 4:
5395             check_insn(env, ctx, ASE_MT);
5396             gen_helper_dmfc0_tchalt(arg, cpu_env);
5397             rn = "TCHalt";
5398             break;
5399         case 5:
5400             check_insn(env, ctx, ASE_MT);
5401             gen_helper_dmfc0_tccontext(arg, cpu_env);
5402             rn = "TCContext";
5403             break;
5404         case 6:
5405             check_insn(env, ctx, ASE_MT);
5406             gen_helper_dmfc0_tcschedule(arg, cpu_env);
5407             rn = "TCSchedule";
5408             break;
5409         case 7:
5410             check_insn(env, ctx, ASE_MT);
5411             gen_helper_dmfc0_tcschefback(arg, cpu_env);
5412             rn = "TCScheFBack";
5413             break;
5414         default:
5415             goto die;
5416         }
5417         break;
5418     case 3:
5419         switch (sel) {
5420         case 0:
5421             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryLo1));
5422             rn = "EntryLo1";
5423             break;
5424         default:
5425             goto die;
5426         }
5427         break;
5428     case 4:
5429         switch (sel) {
5430         case 0:
5431             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_Context));
5432             rn = "Context";
5433             break;
5434         case 1:
5435 //            gen_helper_dmfc0_contextconfig(arg); /* SmartMIPS ASE */
5436             rn = "ContextConfig";
5437 //            break;
5438         default:
5439             goto die;
5440         }
5441         break;
5442     case 5:
5443         switch (sel) {
5444         case 0:
5445             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageMask));
5446             rn = "PageMask";
5447             break;
5448         case 1:
5449             check_insn(env, ctx, ISA_MIPS32R2);
5450             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageGrain));
5451             rn = "PageGrain";
5452             break;
5453         default:
5454             goto die;
5455         }
5456         break;
5457     case 6:
5458         switch (sel) {
5459         case 0:
5460             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Wired));
5461             rn = "Wired";
5462             break;
5463         case 1:
5464             check_insn(env, ctx, ISA_MIPS32R2);
5465             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf0));
5466             rn = "SRSConf0";
5467             break;
5468         case 2:
5469             check_insn(env, ctx, ISA_MIPS32R2);
5470             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf1));
5471             rn = "SRSConf1";
5472             break;
5473         case 3:
5474             check_insn(env, ctx, ISA_MIPS32R2);
5475             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf2));
5476             rn = "SRSConf2";
5477             break;
5478         case 4:
5479             check_insn(env, ctx, ISA_MIPS32R2);
5480             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf3));
5481             rn = "SRSConf3";
5482             break;
5483         case 5:
5484             check_insn(env, ctx, ISA_MIPS32R2);
5485             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf4));
5486             rn = "SRSConf4";
5487             break;
5488         default:
5489             goto die;
5490         }
5491         break;
5492     case 7:
5493         switch (sel) {
5494         case 0:
5495             check_insn(env, ctx, ISA_MIPS32R2);
5496             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_HWREna));
5497             rn = "HWREna";
5498             break;
5499         default:
5500             goto die;
5501         }
5502         break;
5503     case 8:
5504         switch (sel) {
5505         case 0:
5506             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));
5507             rn = "BadVAddr";
5508             break;
5509         default:
5510             goto die;
5511         }
5512         break;
5513     case 9:
5514         switch (sel) {
5515         case 0:
5516             /* Mark as an IO operation because we read the time.  */
5517             if (use_icount)
5518                 gen_io_start();
5519             gen_helper_mfc0_count(arg, cpu_env);
5520             if (use_icount) {
5521                 gen_io_end();
5522             }
5523             /* Break the TB to be able to take timer interrupts immediately
5524                after reading count.  */
5525             ctx->bstate = BS_STOP;
5526             rn = "Count";
5527             break;
5528         /* 6,7 are implementation dependent */
5529         default:
5530             goto die;
5531         }
5532         break;
5533     case 10:
5534         switch (sel) {
5535         case 0:
5536             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryHi));
5537             rn = "EntryHi";
5538             break;
5539         default:
5540             goto die;
5541         }
5542         break;
5543     case 11:
5544         switch (sel) {
5545         case 0:
5546             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Compare));
5547             rn = "Compare";
5548             break;
5549         /* 6,7 are implementation dependent */
5550         default:
5551             goto die;
5552         }
5553         break;
5554     case 12:
5555         switch (sel) {
5556         case 0:
5557             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Status));
5558             rn = "Status";
5559             break;
5560         case 1:
5561             check_insn(env, ctx, ISA_MIPS32R2);
5562             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_IntCtl));
5563             rn = "IntCtl";
5564             break;
5565         case 2:
5566             check_insn(env, ctx, ISA_MIPS32R2);
5567             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSCtl));
5568             rn = "SRSCtl";
5569             break;
5570         case 3:
5571             check_insn(env, ctx, ISA_MIPS32R2);
5572             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
5573             rn = "SRSMap";
5574             break;
5575         default:
5576             goto die;
5577         }
5578         break;
5579     case 13:
5580         switch (sel) {
5581         case 0:
5582             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Cause));
5583             rn = "Cause";
5584             break;
5585         default:
5586             goto die;
5587         }
5588         break;
5589     case 14:
5590         switch (sel) {
5591         case 0:
5592             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
5593             rn = "EPC";
5594             break;
5595         default:
5596             goto die;
5597         }
5598         break;
5599     case 15:
5600         switch (sel) {
5601         case 0:
5602             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PRid));
5603             rn = "PRid";
5604             break;
5605         case 1:
5606             check_insn(env, ctx, ISA_MIPS32R2);
5607             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_EBase));
5608             rn = "EBase";
5609             break;
5610         default:
5611             goto die;
5612         }
5613         break;
5614     case 16:
5615         switch (sel) {
5616         case 0:
5617             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config0));
5618             rn = "Config";
5619             break;
5620         case 1:
5621             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config1));
5622             rn = "Config1";
5623             break;
5624         case 2:
5625             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config2));
5626             rn = "Config2";
5627             break;
5628         case 3:
5629             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config3));
5630             rn = "Config3";
5631             break;
5632        /* 6,7 are implementation dependent */
5633         case 6:
5634             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config6));
5635             rn = "Config6";
5636             break;
5637         case 7:
5638             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config7));
5639             rn = "Config7";
5640             break;
5641         default:
5642             goto die;
5643         }
5644         break;
5645     case 17:
5646         switch (sel) {
5647         case 0:
5648             gen_helper_dmfc0_lladdr(arg, cpu_env);
5649             rn = "LLAddr";
5650             break;
5651         default:
5652             goto die;
5653         }
5654         break;
5655     case 18:
5656         switch (sel) {
5657         case 0 ... 7:
5658             gen_helper_1e0i(dmfc0_watchlo, arg, sel);
5659             rn = "WatchLo";
5660             break;
5661         default:
5662             goto die;
5663         }
5664         break;
5665     case 19:
5666         switch (sel) {
5667         case 0 ... 7:
5668             gen_helper_1e0i(mfc0_watchhi, arg, sel);
5669             rn = "WatchHi";
5670             break;
5671         default:
5672             goto die;
5673         }
5674         break;
5675     case 20:
5676         switch (sel) {
5677         case 0:
5678             check_insn(env, ctx, ISA_MIPS3);
5679             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_XContext));
5680             rn = "XContext";
5681             break;
5682         default:
5683             goto die;
5684         }
5685         break;
5686     case 21:
5687        /* Officially reserved, but sel 0 is used for R1x000 framemask */
5688         switch (sel) {
5689         case 0:
5690             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Framemask));
5691             rn = "Framemask";
5692             break;
5693         default:
5694             goto die;
5695         }
5696         break;
5697     case 22:
5698         tcg_gen_movi_tl(arg, 0); /* unimplemented */
5699         rn = "'Diagnostic"; /* implementation dependent */
5700         break;
5701     case 23:
5702         switch (sel) {
5703         case 0:
5704             gen_helper_mfc0_debug(arg, cpu_env); /* EJTAG support */
5705             rn = "Debug";
5706             break;
5707         case 1:
5708 //            gen_helper_dmfc0_tracecontrol(arg, cpu_env); /* PDtrace support */
5709             rn = "TraceControl";
5710 //            break;
5711         case 2:
5712 //            gen_helper_dmfc0_tracecontrol2(arg, cpu_env); /* PDtrace support */
5713             rn = "TraceControl2";
5714 //            break;
5715         case 3:
5716 //            gen_helper_dmfc0_usertracedata(arg, cpu_env); /* PDtrace support */
5717             rn = "UserTraceData";
5718 //            break;
5719         case 4:
5720 //            gen_helper_dmfc0_tracebpc(arg, cpu_env); /* PDtrace support */
5721             rn = "TraceBPC";
5722 //            break;
5723         default:
5724             goto die;
5725         }
5726         break;
5727     case 24:
5728         switch (sel) {
5729         case 0:
5730             /* EJTAG support */
5731             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
5732             rn = "DEPC";
5733             break;
5734         default:
5735             goto die;
5736         }
5737         break;
5738     case 25:
5739         switch (sel) {
5740         case 0:
5741             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Performance0));
5742             rn = "Performance0";
5743             break;
5744         case 1:
5745 //            gen_helper_dmfc0_performance1(arg);
5746             rn = "Performance1";
5747 //            break;
5748         case 2:
5749 //            gen_helper_dmfc0_performance2(arg);
5750             rn = "Performance2";
5751 //            break;
5752         case 3:
5753 //            gen_helper_dmfc0_performance3(arg);
5754             rn = "Performance3";
5755 //            break;
5756         case 4:
5757 //            gen_helper_dmfc0_performance4(arg);
5758             rn = "Performance4";
5759 //            break;
5760         case 5:
5761 //            gen_helper_dmfc0_performance5(arg);
5762             rn = "Performance5";
5763 //            break;
5764         case 6:
5765 //            gen_helper_dmfc0_performance6(arg);
5766             rn = "Performance6";
5767 //            break;
5768         case 7:
5769 //            gen_helper_dmfc0_performance7(arg);
5770             rn = "Performance7";
5771 //            break;
5772         default:
5773             goto die;
5774         }
5775         break;
5776     case 26:
5777         tcg_gen_movi_tl(arg, 0); /* unimplemented */
5778         rn = "ECC";
5779         break;
5780     case 27:
5781         switch (sel) {
5782         /* ignored */
5783         case 0 ... 3:
5784             tcg_gen_movi_tl(arg, 0); /* unimplemented */
5785             rn = "CacheErr";
5786             break;
5787         default:
5788             goto die;
5789         }
5790         break;
5791     case 28:
5792         switch (sel) {
5793         case 0:
5794         case 2:
5795         case 4:
5796         case 6:
5797             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagLo));
5798             rn = "TagLo";
5799             break;
5800         case 1:
5801         case 3:
5802         case 5:
5803         case 7:
5804             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataLo));
5805             rn = "DataLo";
5806             break;
5807         default:
5808             goto die;
5809         }
5810         break;
5811     case 29:
5812         switch (sel) {
5813         case 0:
5814         case 2:
5815         case 4:
5816         case 6:
5817             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagHi));
5818             rn = "TagHi";
5819             break;
5820         case 1:
5821         case 3:
5822         case 5:
5823         case 7:
5824             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataHi));
5825             rn = "DataHi";
5826             break;
5827         default:
5828             goto die;
5829         }
5830         break;
5831     case 30:
5832         switch (sel) {
5833         case 0:
5834             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
5835             rn = "ErrorEPC";
5836             break;
5837         default:
5838             goto die;
5839         }
5840         break;
5841     case 31:
5842         switch (sel) {
5843         case 0:
5844             /* EJTAG support */
5845             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
5846             rn = "DESAVE";
5847             break;
5848         default:
5849             goto die;
5850         }
5851         break;
5852     default:
5853         goto die;
5854     }
5855     (void)rn; /* avoid a compiler warning */
5856     LOG_DISAS("dmfc0 %s (reg %d sel %d)\n", rn, reg, sel);
5857     return;
5858
5859 die:
5860     LOG_DISAS("dmfc0 %s (reg %d sel %d)\n", rn, reg, sel);
5861     generate_exception(ctx, EXCP_RI);
5862 }
5863
5864 static void gen_dmtc0 (CPUMIPSState *env, DisasContext *ctx, TCGv arg, int reg, int sel)
5865 {
5866     const char *rn = "invalid";
5867
5868     if (sel != 0)
5869         check_insn(env, ctx, ISA_MIPS64);
5870
5871     if (use_icount)
5872         gen_io_start();
5873
5874     switch (reg) {
5875     case 0:
5876         switch (sel) {
5877         case 0:
5878             gen_helper_mtc0_index(cpu_env, arg);
5879             rn = "Index";
5880             break;
5881         case 1:
5882             check_insn(env, ctx, ASE_MT);
5883             gen_helper_mtc0_mvpcontrol(cpu_env, arg);
5884             rn = "MVPControl";
5885             break;
5886         case 2:
5887             check_insn(env, ctx, ASE_MT);
5888             /* ignored */
5889             rn = "MVPConf0";
5890             break;
5891         case 3:
5892             check_insn(env, ctx, ASE_MT);
5893             /* ignored */
5894             rn = "MVPConf1";
5895             break;
5896         default:
5897             goto die;
5898         }
5899         break;
5900     case 1:
5901         switch (sel) {
5902         case 0:
5903             /* ignored */
5904             rn = "Random";
5905             break;
5906         case 1:
5907             check_insn(env, ctx, ASE_MT);
5908             gen_helper_mtc0_vpecontrol(cpu_env, arg);
5909             rn = "VPEControl";
5910             break;
5911         case 2:
5912             check_insn(env, ctx, ASE_MT);
5913             gen_helper_mtc0_vpeconf0(cpu_env, arg);
5914             rn = "VPEConf0";
5915             break;
5916         case 3:
5917             check_insn(env, ctx, ASE_MT);
5918             gen_helper_mtc0_vpeconf1(cpu_env, arg);
5919             rn = "VPEConf1";
5920             break;
5921         case 4:
5922             check_insn(env, ctx, ASE_MT);
5923             gen_helper_mtc0_yqmask(cpu_env, arg);
5924             rn = "YQMask";
5925             break;
5926         case 5:
5927             check_insn(env, ctx, ASE_MT);
5928             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPESchedule));
5929             rn = "VPESchedule";
5930             break;
5931         case 6:
5932             check_insn(env, ctx, ASE_MT);
5933             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPEScheFBack));
5934             rn = "VPEScheFBack";
5935             break;
5936         case 7:
5937             check_insn(env, ctx, ASE_MT);
5938             gen_helper_mtc0_vpeopt(cpu_env, arg);
5939             rn = "VPEOpt";
5940             break;
5941         default:
5942             goto die;
5943         }
5944         break;
5945     case 2:
5946         switch (sel) {
5947         case 0:
5948             gen_helper_mtc0_entrylo0(cpu_env, arg);
5949             rn = "EntryLo0";
5950             break;
5951         case 1:
5952             check_insn(env, ctx, ASE_MT);
5953             gen_helper_mtc0_tcstatus(cpu_env, arg);
5954             rn = "TCStatus";
5955             break;
5956         case 2:
5957             check_insn(env, ctx, ASE_MT);
5958             gen_helper_mtc0_tcbind(cpu_env, arg);
5959             rn = "TCBind";
5960             break;
5961         case 3:
5962             check_insn(env, ctx, ASE_MT);
5963             gen_helper_mtc0_tcrestart(cpu_env, arg);
5964             rn = "TCRestart";
5965             break;
5966         case 4:
5967             check_insn(env, ctx, ASE_MT);
5968             gen_helper_mtc0_tchalt(cpu_env, arg);
5969             rn = "TCHalt";
5970             break;
5971         case 5:
5972             check_insn(env, ctx, ASE_MT);
5973             gen_helper_mtc0_tccontext(cpu_env, arg);
5974             rn = "TCContext";
5975             break;
5976         case 6:
5977             check_insn(env, ctx, ASE_MT);
5978             gen_helper_mtc0_tcschedule(cpu_env, arg);
5979             rn = "TCSchedule";
5980             break;
5981         case 7:
5982             check_insn(env, ctx, ASE_MT);
5983             gen_helper_mtc0_tcschefback(cpu_env, arg);
5984             rn = "TCScheFBack";
5985             break;
5986         default:
5987             goto die;
5988         }
5989         break;
5990     case 3:
5991         switch (sel) {
5992         case 0:
5993             gen_helper_mtc0_entrylo1(cpu_env, arg);
5994             rn = "EntryLo1";
5995             break;
5996         default:
5997             goto die;
5998         }
5999         break;
6000     case 4:
6001         switch (sel) {
6002         case 0:
6003             gen_helper_mtc0_context(cpu_env, arg);
6004             rn = "Context";
6005             break;
6006         case 1:
6007 //           gen_helper_mtc0_contextconfig(cpu_env, arg); /* SmartMIPS ASE */
6008             rn = "ContextConfig";
6009 //           break;
6010         default:
6011             goto die;
6012         }
6013         break;
6014     case 5:
6015         switch (sel) {
6016         case 0:
6017             gen_helper_mtc0_pagemask(cpu_env, arg);
6018             rn = "PageMask";
6019             break;
6020         case 1:
6021             check_insn(env, ctx, ISA_MIPS32R2);
6022             gen_helper_mtc0_pagegrain(cpu_env, arg);
6023             rn = "PageGrain";
6024             break;
6025         default:
6026             goto die;
6027         }
6028         break;
6029     case 6:
6030         switch (sel) {
6031         case 0:
6032             gen_helper_mtc0_wired(cpu_env, arg);
6033             rn = "Wired";
6034             break;
6035         case 1:
6036             check_insn(env, ctx, ISA_MIPS32R2);
6037             gen_helper_mtc0_srsconf0(cpu_env, arg);
6038             rn = "SRSConf0";
6039             break;
6040         case 2:
6041             check_insn(env, ctx, ISA_MIPS32R2);
6042             gen_helper_mtc0_srsconf1(cpu_env, arg);
6043             rn = "SRSConf1";
6044             break;
6045         case 3:
6046             check_insn(env, ctx, ISA_MIPS32R2);
6047             gen_helper_mtc0_srsconf2(cpu_env, arg);
6048             rn = "SRSConf2";
6049             break;
6050         case 4:
6051             check_insn(env, ctx, ISA_MIPS32R2);
6052             gen_helper_mtc0_srsconf3(cpu_env, arg);
6053             rn = "SRSConf3";
6054             break;
6055         case 5:
6056             check_insn(env, ctx, ISA_MIPS32R2);
6057             gen_helper_mtc0_srsconf4(cpu_env, arg);
6058             rn = "SRSConf4";
6059             break;
6060         default:
6061             goto die;
6062         }
6063         break;
6064     case 7:
6065         switch (sel) {
6066         case 0:
6067             check_insn(env, ctx, ISA_MIPS32R2);
6068             gen_helper_mtc0_hwrena(cpu_env, arg);
6069             rn = "HWREna";
6070             break;
6071         default:
6072             goto die;
6073         }
6074         break;
6075     case 8:
6076         /* ignored */
6077         rn = "BadVAddr";
6078         break;
6079     case 9:
6080         switch (sel) {
6081         case 0:
6082             gen_helper_mtc0_count(cpu_env, arg);
6083             rn = "Count";
6084             break;
6085         /* 6,7 are implementation dependent */
6086         default:
6087             goto die;
6088         }
6089         /* Stop translation as we may have switched the execution mode */
6090         ctx->bstate = BS_STOP;
6091         break;
6092     case 10:
6093         switch (sel) {
6094         case 0:
6095             gen_helper_mtc0_entryhi(cpu_env, arg);
6096             rn = "EntryHi";
6097             break;
6098         default:
6099             goto die;
6100         }
6101         break;
6102     case 11:
6103         switch (sel) {
6104         case 0:
6105             gen_helper_mtc0_compare(cpu_env, arg);
6106             rn = "Compare";
6107             break;
6108         /* 6,7 are implementation dependent */
6109         default:
6110             goto die;
6111         }
6112         /* Stop translation as we may have switched the execution mode */
6113         ctx->bstate = BS_STOP;
6114         break;
6115     case 12:
6116         switch (sel) {
6117         case 0:
6118             save_cpu_state(ctx, 1);
6119             gen_helper_mtc0_status(cpu_env, arg);
6120             /* BS_STOP isn't good enough here, hflags may have changed. */
6121             gen_save_pc(ctx->pc + 4);
6122             ctx->bstate = BS_EXCP;
6123             rn = "Status";
6124             break;
6125         case 1:
6126             check_insn(env, ctx, ISA_MIPS32R2);
6127             gen_helper_mtc0_intctl(cpu_env, arg);
6128             /* Stop translation as we may have switched the execution mode */
6129             ctx->bstate = BS_STOP;
6130             rn = "IntCtl";
6131             break;
6132         case 2:
6133             check_insn(env, ctx, ISA_MIPS32R2);
6134             gen_helper_mtc0_srsctl(cpu_env, arg);
6135             /* Stop translation as we may have switched the execution mode */
6136             ctx->bstate = BS_STOP;
6137             rn = "SRSCtl";
6138             break;
6139         case 3:
6140             check_insn(env, ctx, ISA_MIPS32R2);
6141             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
6142             /* Stop translation as we may have switched the execution mode */
6143             ctx->bstate = BS_STOP;
6144             rn = "SRSMap";
6145             break;
6146         default:
6147             goto die;
6148         }
6149         break;
6150     case 13:
6151         switch (sel) {
6152         case 0:
6153             save_cpu_state(ctx, 1);
6154             /* Mark as an IO operation because we may trigger a software
6155                interrupt.  */
6156             if (use_icount) {
6157                 gen_io_start();
6158             }
6159             gen_helper_mtc0_cause(cpu_env, arg);
6160             if (use_icount) {
6161                 gen_io_end();
6162             }
6163             /* Stop translation as we may have triggered an intetrupt */
6164             ctx->bstate = BS_STOP;
6165             rn = "Cause";
6166             break;
6167         default:
6168             goto die;
6169         }
6170         break;
6171     case 14:
6172         switch (sel) {
6173         case 0:
6174             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
6175             rn = "EPC";
6176             break;
6177         default:
6178             goto die;
6179         }
6180         break;
6181     case 15:
6182         switch (sel) {
6183         case 0:
6184             /* ignored */
6185             rn = "PRid";
6186             break;
6187         case 1:
6188             check_insn(env, ctx, ISA_MIPS32R2);
6189             gen_helper_mtc0_ebase(cpu_env, arg);
6190             rn = "EBase";
6191             break;
6192         default:
6193             goto die;
6194         }
6195         break;
6196     case 16:
6197         switch (sel) {
6198         case 0:
6199             gen_helper_mtc0_config0(cpu_env, arg);
6200             rn = "Config";
6201             /* Stop translation as we may have switched the execution mode */
6202             ctx->bstate = BS_STOP;
6203             break;
6204         case 1:
6205             /* ignored, read only */
6206             rn = "Config1";
6207             break;
6208         case 2:
6209             gen_helper_mtc0_config2(cpu_env, arg);
6210             rn = "Config2";
6211             /* Stop translation as we may have switched the execution mode */
6212             ctx->bstate = BS_STOP;
6213             break;
6214         case 3:
6215             /* ignored */
6216             rn = "Config3";
6217             break;
6218         /* 6,7 are implementation dependent */
6219         default:
6220             rn = "Invalid config selector";
6221             goto die;
6222         }
6223         break;
6224     case 17:
6225         switch (sel) {
6226         case 0:
6227             gen_helper_mtc0_lladdr(cpu_env, arg);
6228             rn = "LLAddr";
6229             break;
6230         default:
6231             goto die;
6232         }
6233         break;
6234     case 18:
6235         switch (sel) {
6236         case 0 ... 7:
6237             gen_helper_0e1i(mtc0_watchlo, arg, sel);
6238             rn = "WatchLo";
6239             break;
6240         default:
6241             goto die;
6242         }
6243         break;
6244     case 19:
6245         switch (sel) {
6246         case 0 ... 7:
6247             gen_helper_0e1i(mtc0_watchhi, arg, sel);
6248             rn = "WatchHi";
6249             break;
6250         default:
6251             goto die;
6252         }
6253         break;
6254     case 20:
6255         switch (sel) {
6256         case 0:
6257             check_insn(env, ctx, ISA_MIPS3);
6258             gen_helper_mtc0_xcontext(cpu_env, arg);
6259             rn = "XContext";
6260             break;
6261         default:
6262             goto die;
6263         }
6264         break;
6265     case 21:
6266        /* Officially reserved, but sel 0 is used for R1x000 framemask */
6267         switch (sel) {
6268         case 0:
6269             gen_helper_mtc0_framemask(cpu_env, arg);
6270             rn = "Framemask";
6271             break;
6272         default:
6273             goto die;
6274         }
6275         break;
6276     case 22:
6277         /* ignored */
6278         rn = "Diagnostic"; /* implementation dependent */
6279         break;
6280     case 23:
6281         switch (sel) {
6282         case 0:
6283             gen_helper_mtc0_debug(cpu_env, arg); /* EJTAG support */
6284             /* BS_STOP isn't good enough here, hflags may have changed. */
6285             gen_save_pc(ctx->pc + 4);
6286             ctx->bstate = BS_EXCP;
6287             rn = "Debug";
6288             break;
6289         case 1:
6290 //            gen_helper_mtc0_tracecontrol(cpu_env, arg); /* PDtrace support */
6291             /* Stop translation as we may have switched the execution mode */
6292             ctx->bstate = BS_STOP;
6293             rn = "TraceControl";
6294 //            break;
6295         case 2:
6296 //            gen_helper_mtc0_tracecontrol2(cpu_env, arg); /* PDtrace support */
6297             /* Stop translation as we may have switched the execution mode */
6298             ctx->bstate = BS_STOP;
6299             rn = "TraceControl2";
6300 //            break;
6301         case 3:
6302 //            gen_helper_mtc0_usertracedata(cpu_env, arg); /* PDtrace support */
6303             /* Stop translation as we may have switched the execution mode */
6304             ctx->bstate = BS_STOP;
6305             rn = "UserTraceData";
6306 //            break;
6307         case 4:
6308 //            gen_helper_mtc0_tracebpc(cpu_env, arg); /* PDtrace support */
6309             /* Stop translation as we may have switched the execution mode */
6310             ctx->bstate = BS_STOP;
6311             rn = "TraceBPC";
6312 //            break;
6313         default:
6314             goto die;
6315         }
6316         break;
6317     case 24:
6318         switch (sel) {
6319         case 0:
6320             /* EJTAG support */
6321             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
6322             rn = "DEPC";
6323             break;
6324         default:
6325             goto die;
6326         }
6327         break;
6328     case 25:
6329         switch (sel) {
6330         case 0:
6331             gen_helper_mtc0_performance0(cpu_env, arg);
6332             rn = "Performance0";
6333             break;
6334         case 1:
6335 //            gen_helper_mtc0_performance1(cpu_env, arg);
6336             rn = "Performance1";
6337 //            break;
6338         case 2:
6339 //            gen_helper_mtc0_performance2(cpu_env, arg);
6340             rn = "Performance2";
6341 //            break;
6342         case 3:
6343 //            gen_helper_mtc0_performance3(cpu_env, arg);
6344             rn = "Performance3";
6345 //            break;
6346         case 4:
6347 //            gen_helper_mtc0_performance4(cpu_env, arg);
6348             rn = "Performance4";
6349 //            break;
6350         case 5:
6351 //            gen_helper_mtc0_performance5(cpu_env, arg);
6352             rn = "Performance5";
6353 //            break;
6354         case 6:
6355 //            gen_helper_mtc0_performance6(cpu_env, arg);
6356             rn = "Performance6";
6357 //            break;
6358         case 7:
6359 //            gen_helper_mtc0_performance7(cpu_env, arg);
6360             rn = "Performance7";
6361 //            break;
6362         default:
6363             goto die;
6364         }
6365         break;
6366     case 26:
6367         /* ignored */
6368         rn = "ECC";
6369         break;
6370     case 27:
6371         switch (sel) {
6372         case 0 ... 3:
6373             /* ignored */
6374             rn = "CacheErr";
6375             break;
6376         default:
6377             goto die;
6378         }
6379         break;
6380     case 28:
6381         switch (sel) {
6382         case 0:
6383         case 2:
6384         case 4:
6385         case 6:
6386             gen_helper_mtc0_taglo(cpu_env, arg);
6387             rn = "TagLo";
6388             break;
6389         case 1:
6390         case 3:
6391         case 5:
6392         case 7:
6393             gen_helper_mtc0_datalo(cpu_env, arg);
6394             rn = "DataLo";
6395             break;
6396         default:
6397             goto die;
6398         }
6399         break;
6400     case 29:
6401         switch (sel) {
6402         case 0:
6403         case 2:
6404         case 4:
6405         case 6:
6406             gen_helper_mtc0_taghi(cpu_env, arg);
6407             rn = "TagHi";
6408             break;
6409         case 1:
6410         case 3:
6411         case 5:
6412         case 7:
6413             gen_helper_mtc0_datahi(cpu_env, arg);
6414             rn = "DataHi";
6415             break;
6416         default:
6417             rn = "invalid sel";
6418             goto die;
6419         }
6420         break;
6421     case 30:
6422         switch (sel) {
6423         case 0:
6424             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
6425             rn = "ErrorEPC";
6426             break;
6427         default:
6428             goto die;
6429         }
6430         break;
6431     case 31:
6432         switch (sel) {
6433         case 0:
6434             /* EJTAG support */
6435             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
6436             rn = "DESAVE";
6437             break;
6438         default:
6439             goto die;
6440         }
6441         /* Stop translation as we may have switched the execution mode */
6442         ctx->bstate = BS_STOP;
6443         break;
6444     default:
6445         goto die;
6446     }
6447     (void)rn; /* avoid a compiler warning */
6448     LOG_DISAS("dmtc0 %s (reg %d sel %d)\n", rn, reg, sel);
6449     /* For simplicity assume that all writes can cause interrupts.  */
6450     if (use_icount) {
6451         gen_io_end();
6452         ctx->bstate = BS_STOP;
6453     }
6454     return;
6455
6456 die:
6457     LOG_DISAS("dmtc0 %s (reg %d sel %d)\n", rn, reg, sel);
6458     generate_exception(ctx, EXCP_RI);
6459 }
6460 #endif /* TARGET_MIPS64 */
6461
6462 static void gen_mftr(CPUMIPSState *env, DisasContext *ctx, int rt, int rd,
6463                      int u, int sel, int h)
6464 {
6465     int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
6466     TCGv t0 = tcg_temp_local_new();
6467
6468     if ((env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) == 0 &&
6469         ((env->tcs[other_tc].CP0_TCBind & (0xf << CP0TCBd_CurVPE)) !=
6470          (env->active_tc.CP0_TCBind & (0xf << CP0TCBd_CurVPE))))
6471         tcg_gen_movi_tl(t0, -1);
6472     else if ((env->CP0_VPEControl & (0xff << CP0VPECo_TargTC)) >
6473              (env->mvp->CP0_MVPConf0 & (0xff << CP0MVPC0_PTC)))
6474         tcg_gen_movi_tl(t0, -1);
6475     else if (u == 0) {
6476         switch (rt) {
6477         case 1:
6478             switch (sel) {
6479             case 1:
6480                 gen_helper_mftc0_vpecontrol(t0, cpu_env);
6481                 break;
6482             case 2:
6483                 gen_helper_mftc0_vpeconf0(t0, cpu_env);
6484                 break;
6485             default:
6486                 goto die;
6487                 break;
6488             }
6489             break;
6490         case 2:
6491             switch (sel) {
6492             case 1:
6493                 gen_helper_mftc0_tcstatus(t0, cpu_env);
6494                 break;
6495             case 2:
6496                 gen_helper_mftc0_tcbind(t0, cpu_env);
6497                 break;
6498             case 3:
6499                 gen_helper_mftc0_tcrestart(t0, cpu_env);
6500                 break;
6501             case 4:
6502                 gen_helper_mftc0_tchalt(t0, cpu_env);
6503                 break;
6504             case 5:
6505                 gen_helper_mftc0_tccontext(t0, cpu_env);
6506                 break;
6507             case 6:
6508                 gen_helper_mftc0_tcschedule(t0, cpu_env);
6509                 break;
6510             case 7:
6511                 gen_helper_mftc0_tcschefback(t0, cpu_env);
6512                 break;
6513             default:
6514                 gen_mfc0(env, ctx, t0, rt, sel);
6515                 break;
6516             }
6517             break;
6518         case 10:
6519             switch (sel) {
6520             case 0:
6521                 gen_helper_mftc0_entryhi(t0, cpu_env);
6522                 break;
6523             default:
6524                 gen_mfc0(env, ctx, t0, rt, sel);
6525                 break;
6526             }
6527         case 12:
6528             switch (sel) {
6529             case 0:
6530                 gen_helper_mftc0_status(t0, cpu_env);
6531                 break;
6532             default:
6533                 gen_mfc0(env, ctx, t0, rt, sel);
6534                 break;
6535             }
6536         case 13:
6537             switch (sel) {
6538             case 0:
6539                 gen_helper_mftc0_cause(t0, cpu_env);
6540                 break;
6541             default:
6542                 goto die;
6543                 break;
6544             }
6545             break;
6546         case 14:
6547             switch (sel) {
6548             case 0:
6549                 gen_helper_mftc0_epc(t0, cpu_env);
6550                 break;
6551             default:
6552                 goto die;
6553                 break;
6554             }
6555             break;
6556         case 15:
6557             switch (sel) {
6558             case 1:
6559                 gen_helper_mftc0_ebase(t0, cpu_env);
6560                 break;
6561             default:
6562                 goto die;
6563                 break;
6564             }
6565             break;
6566         case 16:
6567             switch (sel) {
6568             case 0 ... 7:
6569                 gen_helper_mftc0_configx(t0, cpu_env, tcg_const_tl(sel));
6570                 break;
6571             default:
6572                 goto die;
6573                 break;
6574             }
6575             break;
6576         case 23:
6577             switch (sel) {
6578             case 0:
6579                 gen_helper_mftc0_debug(t0, cpu_env);
6580                 break;
6581             default:
6582                 gen_mfc0(env, ctx, t0, rt, sel);
6583                 break;
6584             }
6585             break;
6586         default:
6587             gen_mfc0(env, ctx, t0, rt, sel);
6588         }
6589     } else switch (sel) {
6590     /* GPR registers. */
6591     case 0:
6592         gen_helper_1e0i(mftgpr, t0, rt);
6593         break;
6594     /* Auxiliary CPU registers */
6595     case 1:
6596         switch (rt) {
6597         case 0:
6598             gen_helper_1e0i(mftlo, t0, 0);
6599             break;
6600         case 1:
6601             gen_helper_1e0i(mfthi, t0, 0);
6602             break;
6603         case 2:
6604             gen_helper_1e0i(mftacx, t0, 0);
6605             break;
6606         case 4:
6607             gen_helper_1e0i(mftlo, t0, 1);
6608             break;
6609         case 5:
6610             gen_helper_1e0i(mfthi, t0, 1);
6611             break;
6612         case 6:
6613             gen_helper_1e0i(mftacx, t0, 1);
6614             break;
6615         case 8:
6616             gen_helper_1e0i(mftlo, t0, 2);
6617             break;
6618         case 9:
6619             gen_helper_1e0i(mfthi, t0, 2);
6620             break;
6621         case 10:
6622             gen_helper_1e0i(mftacx, t0, 2);
6623             break;
6624         case 12:
6625             gen_helper_1e0i(mftlo, t0, 3);
6626             break;
6627         case 13:
6628             gen_helper_1e0i(mfthi, t0, 3);
6629             break;
6630         case 14:
6631             gen_helper_1e0i(mftacx, t0, 3);
6632             break;
6633         case 16:
6634             gen_helper_mftdsp(t0, cpu_env);
6635             break;
6636         default:
6637             goto die;
6638         }
6639         break;
6640     /* Floating point (COP1). */
6641     case 2:
6642         /* XXX: For now we support only a single FPU context. */
6643         if (h == 0) {
6644             TCGv_i32 fp0 = tcg_temp_new_i32();
6645
6646             gen_load_fpr32(fp0, rt);
6647             tcg_gen_ext_i32_tl(t0, fp0);
6648             tcg_temp_free_i32(fp0);
6649         } else {
6650             TCGv_i32 fp0 = tcg_temp_new_i32();
6651
6652             gen_load_fpr32h(fp0, rt);
6653             tcg_gen_ext_i32_tl(t0, fp0);
6654             tcg_temp_free_i32(fp0);
6655         }
6656         break;
6657     case 3:
6658         /* XXX: For now we support only a single FPU context. */
6659         gen_helper_1e0i(cfc1, t0, rt);
6660         break;
6661     /* COP2: Not implemented. */
6662     case 4:
6663     case 5:
6664         /* fall through */
6665     default:
6666         goto die;
6667     }
6668     LOG_DISAS("mftr (reg %d u %d sel %d h %d)\n", rt, u, sel, h);
6669     gen_store_gpr(t0, rd);
6670     tcg_temp_free(t0);
6671     return;
6672
6673 die:
6674     tcg_temp_free(t0);
6675     LOG_DISAS("mftr (reg %d u %d sel %d h %d)\n", rt, u, sel, h);
6676     generate_exception(ctx, EXCP_RI);
6677 }
6678
6679 static void gen_mttr(CPUMIPSState *env, DisasContext *ctx, int rd, int rt,
6680                      int u, int sel, int h)
6681 {
6682     int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
6683     TCGv t0 = tcg_temp_local_new();
6684
6685     gen_load_gpr(t0, rt);
6686     if ((env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) == 0 &&
6687         ((env->tcs[other_tc].CP0_TCBind & (0xf << CP0TCBd_CurVPE)) !=
6688          (env->active_tc.CP0_TCBind & (0xf << CP0TCBd_CurVPE))))
6689         /* NOP */ ;
6690     else if ((env->CP0_VPEControl & (0xff << CP0VPECo_TargTC)) >
6691              (env->mvp->CP0_MVPConf0 & (0xff << CP0MVPC0_PTC)))
6692         /* NOP */ ;
6693     else if (u == 0) {
6694         switch (rd) {
6695         case 1:
6696             switch (sel) {
6697             case 1:
6698                 gen_helper_mttc0_vpecontrol(cpu_env, t0);
6699                 break;
6700             case 2:
6701                 gen_helper_mttc0_vpeconf0(cpu_env, t0);
6702                 break;
6703             default:
6704                 goto die;
6705                 break;
6706             }
6707             break;
6708         case 2:
6709             switch (sel) {
6710             case 1:
6711                 gen_helper_mttc0_tcstatus(cpu_env, t0);
6712                 break;
6713             case 2:
6714                 gen_helper_mttc0_tcbind(cpu_env, t0);
6715                 break;
6716             case 3:
6717                 gen_helper_mttc0_tcrestart(cpu_env, t0);
6718                 break;
6719             case 4:
6720                 gen_helper_mttc0_tchalt(cpu_env, t0);
6721                 break;
6722             case 5:
6723                 gen_helper_mttc0_tccontext(cpu_env, t0);
6724                 break;
6725             case 6:
6726                 gen_helper_mttc0_tcschedule(cpu_env, t0);
6727                 break;
6728             case 7:
6729                 gen_helper_mttc0_tcschefback(cpu_env, t0);
6730                 break;
6731             default:
6732                 gen_mtc0(env, ctx, t0, rd, sel);
6733                 break;
6734             }
6735             break;
6736         case 10:
6737             switch (sel) {
6738             case 0:
6739                 gen_helper_mttc0_entryhi(cpu_env, t0);
6740                 break;
6741             default:
6742                 gen_mtc0(env, ctx, t0, rd, sel);
6743                 break;
6744             }
6745         case 12:
6746             switch (sel) {
6747             case 0:
6748                 gen_helper_mttc0_status(cpu_env, t0);
6749                 break;
6750             default:
6751                 gen_mtc0(env, ctx, t0, rd, sel);
6752                 break;
6753             }
6754         case 13:
6755             switch (sel) {
6756             case 0:
6757                 gen_helper_mttc0_cause(cpu_env, t0);
6758                 break;
6759             default:
6760                 goto die;
6761                 break;
6762             }
6763             break;
6764         case 15:
6765             switch (sel) {
6766             case 1:
6767                 gen_helper_mttc0_ebase(cpu_env, t0);
6768                 break;
6769             default:
6770                 goto die;
6771                 break;
6772             }
6773             break;
6774         case 23:
6775             switch (sel) {
6776             case 0:
6777                 gen_helper_mttc0_debug(cpu_env, t0);
6778                 break;
6779             default:
6780                 gen_mtc0(env, ctx, t0, rd, sel);
6781                 break;
6782             }
6783             break;
6784         default:
6785             gen_mtc0(env, ctx, t0, rd, sel);
6786         }
6787     } else switch (sel) {
6788     /* GPR registers. */
6789     case 0:
6790         gen_helper_0e1i(mttgpr, t0, rd);
6791         break;
6792     /* Auxiliary CPU registers */
6793     case 1:
6794         switch (rd) {
6795         case 0:
6796             gen_helper_0e1i(mttlo, t0, 0);
6797             break;
6798         case 1:
6799             gen_helper_0e1i(mtthi, t0, 0);
6800             break;
6801         case 2:
6802             gen_helper_0e1i(mttacx, t0, 0);
6803             break;
6804         case 4:
6805             gen_helper_0e1i(mttlo, t0, 1);
6806             break;
6807         case 5:
6808             gen_helper_0e1i(mtthi, t0, 1);
6809             break;
6810         case 6:
6811             gen_helper_0e1i(mttacx, t0, 1);
6812             break;
6813         case 8:
6814             gen_helper_0e1i(mttlo, t0, 2);
6815             break;
6816         case 9:
6817             gen_helper_0e1i(mtthi, t0, 2);
6818             break;
6819         case 10:
6820             gen_helper_0e1i(mttacx, t0, 2);
6821             break;
6822         case 12:
6823             gen_helper_0e1i(mttlo, t0, 3);
6824             break;
6825         case 13:
6826             gen_helper_0e1i(mtthi, t0, 3);
6827             break;
6828         case 14:
6829             gen_helper_0e1i(mttacx, t0, 3);
6830             break;
6831         case 16:
6832             gen_helper_mttdsp(cpu_env, t0);
6833             break;
6834         default:
6835             goto die;
6836         }
6837         break;
6838     /* Floating point (COP1). */
6839     case 2:
6840         /* XXX: For now we support only a single FPU context. */
6841         if (h == 0) {
6842             TCGv_i32 fp0 = tcg_temp_new_i32();
6843
6844             tcg_gen_trunc_tl_i32(fp0, t0);
6845             gen_store_fpr32(fp0, rd);
6846             tcg_temp_free_i32(fp0);
6847         } else {
6848             TCGv_i32 fp0 = tcg_temp_new_i32();
6849
6850             tcg_gen_trunc_tl_i32(fp0, t0);
6851             gen_store_fpr32h(fp0, rd);
6852             tcg_temp_free_i32(fp0);
6853         }
6854         break;
6855     case 3:
6856         /* XXX: For now we support only a single FPU context. */
6857         gen_helper_0e1i(ctc1, t0, rd);
6858         break;
6859     /* COP2: Not implemented. */
6860     case 4:
6861     case 5:
6862         /* fall through */
6863     default:
6864         goto die;
6865     }
6866     LOG_DISAS("mttr (reg %d u %d sel %d h %d)\n", rd, u, sel, h);
6867     tcg_temp_free(t0);
6868     return;
6869
6870 die:
6871     tcg_temp_free(t0);
6872     LOG_DISAS("mttr (reg %d u %d sel %d h %d)\n", rd, u, sel, h);
6873     generate_exception(ctx, EXCP_RI);
6874 }
6875
6876 static void gen_cp0 (CPUMIPSState *env, DisasContext *ctx, uint32_t opc, int rt, int rd)
6877 {
6878     const char *opn = "ldst";
6879
6880     check_cp0_enabled(ctx);
6881     switch (opc) {
6882     case OPC_MFC0:
6883         if (rt == 0) {
6884             /* Treat as NOP. */
6885             return;
6886         }
6887         gen_mfc0(env, ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
6888         opn = "mfc0";
6889         break;
6890     case OPC_MTC0:
6891         {
6892             TCGv t0 = tcg_temp_new();
6893
6894             gen_load_gpr(t0, rt);
6895             gen_mtc0(env, ctx, t0, rd, ctx->opcode & 0x7);
6896             tcg_temp_free(t0);
6897         }
6898         opn = "mtc0";
6899         break;
6900 #if defined(TARGET_MIPS64)
6901     case OPC_DMFC0:
6902         check_insn(env, ctx, ISA_MIPS3);
6903         if (rt == 0) {
6904             /* Treat as NOP. */
6905             return;
6906         }
6907         gen_dmfc0(env, ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
6908         opn = "dmfc0";
6909         break;
6910     case OPC_DMTC0:
6911         check_insn(env, ctx, ISA_MIPS3);
6912         {
6913             TCGv t0 = tcg_temp_new();
6914
6915             gen_load_gpr(t0, rt);
6916             gen_dmtc0(env, ctx, t0, rd, ctx->opcode & 0x7);
6917             tcg_temp_free(t0);
6918         }
6919         opn = "dmtc0";
6920         break;
6921 #endif
6922     case OPC_MFTR:
6923         check_insn(env, ctx, ASE_MT);
6924         if (rd == 0) {
6925             /* Treat as NOP. */
6926             return;
6927         }
6928         gen_mftr(env, ctx, rt, rd, (ctx->opcode >> 5) & 1,
6929                  ctx->opcode & 0x7, (ctx->opcode >> 4) & 1);
6930         opn = "mftr";
6931         break;
6932     case OPC_MTTR:
6933         check_insn(env, ctx, ASE_MT);
6934         gen_mttr(env, ctx, rd, rt, (ctx->opcode >> 5) & 1,
6935                  ctx->opcode & 0x7, (ctx->opcode >> 4) & 1);
6936         opn = "mttr";
6937         break;
6938     case OPC_TLBWI:
6939         opn = "tlbwi";
6940         if (!env->tlb->helper_tlbwi)
6941             goto die;
6942         gen_helper_tlbwi(cpu_env);
6943         break;
6944     case OPC_TLBWR:
6945         opn = "tlbwr";
6946         if (!env->tlb->helper_tlbwr)
6947             goto die;
6948         gen_helper_tlbwr(cpu_env);
6949         break;
6950     case OPC_TLBP:
6951         opn = "tlbp";
6952         if (!env->tlb->helper_tlbp)
6953             goto die;
6954         gen_helper_tlbp(cpu_env);
6955         break;
6956     case OPC_TLBR:
6957         opn = "tlbr";
6958         if (!env->tlb->helper_tlbr)
6959             goto die;
6960         gen_helper_tlbr(cpu_env);
6961         break;
6962     case OPC_ERET:
6963         opn = "eret";
6964         check_insn(env, ctx, ISA_MIPS2);
6965         gen_helper_eret(cpu_env);
6966         ctx->bstate = BS_EXCP;
6967         break;
6968     case OPC_DERET:
6969         opn = "deret";
6970         check_insn(env, ctx, ISA_MIPS32);
6971         if (!(ctx->hflags & MIPS_HFLAG_DM)) {
6972             MIPS_INVAL(opn);
6973             generate_exception(ctx, EXCP_RI);
6974         } else {
6975             gen_helper_deret(cpu_env);
6976             ctx->bstate = BS_EXCP;
6977         }
6978         break;
6979     case OPC_WAIT:
6980         opn = "wait";
6981         check_insn(env, ctx, ISA_MIPS3 | ISA_MIPS32);
6982         /* If we get an exception, we want to restart at next instruction */
6983         ctx->pc += 4;
6984         save_cpu_state(ctx, 1);
6985         ctx->pc -= 4;
6986         gen_helper_wait(cpu_env);
6987         ctx->bstate = BS_EXCP;
6988         break;
6989     default:
6990  die:
6991         MIPS_INVAL(opn);
6992         generate_exception(ctx, EXCP_RI);
6993         return;
6994     }
6995     (void)opn; /* avoid a compiler warning */
6996     MIPS_DEBUG("%s %s %d", opn, regnames[rt], rd);
6997 }
6998 #endif /* !CONFIG_USER_ONLY */
6999
7000 /* CP1 Branches (before delay slot) */
7001 static void gen_compute_branch1 (CPUMIPSState *env, DisasContext *ctx, uint32_t op,
7002                                  int32_t cc, int32_t offset)
7003 {
7004     target_ulong btarget;
7005     const char *opn = "cp1 cond branch";
7006     TCGv_i32 t0 = tcg_temp_new_i32();
7007
7008     if (cc != 0)
7009         check_insn(env, ctx, ISA_MIPS4 | ISA_MIPS32);
7010
7011     btarget = ctx->pc + 4 + offset;
7012
7013     switch (op) {
7014     case OPC_BC1F:
7015         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
7016         tcg_gen_not_i32(t0, t0);
7017         tcg_gen_andi_i32(t0, t0, 1);
7018         tcg_gen_extu_i32_tl(bcond, t0);
7019         opn = "bc1f";
7020         goto not_likely;
7021     case OPC_BC1FL:
7022         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
7023         tcg_gen_not_i32(t0, t0);
7024         tcg_gen_andi_i32(t0, t0, 1);
7025         tcg_gen_extu_i32_tl(bcond, t0);
7026         opn = "bc1fl";
7027         goto likely;
7028     case OPC_BC1T:
7029         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
7030         tcg_gen_andi_i32(t0, t0, 1);
7031         tcg_gen_extu_i32_tl(bcond, t0);
7032         opn = "bc1t";
7033         goto not_likely;
7034     case OPC_BC1TL:
7035         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
7036         tcg_gen_andi_i32(t0, t0, 1);
7037         tcg_gen_extu_i32_tl(bcond, t0);
7038         opn = "bc1tl";
7039     likely:
7040         ctx->hflags |= MIPS_HFLAG_BL;
7041         break;
7042     case OPC_BC1FANY2:
7043         {
7044             TCGv_i32 t1 = tcg_temp_new_i32();
7045             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
7046             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
7047             tcg_gen_nand_i32(t0, t0, t1);
7048             tcg_temp_free_i32(t1);
7049             tcg_gen_andi_i32(t0, t0, 1);
7050             tcg_gen_extu_i32_tl(bcond, t0);
7051         }
7052         opn = "bc1any2f";
7053         goto not_likely;
7054     case OPC_BC1TANY2:
7055         {
7056             TCGv_i32 t1 = tcg_temp_new_i32();
7057             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
7058             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
7059             tcg_gen_or_i32(t0, t0, t1);
7060             tcg_temp_free_i32(t1);
7061             tcg_gen_andi_i32(t0, t0, 1);
7062             tcg_gen_extu_i32_tl(bcond, t0);
7063         }
7064         opn = "bc1any2t";
7065         goto not_likely;
7066     case OPC_BC1FANY4:
7067         {
7068             TCGv_i32 t1 = tcg_temp_new_i32();
7069             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
7070             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
7071             tcg_gen_and_i32(t0, t0, t1);
7072             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+2));
7073             tcg_gen_and_i32(t0, t0, t1);
7074             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+3));
7075             tcg_gen_nand_i32(t0, t0, t1);
7076             tcg_temp_free_i32(t1);
7077             tcg_gen_andi_i32(t0, t0, 1);
7078             tcg_gen_extu_i32_tl(bcond, t0);
7079         }
7080         opn = "bc1any4f";
7081         goto not_likely;
7082     case OPC_BC1TANY4:
7083         {
7084             TCGv_i32 t1 = tcg_temp_new_i32();
7085             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
7086             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
7087             tcg_gen_or_i32(t0, t0, t1);
7088             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+2));
7089             tcg_gen_or_i32(t0, t0, t1);
7090             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+3));
7091             tcg_gen_or_i32(t0, t0, t1);
7092             tcg_temp_free_i32(t1);
7093             tcg_gen_andi_i32(t0, t0, 1);
7094             tcg_gen_extu_i32_tl(bcond, t0);
7095         }
7096         opn = "bc1any4t";
7097     not_likely:
7098         ctx->hflags |= MIPS_HFLAG_BC;
7099         break;
7100     default:
7101         MIPS_INVAL(opn);
7102         generate_exception (ctx, EXCP_RI);
7103         goto out;
7104     }
7105     (void)opn; /* avoid a compiler warning */
7106     MIPS_DEBUG("%s: cond %02x target " TARGET_FMT_lx, opn,
7107                ctx->hflags, btarget);
7108     ctx->btarget = btarget;
7109
7110  out:
7111     tcg_temp_free_i32(t0);
7112 }
7113
7114 /* Coprocessor 1 (FPU) */
7115
7116 #define FOP(func, fmt) (((fmt) << 21) | (func))
7117
7118 enum fopcode {
7119     OPC_ADD_S = FOP(0, FMT_S),
7120     OPC_SUB_S = FOP(1, FMT_S),
7121     OPC_MUL_S = FOP(2, FMT_S),
7122     OPC_DIV_S = FOP(3, FMT_S),
7123     OPC_SQRT_S = FOP(4, FMT_S),
7124     OPC_ABS_S = FOP(5, FMT_S),
7125     OPC_MOV_S = FOP(6, FMT_S),
7126     OPC_NEG_S = FOP(7, FMT_S),
7127     OPC_ROUND_L_S = FOP(8, FMT_S),
7128     OPC_TRUNC_L_S = FOP(9, FMT_S),
7129     OPC_CEIL_L_S = FOP(10, FMT_S),
7130     OPC_FLOOR_L_S = FOP(11, FMT_S),
7131     OPC_ROUND_W_S = FOP(12, FMT_S),
7132     OPC_TRUNC_W_S = FOP(13, FMT_S),
7133     OPC_CEIL_W_S = FOP(14, FMT_S),
7134     OPC_FLOOR_W_S = FOP(15, FMT_S),
7135     OPC_MOVCF_S = FOP(17, FMT_S),
7136     OPC_MOVZ_S = FOP(18, FMT_S),
7137     OPC_MOVN_S = FOP(19, FMT_S),
7138     OPC_RECIP_S = FOP(21, FMT_S),
7139     OPC_RSQRT_S = FOP(22, FMT_S),
7140     OPC_RECIP2_S = FOP(28, FMT_S),
7141     OPC_RECIP1_S = FOP(29, FMT_S),
7142     OPC_RSQRT1_S = FOP(30, FMT_S),
7143     OPC_RSQRT2_S = FOP(31, FMT_S),
7144     OPC_CVT_D_S = FOP(33, FMT_S),
7145     OPC_CVT_W_S = FOP(36, FMT_S),
7146     OPC_CVT_L_S = FOP(37, FMT_S),
7147     OPC_CVT_PS_S = FOP(38, FMT_S),
7148     OPC_CMP_F_S = FOP (48, FMT_S),
7149     OPC_CMP_UN_S = FOP (49, FMT_S),
7150     OPC_CMP_EQ_S = FOP (50, FMT_S),
7151     OPC_CMP_UEQ_S = FOP (51, FMT_S),
7152     OPC_CMP_OLT_S = FOP (52, FMT_S),
7153     OPC_CMP_ULT_S = FOP (53, FMT_S),
7154     OPC_CMP_OLE_S = FOP (54, FMT_S),
7155     OPC_CMP_ULE_S = FOP (55, FMT_S),
7156     OPC_CMP_SF_S = FOP (56, FMT_S),
7157     OPC_CMP_NGLE_S = FOP (57, FMT_S),
7158     OPC_CMP_SEQ_S = FOP (58, FMT_S),
7159     OPC_CMP_NGL_S = FOP (59, FMT_S),
7160     OPC_CMP_LT_S = FOP (60, FMT_S),
7161     OPC_CMP_NGE_S = FOP (61, FMT_S),
7162     OPC_CMP_LE_S = FOP (62, FMT_S),
7163     OPC_CMP_NGT_S = FOP (63, FMT_S),
7164
7165     OPC_ADD_D = FOP(0, FMT_D),
7166     OPC_SUB_D = FOP(1, FMT_D),
7167     OPC_MUL_D = FOP(2, FMT_D),
7168     OPC_DIV_D = FOP(3, FMT_D),
7169     OPC_SQRT_D = FOP(4, FMT_D),
7170     OPC_ABS_D = FOP(5, FMT_D),
7171     OPC_MOV_D = FOP(6, FMT_D),
7172     OPC_NEG_D = FOP(7, FMT_D),
7173     OPC_ROUND_L_D = FOP(8, FMT_D),
7174     OPC_TRUNC_L_D = FOP(9, FMT_D),
7175     OPC_CEIL_L_D = FOP(10, FMT_D),
7176     OPC_FLOOR_L_D = FOP(11, FMT_D),
7177     OPC_ROUND_W_D = FOP(12, FMT_D),
7178     OPC_TRUNC_W_D = FOP(13, FMT_D),
7179     OPC_CEIL_W_D = FOP(14, FMT_D),
7180     OPC_FLOOR_W_D = FOP(15, FMT_D),
7181     OPC_MOVCF_D = FOP(17, FMT_D),
7182     OPC_MOVZ_D = FOP(18, FMT_D),
7183     OPC_MOVN_D = FOP(19, FMT_D),
7184     OPC_RECIP_D = FOP(21, FMT_D),
7185     OPC_RSQRT_D = FOP(22, FMT_D),
7186     OPC_RECIP2_D = FOP(28, FMT_D),
7187     OPC_RECIP1_D = FOP(29, FMT_D),
7188     OPC_RSQRT1_D = FOP(30, FMT_D),
7189     OPC_RSQRT2_D = FOP(31, FMT_D),
7190     OPC_CVT_S_D = FOP(32, FMT_D),
7191     OPC_CVT_W_D = FOP(36, FMT_D),
7192     OPC_CVT_L_D = FOP(37, FMT_D),
7193     OPC_CMP_F_D = FOP (48, FMT_D),
7194     OPC_CMP_UN_D = FOP (49, FMT_D),
7195     OPC_CMP_EQ_D = FOP (50, FMT_D),
7196     OPC_CMP_UEQ_D = FOP (51, FMT_D),
7197     OPC_CMP_OLT_D = FOP (52, FMT_D),
7198     OPC_CMP_ULT_D = FOP (53, FMT_D),
7199     OPC_CMP_OLE_D = FOP (54, FMT_D),
7200     OPC_CMP_ULE_D = FOP (55, FMT_D),
7201     OPC_CMP_SF_D = FOP (56, FMT_D),
7202     OPC_CMP_NGLE_D = FOP (57, FMT_D),
7203     OPC_CMP_SEQ_D = FOP (58, FMT_D),
7204     OPC_CMP_NGL_D = FOP (59, FMT_D),
7205     OPC_CMP_LT_D = FOP (60, FMT_D),
7206     OPC_CMP_NGE_D = FOP (61, FMT_D),
7207     OPC_CMP_LE_D = FOP (62, FMT_D),
7208     OPC_CMP_NGT_D = FOP (63, FMT_D),
7209
7210     OPC_CVT_S_W = FOP(32, FMT_W),
7211     OPC_CVT_D_W = FOP(33, FMT_W),
7212     OPC_CVT_S_L = FOP(32, FMT_L),
7213     OPC_CVT_D_L = FOP(33, FMT_L),
7214     OPC_CVT_PS_PW = FOP(38, FMT_W),
7215
7216     OPC_ADD_PS = FOP(0, FMT_PS),
7217     OPC_SUB_PS = FOP(1, FMT_PS),
7218     OPC_MUL_PS = FOP(2, FMT_PS),
7219     OPC_DIV_PS = FOP(3, FMT_PS),
7220     OPC_ABS_PS = FOP(5, FMT_PS),
7221     OPC_MOV_PS = FOP(6, FMT_PS),
7222     OPC_NEG_PS = FOP(7, FMT_PS),
7223     OPC_MOVCF_PS = FOP(17, FMT_PS),
7224     OPC_MOVZ_PS = FOP(18, FMT_PS),
7225     OPC_MOVN_PS = FOP(19, FMT_PS),
7226     OPC_ADDR_PS = FOP(24, FMT_PS),
7227     OPC_MULR_PS = FOP(26, FMT_PS),
7228     OPC_RECIP2_PS = FOP(28, FMT_PS),
7229     OPC_RECIP1_PS = FOP(29, FMT_PS),
7230     OPC_RSQRT1_PS = FOP(30, FMT_PS),
7231     OPC_RSQRT2_PS = FOP(31, FMT_PS),
7232
7233     OPC_CVT_S_PU = FOP(32, FMT_PS),
7234     OPC_CVT_PW_PS = FOP(36, FMT_PS),
7235     OPC_CVT_S_PL = FOP(40, FMT_PS),
7236     OPC_PLL_PS = FOP(44, FMT_PS),
7237     OPC_PLU_PS = FOP(45, FMT_PS),
7238     OPC_PUL_PS = FOP(46, FMT_PS),
7239     OPC_PUU_PS = FOP(47, FMT_PS),
7240     OPC_CMP_F_PS = FOP (48, FMT_PS),
7241     OPC_CMP_UN_PS = FOP (49, FMT_PS),
7242     OPC_CMP_EQ_PS = FOP (50, FMT_PS),
7243     OPC_CMP_UEQ_PS = FOP (51, FMT_PS),
7244     OPC_CMP_OLT_PS = FOP (52, FMT_PS),
7245     OPC_CMP_ULT_PS = FOP (53, FMT_PS),
7246     OPC_CMP_OLE_PS = FOP (54, FMT_PS),
7247     OPC_CMP_ULE_PS = FOP (55, FMT_PS),
7248     OPC_CMP_SF_PS = FOP (56, FMT_PS),
7249     OPC_CMP_NGLE_PS = FOP (57, FMT_PS),
7250     OPC_CMP_SEQ_PS = FOP (58, FMT_PS),
7251     OPC_CMP_NGL_PS = FOP (59, FMT_PS),
7252     OPC_CMP_LT_PS = FOP (60, FMT_PS),
7253     OPC_CMP_NGE_PS = FOP (61, FMT_PS),
7254     OPC_CMP_LE_PS = FOP (62, FMT_PS),
7255     OPC_CMP_NGT_PS = FOP (63, FMT_PS),
7256 };
7257
7258 static void gen_cp1 (DisasContext *ctx, uint32_t opc, int rt, int fs)
7259 {
7260     const char *opn = "cp1 move";
7261     TCGv t0 = tcg_temp_new();
7262
7263     switch (opc) {
7264     case OPC_MFC1:
7265         {
7266             TCGv_i32 fp0 = tcg_temp_new_i32();
7267
7268             gen_load_fpr32(fp0, fs);
7269             tcg_gen_ext_i32_tl(t0, fp0);
7270             tcg_temp_free_i32(fp0);
7271         }
7272         gen_store_gpr(t0, rt);
7273         opn = "mfc1";
7274         break;
7275     case OPC_MTC1:
7276         gen_load_gpr(t0, rt);
7277         {
7278             TCGv_i32 fp0 = tcg_temp_new_i32();
7279
7280             tcg_gen_trunc_tl_i32(fp0, t0);
7281             gen_store_fpr32(fp0, fs);
7282             tcg_temp_free_i32(fp0);
7283         }
7284         opn = "mtc1";
7285         break;
7286     case OPC_CFC1:
7287         gen_helper_1e0i(cfc1, t0, fs);
7288         gen_store_gpr(t0, rt);
7289         opn = "cfc1";
7290         break;
7291     case OPC_CTC1:
7292         gen_load_gpr(t0, rt);
7293         gen_helper_0e1i(ctc1, t0, fs);
7294         opn = "ctc1";
7295         break;
7296 #if defined(TARGET_MIPS64)
7297     case OPC_DMFC1:
7298         gen_load_fpr64(ctx, t0, fs);
7299         gen_store_gpr(t0, rt);
7300         opn = "dmfc1";
7301         break;
7302     case OPC_DMTC1:
7303         gen_load_gpr(t0, rt);
7304         gen_store_fpr64(ctx, t0, fs);
7305         opn = "dmtc1";
7306         break;
7307 #endif
7308     case OPC_MFHC1:
7309         {
7310             TCGv_i32 fp0 = tcg_temp_new_i32();
7311
7312             gen_load_fpr32h(fp0, fs);
7313             tcg_gen_ext_i32_tl(t0, fp0);
7314             tcg_temp_free_i32(fp0);
7315         }
7316         gen_store_gpr(t0, rt);
7317         opn = "mfhc1";
7318         break;
7319     case OPC_MTHC1:
7320         gen_load_gpr(t0, rt);
7321         {
7322             TCGv_i32 fp0 = tcg_temp_new_i32();
7323
7324             tcg_gen_trunc_tl_i32(fp0, t0);
7325             gen_store_fpr32h(fp0, fs);
7326             tcg_temp_free_i32(fp0);
7327         }
7328         opn = "mthc1";
7329         break;
7330     default:
7331         MIPS_INVAL(opn);
7332         generate_exception (ctx, EXCP_RI);
7333         goto out;
7334     }
7335     (void)opn; /* avoid a compiler warning */
7336     MIPS_DEBUG("%s %s %s", opn, regnames[rt], fregnames[fs]);
7337
7338  out:
7339     tcg_temp_free(t0);
7340 }
7341
7342 static void gen_movci (DisasContext *ctx, int rd, int rs, int cc, int tf)
7343 {
7344     int l1;
7345     TCGCond cond;
7346     TCGv_i32 t0;
7347
7348     if (rd == 0) {
7349         /* Treat as NOP. */
7350         return;
7351     }
7352
7353     if (tf)
7354         cond = TCG_COND_EQ;
7355     else
7356         cond = TCG_COND_NE;
7357
7358     l1 = gen_new_label();
7359     t0 = tcg_temp_new_i32();
7360     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
7361     tcg_gen_brcondi_i32(cond, t0, 0, l1);
7362     tcg_temp_free_i32(t0);
7363     if (rs == 0) {
7364         tcg_gen_movi_tl(cpu_gpr[rd], 0);
7365     } else {
7366         tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
7367     }
7368     gen_set_label(l1);
7369 }
7370
7371 static inline void gen_movcf_s (int fs, int fd, int cc, int tf)
7372 {
7373     int cond;
7374     TCGv_i32 t0 = tcg_temp_new_i32();
7375     int l1 = gen_new_label();
7376
7377     if (tf)
7378         cond = TCG_COND_EQ;
7379     else
7380         cond = TCG_COND_NE;
7381
7382     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
7383     tcg_gen_brcondi_i32(cond, t0, 0, l1);
7384     gen_load_fpr32(t0, fs);
7385     gen_store_fpr32(t0, fd);
7386     gen_set_label(l1);
7387     tcg_temp_free_i32(t0);
7388 }
7389
7390 static inline void gen_movcf_d (DisasContext *ctx, int fs, int fd, int cc, int tf)
7391 {
7392     int cond;
7393     TCGv_i32 t0 = tcg_temp_new_i32();
7394     TCGv_i64 fp0;
7395     int l1 = gen_new_label();
7396
7397     if (tf)
7398         cond = TCG_COND_EQ;
7399     else
7400         cond = TCG_COND_NE;
7401
7402     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
7403     tcg_gen_brcondi_i32(cond, t0, 0, l1);
7404     tcg_temp_free_i32(t0);
7405     fp0 = tcg_temp_new_i64();
7406     gen_load_fpr64(ctx, fp0, fs);
7407     gen_store_fpr64(ctx, fp0, fd);
7408     tcg_temp_free_i64(fp0);
7409     gen_set_label(l1);
7410 }
7411
7412 static inline void gen_movcf_ps (int fs, int fd, int cc, int tf)
7413 {
7414     int cond;
7415     TCGv_i32 t0 = tcg_temp_new_i32();
7416     int l1 = gen_new_label();
7417     int l2 = gen_new_label();
7418
7419     if (tf)
7420         cond = TCG_COND_EQ;
7421     else
7422         cond = TCG_COND_NE;
7423
7424     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
7425     tcg_gen_brcondi_i32(cond, t0, 0, l1);
7426     gen_load_fpr32(t0, fs);
7427     gen_store_fpr32(t0, fd);
7428     gen_set_label(l1);
7429
7430     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc+1));
7431     tcg_gen_brcondi_i32(cond, t0, 0, l2);
7432     gen_load_fpr32h(t0, fs);
7433     gen_store_fpr32h(t0, fd);
7434     tcg_temp_free_i32(t0);
7435     gen_set_label(l2);
7436 }
7437
7438
7439 static void gen_farith (DisasContext *ctx, enum fopcode op1,
7440                         int ft, int fs, int fd, int cc)
7441 {
7442     const char *opn = "farith";
7443     const char *condnames[] = {
7444             "c.f",
7445             "c.un",
7446             "c.eq",
7447             "c.ueq",
7448             "c.olt",
7449             "c.ult",
7450             "c.ole",
7451             "c.ule",
7452             "c.sf",
7453             "c.ngle",
7454             "c.seq",
7455             "c.ngl",
7456             "c.lt",
7457             "c.nge",
7458             "c.le",
7459             "c.ngt",
7460     };
7461     const char *condnames_abs[] = {
7462             "cabs.f",
7463             "cabs.un",
7464             "cabs.eq",
7465             "cabs.ueq",
7466             "cabs.olt",
7467             "cabs.ult",
7468             "cabs.ole",
7469             "cabs.ule",
7470             "cabs.sf",
7471             "cabs.ngle",
7472             "cabs.seq",
7473             "cabs.ngl",
7474             "cabs.lt",
7475             "cabs.nge",
7476             "cabs.le",
7477             "cabs.ngt",
7478     };
7479     enum { BINOP, CMPOP, OTHEROP } optype = OTHEROP;
7480     uint32_t func = ctx->opcode & 0x3f;
7481
7482     switch (op1) {
7483     case OPC_ADD_S:
7484         {
7485             TCGv_i32 fp0 = tcg_temp_new_i32();
7486             TCGv_i32 fp1 = tcg_temp_new_i32();
7487
7488             gen_load_fpr32(fp0, fs);
7489             gen_load_fpr32(fp1, ft);
7490             gen_helper_float_add_s(fp0, cpu_env, fp0, fp1);
7491             tcg_temp_free_i32(fp1);
7492             gen_store_fpr32(fp0, fd);
7493             tcg_temp_free_i32(fp0);
7494         }
7495         opn = "add.s";
7496         optype = BINOP;
7497         break;
7498     case OPC_SUB_S:
7499         {
7500             TCGv_i32 fp0 = tcg_temp_new_i32();
7501             TCGv_i32 fp1 = tcg_temp_new_i32();
7502
7503             gen_load_fpr32(fp0, fs);
7504             gen_load_fpr32(fp1, ft);
7505             gen_helper_float_sub_s(fp0, cpu_env, fp0, fp1);
7506             tcg_temp_free_i32(fp1);
7507             gen_store_fpr32(fp0, fd);
7508             tcg_temp_free_i32(fp0);
7509         }
7510         opn = "sub.s";
7511         optype = BINOP;
7512         break;
7513     case OPC_MUL_S:
7514         {
7515             TCGv_i32 fp0 = tcg_temp_new_i32();
7516             TCGv_i32 fp1 = tcg_temp_new_i32();
7517
7518             gen_load_fpr32(fp0, fs);
7519             gen_load_fpr32(fp1, ft);
7520             gen_helper_float_mul_s(fp0, cpu_env, fp0, fp1);
7521             tcg_temp_free_i32(fp1);
7522             gen_store_fpr32(fp0, fd);
7523             tcg_temp_free_i32(fp0);
7524         }
7525         opn = "mul.s";
7526         optype = BINOP;
7527         break;
7528     case OPC_DIV_S:
7529         {
7530             TCGv_i32 fp0 = tcg_temp_new_i32();
7531             TCGv_i32 fp1 = tcg_temp_new_i32();
7532
7533             gen_load_fpr32(fp0, fs);
7534             gen_load_fpr32(fp1, ft);
7535             gen_helper_float_div_s(fp0, cpu_env, fp0, fp1);
7536             tcg_temp_free_i32(fp1);
7537             gen_store_fpr32(fp0, fd);
7538             tcg_temp_free_i32(fp0);
7539         }
7540         opn = "div.s";
7541         optype = BINOP;
7542         break;
7543     case OPC_SQRT_S:
7544         {
7545             TCGv_i32 fp0 = tcg_temp_new_i32();
7546
7547             gen_load_fpr32(fp0, fs);
7548             gen_helper_float_sqrt_s(fp0, cpu_env, fp0);
7549             gen_store_fpr32(fp0, fd);
7550             tcg_temp_free_i32(fp0);
7551         }
7552         opn = "sqrt.s";
7553         break;
7554     case OPC_ABS_S:
7555         {
7556             TCGv_i32 fp0 = tcg_temp_new_i32();
7557
7558             gen_load_fpr32(fp0, fs);
7559             gen_helper_float_abs_s(fp0, fp0);
7560             gen_store_fpr32(fp0, fd);
7561             tcg_temp_free_i32(fp0);
7562         }
7563         opn = "abs.s";
7564         break;
7565     case OPC_MOV_S:
7566         {
7567             TCGv_i32 fp0 = tcg_temp_new_i32();
7568
7569             gen_load_fpr32(fp0, fs);
7570             gen_store_fpr32(fp0, fd);
7571             tcg_temp_free_i32(fp0);
7572         }
7573         opn = "mov.s";
7574         break;
7575     case OPC_NEG_S:
7576         {
7577             TCGv_i32 fp0 = tcg_temp_new_i32();
7578
7579             gen_load_fpr32(fp0, fs);
7580             gen_helper_float_chs_s(fp0, fp0);
7581             gen_store_fpr32(fp0, fd);
7582             tcg_temp_free_i32(fp0);
7583         }
7584         opn = "neg.s";
7585         break;
7586     case OPC_ROUND_L_S:
7587         check_cp1_64bitmode(ctx);
7588         {
7589             TCGv_i32 fp32 = tcg_temp_new_i32();
7590             TCGv_i64 fp64 = tcg_temp_new_i64();
7591
7592             gen_load_fpr32(fp32, fs);
7593             gen_helper_float_roundl_s(fp64, cpu_env, fp32);
7594             tcg_temp_free_i32(fp32);
7595             gen_store_fpr64(ctx, fp64, fd);
7596             tcg_temp_free_i64(fp64);
7597         }
7598         opn = "round.l.s";
7599         break;
7600     case OPC_TRUNC_L_S:
7601         check_cp1_64bitmode(ctx);
7602         {
7603             TCGv_i32 fp32 = tcg_temp_new_i32();
7604             TCGv_i64 fp64 = tcg_temp_new_i64();
7605
7606             gen_load_fpr32(fp32, fs);
7607             gen_helper_float_truncl_s(fp64, cpu_env, fp32);
7608             tcg_temp_free_i32(fp32);
7609             gen_store_fpr64(ctx, fp64, fd);
7610             tcg_temp_free_i64(fp64);
7611         }
7612         opn = "trunc.l.s";
7613         break;
7614     case OPC_CEIL_L_S:
7615         check_cp1_64bitmode(ctx);
7616         {
7617             TCGv_i32 fp32 = tcg_temp_new_i32();
7618             TCGv_i64 fp64 = tcg_temp_new_i64();
7619
7620             gen_load_fpr32(fp32, fs);
7621             gen_helper_float_ceill_s(fp64, cpu_env, fp32);
7622             tcg_temp_free_i32(fp32);
7623             gen_store_fpr64(ctx, fp64, fd);
7624             tcg_temp_free_i64(fp64);
7625         }
7626         opn = "ceil.l.s";
7627         break;
7628     case OPC_FLOOR_L_S:
7629         check_cp1_64bitmode(ctx);
7630         {
7631             TCGv_i32 fp32 = tcg_temp_new_i32();
7632             TCGv_i64 fp64 = tcg_temp_new_i64();
7633
7634             gen_load_fpr32(fp32, fs);
7635             gen_helper_float_floorl_s(fp64, cpu_env, fp32);
7636             tcg_temp_free_i32(fp32);
7637             gen_store_fpr64(ctx, fp64, fd);
7638             tcg_temp_free_i64(fp64);
7639         }
7640         opn = "floor.l.s";
7641         break;
7642     case OPC_ROUND_W_S:
7643         {
7644             TCGv_i32 fp0 = tcg_temp_new_i32();
7645
7646             gen_load_fpr32(fp0, fs);
7647             gen_helper_float_roundw_s(fp0, cpu_env, fp0);
7648             gen_store_fpr32(fp0, fd);
7649             tcg_temp_free_i32(fp0);
7650         }
7651         opn = "round.w.s";
7652         break;
7653     case OPC_TRUNC_W_S:
7654         {
7655             TCGv_i32 fp0 = tcg_temp_new_i32();
7656
7657             gen_load_fpr32(fp0, fs);
7658             gen_helper_float_truncw_s(fp0, cpu_env, fp0);
7659             gen_store_fpr32(fp0, fd);
7660             tcg_temp_free_i32(fp0);
7661         }
7662         opn = "trunc.w.s";
7663         break;
7664     case OPC_CEIL_W_S:
7665         {
7666             TCGv_i32 fp0 = tcg_temp_new_i32();
7667
7668             gen_load_fpr32(fp0, fs);
7669             gen_helper_float_ceilw_s(fp0, cpu_env, fp0);
7670             gen_store_fpr32(fp0, fd);
7671             tcg_temp_free_i32(fp0);
7672         }
7673         opn = "ceil.w.s";
7674         break;
7675     case OPC_FLOOR_W_S:
7676         {
7677             TCGv_i32 fp0 = tcg_temp_new_i32();
7678
7679             gen_load_fpr32(fp0, fs);
7680             gen_helper_float_floorw_s(fp0, cpu_env, fp0);
7681             gen_store_fpr32(fp0, fd);
7682             tcg_temp_free_i32(fp0);
7683         }
7684         opn = "floor.w.s";
7685         break;
7686     case OPC_MOVCF_S:
7687         gen_movcf_s(fs, fd, (ft >> 2) & 0x7, ft & 0x1);
7688         opn = "movcf.s";
7689         break;
7690     case OPC_MOVZ_S:
7691         {
7692             int l1 = gen_new_label();
7693             TCGv_i32 fp0;
7694
7695             if (ft != 0) {
7696                 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
7697             }
7698             fp0 = tcg_temp_new_i32();
7699             gen_load_fpr32(fp0, fs);
7700             gen_store_fpr32(fp0, fd);
7701             tcg_temp_free_i32(fp0);
7702             gen_set_label(l1);
7703         }
7704         opn = "movz.s";
7705         break;
7706     case OPC_MOVN_S:
7707         {
7708             int l1 = gen_new_label();
7709             TCGv_i32 fp0;
7710
7711             if (ft != 0) {
7712                 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
7713                 fp0 = tcg_temp_new_i32();
7714                 gen_load_fpr32(fp0, fs);
7715                 gen_store_fpr32(fp0, fd);
7716                 tcg_temp_free_i32(fp0);
7717                 gen_set_label(l1);
7718             }
7719         }
7720         opn = "movn.s";
7721         break;
7722     case OPC_RECIP_S:
7723         check_cop1x(ctx);
7724         {
7725             TCGv_i32 fp0 = tcg_temp_new_i32();
7726
7727             gen_load_fpr32(fp0, fs);
7728             gen_helper_float_recip_s(fp0, cpu_env, fp0);
7729             gen_store_fpr32(fp0, fd);
7730             tcg_temp_free_i32(fp0);
7731         }
7732         opn = "recip.s";
7733         break;
7734     case OPC_RSQRT_S:
7735         check_cop1x(ctx);
7736         {
7737             TCGv_i32 fp0 = tcg_temp_new_i32();
7738
7739             gen_load_fpr32(fp0, fs);
7740             gen_helper_float_rsqrt_s(fp0, cpu_env, fp0);
7741             gen_store_fpr32(fp0, fd);
7742             tcg_temp_free_i32(fp0);
7743         }
7744         opn = "rsqrt.s";
7745         break;
7746     case OPC_RECIP2_S:
7747         check_cp1_64bitmode(ctx);
7748         {
7749             TCGv_i32 fp0 = tcg_temp_new_i32();
7750             TCGv_i32 fp1 = tcg_temp_new_i32();
7751
7752             gen_load_fpr32(fp0, fs);
7753             gen_load_fpr32(fp1, ft);
7754             gen_helper_float_recip2_s(fp0, cpu_env, fp0, fp1);
7755             tcg_temp_free_i32(fp1);
7756             gen_store_fpr32(fp0, fd);
7757             tcg_temp_free_i32(fp0);
7758         }
7759         opn = "recip2.s";
7760         break;
7761     case OPC_RECIP1_S:
7762         check_cp1_64bitmode(ctx);
7763         {
7764             TCGv_i32 fp0 = tcg_temp_new_i32();
7765
7766             gen_load_fpr32(fp0, fs);
7767             gen_helper_float_recip1_s(fp0, cpu_env, fp0);
7768             gen_store_fpr32(fp0, fd);
7769             tcg_temp_free_i32(fp0);
7770         }
7771         opn = "recip1.s";
7772         break;
7773     case OPC_RSQRT1_S:
7774         check_cp1_64bitmode(ctx);
7775         {
7776             TCGv_i32 fp0 = tcg_temp_new_i32();
7777
7778             gen_load_fpr32(fp0, fs);
7779             gen_helper_float_rsqrt1_s(fp0, cpu_env, fp0);
7780             gen_store_fpr32(fp0, fd);
7781             tcg_temp_free_i32(fp0);
7782         }
7783         opn = "rsqrt1.s";
7784         break;
7785     case OPC_RSQRT2_S:
7786         check_cp1_64bitmode(ctx);
7787         {
7788             TCGv_i32 fp0 = tcg_temp_new_i32();
7789             TCGv_i32 fp1 = tcg_temp_new_i32();
7790
7791             gen_load_fpr32(fp0, fs);
7792             gen_load_fpr32(fp1, ft);
7793             gen_helper_float_rsqrt2_s(fp0, cpu_env, fp0, fp1);
7794             tcg_temp_free_i32(fp1);
7795             gen_store_fpr32(fp0, fd);
7796             tcg_temp_free_i32(fp0);
7797         }
7798         opn = "rsqrt2.s";
7799         break;
7800     case OPC_CVT_D_S:
7801         check_cp1_registers(ctx, fd);
7802         {
7803             TCGv_i32 fp32 = tcg_temp_new_i32();
7804             TCGv_i64 fp64 = tcg_temp_new_i64();
7805
7806             gen_load_fpr32(fp32, fs);
7807             gen_helper_float_cvtd_s(fp64, cpu_env, fp32);
7808             tcg_temp_free_i32(fp32);
7809             gen_store_fpr64(ctx, fp64, fd);
7810             tcg_temp_free_i64(fp64);
7811         }
7812         opn = "cvt.d.s";
7813         break;
7814     case OPC_CVT_W_S:
7815         {
7816             TCGv_i32 fp0 = tcg_temp_new_i32();
7817
7818             gen_load_fpr32(fp0, fs);
7819             gen_helper_float_cvtw_s(fp0, cpu_env, fp0);
7820             gen_store_fpr32(fp0, fd);
7821             tcg_temp_free_i32(fp0);
7822         }
7823         opn = "cvt.w.s";
7824         break;
7825     case OPC_CVT_L_S:
7826         check_cp1_64bitmode(ctx);
7827         {
7828             TCGv_i32 fp32 = tcg_temp_new_i32();
7829             TCGv_i64 fp64 = tcg_temp_new_i64();
7830
7831             gen_load_fpr32(fp32, fs);
7832             gen_helper_float_cvtl_s(fp64, cpu_env, fp32);
7833             tcg_temp_free_i32(fp32);
7834             gen_store_fpr64(ctx, fp64, fd);
7835             tcg_temp_free_i64(fp64);
7836         }
7837         opn = "cvt.l.s";
7838         break;
7839     case OPC_CVT_PS_S:
7840         check_cp1_64bitmode(ctx);
7841         {
7842             TCGv_i64 fp64 = tcg_temp_new_i64();
7843             TCGv_i32 fp32_0 = tcg_temp_new_i32();
7844             TCGv_i32 fp32_1 = tcg_temp_new_i32();
7845
7846             gen_load_fpr32(fp32_0, fs);
7847             gen_load_fpr32(fp32_1, ft);
7848             tcg_gen_concat_i32_i64(fp64, fp32_1, fp32_0);
7849             tcg_temp_free_i32(fp32_1);
7850             tcg_temp_free_i32(fp32_0);
7851             gen_store_fpr64(ctx, fp64, fd);
7852             tcg_temp_free_i64(fp64);
7853         }
7854         opn = "cvt.ps.s";
7855         break;
7856     case OPC_CMP_F_S:
7857     case OPC_CMP_UN_S:
7858     case OPC_CMP_EQ_S:
7859     case OPC_CMP_UEQ_S:
7860     case OPC_CMP_OLT_S:
7861     case OPC_CMP_ULT_S:
7862     case OPC_CMP_OLE_S:
7863     case OPC_CMP_ULE_S:
7864     case OPC_CMP_SF_S:
7865     case OPC_CMP_NGLE_S:
7866     case OPC_CMP_SEQ_S:
7867     case OPC_CMP_NGL_S:
7868     case OPC_CMP_LT_S:
7869     case OPC_CMP_NGE_S:
7870     case OPC_CMP_LE_S:
7871     case OPC_CMP_NGT_S:
7872         if (ctx->opcode & (1 << 6)) {
7873             gen_cmpabs_s(ctx, func-48, ft, fs, cc);
7874             opn = condnames_abs[func-48];
7875         } else {
7876             gen_cmp_s(ctx, func-48, ft, fs, cc);
7877             opn = condnames[func-48];
7878         }
7879         break;
7880     case OPC_ADD_D:
7881         check_cp1_registers(ctx, fs | ft | fd);
7882         {
7883             TCGv_i64 fp0 = tcg_temp_new_i64();
7884             TCGv_i64 fp1 = tcg_temp_new_i64();
7885
7886             gen_load_fpr64(ctx, fp0, fs);
7887             gen_load_fpr64(ctx, fp1, ft);
7888             gen_helper_float_add_d(fp0, cpu_env, fp0, fp1);
7889             tcg_temp_free_i64(fp1);
7890             gen_store_fpr64(ctx, fp0, fd);
7891             tcg_temp_free_i64(fp0);
7892         }
7893         opn = "add.d";
7894         optype = BINOP;
7895         break;
7896     case OPC_SUB_D:
7897         check_cp1_registers(ctx, fs | ft | fd);
7898         {
7899             TCGv_i64 fp0 = tcg_temp_new_i64();
7900             TCGv_i64 fp1 = tcg_temp_new_i64();
7901
7902             gen_load_fpr64(ctx, fp0, fs);
7903             gen_load_fpr64(ctx, fp1, ft);
7904             gen_helper_float_sub_d(fp0, cpu_env, fp0, fp1);
7905             tcg_temp_free_i64(fp1);
7906             gen_store_fpr64(ctx, fp0, fd);
7907             tcg_temp_free_i64(fp0);
7908         }
7909         opn = "sub.d";
7910         optype = BINOP;
7911         break;
7912     case OPC_MUL_D:
7913         check_cp1_registers(ctx, fs | ft | fd);
7914         {
7915             TCGv_i64 fp0 = tcg_temp_new_i64();
7916             TCGv_i64 fp1 = tcg_temp_new_i64();
7917
7918             gen_load_fpr64(ctx, fp0, fs);
7919             gen_load_fpr64(ctx, fp1, ft);
7920             gen_helper_float_mul_d(fp0, cpu_env, fp0, fp1);
7921             tcg_temp_free_i64(fp1);
7922             gen_store_fpr64(ctx, fp0, fd);
7923             tcg_temp_free_i64(fp0);
7924         }
7925         opn = "mul.d";
7926         optype = BINOP;
7927         break;
7928     case OPC_DIV_D:
7929         check_cp1_registers(ctx, fs | ft | fd);
7930         {
7931             TCGv_i64 fp0 = tcg_temp_new_i64();
7932             TCGv_i64 fp1 = tcg_temp_new_i64();
7933
7934             gen_load_fpr64(ctx, fp0, fs);
7935             gen_load_fpr64(ctx, fp1, ft);
7936             gen_helper_float_div_d(fp0, cpu_env, fp0, fp1);
7937             tcg_temp_free_i64(fp1);
7938             gen_store_fpr64(ctx, fp0, fd);
7939             tcg_temp_free_i64(fp0);
7940         }
7941         opn = "div.d";
7942         optype = BINOP;
7943         break;
7944     case OPC_SQRT_D:
7945         check_cp1_registers(ctx, fs | fd);
7946         {
7947             TCGv_i64 fp0 = tcg_temp_new_i64();
7948
7949             gen_load_fpr64(ctx, fp0, fs);
7950             gen_helper_float_sqrt_d(fp0, cpu_env, fp0);
7951             gen_store_fpr64(ctx, fp0, fd);
7952             tcg_temp_free_i64(fp0);
7953         }
7954         opn = "sqrt.d";
7955         break;
7956     case OPC_ABS_D:
7957         check_cp1_registers(ctx, fs | fd);
7958         {
7959             TCGv_i64 fp0 = tcg_temp_new_i64();
7960
7961             gen_load_fpr64(ctx, fp0, fs);
7962             gen_helper_float_abs_d(fp0, fp0);
7963             gen_store_fpr64(ctx, fp0, fd);
7964             tcg_temp_free_i64(fp0);
7965         }
7966         opn = "abs.d";
7967         break;
7968     case OPC_MOV_D:
7969         check_cp1_registers(ctx, fs | fd);
7970         {
7971             TCGv_i64 fp0 = tcg_temp_new_i64();
7972
7973             gen_load_fpr64(ctx, fp0, fs);
7974             gen_store_fpr64(ctx, fp0, fd);
7975             tcg_temp_free_i64(fp0);
7976         }
7977         opn = "mov.d";
7978         break;
7979     case OPC_NEG_D:
7980         check_cp1_registers(ctx, fs | fd);
7981         {
7982             TCGv_i64 fp0 = tcg_temp_new_i64();
7983
7984             gen_load_fpr64(ctx, fp0, fs);
7985             gen_helper_float_chs_d(fp0, fp0);
7986             gen_store_fpr64(ctx, fp0, fd);
7987             tcg_temp_free_i64(fp0);
7988         }
7989         opn = "neg.d";
7990         break;
7991     case OPC_ROUND_L_D:
7992         check_cp1_64bitmode(ctx);
7993         {
7994             TCGv_i64 fp0 = tcg_temp_new_i64();
7995
7996             gen_load_fpr64(ctx, fp0, fs);
7997             gen_helper_float_roundl_d(fp0, cpu_env, fp0);
7998             gen_store_fpr64(ctx, fp0, fd);
7999             tcg_temp_free_i64(fp0);
8000         }
8001         opn = "round.l.d";
8002         break;
8003     case OPC_TRUNC_L_D:
8004         check_cp1_64bitmode(ctx);
8005         {
8006             TCGv_i64 fp0 = tcg_temp_new_i64();
8007
8008             gen_load_fpr64(ctx, fp0, fs);
8009             gen_helper_float_truncl_d(fp0, cpu_env, fp0);
8010             gen_store_fpr64(ctx, fp0, fd);
8011             tcg_temp_free_i64(fp0);
8012         }
8013         opn = "trunc.l.d";
8014         break;
8015     case OPC_CEIL_L_D:
8016         check_cp1_64bitmode(ctx);
8017         {
8018             TCGv_i64 fp0 = tcg_temp_new_i64();
8019
8020             gen_load_fpr64(ctx, fp0, fs);
8021             gen_helper_float_ceill_d(fp0, cpu_env, fp0);
8022             gen_store_fpr64(ctx, fp0, fd);
8023             tcg_temp_free_i64(fp0);
8024         }
8025         opn = "ceil.l.d";
8026         break;
8027     case OPC_FLOOR_L_D:
8028         check_cp1_64bitmode(ctx);
8029         {
8030             TCGv_i64 fp0 = tcg_temp_new_i64();
8031
8032             gen_load_fpr64(ctx, fp0, fs);
8033             gen_helper_float_floorl_d(fp0, cpu_env, fp0);
8034             gen_store_fpr64(ctx, fp0, fd);
8035             tcg_temp_free_i64(fp0);
8036         }
8037         opn = "floor.l.d";
8038         break;
8039     case OPC_ROUND_W_D:
8040         check_cp1_registers(ctx, fs);
8041         {
8042             TCGv_i32 fp32 = tcg_temp_new_i32();
8043             TCGv_i64 fp64 = tcg_temp_new_i64();
8044
8045             gen_load_fpr64(ctx, fp64, fs);
8046             gen_helper_float_roundw_d(fp32, cpu_env, fp64);
8047             tcg_temp_free_i64(fp64);
8048             gen_store_fpr32(fp32, fd);
8049             tcg_temp_free_i32(fp32);
8050         }
8051         opn = "round.w.d";
8052         break;
8053     case OPC_TRUNC_W_D:
8054         check_cp1_registers(ctx, fs);
8055         {
8056             TCGv_i32 fp32 = tcg_temp_new_i32();
8057             TCGv_i64 fp64 = tcg_temp_new_i64();
8058
8059             gen_load_fpr64(ctx, fp64, fs);
8060             gen_helper_float_truncw_d(fp32, cpu_env, fp64);
8061             tcg_temp_free_i64(fp64);
8062             gen_store_fpr32(fp32, fd);
8063             tcg_temp_free_i32(fp32);
8064         }
8065         opn = "trunc.w.d";
8066         break;
8067     case OPC_CEIL_W_D:
8068         check_cp1_registers(ctx, fs);
8069         {
8070             TCGv_i32 fp32 = tcg_temp_new_i32();
8071             TCGv_i64 fp64 = tcg_temp_new_i64();
8072
8073             gen_load_fpr64(ctx, fp64, fs);
8074             gen_helper_float_ceilw_d(fp32, cpu_env, fp64);
8075             tcg_temp_free_i64(fp64);
8076             gen_store_fpr32(fp32, fd);
8077             tcg_temp_free_i32(fp32);
8078         }
8079         opn = "ceil.w.d";
8080         break;
8081     case OPC_FLOOR_W_D:
8082         check_cp1_registers(ctx, fs);
8083         {
8084             TCGv_i32 fp32 = tcg_temp_new_i32();
8085             TCGv_i64 fp64 = tcg_temp_new_i64();
8086
8087             gen_load_fpr64(ctx, fp64, fs);
8088             gen_helper_float_floorw_d(fp32, cpu_env, fp64);
8089             tcg_temp_free_i64(fp64);
8090             gen_store_fpr32(fp32, fd);
8091             tcg_temp_free_i32(fp32);
8092         }
8093         opn = "floor.w.d";
8094         break;
8095     case OPC_MOVCF_D:
8096         gen_movcf_d(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1);
8097         opn = "movcf.d";
8098         break;
8099     case OPC_MOVZ_D:
8100         {
8101             int l1 = gen_new_label();
8102             TCGv_i64 fp0;
8103
8104             if (ft != 0) {
8105                 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
8106             }
8107             fp0 = tcg_temp_new_i64();
8108             gen_load_fpr64(ctx, fp0, fs);
8109             gen_store_fpr64(ctx, fp0, fd);
8110             tcg_temp_free_i64(fp0);
8111             gen_set_label(l1);
8112         }
8113         opn = "movz.d";
8114         break;
8115     case OPC_MOVN_D:
8116         {
8117             int l1 = gen_new_label();
8118             TCGv_i64 fp0;
8119
8120             if (ft != 0) {
8121                 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
8122                 fp0 = tcg_temp_new_i64();
8123                 gen_load_fpr64(ctx, fp0, fs);
8124                 gen_store_fpr64(ctx, fp0, fd);
8125                 tcg_temp_free_i64(fp0);
8126                 gen_set_label(l1);
8127             }
8128         }
8129         opn = "movn.d";
8130         break;
8131     case OPC_RECIP_D:
8132         check_cp1_64bitmode(ctx);
8133         {
8134             TCGv_i64 fp0 = tcg_temp_new_i64();
8135
8136             gen_load_fpr64(ctx, fp0, fs);
8137             gen_helper_float_recip_d(fp0, cpu_env, fp0);
8138             gen_store_fpr64(ctx, fp0, fd);
8139             tcg_temp_free_i64(fp0);
8140         }
8141         opn = "recip.d";
8142         break;
8143     case OPC_RSQRT_D:
8144         check_cp1_64bitmode(ctx);
8145         {
8146             TCGv_i64 fp0 = tcg_temp_new_i64();
8147
8148             gen_load_fpr64(ctx, fp0, fs);
8149             gen_helper_float_rsqrt_d(fp0, cpu_env, fp0);
8150             gen_store_fpr64(ctx, fp0, fd);
8151             tcg_temp_free_i64(fp0);
8152         }
8153         opn = "rsqrt.d";
8154         break;
8155     case OPC_RECIP2_D:
8156         check_cp1_64bitmode(ctx);
8157         {
8158             TCGv_i64 fp0 = tcg_temp_new_i64();
8159             TCGv_i64 fp1 = tcg_temp_new_i64();
8160
8161             gen_load_fpr64(ctx, fp0, fs);
8162             gen_load_fpr64(ctx, fp1, ft);
8163             gen_helper_float_recip2_d(fp0, cpu_env, fp0, fp1);
8164             tcg_temp_free_i64(fp1);
8165             gen_store_fpr64(ctx, fp0, fd);
8166             tcg_temp_free_i64(fp0);
8167         }
8168         opn = "recip2.d";
8169         break;
8170     case OPC_RECIP1_D:
8171         check_cp1_64bitmode(ctx);
8172         {
8173             TCGv_i64 fp0 = tcg_temp_new_i64();
8174
8175             gen_load_fpr64(ctx, fp0, fs);
8176             gen_helper_float_recip1_d(fp0, cpu_env, fp0);
8177             gen_store_fpr64(ctx, fp0, fd);
8178             tcg_temp_free_i64(fp0);
8179         }
8180         opn = "recip1.d";
8181         break;
8182     case OPC_RSQRT1_D:
8183         check_cp1_64bitmode(ctx);
8184         {
8185             TCGv_i64 fp0 = tcg_temp_new_i64();
8186
8187             gen_load_fpr64(ctx, fp0, fs);
8188             gen_helper_float_rsqrt1_d(fp0, cpu_env, fp0);
8189             gen_store_fpr64(ctx, fp0, fd);
8190             tcg_temp_free_i64(fp0);
8191         }
8192         opn = "rsqrt1.d";
8193         break;
8194     case OPC_RSQRT2_D:
8195         check_cp1_64bitmode(ctx);
8196         {
8197             TCGv_i64 fp0 = tcg_temp_new_i64();
8198             TCGv_i64 fp1 = tcg_temp_new_i64();
8199
8200             gen_load_fpr64(ctx, fp0, fs);
8201             gen_load_fpr64(ctx, fp1, ft);
8202             gen_helper_float_rsqrt2_d(fp0, cpu_env, fp0, fp1);
8203             tcg_temp_free_i64(fp1);
8204             gen_store_fpr64(ctx, fp0, fd);
8205             tcg_temp_free_i64(fp0);
8206         }
8207         opn = "rsqrt2.d";
8208         break;
8209     case OPC_CMP_F_D:
8210     case OPC_CMP_UN_D:
8211     case OPC_CMP_EQ_D:
8212     case OPC_CMP_UEQ_D:
8213     case OPC_CMP_OLT_D:
8214     case OPC_CMP_ULT_D:
8215     case OPC_CMP_OLE_D:
8216     case OPC_CMP_ULE_D:
8217     case OPC_CMP_SF_D:
8218     case OPC_CMP_NGLE_D:
8219     case OPC_CMP_SEQ_D:
8220     case OPC_CMP_NGL_D:
8221     case OPC_CMP_LT_D:
8222     case OPC_CMP_NGE_D:
8223     case OPC_CMP_LE_D:
8224     case OPC_CMP_NGT_D:
8225         if (ctx->opcode & (1 << 6)) {
8226             gen_cmpabs_d(ctx, func-48, ft, fs, cc);
8227             opn = condnames_abs[func-48];
8228         } else {
8229             gen_cmp_d(ctx, func-48, ft, fs, cc);
8230             opn = condnames[func-48];
8231         }
8232         break;
8233     case OPC_CVT_S_D:
8234         check_cp1_registers(ctx, fs);
8235         {
8236             TCGv_i32 fp32 = tcg_temp_new_i32();
8237             TCGv_i64 fp64 = tcg_temp_new_i64();
8238
8239             gen_load_fpr64(ctx, fp64, fs);
8240             gen_helper_float_cvts_d(fp32, cpu_env, fp64);
8241             tcg_temp_free_i64(fp64);
8242             gen_store_fpr32(fp32, fd);
8243             tcg_temp_free_i32(fp32);
8244         }
8245         opn = "cvt.s.d";
8246         break;
8247     case OPC_CVT_W_D:
8248         check_cp1_registers(ctx, fs);
8249         {
8250             TCGv_i32 fp32 = tcg_temp_new_i32();
8251             TCGv_i64 fp64 = tcg_temp_new_i64();
8252
8253             gen_load_fpr64(ctx, fp64, fs);
8254             gen_helper_float_cvtw_d(fp32, cpu_env, fp64);
8255             tcg_temp_free_i64(fp64);
8256             gen_store_fpr32(fp32, fd);
8257             tcg_temp_free_i32(fp32);
8258         }
8259         opn = "cvt.w.d";
8260         break;
8261     case OPC_CVT_L_D:
8262         check_cp1_64bitmode(ctx);
8263         {
8264             TCGv_i64 fp0 = tcg_temp_new_i64();
8265
8266             gen_load_fpr64(ctx, fp0, fs);
8267             gen_helper_float_cvtl_d(fp0, cpu_env, fp0);
8268             gen_store_fpr64(ctx, fp0, fd);
8269             tcg_temp_free_i64(fp0);
8270         }
8271         opn = "cvt.l.d";
8272         break;
8273     case OPC_CVT_S_W:
8274         {
8275             TCGv_i32 fp0 = tcg_temp_new_i32();
8276
8277             gen_load_fpr32(fp0, fs);
8278             gen_helper_float_cvts_w(fp0, cpu_env, fp0);
8279             gen_store_fpr32(fp0, fd);
8280             tcg_temp_free_i32(fp0);
8281         }
8282         opn = "cvt.s.w";
8283         break;
8284     case OPC_CVT_D_W:
8285         check_cp1_registers(ctx, fd);
8286         {
8287             TCGv_i32 fp32 = tcg_temp_new_i32();
8288             TCGv_i64 fp64 = tcg_temp_new_i64();
8289
8290             gen_load_fpr32(fp32, fs);
8291             gen_helper_float_cvtd_w(fp64, cpu_env, fp32);
8292             tcg_temp_free_i32(fp32);
8293             gen_store_fpr64(ctx, fp64, fd);
8294             tcg_temp_free_i64(fp64);
8295         }
8296         opn = "cvt.d.w";
8297         break;
8298     case OPC_CVT_S_L:
8299         check_cp1_64bitmode(ctx);
8300         {
8301             TCGv_i32 fp32 = tcg_temp_new_i32();
8302             TCGv_i64 fp64 = tcg_temp_new_i64();
8303
8304             gen_load_fpr64(ctx, fp64, fs);
8305             gen_helper_float_cvts_l(fp32, cpu_env, fp64);
8306             tcg_temp_free_i64(fp64);
8307             gen_store_fpr32(fp32, fd);
8308             tcg_temp_free_i32(fp32);
8309         }
8310         opn = "cvt.s.l";
8311         break;
8312     case OPC_CVT_D_L:
8313         check_cp1_64bitmode(ctx);
8314         {
8315             TCGv_i64 fp0 = tcg_temp_new_i64();
8316
8317             gen_load_fpr64(ctx, fp0, fs);
8318             gen_helper_float_cvtd_l(fp0, cpu_env, fp0);
8319             gen_store_fpr64(ctx, fp0, fd);
8320             tcg_temp_free_i64(fp0);
8321         }
8322         opn = "cvt.d.l";
8323         break;
8324     case OPC_CVT_PS_PW:
8325         check_cp1_64bitmode(ctx);
8326         {
8327             TCGv_i64 fp0 = tcg_temp_new_i64();
8328
8329             gen_load_fpr64(ctx, fp0, fs);
8330             gen_helper_float_cvtps_pw(fp0, cpu_env, fp0);
8331             gen_store_fpr64(ctx, fp0, fd);
8332             tcg_temp_free_i64(fp0);
8333         }
8334         opn = "cvt.ps.pw";
8335         break;
8336     case OPC_ADD_PS:
8337         check_cp1_64bitmode(ctx);
8338         {
8339             TCGv_i64 fp0 = tcg_temp_new_i64();
8340             TCGv_i64 fp1 = tcg_temp_new_i64();
8341
8342             gen_load_fpr64(ctx, fp0, fs);
8343             gen_load_fpr64(ctx, fp1, ft);
8344             gen_helper_float_add_ps(fp0, cpu_env, fp0, fp1);
8345             tcg_temp_free_i64(fp1);
8346             gen_store_fpr64(ctx, fp0, fd);
8347             tcg_temp_free_i64(fp0);
8348         }
8349         opn = "add.ps";
8350         break;
8351     case OPC_SUB_PS:
8352         check_cp1_64bitmode(ctx);
8353         {
8354             TCGv_i64 fp0 = tcg_temp_new_i64();
8355             TCGv_i64 fp1 = tcg_temp_new_i64();
8356
8357             gen_load_fpr64(ctx, fp0, fs);
8358             gen_load_fpr64(ctx, fp1, ft);
8359             gen_helper_float_sub_ps(fp0, cpu_env, fp0, fp1);
8360             tcg_temp_free_i64(fp1);
8361             gen_store_fpr64(ctx, fp0, fd);
8362             tcg_temp_free_i64(fp0);
8363         }
8364         opn = "sub.ps";
8365         break;
8366     case OPC_MUL_PS:
8367         check_cp1_64bitmode(ctx);
8368         {
8369             TCGv_i64 fp0 = tcg_temp_new_i64();
8370             TCGv_i64 fp1 = tcg_temp_new_i64();
8371
8372             gen_load_fpr64(ctx, fp0, fs);
8373             gen_load_fpr64(ctx, fp1, ft);
8374             gen_helper_float_mul_ps(fp0, cpu_env, fp0, fp1);
8375             tcg_temp_free_i64(fp1);
8376             gen_store_fpr64(ctx, fp0, fd);
8377             tcg_temp_free_i64(fp0);
8378         }
8379         opn = "mul.ps";
8380         break;
8381     case OPC_ABS_PS:
8382         check_cp1_64bitmode(ctx);
8383         {
8384             TCGv_i64 fp0 = tcg_temp_new_i64();
8385
8386             gen_load_fpr64(ctx, fp0, fs);
8387             gen_helper_float_abs_ps(fp0, fp0);
8388             gen_store_fpr64(ctx, fp0, fd);
8389             tcg_temp_free_i64(fp0);
8390         }
8391         opn = "abs.ps";
8392         break;
8393     case OPC_MOV_PS:
8394         check_cp1_64bitmode(ctx);
8395         {
8396             TCGv_i64 fp0 = tcg_temp_new_i64();
8397
8398             gen_load_fpr64(ctx, fp0, fs);
8399             gen_store_fpr64(ctx, fp0, fd);
8400             tcg_temp_free_i64(fp0);
8401         }
8402         opn = "mov.ps";
8403         break;
8404     case OPC_NEG_PS:
8405         check_cp1_64bitmode(ctx);
8406         {
8407             TCGv_i64 fp0 = tcg_temp_new_i64();
8408
8409             gen_load_fpr64(ctx, fp0, fs);
8410             gen_helper_float_chs_ps(fp0, fp0);
8411             gen_store_fpr64(ctx, fp0, fd);
8412             tcg_temp_free_i64(fp0);
8413         }
8414         opn = "neg.ps";
8415         break;
8416     case OPC_MOVCF_PS:
8417         check_cp1_64bitmode(ctx);
8418         gen_movcf_ps(fs, fd, (ft >> 2) & 0x7, ft & 0x1);
8419         opn = "movcf.ps";
8420         break;
8421     case OPC_MOVZ_PS:
8422         check_cp1_64bitmode(ctx);
8423         {
8424             int l1 = gen_new_label();
8425             TCGv_i64 fp0;
8426
8427             if (ft != 0)
8428                 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
8429             fp0 = tcg_temp_new_i64();
8430             gen_load_fpr64(ctx, fp0, fs);
8431             gen_store_fpr64(ctx, fp0, fd);
8432             tcg_temp_free_i64(fp0);
8433             gen_set_label(l1);
8434         }
8435         opn = "movz.ps";
8436         break;
8437     case OPC_MOVN_PS:
8438         check_cp1_64bitmode(ctx);
8439         {
8440             int l1 = gen_new_label();
8441             TCGv_i64 fp0;
8442
8443             if (ft != 0) {
8444                 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
8445                 fp0 = tcg_temp_new_i64();
8446                 gen_load_fpr64(ctx, fp0, fs);
8447                 gen_store_fpr64(ctx, fp0, fd);
8448                 tcg_temp_free_i64(fp0);
8449                 gen_set_label(l1);
8450             }
8451         }
8452         opn = "movn.ps";
8453         break;
8454     case OPC_ADDR_PS:
8455         check_cp1_64bitmode(ctx);
8456         {
8457             TCGv_i64 fp0 = tcg_temp_new_i64();
8458             TCGv_i64 fp1 = tcg_temp_new_i64();
8459
8460             gen_load_fpr64(ctx, fp0, ft);
8461             gen_load_fpr64(ctx, fp1, fs);
8462             gen_helper_float_addr_ps(fp0, cpu_env, fp0, fp1);
8463             tcg_temp_free_i64(fp1);
8464             gen_store_fpr64(ctx, fp0, fd);
8465             tcg_temp_free_i64(fp0);
8466         }
8467         opn = "addr.ps";
8468         break;
8469     case OPC_MULR_PS:
8470         check_cp1_64bitmode(ctx);
8471         {
8472             TCGv_i64 fp0 = tcg_temp_new_i64();
8473             TCGv_i64 fp1 = tcg_temp_new_i64();
8474
8475             gen_load_fpr64(ctx, fp0, ft);
8476             gen_load_fpr64(ctx, fp1, fs);
8477             gen_helper_float_mulr_ps(fp0, cpu_env, fp0, fp1);
8478             tcg_temp_free_i64(fp1);
8479             gen_store_fpr64(ctx, fp0, fd);
8480             tcg_temp_free_i64(fp0);
8481         }
8482         opn = "mulr.ps";
8483         break;
8484     case OPC_RECIP2_PS:
8485         check_cp1_64bitmode(ctx);
8486         {
8487             TCGv_i64 fp0 = tcg_temp_new_i64();
8488             TCGv_i64 fp1 = tcg_temp_new_i64();
8489
8490             gen_load_fpr64(ctx, fp0, fs);
8491             gen_load_fpr64(ctx, fp1, ft);
8492             gen_helper_float_recip2_ps(fp0, cpu_env, fp0, fp1);
8493             tcg_temp_free_i64(fp1);
8494             gen_store_fpr64(ctx, fp0, fd);
8495             tcg_temp_free_i64(fp0);
8496         }
8497         opn = "recip2.ps";
8498         break;
8499     case OPC_RECIP1_PS:
8500         check_cp1_64bitmode(ctx);
8501         {
8502             TCGv_i64 fp0 = tcg_temp_new_i64();
8503
8504             gen_load_fpr64(ctx, fp0, fs);
8505             gen_helper_float_recip1_ps(fp0, cpu_env, fp0);
8506             gen_store_fpr64(ctx, fp0, fd);
8507             tcg_temp_free_i64(fp0);
8508         }
8509         opn = "recip1.ps";
8510         break;
8511     case OPC_RSQRT1_PS:
8512         check_cp1_64bitmode(ctx);
8513         {
8514             TCGv_i64 fp0 = tcg_temp_new_i64();
8515
8516             gen_load_fpr64(ctx, fp0, fs);
8517             gen_helper_float_rsqrt1_ps(fp0, cpu_env, fp0);
8518             gen_store_fpr64(ctx, fp0, fd);
8519             tcg_temp_free_i64(fp0);
8520         }
8521         opn = "rsqrt1.ps";
8522         break;
8523     case OPC_RSQRT2_PS:
8524         check_cp1_64bitmode(ctx);
8525         {
8526             TCGv_i64 fp0 = tcg_temp_new_i64();
8527             TCGv_i64 fp1 = tcg_temp_new_i64();
8528
8529             gen_load_fpr64(ctx, fp0, fs);
8530             gen_load_fpr64(ctx, fp1, ft);
8531             gen_helper_float_rsqrt2_ps(fp0, cpu_env, fp0, fp1);
8532             tcg_temp_free_i64(fp1);
8533             gen_store_fpr64(ctx, fp0, fd);
8534             tcg_temp_free_i64(fp0);
8535         }
8536         opn = "rsqrt2.ps";
8537         break;
8538     case OPC_CVT_S_PU:
8539         check_cp1_64bitmode(ctx);
8540         {
8541             TCGv_i32 fp0 = tcg_temp_new_i32();
8542
8543             gen_load_fpr32h(fp0, fs);
8544             gen_helper_float_cvts_pu(fp0, cpu_env, fp0);
8545             gen_store_fpr32(fp0, fd);
8546             tcg_temp_free_i32(fp0);
8547         }
8548         opn = "cvt.s.pu";
8549         break;
8550     case OPC_CVT_PW_PS:
8551         check_cp1_64bitmode(ctx);
8552         {
8553             TCGv_i64 fp0 = tcg_temp_new_i64();
8554
8555             gen_load_fpr64(ctx, fp0, fs);
8556             gen_helper_float_cvtpw_ps(fp0, cpu_env, fp0);
8557             gen_store_fpr64(ctx, fp0, fd);
8558             tcg_temp_free_i64(fp0);
8559         }
8560         opn = "cvt.pw.ps";
8561         break;
8562     case OPC_CVT_S_PL:
8563         check_cp1_64bitmode(ctx);
8564         {
8565             TCGv_i32 fp0 = tcg_temp_new_i32();
8566
8567             gen_load_fpr32(fp0, fs);
8568             gen_helper_float_cvts_pl(fp0, cpu_env, fp0);
8569             gen_store_fpr32(fp0, fd);
8570             tcg_temp_free_i32(fp0);
8571         }
8572         opn = "cvt.s.pl";
8573         break;
8574     case OPC_PLL_PS:
8575         check_cp1_64bitmode(ctx);
8576         {
8577             TCGv_i32 fp0 = tcg_temp_new_i32();
8578             TCGv_i32 fp1 = tcg_temp_new_i32();
8579
8580             gen_load_fpr32(fp0, fs);
8581             gen_load_fpr32(fp1, ft);
8582             gen_store_fpr32h(fp0, fd);
8583             gen_store_fpr32(fp1, fd);
8584             tcg_temp_free_i32(fp0);
8585             tcg_temp_free_i32(fp1);
8586         }
8587         opn = "pll.ps";
8588         break;
8589     case OPC_PLU_PS:
8590         check_cp1_64bitmode(ctx);
8591         {
8592             TCGv_i32 fp0 = tcg_temp_new_i32();
8593             TCGv_i32 fp1 = tcg_temp_new_i32();
8594
8595             gen_load_fpr32(fp0, fs);
8596             gen_load_fpr32h(fp1, ft);
8597             gen_store_fpr32(fp1, fd);
8598             gen_store_fpr32h(fp0, fd);
8599             tcg_temp_free_i32(fp0);
8600             tcg_temp_free_i32(fp1);
8601         }
8602         opn = "plu.ps";
8603         break;
8604     case OPC_PUL_PS:
8605         check_cp1_64bitmode(ctx);
8606         {
8607             TCGv_i32 fp0 = tcg_temp_new_i32();
8608             TCGv_i32 fp1 = tcg_temp_new_i32();
8609
8610             gen_load_fpr32h(fp0, fs);
8611             gen_load_fpr32(fp1, ft);
8612             gen_store_fpr32(fp1, fd);
8613             gen_store_fpr32h(fp0, fd);
8614             tcg_temp_free_i32(fp0);
8615             tcg_temp_free_i32(fp1);
8616         }
8617         opn = "pul.ps";
8618         break;
8619     case OPC_PUU_PS:
8620         check_cp1_64bitmode(ctx);
8621         {
8622             TCGv_i32 fp0 = tcg_temp_new_i32();
8623             TCGv_i32 fp1 = tcg_temp_new_i32();
8624
8625             gen_load_fpr32h(fp0, fs);
8626             gen_load_fpr32h(fp1, ft);
8627             gen_store_fpr32(fp1, fd);
8628             gen_store_fpr32h(fp0, fd);
8629             tcg_temp_free_i32(fp0);
8630             tcg_temp_free_i32(fp1);
8631         }
8632         opn = "puu.ps";
8633         break;
8634     case OPC_CMP_F_PS:
8635     case OPC_CMP_UN_PS:
8636     case OPC_CMP_EQ_PS:
8637     case OPC_CMP_UEQ_PS:
8638     case OPC_CMP_OLT_PS:
8639     case OPC_CMP_ULT_PS:
8640     case OPC_CMP_OLE_PS:
8641     case OPC_CMP_ULE_PS:
8642     case OPC_CMP_SF_PS:
8643     case OPC_CMP_NGLE_PS:
8644     case OPC_CMP_SEQ_PS:
8645     case OPC_CMP_NGL_PS:
8646     case OPC_CMP_LT_PS:
8647     case OPC_CMP_NGE_PS:
8648     case OPC_CMP_LE_PS:
8649     case OPC_CMP_NGT_PS:
8650         if (ctx->opcode & (1 << 6)) {
8651             gen_cmpabs_ps(ctx, func-48, ft, fs, cc);
8652             opn = condnames_abs[func-48];
8653         } else {
8654             gen_cmp_ps(ctx, func-48, ft, fs, cc);
8655             opn = condnames[func-48];
8656         }
8657         break;
8658     default:
8659         MIPS_INVAL(opn);
8660         generate_exception (ctx, EXCP_RI);
8661         return;
8662     }
8663     (void)opn; /* avoid a compiler warning */
8664     switch (optype) {
8665     case BINOP:
8666         MIPS_DEBUG("%s %s, %s, %s", opn, fregnames[fd], fregnames[fs], fregnames[ft]);
8667         break;
8668     case CMPOP:
8669         MIPS_DEBUG("%s %s,%s", opn, fregnames[fs], fregnames[ft]);
8670         break;
8671     default:
8672         MIPS_DEBUG("%s %s,%s", opn, fregnames[fd], fregnames[fs]);
8673         break;
8674     }
8675 }
8676
8677 /* Coprocessor 3 (FPU) */
8678 static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc,
8679                            int fd, int fs, int base, int index)
8680 {
8681     const char *opn = "extended float load/store";
8682     int store = 0;
8683     TCGv t0 = tcg_temp_new();
8684
8685     if (base == 0) {
8686         gen_load_gpr(t0, index);
8687     } else if (index == 0) {
8688         gen_load_gpr(t0, base);
8689     } else {
8690         gen_op_addr_add(ctx, t0, cpu_gpr[base], cpu_gpr[index]);
8691     }
8692     /* Don't do NOP if destination is zero: we must perform the actual
8693        memory access. */
8694     save_cpu_state(ctx, 0);
8695     switch (opc) {
8696     case OPC_LWXC1:
8697         check_cop1x(ctx);
8698         {
8699             TCGv_i32 fp0 = tcg_temp_new_i32();
8700
8701             tcg_gen_qemu_ld32s(t0, t0, ctx->mem_idx);
8702             tcg_gen_trunc_tl_i32(fp0, t0);
8703             gen_store_fpr32(fp0, fd);
8704             tcg_temp_free_i32(fp0);
8705         }
8706         opn = "lwxc1";
8707         break;
8708     case OPC_LDXC1:
8709         check_cop1x(ctx);
8710         check_cp1_registers(ctx, fd);
8711         {
8712             TCGv_i64 fp0 = tcg_temp_new_i64();
8713
8714             tcg_gen_qemu_ld64(fp0, t0, ctx->mem_idx);
8715             gen_store_fpr64(ctx, fp0, fd);
8716             tcg_temp_free_i64(fp0);
8717         }
8718         opn = "ldxc1";
8719         break;
8720     case OPC_LUXC1:
8721         check_cp1_64bitmode(ctx);
8722         tcg_gen_andi_tl(t0, t0, ~0x7);
8723         {
8724             TCGv_i64 fp0 = tcg_temp_new_i64();
8725
8726             tcg_gen_qemu_ld64(fp0, t0, ctx->mem_idx);
8727             gen_store_fpr64(ctx, fp0, fd);
8728             tcg_temp_free_i64(fp0);
8729         }
8730         opn = "luxc1";
8731         break;
8732     case OPC_SWXC1:
8733         check_cop1x(ctx);
8734         {
8735             TCGv_i32 fp0 = tcg_temp_new_i32();
8736             TCGv t1 = tcg_temp_new();
8737
8738             gen_load_fpr32(fp0, fs);
8739             tcg_gen_extu_i32_tl(t1, fp0);
8740             tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);
8741             tcg_temp_free_i32(fp0);
8742             tcg_temp_free(t1);
8743         }
8744         opn = "swxc1";
8745         store = 1;
8746         break;
8747     case OPC_SDXC1:
8748         check_cop1x(ctx);
8749         check_cp1_registers(ctx, fs);
8750         {
8751             TCGv_i64 fp0 = tcg_temp_new_i64();
8752
8753             gen_load_fpr64(ctx, fp0, fs);
8754             tcg_gen_qemu_st64(fp0, t0, ctx->mem_idx);
8755             tcg_temp_free_i64(fp0);
8756         }
8757         opn = "sdxc1";
8758         store = 1;
8759         break;
8760     case OPC_SUXC1:
8761         check_cp1_64bitmode(ctx);
8762         tcg_gen_andi_tl(t0, t0, ~0x7);
8763         {
8764             TCGv_i64 fp0 = tcg_temp_new_i64();
8765
8766             gen_load_fpr64(ctx, fp0, fs);
8767             tcg_gen_qemu_st64(fp0, t0, ctx->mem_idx);
8768             tcg_temp_free_i64(fp0);
8769         }
8770         opn = "suxc1";
8771         store = 1;
8772         break;
8773     }
8774     tcg_temp_free(t0);
8775     (void)opn; (void)store; /* avoid compiler warnings */
8776     MIPS_DEBUG("%s %s, %s(%s)", opn, fregnames[store ? fs : fd],
8777                regnames[index], regnames[base]);
8778 }
8779
8780 static void gen_flt3_arith (DisasContext *ctx, uint32_t opc,
8781                             int fd, int fr, int fs, int ft)
8782 {
8783     const char *opn = "flt3_arith";
8784
8785     switch (opc) {
8786     case OPC_ALNV_PS:
8787         check_cp1_64bitmode(ctx);
8788         {
8789             TCGv t0 = tcg_temp_local_new();
8790             TCGv_i32 fp = tcg_temp_new_i32();
8791             TCGv_i32 fph = tcg_temp_new_i32();
8792             int l1 = gen_new_label();
8793             int l2 = gen_new_label();
8794
8795             gen_load_gpr(t0, fr);
8796             tcg_gen_andi_tl(t0, t0, 0x7);
8797
8798             tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0, l1);
8799             gen_load_fpr32(fp, fs);
8800             gen_load_fpr32h(fph, fs);
8801             gen_store_fpr32(fp, fd);
8802             gen_store_fpr32h(fph, fd);
8803             tcg_gen_br(l2);
8804             gen_set_label(l1);
8805             tcg_gen_brcondi_tl(TCG_COND_NE, t0, 4, l2);
8806             tcg_temp_free(t0);
8807 #ifdef TARGET_WORDS_BIGENDIAN
8808             gen_load_fpr32(fp, fs);
8809             gen_load_fpr32h(fph, ft);
8810             gen_store_fpr32h(fp, fd);
8811             gen_store_fpr32(fph, fd);
8812 #else
8813             gen_load_fpr32h(fph, fs);
8814             gen_load_fpr32(fp, ft);
8815             gen_store_fpr32(fph, fd);
8816             gen_store_fpr32h(fp, fd);
8817 #endif
8818             gen_set_label(l2);
8819             tcg_temp_free_i32(fp);
8820             tcg_temp_free_i32(fph);
8821         }
8822         opn = "alnv.ps";
8823         break;
8824     case OPC_MADD_S:
8825         check_cop1x(ctx);
8826         {
8827             TCGv_i32 fp0 = tcg_temp_new_i32();
8828             TCGv_i32 fp1 = tcg_temp_new_i32();
8829             TCGv_i32 fp2 = tcg_temp_new_i32();
8830
8831             gen_load_fpr32(fp0, fs);
8832             gen_load_fpr32(fp1, ft);
8833             gen_load_fpr32(fp2, fr);
8834             gen_helper_float_muladd_s(fp2, cpu_env, fp0, fp1, fp2);
8835             tcg_temp_free_i32(fp0);
8836             tcg_temp_free_i32(fp1);
8837             gen_store_fpr32(fp2, fd);
8838             tcg_temp_free_i32(fp2);
8839         }
8840         opn = "madd.s";
8841         break;
8842     case OPC_MADD_D:
8843         check_cop1x(ctx);
8844         check_cp1_registers(ctx, fd | fs | ft | fr);
8845         {
8846             TCGv_i64 fp0 = tcg_temp_new_i64();
8847             TCGv_i64 fp1 = tcg_temp_new_i64();
8848             TCGv_i64 fp2 = tcg_temp_new_i64();
8849
8850             gen_load_fpr64(ctx, fp0, fs);
8851             gen_load_fpr64(ctx, fp1, ft);
8852             gen_load_fpr64(ctx, fp2, fr);
8853             gen_helper_float_muladd_d(fp2, cpu_env, fp0, fp1, fp2);
8854             tcg_temp_free_i64(fp0);
8855             tcg_temp_free_i64(fp1);
8856             gen_store_fpr64(ctx, fp2, fd);
8857             tcg_temp_free_i64(fp2);
8858         }
8859         opn = "madd.d";
8860         break;
8861     case OPC_MADD_PS:
8862         check_cp1_64bitmode(ctx);
8863         {
8864             TCGv_i64 fp0 = tcg_temp_new_i64();
8865             TCGv_i64 fp1 = tcg_temp_new_i64();
8866             TCGv_i64 fp2 = tcg_temp_new_i64();
8867
8868             gen_load_fpr64(ctx, fp0, fs);
8869             gen_load_fpr64(ctx, fp1, ft);
8870             gen_load_fpr64(ctx, fp2, fr);
8871             gen_helper_float_muladd_ps(fp2, cpu_env, fp0, fp1, fp2);
8872             tcg_temp_free_i64(fp0);
8873             tcg_temp_free_i64(fp1);
8874             gen_store_fpr64(ctx, fp2, fd);
8875             tcg_temp_free_i64(fp2);
8876         }
8877         opn = "madd.ps";
8878         break;
8879     case OPC_MSUB_S:
8880         check_cop1x(ctx);
8881         {
8882             TCGv_i32 fp0 = tcg_temp_new_i32();
8883             TCGv_i32 fp1 = tcg_temp_new_i32();
8884             TCGv_i32 fp2 = tcg_temp_new_i32();
8885
8886             gen_load_fpr32(fp0, fs);
8887             gen_load_fpr32(fp1, ft);
8888             gen_load_fpr32(fp2, fr);
8889             gen_helper_float_mulsub_s(fp2, cpu_env, fp0, fp1, fp2);
8890             tcg_temp_free_i32(fp0);
8891             tcg_temp_free_i32(fp1);
8892             gen_store_fpr32(fp2, fd);
8893             tcg_temp_free_i32(fp2);
8894         }
8895         opn = "msub.s";
8896         break;
8897     case OPC_MSUB_D:
8898         check_cop1x(ctx);
8899         check_cp1_registers(ctx, fd | fs | ft | fr);
8900         {
8901             TCGv_i64 fp0 = tcg_temp_new_i64();
8902             TCGv_i64 fp1 = tcg_temp_new_i64();
8903             TCGv_i64 fp2 = tcg_temp_new_i64();
8904
8905             gen_load_fpr64(ctx, fp0, fs);
8906             gen_load_fpr64(ctx, fp1, ft);
8907             gen_load_fpr64(ctx, fp2, fr);
8908             gen_helper_float_mulsub_d(fp2, cpu_env, fp0, fp1, fp2);
8909             tcg_temp_free_i64(fp0);
8910             tcg_temp_free_i64(fp1);
8911             gen_store_fpr64(ctx, fp2, fd);
8912             tcg_temp_free_i64(fp2);
8913         }
8914         opn = "msub.d";
8915         break;
8916     case OPC_MSUB_PS:
8917         check_cp1_64bitmode(ctx);
8918         {
8919             TCGv_i64 fp0 = tcg_temp_new_i64();
8920             TCGv_i64 fp1 = tcg_temp_new_i64();
8921             TCGv_i64 fp2 = tcg_temp_new_i64();
8922
8923             gen_load_fpr64(ctx, fp0, fs);
8924             gen_load_fpr64(ctx, fp1, ft);
8925             gen_load_fpr64(ctx, fp2, fr);
8926             gen_helper_float_mulsub_ps(fp2, cpu_env, fp0, fp1, fp2);
8927             tcg_temp_free_i64(fp0);
8928             tcg_temp_free_i64(fp1);
8929             gen_store_fpr64(ctx, fp2, fd);
8930             tcg_temp_free_i64(fp2);
8931         }
8932         opn = "msub.ps";
8933         break;
8934     case OPC_NMADD_S:
8935         check_cop1x(ctx);
8936         {
8937             TCGv_i32 fp0 = tcg_temp_new_i32();
8938             TCGv_i32 fp1 = tcg_temp_new_i32();
8939             TCGv_i32 fp2 = tcg_temp_new_i32();
8940
8941             gen_load_fpr32(fp0, fs);
8942             gen_load_fpr32(fp1, ft);
8943             gen_load_fpr32(fp2, fr);
8944             gen_helper_float_nmuladd_s(fp2, cpu_env, fp0, fp1, fp2);
8945             tcg_temp_free_i32(fp0);
8946             tcg_temp_free_i32(fp1);
8947             gen_store_fpr32(fp2, fd);
8948             tcg_temp_free_i32(fp2);
8949         }
8950         opn = "nmadd.s";
8951         break;
8952     case OPC_NMADD_D:
8953         check_cop1x(ctx);
8954         check_cp1_registers(ctx, fd | fs | ft | fr);
8955         {
8956             TCGv_i64 fp0 = tcg_temp_new_i64();
8957             TCGv_i64 fp1 = tcg_temp_new_i64();
8958             TCGv_i64 fp2 = tcg_temp_new_i64();
8959
8960             gen_load_fpr64(ctx, fp0, fs);
8961             gen_load_fpr64(ctx, fp1, ft);
8962             gen_load_fpr64(ctx, fp2, fr);
8963             gen_helper_float_nmuladd_d(fp2, cpu_env, fp0, fp1, fp2);
8964             tcg_temp_free_i64(fp0);
8965             tcg_temp_free_i64(fp1);
8966             gen_store_fpr64(ctx, fp2, fd);
8967             tcg_temp_free_i64(fp2);
8968         }
8969         opn = "nmadd.d";
8970         break;
8971     case OPC_NMADD_PS:
8972         check_cp1_64bitmode(ctx);
8973         {
8974             TCGv_i64 fp0 = tcg_temp_new_i64();
8975             TCGv_i64 fp1 = tcg_temp_new_i64();
8976             TCGv_i64 fp2 = tcg_temp_new_i64();
8977
8978             gen_load_fpr64(ctx, fp0, fs);
8979             gen_load_fpr64(ctx, fp1, ft);
8980             gen_load_fpr64(ctx, fp2, fr);
8981             gen_helper_float_nmuladd_ps(fp2, cpu_env, fp0, fp1, fp2);
8982             tcg_temp_free_i64(fp0);
8983             tcg_temp_free_i64(fp1);
8984             gen_store_fpr64(ctx, fp2, fd);
8985             tcg_temp_free_i64(fp2);
8986         }
8987         opn = "nmadd.ps";
8988         break;
8989     case OPC_NMSUB_S:
8990         check_cop1x(ctx);
8991         {
8992             TCGv_i32 fp0 = tcg_temp_new_i32();
8993             TCGv_i32 fp1 = tcg_temp_new_i32();
8994             TCGv_i32 fp2 = tcg_temp_new_i32();
8995
8996             gen_load_fpr32(fp0, fs);
8997             gen_load_fpr32(fp1, ft);
8998             gen_load_fpr32(fp2, fr);
8999             gen_helper_float_nmulsub_s(fp2, cpu_env, fp0, fp1, fp2);
9000             tcg_temp_free_i32(fp0);
9001             tcg_temp_free_i32(fp1);
9002             gen_store_fpr32(fp2, fd);
9003             tcg_temp_free_i32(fp2);
9004         }
9005         opn = "nmsub.s";
9006         break;
9007     case OPC_NMSUB_D:
9008         check_cop1x(ctx);
9009         check_cp1_registers(ctx, fd | fs | ft | fr);
9010         {
9011             TCGv_i64 fp0 = tcg_temp_new_i64();
9012             TCGv_i64 fp1 = tcg_temp_new_i64();
9013             TCGv_i64 fp2 = tcg_temp_new_i64();
9014
9015             gen_load_fpr64(ctx, fp0, fs);
9016             gen_load_fpr64(ctx, fp1, ft);
9017             gen_load_fpr64(ctx, fp2, fr);
9018             gen_helper_float_nmulsub_d(fp2, cpu_env, fp0, fp1, fp2);
9019             tcg_temp_free_i64(fp0);
9020             tcg_temp_free_i64(fp1);
9021             gen_store_fpr64(ctx, fp2, fd);
9022             tcg_temp_free_i64(fp2);
9023         }
9024         opn = "nmsub.d";
9025         break;
9026     case OPC_NMSUB_PS:
9027         check_cp1_64bitmode(ctx);
9028         {
9029             TCGv_i64 fp0 = tcg_temp_new_i64();
9030             TCGv_i64 fp1 = tcg_temp_new_i64();
9031             TCGv_i64 fp2 = tcg_temp_new_i64();
9032
9033             gen_load_fpr64(ctx, fp0, fs);
9034             gen_load_fpr64(ctx, fp1, ft);
9035             gen_load_fpr64(ctx, fp2, fr);
9036             gen_helper_float_nmulsub_ps(fp2, cpu_env, fp0, fp1, fp2);
9037             tcg_temp_free_i64(fp0);
9038             tcg_temp_free_i64(fp1);
9039             gen_store_fpr64(ctx, fp2, fd);
9040             tcg_temp_free_i64(fp2);
9041         }
9042         opn = "nmsub.ps";
9043         break;
9044     default:
9045         MIPS_INVAL(opn);
9046         generate_exception (ctx, EXCP_RI);
9047         return;
9048     }
9049     (void)opn; /* avoid a compiler warning */
9050     MIPS_DEBUG("%s %s, %s, %s, %s", opn, fregnames[fd], fregnames[fr],
9051                fregnames[fs], fregnames[ft]);
9052 }
9053
9054 static void
9055 gen_rdhwr (CPUMIPSState *env, DisasContext *ctx, int rt, int rd)
9056 {
9057     TCGv t0;
9058
9059 #if !defined(CONFIG_USER_ONLY)
9060     /* The Linux kernel will emulate rdhwr if it's not supported natively.
9061        Therefore only check the ISA in system mode.  */
9062     check_insn(env, ctx, ISA_MIPS32R2);
9063 #endif
9064     t0 = tcg_temp_new();
9065
9066     switch (rd) {
9067     case 0:
9068         save_cpu_state(ctx, 1);
9069         gen_helper_rdhwr_cpunum(t0, cpu_env);
9070         gen_store_gpr(t0, rt);
9071         break;
9072     case 1:
9073         save_cpu_state(ctx, 1);
9074         gen_helper_rdhwr_synci_step(t0, cpu_env);
9075         gen_store_gpr(t0, rt);
9076         break;
9077     case 2:
9078         save_cpu_state(ctx, 1);
9079         gen_helper_rdhwr_cc(t0, cpu_env);
9080         gen_store_gpr(t0, rt);
9081         break;
9082     case 3:
9083         save_cpu_state(ctx, 1);
9084         gen_helper_rdhwr_ccres(t0, cpu_env);
9085         gen_store_gpr(t0, rt);
9086         break;
9087     case 29:
9088 #if defined(CONFIG_USER_ONLY)
9089         tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUMIPSState, tls_value));
9090         gen_store_gpr(t0, rt);
9091         break;
9092 #else
9093         /* XXX: Some CPUs implement this in hardware.
9094            Not supported yet. */
9095 #endif
9096     default:            /* Invalid */
9097         MIPS_INVAL("rdhwr");
9098         generate_exception(ctx, EXCP_RI);
9099         break;
9100     }
9101     tcg_temp_free(t0);
9102 }
9103
9104 static void handle_delay_slot (CPUMIPSState *env, DisasContext *ctx,
9105                                int insn_bytes)
9106 {
9107     if (ctx->hflags & MIPS_HFLAG_BMASK) {
9108         int proc_hflags = ctx->hflags & MIPS_HFLAG_BMASK;
9109         /* Branches completion */
9110         ctx->hflags &= ~MIPS_HFLAG_BMASK;
9111         ctx->bstate = BS_BRANCH;
9112         save_cpu_state(ctx, 0);
9113         /* FIXME: Need to clear can_do_io.  */
9114         switch (proc_hflags & MIPS_HFLAG_BMASK_BASE) {
9115         case MIPS_HFLAG_B:
9116             /* unconditional branch */
9117             MIPS_DEBUG("unconditional branch");
9118             if (proc_hflags & MIPS_HFLAG_BX) {
9119                 tcg_gen_xori_i32(hflags, hflags, MIPS_HFLAG_M16);
9120             }
9121             gen_goto_tb(ctx, 0, ctx->btarget);
9122             break;
9123         case MIPS_HFLAG_BL:
9124             /* blikely taken case */
9125             MIPS_DEBUG("blikely branch taken");
9126             gen_goto_tb(ctx, 0, ctx->btarget);
9127             break;
9128         case MIPS_HFLAG_BC:
9129             /* Conditional branch */
9130             MIPS_DEBUG("conditional branch");
9131             {
9132                 int l1 = gen_new_label();
9133
9134                 tcg_gen_brcondi_tl(TCG_COND_NE, bcond, 0, l1);
9135                 gen_goto_tb(ctx, 1, ctx->pc + insn_bytes);
9136                 gen_set_label(l1);
9137                 gen_goto_tb(ctx, 0, ctx->btarget);
9138             }
9139             break;
9140         case MIPS_HFLAG_BR:
9141             /* unconditional branch to register */
9142             MIPS_DEBUG("branch to register");
9143             if (env->insn_flags & (ASE_MIPS16 | ASE_MICROMIPS)) {
9144                 TCGv t0 = tcg_temp_new();
9145                 TCGv_i32 t1 = tcg_temp_new_i32();
9146
9147                 tcg_gen_andi_tl(t0, btarget, 0x1);
9148                 tcg_gen_trunc_tl_i32(t1, t0);
9149                 tcg_temp_free(t0);
9150                 tcg_gen_andi_i32(hflags, hflags, ~(uint32_t)MIPS_HFLAG_M16);
9151                 tcg_gen_shli_i32(t1, t1, MIPS_HFLAG_M16_SHIFT);
9152                 tcg_gen_or_i32(hflags, hflags, t1);
9153                 tcg_temp_free_i32(t1);
9154
9155                 tcg_gen_andi_tl(cpu_PC, btarget, ~(target_ulong)0x1);
9156             } else {
9157                 tcg_gen_mov_tl(cpu_PC, btarget);
9158             }
9159             if (ctx->singlestep_enabled) {
9160                 save_cpu_state(ctx, 0);
9161                 gen_helper_0e0i(raise_exception, EXCP_DEBUG);
9162             }
9163             tcg_gen_exit_tb(0);
9164             break;
9165         default:
9166             MIPS_DEBUG("unknown branch");
9167             break;
9168         }
9169     }
9170 }
9171
9172 /* ISA extensions (ASEs) */
9173 /* MIPS16 extension to MIPS32 */
9174
9175 /* MIPS16 major opcodes */
9176 enum {
9177   M16_OPC_ADDIUSP = 0x00,
9178   M16_OPC_ADDIUPC = 0x01,
9179   M16_OPC_B = 0x02,
9180   M16_OPC_JAL = 0x03,
9181   M16_OPC_BEQZ = 0x04,
9182   M16_OPC_BNEQZ = 0x05,
9183   M16_OPC_SHIFT = 0x06,
9184   M16_OPC_LD = 0x07,
9185   M16_OPC_RRIA = 0x08,
9186   M16_OPC_ADDIU8 = 0x09,
9187   M16_OPC_SLTI = 0x0a,
9188   M16_OPC_SLTIU = 0x0b,
9189   M16_OPC_I8 = 0x0c,
9190   M16_OPC_LI = 0x0d,
9191   M16_OPC_CMPI = 0x0e,
9192   M16_OPC_SD = 0x0f,
9193   M16_OPC_LB = 0x10,
9194   M16_OPC_LH = 0x11,
9195   M16_OPC_LWSP = 0x12,
9196   M16_OPC_LW = 0x13,
9197   M16_OPC_LBU = 0x14,
9198   M16_OPC_LHU = 0x15,
9199   M16_OPC_LWPC = 0x16,
9200   M16_OPC_LWU = 0x17,
9201   M16_OPC_SB = 0x18,
9202   M16_OPC_SH = 0x19,
9203   M16_OPC_SWSP = 0x1a,
9204   M16_OPC_SW = 0x1b,
9205   M16_OPC_RRR = 0x1c,
9206   M16_OPC_RR = 0x1d,
9207   M16_OPC_EXTEND = 0x1e,
9208   M16_OPC_I64 = 0x1f
9209 };
9210
9211 /* I8 funct field */
9212 enum {
9213   I8_BTEQZ = 0x0,
9214   I8_BTNEZ = 0x1,
9215   I8_SWRASP = 0x2,
9216   I8_ADJSP = 0x3,
9217   I8_SVRS = 0x4,
9218   I8_MOV32R = 0x5,
9219   I8_MOVR32 = 0x7
9220 };
9221
9222 /* RRR f field */
9223 enum {
9224   RRR_DADDU = 0x0,
9225   RRR_ADDU = 0x1,
9226   RRR_DSUBU = 0x2,
9227   RRR_SUBU = 0x3
9228 };
9229
9230 /* RR funct field */
9231 enum {
9232   RR_JR = 0x00,
9233   RR_SDBBP = 0x01,
9234   RR_SLT = 0x02,
9235   RR_SLTU = 0x03,
9236   RR_SLLV = 0x04,
9237   RR_BREAK = 0x05,
9238   RR_SRLV = 0x06,
9239   RR_SRAV = 0x07,
9240   RR_DSRL = 0x08,
9241   RR_CMP = 0x0a,
9242   RR_NEG = 0x0b,
9243   RR_AND = 0x0c,
9244   RR_OR = 0x0d,
9245   RR_XOR = 0x0e,
9246   RR_NOT = 0x0f,
9247   RR_MFHI = 0x10,
9248   RR_CNVT = 0x11,
9249   RR_MFLO = 0x12,
9250   RR_DSRA = 0x13,
9251   RR_DSLLV = 0x14,
9252   RR_DSRLV = 0x16,
9253   RR_DSRAV = 0x17,
9254   RR_MULT = 0x18,
9255   RR_MULTU = 0x19,
9256   RR_DIV = 0x1a,
9257   RR_DIVU = 0x1b,
9258   RR_DMULT = 0x1c,
9259   RR_DMULTU = 0x1d,
9260   RR_DDIV = 0x1e,
9261   RR_DDIVU = 0x1f
9262 };
9263
9264 /* I64 funct field */
9265 enum {
9266   I64_LDSP = 0x0,
9267   I64_SDSP = 0x1,
9268   I64_SDRASP = 0x2,
9269   I64_DADJSP = 0x3,
9270   I64_LDPC = 0x4,
9271   I64_DADDIU5 = 0x5,
9272   I64_DADDIUPC = 0x6,
9273   I64_DADDIUSP = 0x7
9274 };
9275
9276 /* RR ry field for CNVT */
9277 enum {
9278   RR_RY_CNVT_ZEB = 0x0,
9279   RR_RY_CNVT_ZEH = 0x1,
9280   RR_RY_CNVT_ZEW = 0x2,
9281   RR_RY_CNVT_SEB = 0x4,
9282   RR_RY_CNVT_SEH = 0x5,
9283   RR_RY_CNVT_SEW = 0x6,
9284 };
9285
9286 static int xlat (int r)
9287 {
9288   static int map[] = { 16, 17, 2, 3, 4, 5, 6, 7 };
9289
9290   return map[r];
9291 }
9292
9293 static void gen_mips16_save (DisasContext *ctx,
9294                              int xsregs, int aregs,
9295                              int do_ra, int do_s0, int do_s1,
9296                              int framesize)
9297 {
9298     TCGv t0 = tcg_temp_new();
9299     TCGv t1 = tcg_temp_new();
9300     int args, astatic;
9301
9302     switch (aregs) {
9303     case 0:
9304     case 1:
9305     case 2:
9306     case 3:
9307     case 11:
9308         args = 0;
9309         break;
9310     case 4:
9311     case 5:
9312     case 6:
9313     case 7:
9314         args = 1;
9315         break;
9316     case 8:
9317     case 9:
9318     case 10:
9319         args = 2;
9320         break;
9321     case 12:
9322     case 13:
9323         args = 3;
9324         break;
9325     case 14:
9326         args = 4;
9327         break;
9328     default:
9329         generate_exception(ctx, EXCP_RI);
9330         return;
9331     }
9332
9333     switch (args) {
9334     case 4:
9335         gen_base_offset_addr(ctx, t0, 29, 12);
9336         gen_load_gpr(t1, 7);
9337         op_st_sw(t1, t0, ctx);
9338         /* Fall through */
9339     case 3:
9340         gen_base_offset_addr(ctx, t0, 29, 8);
9341         gen_load_gpr(t1, 6);
9342         op_st_sw(t1, t0, ctx);
9343         /* Fall through */
9344     case 2:
9345         gen_base_offset_addr(ctx, t0, 29, 4);
9346         gen_load_gpr(t1, 5);
9347         op_st_sw(t1, t0, ctx);
9348         /* Fall through */
9349     case 1:
9350         gen_base_offset_addr(ctx, t0, 29, 0);
9351         gen_load_gpr(t1, 4);
9352         op_st_sw(t1, t0, ctx);
9353     }
9354
9355     gen_load_gpr(t0, 29);
9356
9357 #define DECR_AND_STORE(reg) do {                \
9358         tcg_gen_subi_tl(t0, t0, 4);             \
9359         gen_load_gpr(t1, reg);                  \
9360         op_st_sw(t1, t0, ctx);                  \
9361     } while (0)
9362
9363     if (do_ra) {
9364         DECR_AND_STORE(31);
9365     }
9366
9367     switch (xsregs) {
9368     case 7:
9369         DECR_AND_STORE(30);
9370         /* Fall through */
9371     case 6:
9372         DECR_AND_STORE(23);
9373         /* Fall through */
9374     case 5:
9375         DECR_AND_STORE(22);
9376         /* Fall through */
9377     case 4:
9378         DECR_AND_STORE(21);
9379         /* Fall through */
9380     case 3:
9381         DECR_AND_STORE(20);
9382         /* Fall through */
9383     case 2:
9384         DECR_AND_STORE(19);
9385         /* Fall through */
9386     case 1:
9387         DECR_AND_STORE(18);
9388     }
9389
9390     if (do_s1) {
9391         DECR_AND_STORE(17);
9392     }
9393     if (do_s0) {
9394         DECR_AND_STORE(16);
9395     }
9396
9397     switch (aregs) {
9398     case 0:
9399     case 4:
9400     case 8:
9401     case 12:
9402     case 14:
9403         astatic = 0;
9404         break;
9405     case 1:
9406     case 5:
9407     case 9:
9408     case 13:
9409         astatic = 1;
9410         break;
9411     case 2:
9412     case 6:
9413     case 10:
9414         astatic = 2;
9415         break;
9416     case 3:
9417     case 7:
9418         astatic = 3;
9419         break;
9420     case 11:
9421         astatic = 4;
9422         break;
9423     default:
9424         generate_exception(ctx, EXCP_RI);
9425         return;
9426     }
9427
9428     if (astatic > 0) {
9429         DECR_AND_STORE(7);
9430         if (astatic > 1) {
9431             DECR_AND_STORE(6);
9432             if (astatic > 2) {
9433                 DECR_AND_STORE(5);
9434                 if (astatic > 3) {
9435                     DECR_AND_STORE(4);
9436                 }
9437             }
9438         }
9439     }
9440 #undef DECR_AND_STORE
9441
9442     tcg_gen_subi_tl(cpu_gpr[29], cpu_gpr[29], framesize);
9443     tcg_temp_free(t0);
9444     tcg_temp_free(t1);
9445 }
9446
9447 static void gen_mips16_restore (DisasContext *ctx,
9448                                 int xsregs, int aregs,
9449                                 int do_ra, int do_s0, int do_s1,
9450                                 int framesize)
9451 {
9452     int astatic;
9453     TCGv t0 = tcg_temp_new();
9454     TCGv t1 = tcg_temp_new();
9455
9456     tcg_gen_addi_tl(t0, cpu_gpr[29], framesize);
9457
9458 #define DECR_AND_LOAD(reg) do {                 \
9459         tcg_gen_subi_tl(t0, t0, 4);             \
9460         op_ld_lw(t1, t0, ctx);                  \
9461         gen_store_gpr(t1, reg);                 \
9462     } while (0)
9463
9464     if (do_ra) {
9465         DECR_AND_LOAD(31);
9466     }
9467
9468     switch (xsregs) {
9469     case 7:
9470         DECR_AND_LOAD(30);
9471         /* Fall through */
9472     case 6:
9473         DECR_AND_LOAD(23);
9474         /* Fall through */
9475     case 5:
9476         DECR_AND_LOAD(22);
9477         /* Fall through */
9478     case 4:
9479         DECR_AND_LOAD(21);
9480         /* Fall through */
9481     case 3:
9482         DECR_AND_LOAD(20);
9483         /* Fall through */
9484     case 2:
9485         DECR_AND_LOAD(19);
9486         /* Fall through */
9487     case 1:
9488         DECR_AND_LOAD(18);
9489     }
9490
9491     if (do_s1) {
9492         DECR_AND_LOAD(17);
9493     }
9494     if (do_s0) {
9495         DECR_AND_LOAD(16);
9496     }
9497
9498     switch (aregs) {
9499     case 0:
9500     case 4:
9501     case 8:
9502     case 12:
9503     case 14:
9504         astatic = 0;
9505         break;
9506     case 1:
9507     case 5:
9508     case 9:
9509     case 13:
9510         astatic = 1;
9511         break;
9512     case 2:
9513     case 6:
9514     case 10:
9515         astatic = 2;
9516         break;
9517     case 3:
9518     case 7:
9519         astatic = 3;
9520         break;
9521     case 11:
9522         astatic = 4;
9523         break;
9524     default:
9525         generate_exception(ctx, EXCP_RI);
9526         return;
9527     }
9528
9529     if (astatic > 0) {
9530         DECR_AND_LOAD(7);
9531         if (astatic > 1) {
9532             DECR_AND_LOAD(6);
9533             if (astatic > 2) {
9534                 DECR_AND_LOAD(5);
9535                 if (astatic > 3) {
9536                     DECR_AND_LOAD(4);
9537                 }
9538             }
9539         }
9540     }
9541 #undef DECR_AND_LOAD
9542
9543     tcg_gen_addi_tl(cpu_gpr[29], cpu_gpr[29], framesize);
9544     tcg_temp_free(t0);
9545     tcg_temp_free(t1);
9546 }
9547
9548 static void gen_addiupc (DisasContext *ctx, int rx, int imm,
9549                          int is_64_bit, int extended)
9550 {
9551     TCGv t0;
9552
9553     if (extended && (ctx->hflags & MIPS_HFLAG_BMASK)) {
9554         generate_exception(ctx, EXCP_RI);
9555         return;
9556     }
9557
9558     t0 = tcg_temp_new();
9559
9560     tcg_gen_movi_tl(t0, pc_relative_pc(ctx));
9561     tcg_gen_addi_tl(cpu_gpr[rx], t0, imm);
9562     if (!is_64_bit) {
9563         tcg_gen_ext32s_tl(cpu_gpr[rx], cpu_gpr[rx]);
9564     }
9565
9566     tcg_temp_free(t0);
9567 }
9568
9569 #if defined(TARGET_MIPS64)
9570 static void decode_i64_mips16 (CPUMIPSState *env, DisasContext *ctx,
9571                                int ry, int funct, int16_t offset,
9572                                int extended)
9573 {
9574     switch (funct) {
9575     case I64_LDSP:
9576         check_mips_64(ctx);
9577         offset = extended ? offset : offset << 3;
9578         gen_ld(env, ctx, OPC_LD, ry, 29, offset);
9579         break;
9580     case I64_SDSP:
9581         check_mips_64(ctx);
9582         offset = extended ? offset : offset << 3;
9583         gen_st(ctx, OPC_SD, ry, 29, offset);
9584         break;
9585     case I64_SDRASP:
9586         check_mips_64(ctx);
9587         offset = extended ? offset : (ctx->opcode & 0xff) << 3;
9588         gen_st(ctx, OPC_SD, 31, 29, offset);
9589         break;
9590     case I64_DADJSP:
9591         check_mips_64(ctx);
9592         offset = extended ? offset : ((int8_t)ctx->opcode) << 3;
9593         gen_arith_imm(env, ctx, OPC_DADDIU, 29, 29, offset);
9594         break;
9595     case I64_LDPC:
9596         if (extended && (ctx->hflags & MIPS_HFLAG_BMASK)) {
9597             generate_exception(ctx, EXCP_RI);
9598         } else {
9599             offset = extended ? offset : offset << 3;
9600             gen_ld(env, ctx, OPC_LDPC, ry, 0, offset);
9601         }
9602         break;
9603     case I64_DADDIU5:
9604         check_mips_64(ctx);
9605         offset = extended ? offset : ((int8_t)(offset << 3)) >> 3;
9606         gen_arith_imm(env, ctx, OPC_DADDIU, ry, ry, offset);
9607         break;
9608     case I64_DADDIUPC:
9609         check_mips_64(ctx);
9610         offset = extended ? offset : offset << 2;
9611         gen_addiupc(ctx, ry, offset, 1, extended);
9612         break;
9613     case I64_DADDIUSP:
9614         check_mips_64(ctx);
9615         offset = extended ? offset : offset << 2;
9616         gen_arith_imm(env, ctx, OPC_DADDIU, ry, 29, offset);
9617         break;
9618     }
9619 }
9620 #endif
9621
9622 static int decode_extended_mips16_opc (CPUMIPSState *env, DisasContext *ctx,
9623                                        int *is_branch)
9624 {
9625     int extend = cpu_lduw_code(env, ctx->pc + 2);
9626     int op, rx, ry, funct, sa;
9627     int16_t imm, offset;
9628
9629     ctx->opcode = (ctx->opcode << 16) | extend;
9630     op = (ctx->opcode >> 11) & 0x1f;
9631     sa = (ctx->opcode >> 22) & 0x1f;
9632     funct = (ctx->opcode >> 8) & 0x7;
9633     rx = xlat((ctx->opcode >> 8) & 0x7);
9634     ry = xlat((ctx->opcode >> 5) & 0x7);
9635     offset = imm = (int16_t) (((ctx->opcode >> 16) & 0x1f) << 11
9636                               | ((ctx->opcode >> 21) & 0x3f) << 5
9637                               | (ctx->opcode & 0x1f));
9638
9639     /* The extended opcodes cleverly reuse the opcodes from their 16-bit
9640        counterparts.  */
9641     switch (op) {
9642     case M16_OPC_ADDIUSP:
9643         gen_arith_imm(env, ctx, OPC_ADDIU, rx, 29, imm);
9644         break;
9645     case M16_OPC_ADDIUPC:
9646         gen_addiupc(ctx, rx, imm, 0, 1);
9647         break;
9648     case M16_OPC_B:
9649         gen_compute_branch(ctx, OPC_BEQ, 4, 0, 0, offset << 1);
9650         /* No delay slot, so just process as a normal instruction */
9651         break;
9652     case M16_OPC_BEQZ:
9653         gen_compute_branch(ctx, OPC_BEQ, 4, rx, 0, offset << 1);
9654         /* No delay slot, so just process as a normal instruction */
9655         break;
9656     case M16_OPC_BNEQZ:
9657         gen_compute_branch(ctx, OPC_BNE, 4, rx, 0, offset << 1);
9658         /* No delay slot, so just process as a normal instruction */
9659         break;
9660     case M16_OPC_SHIFT:
9661         switch (ctx->opcode & 0x3) {
9662         case 0x0:
9663             gen_shift_imm(env, ctx, OPC_SLL, rx, ry, sa);
9664             break;
9665         case 0x1:
9666 #if defined(TARGET_MIPS64)
9667             check_mips_64(ctx);
9668             gen_shift_imm(env, ctx, OPC_DSLL, rx, ry, sa);
9669 #else
9670             generate_exception(ctx, EXCP_RI);
9671 #endif
9672             break;
9673         case 0x2:
9674             gen_shift_imm(env, ctx, OPC_SRL, rx, ry, sa);
9675             break;
9676         case 0x3:
9677             gen_shift_imm(env, ctx, OPC_SRA, rx, ry, sa);
9678             break;
9679         }
9680         break;
9681 #if defined(TARGET_MIPS64)
9682     case M16_OPC_LD:
9683             check_mips_64(ctx);
9684         gen_ld(env, ctx, OPC_LD, ry, rx, offset);
9685         break;
9686 #endif
9687     case M16_OPC_RRIA:
9688         imm = ctx->opcode & 0xf;
9689         imm = imm | ((ctx->opcode >> 20) & 0x7f) << 4;
9690         imm = imm | ((ctx->opcode >> 16) & 0xf) << 11;
9691         imm = (int16_t) (imm << 1) >> 1;
9692         if ((ctx->opcode >> 4) & 0x1) {
9693 #if defined(TARGET_MIPS64)
9694             check_mips_64(ctx);
9695             gen_arith_imm(env, ctx, OPC_DADDIU, ry, rx, imm);
9696 #else
9697             generate_exception(ctx, EXCP_RI);
9698 #endif
9699         } else {
9700             gen_arith_imm(env, ctx, OPC_ADDIU, ry, rx, imm);
9701         }
9702         break;
9703     case M16_OPC_ADDIU8:
9704         gen_arith_imm(env, ctx, OPC_ADDIU, rx, rx, imm);
9705         break;
9706     case M16_OPC_SLTI:
9707         gen_slt_imm(env, ctx, OPC_SLTI, 24, rx, imm);
9708         break;
9709     case M16_OPC_SLTIU:
9710         gen_slt_imm(env, ctx, OPC_SLTIU, 24, rx, imm);
9711         break;
9712     case M16_OPC_I8:
9713         switch (funct) {
9714         case I8_BTEQZ:
9715             gen_compute_branch(ctx, OPC_BEQ, 4, 24, 0, offset << 1);
9716             break;
9717         case I8_BTNEZ:
9718             gen_compute_branch(ctx, OPC_BNE, 4, 24, 0, offset << 1);
9719             break;
9720         case I8_SWRASP:
9721             gen_st(ctx, OPC_SW, 31, 29, imm);
9722             break;
9723         case I8_ADJSP:
9724             gen_arith_imm(env, ctx, OPC_ADDIU, 29, 29, imm);
9725             break;
9726         case I8_SVRS:
9727             {
9728                 int xsregs = (ctx->opcode >> 24) & 0x7;
9729                 int aregs = (ctx->opcode >> 16) & 0xf;
9730                 int do_ra = (ctx->opcode >> 6) & 0x1;
9731                 int do_s0 = (ctx->opcode >> 5) & 0x1;
9732                 int do_s1 = (ctx->opcode >> 4) & 0x1;
9733                 int framesize = (((ctx->opcode >> 20) & 0xf) << 4
9734                                  | (ctx->opcode & 0xf)) << 3;
9735
9736                 if (ctx->opcode & (1 << 7)) {
9737                     gen_mips16_save(ctx, xsregs, aregs,
9738                                     do_ra, do_s0, do_s1,
9739                                     framesize);
9740                 } else {
9741                     gen_mips16_restore(ctx, xsregs, aregs,
9742                                        do_ra, do_s0, do_s1,
9743                                        framesize);
9744                 }
9745             }
9746             break;
9747         default:
9748             generate_exception(ctx, EXCP_RI);
9749             break;
9750         }
9751         break;
9752     case M16_OPC_LI:
9753         tcg_gen_movi_tl(cpu_gpr[rx], (uint16_t) imm);
9754         break;
9755     case M16_OPC_CMPI:
9756         tcg_gen_xori_tl(cpu_gpr[24], cpu_gpr[rx], (uint16_t) imm);
9757         break;
9758 #if defined(TARGET_MIPS64)
9759     case M16_OPC_SD:
9760         gen_st(ctx, OPC_SD, ry, rx, offset);
9761         break;
9762 #endif
9763     case M16_OPC_LB:
9764         gen_ld(env, ctx, OPC_LB, ry, rx, offset);
9765         break;
9766     case M16_OPC_LH:
9767         gen_ld(env, ctx, OPC_LH, ry, rx, offset);
9768         break;
9769     case M16_OPC_LWSP:
9770         gen_ld(env, ctx, OPC_LW, rx, 29, offset);
9771         break;
9772     case M16_OPC_LW:
9773         gen_ld(env, ctx, OPC_LW, ry, rx, offset);
9774         break;
9775     case M16_OPC_LBU:
9776         gen_ld(env, ctx, OPC_LBU, ry, rx, offset);
9777         break;
9778     case M16_OPC_LHU:
9779         gen_ld(env, ctx, OPC_LHU, ry, rx, offset);
9780         break;
9781     case M16_OPC_LWPC:
9782         gen_ld(env, ctx, OPC_LWPC, rx, 0, offset);
9783         break;
9784 #if defined(TARGET_MIPS64)
9785     case M16_OPC_LWU:
9786         gen_ld(env, ctx, OPC_LWU, ry, rx, offset);
9787         break;
9788 #endif
9789     case M16_OPC_SB:
9790         gen_st(ctx, OPC_SB, ry, rx, offset);
9791         break;
9792     case M16_OPC_SH:
9793         gen_st(ctx, OPC_SH, ry, rx, offset);
9794         break;
9795     case M16_OPC_SWSP:
9796         gen_st(ctx, OPC_SW, rx, 29, offset);
9797         break;
9798     case M16_OPC_SW:
9799         gen_st(ctx, OPC_SW, ry, rx, offset);
9800         break;
9801 #if defined(TARGET_MIPS64)
9802     case M16_OPC_I64:
9803         decode_i64_mips16(env, ctx, ry, funct, offset, 1);
9804         break;
9805 #endif
9806     default:
9807         generate_exception(ctx, EXCP_RI);
9808         break;
9809     }
9810
9811     return 4;
9812 }
9813
9814 static int decode_mips16_opc (CPUMIPSState *env, DisasContext *ctx,
9815                               int *is_branch)
9816 {
9817     int rx, ry;
9818     int sa;
9819     int op, cnvt_op, op1, offset;
9820     int funct;
9821     int n_bytes;
9822
9823     op = (ctx->opcode >> 11) & 0x1f;
9824     sa = (ctx->opcode >> 2) & 0x7;
9825     sa = sa == 0 ? 8 : sa;
9826     rx = xlat((ctx->opcode >> 8) & 0x7);
9827     cnvt_op = (ctx->opcode >> 5) & 0x7;
9828     ry = xlat((ctx->opcode >> 5) & 0x7);
9829     op1 = offset = ctx->opcode & 0x1f;
9830
9831     n_bytes = 2;
9832
9833     switch (op) {
9834     case M16_OPC_ADDIUSP:
9835         {
9836             int16_t imm = ((uint8_t) ctx->opcode) << 2;
9837
9838             gen_arith_imm(env, ctx, OPC_ADDIU, rx, 29, imm);
9839         }
9840         break;
9841     case M16_OPC_ADDIUPC:
9842         gen_addiupc(ctx, rx, ((uint8_t) ctx->opcode) << 2, 0, 0);
9843         break;
9844     case M16_OPC_B:
9845         offset = (ctx->opcode & 0x7ff) << 1;
9846         offset = (int16_t)(offset << 4) >> 4;
9847         gen_compute_branch(ctx, OPC_BEQ, 2, 0, 0, offset);
9848         /* No delay slot, so just process as a normal instruction */
9849         break;
9850     case M16_OPC_JAL:
9851         offset = cpu_lduw_code(env, ctx->pc + 2);
9852         offset = (((ctx->opcode & 0x1f) << 21)
9853                   | ((ctx->opcode >> 5) & 0x1f) << 16
9854                   | offset) << 2;
9855         op = ((ctx->opcode >> 10) & 0x1) ? OPC_JALXS : OPC_JALS;
9856         gen_compute_branch(ctx, op, 4, rx, ry, offset);
9857         n_bytes = 4;
9858         *is_branch = 1;
9859         break;
9860     case M16_OPC_BEQZ:
9861         gen_compute_branch(ctx, OPC_BEQ, 2, rx, 0, ((int8_t)ctx->opcode) << 1);
9862         /* No delay slot, so just process as a normal instruction */
9863         break;
9864     case M16_OPC_BNEQZ:
9865         gen_compute_branch(ctx, OPC_BNE, 2, rx, 0, ((int8_t)ctx->opcode) << 1);
9866         /* No delay slot, so just process as a normal instruction */
9867         break;
9868     case M16_OPC_SHIFT:
9869         switch (ctx->opcode & 0x3) {
9870         case 0x0:
9871             gen_shift_imm(env, ctx, OPC_SLL, rx, ry, sa);
9872             break;
9873         case 0x1:
9874 #if defined(TARGET_MIPS64)
9875             check_mips_64(ctx);
9876             gen_shift_imm(env, ctx, OPC_DSLL, rx, ry, sa);
9877 #else
9878             generate_exception(ctx, EXCP_RI);
9879 #endif
9880             break;
9881         case 0x2:
9882             gen_shift_imm(env, ctx, OPC_SRL, rx, ry, sa);
9883             break;
9884         case 0x3:
9885             gen_shift_imm(env, ctx, OPC_SRA, rx, ry, sa);
9886             break;
9887         }
9888         break;
9889 #if defined(TARGET_MIPS64)
9890     case M16_OPC_LD:
9891         check_mips_64(ctx);
9892         gen_ld(env, ctx, OPC_LD, ry, rx, offset << 3);
9893         break;
9894 #endif
9895     case M16_OPC_RRIA:
9896         {
9897             int16_t imm = (int8_t)((ctx->opcode & 0xf) << 4) >> 4;
9898
9899             if ((ctx->opcode >> 4) & 1) {
9900 #if defined(TARGET_MIPS64)
9901                 check_mips_64(ctx);
9902                 gen_arith_imm(env, ctx, OPC_DADDIU, ry, rx, imm);
9903 #else
9904                 generate_exception(ctx, EXCP_RI);
9905 #endif
9906             } else {
9907                 gen_arith_imm(env, ctx, OPC_ADDIU, ry, rx, imm);
9908             }
9909         }
9910         break;
9911     case M16_OPC_ADDIU8:
9912         {
9913             int16_t imm = (int8_t) ctx->opcode;
9914
9915             gen_arith_imm(env, ctx, OPC_ADDIU, rx, rx, imm);
9916         }
9917         break;
9918     case M16_OPC_SLTI:
9919         {
9920             int16_t imm = (uint8_t) ctx->opcode;
9921             gen_slt_imm(env, ctx, OPC_SLTI, 24, rx, imm);
9922         }
9923         break;
9924     case M16_OPC_SLTIU:
9925         {
9926             int16_t imm = (uint8_t) ctx->opcode;
9927             gen_slt_imm(env, ctx, OPC_SLTIU, 24, rx, imm);
9928         }
9929         break;
9930     case M16_OPC_I8:
9931         {
9932             int reg32;
9933
9934             funct = (ctx->opcode >> 8) & 0x7;
9935             switch (funct) {
9936             case I8_BTEQZ:
9937                 gen_compute_branch(ctx, OPC_BEQ, 2, 24, 0,
9938                                    ((int8_t)ctx->opcode) << 1);
9939                 break;
9940             case I8_BTNEZ:
9941                 gen_compute_branch(ctx, OPC_BNE, 2, 24, 0,
9942                                    ((int8_t)ctx->opcode) << 1);
9943                 break;
9944             case I8_SWRASP:
9945                 gen_st(ctx, OPC_SW, 31, 29, (ctx->opcode & 0xff) << 2);
9946                 break;
9947             case I8_ADJSP:
9948                 gen_arith_imm(env, ctx, OPC_ADDIU, 29, 29,
9949                               ((int8_t)ctx->opcode) << 3);
9950                 break;
9951             case I8_SVRS:
9952                 {
9953                     int do_ra = ctx->opcode & (1 << 6);
9954                     int do_s0 = ctx->opcode & (1 << 5);
9955                     int do_s1 = ctx->opcode & (1 << 4);
9956                     int framesize = ctx->opcode & 0xf;
9957
9958                     if (framesize == 0) {
9959                         framesize = 128;
9960                     } else {
9961                         framesize = framesize << 3;
9962                     }
9963
9964                     if (ctx->opcode & (1 << 7)) {
9965                         gen_mips16_save(ctx, 0, 0,
9966                                         do_ra, do_s0, do_s1, framesize);
9967                     } else {
9968                         gen_mips16_restore(ctx, 0, 0,
9969                                            do_ra, do_s0, do_s1, framesize);
9970                     }
9971                 }
9972                 break;
9973             case I8_MOV32R:
9974                 {
9975                     int rz = xlat(ctx->opcode & 0x7);
9976
9977                     reg32 = (((ctx->opcode >> 3) & 0x3) << 3) |
9978                         ((ctx->opcode >> 5) & 0x7);
9979                     gen_arith(env, ctx, OPC_ADDU, reg32, rz, 0);
9980                 }
9981                 break;
9982             case I8_MOVR32:
9983                 reg32 = ctx->opcode & 0x1f;
9984                 gen_arith(env, ctx, OPC_ADDU, ry, reg32, 0);
9985                 break;
9986             default:
9987                 generate_exception(ctx, EXCP_RI);
9988                 break;
9989             }
9990         }
9991         break;
9992     case M16_OPC_LI:
9993         {
9994             int16_t imm = (uint8_t) ctx->opcode;
9995
9996             gen_arith_imm(env, ctx, OPC_ADDIU, rx, 0, imm);
9997         }
9998         break;
9999     case M16_OPC_CMPI:
10000         {
10001             int16_t imm = (uint8_t) ctx->opcode;
10002             gen_logic_imm(env, ctx, OPC_XORI, 24, rx, imm);
10003         }
10004         break;
10005 #if defined(TARGET_MIPS64)
10006     case M16_OPC_SD:
10007         check_mips_64(ctx);
10008         gen_st(ctx, OPC_SD, ry, rx, offset << 3);
10009         break;
10010 #endif
10011     case M16_OPC_LB:
10012         gen_ld(env, ctx, OPC_LB, ry, rx, offset);
10013         break;
10014     case M16_OPC_LH:
10015         gen_ld(env, ctx, OPC_LH, ry, rx, offset << 1);
10016         break;
10017     case M16_OPC_LWSP:
10018         gen_ld(env, ctx, OPC_LW, rx, 29, ((uint8_t)ctx->opcode) << 2);
10019         break;
10020     case M16_OPC_LW:
10021         gen_ld(env, ctx, OPC_LW, ry, rx, offset << 2);
10022         break;
10023     case M16_OPC_LBU:
10024         gen_ld(env, ctx, OPC_LBU, ry, rx, offset);
10025         break;
10026     case M16_OPC_LHU:
10027         gen_ld(env, ctx, OPC_LHU, ry, rx, offset << 1);
10028         break;
10029     case M16_OPC_LWPC:
10030         gen_ld(env, ctx, OPC_LWPC, rx, 0, ((uint8_t)ctx->opcode) << 2);
10031         break;
10032 #if defined (TARGET_MIPS64)
10033     case M16_OPC_LWU:
10034         check_mips_64(ctx);
10035         gen_ld(env, ctx, OPC_LWU, ry, rx, offset << 2);
10036         break;
10037 #endif
10038     case M16_OPC_SB:
10039         gen_st(ctx, OPC_SB, ry, rx, offset);
10040         break;
10041     case M16_OPC_SH:
10042         gen_st(ctx, OPC_SH, ry, rx, offset << 1);
10043         break;
10044     case M16_OPC_SWSP:
10045         gen_st(ctx, OPC_SW, rx, 29, ((uint8_t)ctx->opcode) << 2);
10046         break;
10047     case M16_OPC_SW:
10048         gen_st(ctx, OPC_SW, ry, rx, offset << 2);
10049         break;
10050     case M16_OPC_RRR:
10051         {
10052             int rz = xlat((ctx->opcode >> 2) & 0x7);
10053             int mips32_op;
10054
10055             switch (ctx->opcode & 0x3) {
10056             case RRR_ADDU:
10057                 mips32_op = OPC_ADDU;
10058                 break;
10059             case RRR_SUBU:
10060                 mips32_op = OPC_SUBU;
10061                 break;
10062 #if defined(TARGET_MIPS64)
10063             case RRR_DADDU:
10064                 mips32_op = OPC_DADDU;
10065                 check_mips_64(ctx);
10066                 break;
10067             case RRR_DSUBU:
10068                 mips32_op = OPC_DSUBU;
10069                 check_mips_64(ctx);
10070                 break;
10071 #endif
10072             default:
10073                 generate_exception(ctx, EXCP_RI);
10074                 goto done;
10075             }
10076
10077             gen_arith(env, ctx, mips32_op, rz, rx, ry);
10078         done:
10079             ;
10080         }
10081         break;
10082     case M16_OPC_RR:
10083         switch (op1) {
10084         case RR_JR:
10085             {
10086                 int nd = (ctx->opcode >> 7) & 0x1;
10087                 int link = (ctx->opcode >> 6) & 0x1;
10088                 int ra = (ctx->opcode >> 5) & 0x1;
10089
10090                 if (link) {
10091                     op = nd ? OPC_JALRC : OPC_JALRS;
10092                 } else {
10093                     op = OPC_JR;
10094                 }
10095
10096                 gen_compute_branch(ctx, op, 2, ra ? 31 : rx, 31, 0);
10097                 if (!nd) {
10098                     *is_branch = 1;
10099                 }
10100             }
10101             break;
10102         case RR_SDBBP:
10103             /* XXX: not clear which exception should be raised
10104              *      when in debug mode...
10105              */
10106             check_insn(env, ctx, ISA_MIPS32);
10107             if (!(ctx->hflags & MIPS_HFLAG_DM)) {
10108                 generate_exception(ctx, EXCP_DBp);
10109             } else {
10110                 generate_exception(ctx, EXCP_DBp);
10111             }
10112             break;
10113         case RR_SLT:
10114             gen_slt(env, ctx, OPC_SLT, 24, rx, ry);
10115             break;
10116         case RR_SLTU:
10117             gen_slt(env, ctx, OPC_SLTU, 24, rx, ry);
10118             break;
10119         case RR_BREAK:
10120             generate_exception(ctx, EXCP_BREAK);
10121             break;
10122         case RR_SLLV:
10123             gen_shift(env, ctx, OPC_SLLV, ry, rx, ry);
10124             break;
10125         case RR_SRLV:
10126             gen_shift(env, ctx, OPC_SRLV, ry, rx, ry);
10127             break;
10128         case RR_SRAV:
10129             gen_shift(env, ctx, OPC_SRAV, ry, rx, ry);
10130             break;
10131 #if defined (TARGET_MIPS64)
10132         case RR_DSRL:
10133             check_mips_64(ctx);
10134             gen_shift_imm(env, ctx, OPC_DSRL, ry, ry, sa);
10135             break;
10136 #endif
10137         case RR_CMP:
10138             gen_logic(env, ctx, OPC_XOR, 24, rx, ry);
10139             break;
10140         case RR_NEG:
10141             gen_arith(env, ctx, OPC_SUBU, rx, 0, ry);
10142             break;
10143         case RR_AND:
10144             gen_logic(env, ctx, OPC_AND, rx, rx, ry);
10145             break;
10146         case RR_OR:
10147             gen_logic(env, ctx, OPC_OR, rx, rx, ry);
10148             break;
10149         case RR_XOR:
10150             gen_logic(env, ctx, OPC_XOR, rx, rx, ry);
10151             break;
10152         case RR_NOT:
10153             gen_logic(env, ctx, OPC_NOR, rx, ry, 0);
10154             break;
10155         case RR_MFHI:
10156             gen_HILO(ctx, OPC_MFHI, rx);
10157             break;
10158         case RR_CNVT:
10159             switch (cnvt_op) {
10160             case RR_RY_CNVT_ZEB:
10161                 tcg_gen_ext8u_tl(cpu_gpr[rx], cpu_gpr[rx]);
10162                 break;
10163             case RR_RY_CNVT_ZEH:
10164                 tcg_gen_ext16u_tl(cpu_gpr[rx], cpu_gpr[rx]);
10165                 break;
10166             case RR_RY_CNVT_SEB:
10167                 tcg_gen_ext8s_tl(cpu_gpr[rx], cpu_gpr[rx]);
10168                 break;
10169             case RR_RY_CNVT_SEH:
10170                 tcg_gen_ext16s_tl(cpu_gpr[rx], cpu_gpr[rx]);
10171                 break;
10172 #if defined (TARGET_MIPS64)
10173             case RR_RY_CNVT_ZEW:
10174                 check_mips_64(ctx);
10175                 tcg_gen_ext32u_tl(cpu_gpr[rx], cpu_gpr[rx]);
10176                 break;
10177             case RR_RY_CNVT_SEW:
10178                 check_mips_64(ctx);
10179                 tcg_gen_ext32s_tl(cpu_gpr[rx], cpu_gpr[rx]);
10180                 break;
10181 #endif
10182             default:
10183                 generate_exception(ctx, EXCP_RI);
10184                 break;
10185             }
10186             break;
10187         case RR_MFLO:
10188             gen_HILO(ctx, OPC_MFLO, rx);
10189             break;
10190 #if defined (TARGET_MIPS64)
10191         case RR_DSRA:
10192             check_mips_64(ctx);
10193             gen_shift_imm(env, ctx, OPC_DSRA, ry, ry, sa);
10194             break;
10195         case RR_DSLLV:
10196             check_mips_64(ctx);
10197             gen_shift(env, ctx, OPC_DSLLV, ry, rx, ry);
10198             break;
10199         case RR_DSRLV:
10200             check_mips_64(ctx);
10201             gen_shift(env, ctx, OPC_DSRLV, ry, rx, ry);
10202             break;
10203         case RR_DSRAV:
10204             check_mips_64(ctx);
10205             gen_shift(env, ctx, OPC_DSRAV, ry, rx, ry);
10206             break;
10207 #endif
10208         case RR_MULT:
10209             gen_muldiv(ctx, OPC_MULT, rx, ry);
10210             break;
10211         case RR_MULTU:
10212             gen_muldiv(ctx, OPC_MULTU, rx, ry);
10213             break;
10214         case RR_DIV:
10215             gen_muldiv(ctx, OPC_DIV, rx, ry);
10216             break;
10217         case RR_DIVU:
10218             gen_muldiv(ctx, OPC_DIVU, rx, ry);
10219             break;
10220 #if defined (TARGET_MIPS64)
10221         case RR_DMULT:
10222             check_mips_64(ctx);
10223             gen_muldiv(ctx, OPC_DMULT, rx, ry);
10224             break;
10225         case RR_DMULTU:
10226             check_mips_64(ctx);
10227             gen_muldiv(ctx, OPC_DMULTU, rx, ry);
10228             break;
10229         case RR_DDIV:
10230             check_mips_64(ctx);
10231             gen_muldiv(ctx, OPC_DDIV, rx, ry);
10232             break;
10233         case RR_DDIVU:
10234             check_mips_64(ctx);
10235             gen_muldiv(ctx, OPC_DDIVU, rx, ry);
10236             break;
10237 #endif
10238         default:
10239             generate_exception(ctx, EXCP_RI);
10240             break;
10241         }
10242         break;
10243     case M16_OPC_EXTEND:
10244         decode_extended_mips16_opc(env, ctx, is_branch);
10245         n_bytes = 4;
10246         break;
10247 #if defined(TARGET_MIPS64)
10248     case M16_OPC_I64:
10249         funct = (ctx->opcode >> 8) & 0x7;
10250         decode_i64_mips16(env, ctx, ry, funct, offset, 0);
10251         break;
10252 #endif
10253     default:
10254         generate_exception(ctx, EXCP_RI);
10255         break;
10256     }
10257
10258     return n_bytes;
10259 }
10260
10261 /* microMIPS extension to MIPS32 */
10262
10263 /* microMIPS32 major opcodes */
10264
10265 enum {
10266     POOL32A = 0x00,
10267     POOL16A = 0x01,
10268     LBU16 = 0x02,
10269     MOVE16 = 0x03,
10270     ADDI32 = 0x04,
10271     LBU32 = 0x05,
10272     SB32 = 0x06,
10273     LB32 = 0x07,
10274
10275     POOL32B = 0x08,
10276     POOL16B = 0x09,
10277     LHU16 = 0x0a,
10278     ANDI16 = 0x0b,
10279     ADDIU32 = 0x0c,
10280     LHU32 = 0x0d,
10281     SH32 = 0x0e,
10282     LH32 = 0x0f,
10283
10284     POOL32I = 0x10,
10285     POOL16C = 0x11,
10286     LWSP16 = 0x12,
10287     POOL16D = 0x13,
10288     ORI32 = 0x14,
10289     POOL32F = 0x15,
10290     POOL32S = 0x16,
10291     DADDIU32 = 0x17,
10292
10293     POOL32C = 0x18,
10294     LWGP16 = 0x19,
10295     LW16 = 0x1a,
10296     POOL16E = 0x1b,
10297     XORI32 = 0x1c,
10298     JALS32 = 0x1d,
10299     ADDIUPC = 0x1e,
10300     POOL48A = 0x1f,
10301
10302     /* 0x20 is reserved */
10303     RES_20 = 0x20,
10304     POOL16F = 0x21,
10305     SB16 = 0x22,
10306     BEQZ16 = 0x23,
10307     SLTI32 = 0x24,
10308     BEQ32 = 0x25,
10309     SWC132 = 0x26,
10310     LWC132 = 0x27,
10311
10312     /* 0x28 and 0x29 are reserved */
10313     RES_28 = 0x28,
10314     RES_29 = 0x29,
10315     SH16 = 0x2a,
10316     BNEZ16 = 0x2b,
10317     SLTIU32 = 0x2c,
10318     BNE32 = 0x2d,
10319     SDC132 = 0x2e,
10320     LDC132 = 0x2f,
10321
10322     /* 0x30 and 0x31 are reserved */
10323     RES_30 = 0x30,
10324     RES_31 = 0x31,
10325     SWSP16 = 0x32,
10326     B16 = 0x33,
10327     ANDI32 = 0x34,
10328     J32 = 0x35,
10329     SD32 = 0x36,
10330     LD32 = 0x37,
10331
10332     /* 0x38 and 0x39 are reserved */
10333     RES_38 = 0x38,
10334     RES_39 = 0x39,
10335     SW16 = 0x3a,
10336     LI16 = 0x3b,
10337     JALX32 = 0x3c,
10338     JAL32 = 0x3d,
10339     SW32 = 0x3e,
10340     LW32 = 0x3f
10341 };
10342
10343 /* POOL32A encoding of minor opcode field */
10344
10345 enum {
10346     /* These opcodes are distinguished only by bits 9..6; those bits are
10347      * what are recorded below. */
10348     SLL32 = 0x0,
10349     SRL32 = 0x1,
10350     SRA = 0x2,
10351     ROTR = 0x3,
10352
10353     SLLV = 0x0,
10354     SRLV = 0x1,
10355     SRAV = 0x2,
10356     ROTRV = 0x3,
10357     ADD = 0x4,
10358     ADDU32 = 0x5,
10359     SUB = 0x6,
10360     SUBU32 = 0x7,
10361     MUL = 0x8,
10362     AND = 0x9,
10363     OR32 = 0xa,
10364     NOR = 0xb,
10365     XOR32 = 0xc,
10366     SLT = 0xd,
10367     SLTU = 0xe,
10368
10369     MOVN = 0x0,
10370     MOVZ = 0x1,
10371     LWXS = 0x4,
10372
10373     /* The following can be distinguished by their lower 6 bits. */
10374     INS = 0x0c,
10375     EXT = 0x2c,
10376     POOL32AXF = 0x3c
10377 };
10378
10379 /* POOL32AXF encoding of minor opcode field extension */
10380
10381 enum {
10382     /* bits 11..6 */
10383     TEQ = 0x00,
10384     TGE = 0x08,
10385     TGEU = 0x10,
10386     TLT = 0x20,
10387     TLTU = 0x28,
10388     TNE = 0x30,
10389
10390     MFC0 = 0x03,
10391     MTC0 = 0x0b,
10392
10393     /* bits 13..12 for 0x01 */
10394     MFHI_ACC = 0x0,
10395     MFLO_ACC = 0x1,
10396     MTHI_ACC = 0x2,
10397     MTLO_ACC = 0x3,
10398
10399     /* bits 13..12 for 0x2a */
10400     MADD_ACC = 0x0,
10401     MADDU_ACC = 0x1,
10402     MSUB_ACC = 0x2,
10403     MSUBU_ACC = 0x3,
10404
10405     /* bits 13..12 for 0x32 */
10406     MULT_ACC = 0x0,
10407     MULTU_ACC = 0x0,
10408
10409     /* bits 15..12 for 0x2c */
10410     SEB = 0x2,
10411     SEH = 0x3,
10412     CLO = 0x4,
10413     CLZ = 0x5,
10414     RDHWR = 0x6,
10415     WSBH = 0x7,
10416     MULT = 0x8,
10417     MULTU = 0x9,
10418     DIV = 0xa,
10419     DIVU = 0xb,
10420     MADD = 0xc,
10421     MADDU = 0xd,
10422     MSUB = 0xe,
10423     MSUBU = 0xf,
10424
10425     /* bits 15..12 for 0x34 */
10426     MFC2 = 0x4,
10427     MTC2 = 0x5,
10428     MFHC2 = 0x8,
10429     MTHC2 = 0x9,
10430     CFC2 = 0xc,
10431     CTC2 = 0xd,
10432
10433     /* bits 15..12 for 0x3c */
10434     JALR = 0x0,
10435     JR = 0x0,                   /* alias */
10436     JALR_HB = 0x1,
10437     JALRS = 0x4,
10438     JALRS_HB = 0x5,
10439
10440     /* bits 15..12 for 0x05 */
10441     RDPGPR = 0xe,
10442     WRPGPR = 0xf,
10443
10444     /* bits 15..12 for 0x0d */
10445     TLBP = 0x0,
10446     TLBR = 0x1,
10447     TLBWI = 0x2,
10448     TLBWR = 0x3,
10449     WAIT = 0x9,
10450     IRET = 0xd,
10451     DERET = 0xe,
10452     ERET = 0xf,
10453
10454     /* bits 15..12 for 0x15 */
10455     DMT = 0x0,
10456     DVPE = 0x1,
10457     EMT = 0x2,
10458     EVPE = 0x3,
10459
10460     /* bits 15..12 for 0x1d */
10461     DI = 0x4,
10462     EI = 0x5,
10463
10464     /* bits 15..12 for 0x2d */
10465     SYNC = 0x6,
10466     SYSCALL = 0x8,
10467     SDBBP = 0xd,
10468
10469     /* bits 15..12 for 0x35 */
10470     MFHI32 = 0x0,
10471     MFLO32 = 0x1,
10472     MTHI32 = 0x2,
10473     MTLO32 = 0x3,
10474 };
10475
10476 /* POOL32B encoding of minor opcode field (bits 15..12) */
10477
10478 enum {
10479     LWC2 = 0x0,
10480     LWP = 0x1,
10481     LDP = 0x4,
10482     LWM32 = 0x5,
10483     CACHE = 0x6,
10484     LDM = 0x7,
10485     SWC2 = 0x8,
10486     SWP = 0x9,
10487     SDP = 0xc,
10488     SWM32 = 0xd,
10489     SDM = 0xf
10490 };
10491
10492 /* POOL32C encoding of minor opcode field (bits 15..12) */
10493
10494 enum {
10495     LWL = 0x0,
10496     SWL = 0x8,
10497     LWR = 0x1,
10498     SWR = 0x9,
10499     PREF = 0x2,
10500     /* 0xa is reserved */
10501     LL = 0x3,
10502     SC = 0xb,
10503     LDL = 0x4,
10504     SDL = 0xc,
10505     LDR = 0x5,
10506     SDR = 0xd,
10507     /* 0x6 is reserved */
10508     LWU = 0xe,
10509     LLD = 0x7,
10510     SCD = 0xf
10511 };
10512
10513 /* POOL32F encoding of minor opcode field (bits 5..0) */
10514
10515 enum {
10516     /* These are the bit 7..6 values */
10517     ADD_FMT = 0x0,
10518     MOVN_FMT = 0x0,
10519
10520     SUB_FMT = 0x1,
10521     MOVZ_FMT = 0x1,
10522
10523     MUL_FMT = 0x2,
10524
10525     DIV_FMT = 0x3,
10526
10527     /* These are the bit 8..6 values */
10528     RSQRT2_FMT = 0x0,
10529     MOVF_FMT = 0x0,
10530
10531     LWXC1 = 0x1,
10532     MOVT_FMT = 0x1,
10533
10534     PLL_PS = 0x2,
10535     SWXC1 = 0x2,
10536
10537     PLU_PS = 0x3,
10538     LDXC1 = 0x3,
10539
10540     PUL_PS = 0x4,
10541     SDXC1 = 0x4,
10542     RECIP2_FMT = 0x4,
10543
10544     PUU_PS = 0x5,
10545     LUXC1 = 0x5,
10546
10547     CVT_PS_S = 0x6,
10548     SUXC1 = 0x6,
10549     ADDR_PS = 0x6,
10550     PREFX = 0x6,
10551
10552     MULR_PS = 0x7,
10553
10554     MADD_S = 0x01,
10555     MADD_D = 0x09,
10556     MADD_PS = 0x11,
10557     ALNV_PS = 0x19,
10558     MSUB_S = 0x21,
10559     MSUB_D = 0x29,
10560     MSUB_PS = 0x31,
10561
10562     NMADD_S = 0x02,
10563     NMADD_D = 0x0a,
10564     NMADD_PS = 0x12,
10565     NMSUB_S = 0x22,
10566     NMSUB_D = 0x2a,
10567     NMSUB_PS = 0x32,
10568
10569     POOL32FXF = 0x3b,
10570
10571     CABS_COND_FMT = 0x1c,              /* MIPS3D */
10572     C_COND_FMT = 0x3c
10573 };
10574
10575 /* POOL32Fxf encoding of minor opcode extension field */
10576
10577 enum {
10578     CVT_L = 0x04,
10579     RSQRT_FMT = 0x08,
10580     FLOOR_L = 0x0c,
10581     CVT_PW_PS = 0x1c,
10582     CVT_W = 0x24,
10583     SQRT_FMT = 0x28,
10584     FLOOR_W = 0x2c,
10585     CVT_PS_PW = 0x3c,
10586     CFC1 = 0x40,
10587     RECIP_FMT = 0x48,
10588     CEIL_L = 0x4c,
10589     CTC1 = 0x60,
10590     CEIL_W = 0x6c,
10591     MFC1 = 0x80,
10592     CVT_S_PL = 0x84,
10593     TRUNC_L = 0x8c,
10594     MTC1 = 0xa0,
10595     CVT_S_PU = 0xa4,
10596     TRUNC_W = 0xac,
10597     MFHC1 = 0xc0,
10598     ROUND_L = 0xcc,
10599     MTHC1 = 0xe0,
10600     ROUND_W = 0xec,
10601
10602     MOV_FMT = 0x01,
10603     MOVF = 0x05,
10604     ABS_FMT = 0x0d,
10605     RSQRT1_FMT = 0x1d,
10606     MOVT = 0x25,
10607     NEG_FMT = 0x2d,
10608     CVT_D = 0x4d,
10609     RECIP1_FMT = 0x5d,
10610     CVT_S = 0x6d
10611 };
10612
10613 /* POOL32I encoding of minor opcode field (bits 25..21) */
10614
10615 enum {
10616     BLTZ = 0x00,
10617     BLTZAL = 0x01,
10618     BGEZ = 0x02,
10619     BGEZAL = 0x03,
10620     BLEZ = 0x04,
10621     BNEZC = 0x05,
10622     BGTZ = 0x06,
10623     BEQZC = 0x07,
10624     TLTI = 0x08,
10625     TGEI = 0x09,
10626     TLTIU = 0x0a,
10627     TGEIU = 0x0b,
10628     TNEI = 0x0c,
10629     LUI = 0x0d,
10630     TEQI = 0x0e,
10631     SYNCI = 0x10,
10632     BLTZALS = 0x11,
10633     BGEZALS = 0x13,
10634     BC2F = 0x14,
10635     BC2T = 0x15,
10636     BPOSGE64 = 0x1a,
10637     BPOSGE32 = 0x1b,
10638     /* These overlap and are distinguished by bit16 of the instruction */
10639     BC1F = 0x1c,
10640     BC1T = 0x1d,
10641     BC1ANY2F = 0x1c,
10642     BC1ANY2T = 0x1d,
10643     BC1ANY4F = 0x1e,
10644     BC1ANY4T = 0x1f
10645 };
10646
10647 /* POOL16A encoding of minor opcode field */
10648
10649 enum {
10650     ADDU16 = 0x0,
10651     SUBU16 = 0x1
10652 };
10653
10654 /* POOL16B encoding of minor opcode field */
10655
10656 enum {
10657     SLL16 = 0x0,
10658     SRL16 = 0x1
10659 };
10660
10661 /* POOL16C encoding of minor opcode field */
10662
10663 enum {
10664     NOT16 = 0x00,
10665     XOR16 = 0x04,
10666     AND16 = 0x08,
10667     OR16 = 0x0c,
10668     LWM16 = 0x10,
10669     SWM16 = 0x14,
10670     JR16 = 0x18,
10671     JRC16 = 0x1a,
10672     JALR16 = 0x1c,
10673     JALR16S = 0x1e,
10674     MFHI16 = 0x20,
10675     MFLO16 = 0x24,
10676     BREAK16 = 0x28,
10677     SDBBP16 = 0x2c,
10678     JRADDIUSP = 0x30
10679 };
10680
10681 /* POOL16D encoding of minor opcode field */
10682
10683 enum {
10684     ADDIUS5 = 0x0,
10685     ADDIUSP = 0x1
10686 };
10687
10688 /* POOL16E encoding of minor opcode field */
10689
10690 enum {
10691     ADDIUR2 = 0x0,
10692     ADDIUR1SP = 0x1
10693 };
10694
10695 static int mmreg (int r)
10696 {
10697     static const int map[] = { 16, 17, 2, 3, 4, 5, 6, 7 };
10698
10699     return map[r];
10700 }
10701
10702 /* Used for 16-bit store instructions.  */
10703 static int mmreg2 (int r)
10704 {
10705     static const int map[] = { 0, 17, 2, 3, 4, 5, 6, 7 };
10706
10707     return map[r];
10708 }
10709
10710 #define uMIPS_RD(op) ((op >> 7) & 0x7)
10711 #define uMIPS_RS(op) ((op >> 4) & 0x7)
10712 #define uMIPS_RS2(op) uMIPS_RS(op)
10713 #define uMIPS_RS1(op) ((op >> 1) & 0x7)
10714 #define uMIPS_RD5(op) ((op >> 5) & 0x1f)
10715 #define uMIPS_RS5(op) (op & 0x1f)
10716
10717 /* Signed immediate */
10718 #define SIMM(op, start, width)                                          \
10719     ((int32_t)(((op >> start) & ((~0U) >> (32-width)))                 \
10720                << (32-width))                                           \
10721      >> (32-width))
10722 /* Zero-extended immediate */
10723 #define ZIMM(op, start, width) ((op >> start) & ((~0U) >> (32-width)))
10724
10725 static void gen_addiur1sp (CPUMIPSState *env, DisasContext *ctx)
10726 {
10727     int rd = mmreg(uMIPS_RD(ctx->opcode));
10728
10729     gen_arith_imm(env, ctx, OPC_ADDIU, rd, 29, ((ctx->opcode >> 1) & 0x3f) << 2);
10730 }
10731
10732 static void gen_addiur2 (CPUMIPSState *env, DisasContext *ctx)
10733 {
10734     static const int decoded_imm[] = { 1, 4, 8, 12, 16, 20, 24, -1 };
10735     int rd = mmreg(uMIPS_RD(ctx->opcode));
10736     int rs = mmreg(uMIPS_RS(ctx->opcode));
10737
10738     gen_arith_imm(env, ctx, OPC_ADDIU, rd, rs, decoded_imm[ZIMM(ctx->opcode, 1, 3)]);
10739 }
10740
10741 static void gen_addiusp (CPUMIPSState *env, DisasContext *ctx)
10742 {
10743     int encoded = ZIMM(ctx->opcode, 1, 9);
10744     int decoded;
10745
10746     if (encoded <= 1) {
10747         decoded = 256 + encoded;
10748     } else if (encoded <= 255) {
10749         decoded = encoded;
10750     } else if (encoded <= 509) {
10751         decoded = encoded - 512;
10752     } else {
10753         decoded = encoded - 768;
10754     }
10755
10756     gen_arith_imm(env, ctx, OPC_ADDIU, 29, 29, decoded << 2);
10757 }
10758
10759 static void gen_addius5 (CPUMIPSState *env, DisasContext *ctx)
10760 {
10761     int imm = SIMM(ctx->opcode, 1, 4);
10762     int rd = (ctx->opcode >> 5) & 0x1f;
10763
10764     gen_arith_imm(env, ctx, OPC_ADDIU, rd, rd, imm);
10765 }
10766
10767 static void gen_andi16 (CPUMIPSState *env, DisasContext *ctx)
10768 {
10769     static const int decoded_imm[] = { 128, 1, 2, 3, 4, 7, 8, 15, 16,
10770                                  31, 32, 63, 64, 255, 32768, 65535 };
10771     int rd = mmreg(uMIPS_RD(ctx->opcode));
10772     int rs = mmreg(uMIPS_RS(ctx->opcode));
10773     int encoded = ZIMM(ctx->opcode, 0, 4);
10774
10775     gen_logic_imm(env, ctx, OPC_ANDI, rd, rs, decoded_imm[encoded]);
10776 }
10777
10778 static void gen_ldst_multiple (DisasContext *ctx, uint32_t opc, int reglist,
10779                                int base, int16_t offset)
10780 {
10781     const char *opn = "ldst_multiple";
10782     TCGv t0, t1;
10783     TCGv_i32 t2;
10784
10785     if (ctx->hflags & MIPS_HFLAG_BMASK) {
10786         generate_exception(ctx, EXCP_RI);
10787         return;
10788     }
10789
10790     t0 = tcg_temp_new();
10791
10792     gen_base_offset_addr(ctx, t0, base, offset);
10793
10794     t1 = tcg_const_tl(reglist);
10795     t2 = tcg_const_i32(ctx->mem_idx);
10796
10797     save_cpu_state(ctx, 1);
10798     switch (opc) {
10799     case LWM32:
10800         gen_helper_lwm(cpu_env, t0, t1, t2);
10801         opn = "lwm";
10802         break;
10803     case SWM32:
10804         gen_helper_swm(cpu_env, t0, t1, t2);
10805         opn = "swm";
10806         break;
10807 #ifdef TARGET_MIPS64
10808     case LDM:
10809         gen_helper_ldm(cpu_env, t0, t1, t2);
10810         opn = "ldm";
10811         break;
10812     case SDM:
10813         gen_helper_sdm(cpu_env, t0, t1, t2);
10814         opn = "sdm";
10815         break;
10816 #endif
10817     }
10818     (void)opn;
10819     MIPS_DEBUG("%s, %x, %d(%s)", opn, reglist, offset, regnames[base]);
10820     tcg_temp_free(t0);
10821     tcg_temp_free(t1);
10822     tcg_temp_free_i32(t2);
10823 }
10824
10825
10826 static void gen_pool16c_insn (CPUMIPSState *env, DisasContext *ctx, int *is_branch)
10827 {
10828     int rd = mmreg((ctx->opcode >> 3) & 0x7);
10829     int rs = mmreg(ctx->opcode & 0x7);
10830     int opc;
10831
10832     switch (((ctx->opcode) >> 4) & 0x3f) {
10833     case NOT16 + 0:
10834     case NOT16 + 1:
10835     case NOT16 + 2:
10836     case NOT16 + 3:
10837         gen_logic(env, ctx, OPC_NOR, rd, rs, 0);
10838         break;
10839     case XOR16 + 0:
10840     case XOR16 + 1:
10841     case XOR16 + 2:
10842     case XOR16 + 3:
10843         gen_logic(env, ctx, OPC_XOR, rd, rd, rs);
10844         break;
10845     case AND16 + 0:
10846     case AND16 + 1:
10847     case AND16 + 2:
10848     case AND16 + 3:
10849         gen_logic(env, ctx, OPC_AND, rd, rd, rs);
10850         break;
10851     case OR16 + 0:
10852     case OR16 + 1:
10853     case OR16 + 2:
10854     case OR16 + 3:
10855         gen_logic(env, ctx, OPC_OR, rd, rd, rs);
10856         break;
10857     case LWM16 + 0:
10858     case LWM16 + 1:
10859     case LWM16 + 2:
10860     case LWM16 + 3:
10861         {
10862             static const int lwm_convert[] = { 0x11, 0x12, 0x13, 0x14 };
10863             int offset = ZIMM(ctx->opcode, 0, 4);
10864
10865             gen_ldst_multiple(ctx, LWM32, lwm_convert[(ctx->opcode >> 4) & 0x3],
10866                               29, offset << 2);
10867         }
10868         break;
10869     case SWM16 + 0:
10870     case SWM16 + 1:
10871     case SWM16 + 2:
10872     case SWM16 + 3:
10873         {
10874             static const int swm_convert[] = { 0x11, 0x12, 0x13, 0x14 };
10875             int offset = ZIMM(ctx->opcode, 0, 4);
10876
10877             gen_ldst_multiple(ctx, SWM32, swm_convert[(ctx->opcode >> 4) & 0x3],
10878                               29, offset << 2);
10879         }
10880         break;
10881     case JR16 + 0:
10882     case JR16 + 1:
10883         {
10884             int reg = ctx->opcode & 0x1f;
10885
10886             gen_compute_branch(ctx, OPC_JR, 2, reg, 0, 0);
10887         }
10888         *is_branch = 1;
10889         break;
10890     case JRC16 + 0:
10891     case JRC16 + 1:
10892         {
10893             int reg = ctx->opcode & 0x1f;
10894
10895             gen_compute_branch(ctx, OPC_JR, 2, reg, 0, 0);
10896             /* Let normal delay slot handling in our caller take us
10897                to the branch target.  */
10898         }
10899         break;
10900     case JALR16 + 0:
10901     case JALR16 + 1:
10902         opc = OPC_JALR;
10903         goto do_jalr;
10904     case JALR16S + 0:
10905     case JALR16S + 1:
10906         opc = OPC_JALRS;
10907     do_jalr:
10908         {
10909             int reg = ctx->opcode & 0x1f;
10910
10911             gen_compute_branch(ctx, opc, 2, reg, 31, 0);
10912         }
10913         *is_branch = 1;
10914         break;
10915     case MFHI16 + 0:
10916     case MFHI16 + 1:
10917         gen_HILO(ctx, OPC_MFHI, uMIPS_RS5(ctx->opcode));
10918         break;
10919     case MFLO16 + 0:
10920     case MFLO16 + 1:
10921         gen_HILO(ctx, OPC_MFLO, uMIPS_RS5(ctx->opcode));
10922         break;
10923     case BREAK16:
10924         generate_exception(ctx, EXCP_BREAK);
10925         break;
10926     case SDBBP16:
10927         /* XXX: not clear which exception should be raised
10928          *      when in debug mode...
10929          */
10930         check_insn(env, ctx, ISA_MIPS32);
10931         if (!(ctx->hflags & MIPS_HFLAG_DM)) {
10932             generate_exception(ctx, EXCP_DBp);
10933         } else {
10934             generate_exception(ctx, EXCP_DBp);
10935         }
10936         break;
10937     case JRADDIUSP + 0:
10938     case JRADDIUSP + 1:
10939         {
10940             int imm = ZIMM(ctx->opcode, 0, 5);
10941
10942             gen_compute_branch(ctx, OPC_JR, 2, 31, 0, 0);
10943             gen_arith_imm(env, ctx, OPC_ADDIU, 29, 29, imm << 2);
10944             /* Let normal delay slot handling in our caller take us
10945                to the branch target.  */
10946         }
10947         break;
10948     default:
10949         generate_exception(ctx, EXCP_RI);
10950         break;
10951     }
10952 }
10953
10954 static void gen_ldxs (DisasContext *ctx, int base, int index, int rd)
10955 {
10956     TCGv t0 = tcg_temp_new();
10957     TCGv t1 = tcg_temp_new();
10958
10959     gen_load_gpr(t0, base);
10960
10961     if (index != 0) {
10962         gen_load_gpr(t1, index);
10963         tcg_gen_shli_tl(t1, t1, 2);
10964         gen_op_addr_add(ctx, t0, t1, t0);
10965     }
10966
10967     save_cpu_state(ctx, 0);
10968     op_ld_lw(t1, t0, ctx);
10969     gen_store_gpr(t1, rd);
10970
10971     tcg_temp_free(t0);
10972     tcg_temp_free(t1);
10973 }
10974
10975 static void gen_ldst_pair (DisasContext *ctx, uint32_t opc, int rd,
10976                            int base, int16_t offset)
10977 {
10978     const char *opn = "ldst_pair";
10979     TCGv t0, t1;
10980
10981     if (ctx->hflags & MIPS_HFLAG_BMASK || rd == 31) {
10982         generate_exception(ctx, EXCP_RI);
10983         return;
10984     }
10985
10986     t0 = tcg_temp_new();
10987     t1 = tcg_temp_new();
10988
10989     gen_base_offset_addr(ctx, t0, base, offset);
10990
10991     switch (opc) {
10992     case LWP:
10993         if (rd == base) {
10994             generate_exception(ctx, EXCP_RI);
10995             return;
10996         }
10997         save_cpu_state(ctx, 0);
10998         op_ld_lw(t1, t0, ctx);
10999         gen_store_gpr(t1, rd);
11000         tcg_gen_movi_tl(t1, 4);
11001         gen_op_addr_add(ctx, t0, t0, t1);
11002         op_ld_lw(t1, t0, ctx);
11003         gen_store_gpr(t1, rd+1);
11004         opn = "lwp";
11005         break;
11006     case SWP:
11007         save_cpu_state(ctx, 0);
11008         gen_load_gpr(t1, rd);
11009         op_st_sw(t1, t0, ctx);
11010         tcg_gen_movi_tl(t1, 4);
11011         gen_op_addr_add(ctx, t0, t0, t1);
11012         gen_load_gpr(t1, rd+1);
11013         op_st_sw(t1, t0, ctx);
11014         opn = "swp";
11015         break;
11016 #ifdef TARGET_MIPS64
11017     case LDP:
11018         if (rd == base) {
11019             generate_exception(ctx, EXCP_RI);
11020             return;
11021         }
11022         save_cpu_state(ctx, 0);
11023         op_ld_ld(t1, t0, ctx);
11024         gen_store_gpr(t1, rd);
11025         tcg_gen_movi_tl(t1, 8);
11026         gen_op_addr_add(ctx, t0, t0, t1);
11027         op_ld_ld(t1, t0, ctx);
11028         gen_store_gpr(t1, rd+1);
11029         opn = "ldp";
11030         break;
11031     case SDP:
11032         save_cpu_state(ctx, 0);
11033         gen_load_gpr(t1, rd);
11034         op_st_sd(t1, t0, ctx);
11035         tcg_gen_movi_tl(t1, 8);
11036         gen_op_addr_add(ctx, t0, t0, t1);
11037         gen_load_gpr(t1, rd+1);
11038         op_st_sd(t1, t0, ctx);
11039         opn = "sdp";
11040         break;
11041 #endif
11042     }
11043     (void)opn; /* avoid a compiler warning */
11044     MIPS_DEBUG("%s, %s, %d(%s)", opn, regnames[rd], offset, regnames[base]);
11045     tcg_temp_free(t0);
11046     tcg_temp_free(t1);
11047 }
11048
11049 static void gen_pool32axf (CPUMIPSState *env, DisasContext *ctx, int rt, int rs,
11050                            int *is_branch)
11051 {
11052     int extension = (ctx->opcode >> 6) & 0x3f;
11053     int minor = (ctx->opcode >> 12) & 0xf;
11054     uint32_t mips32_op;
11055
11056     switch (extension) {
11057     case TEQ:
11058         mips32_op = OPC_TEQ;
11059         goto do_trap;
11060     case TGE:
11061         mips32_op = OPC_TGE;
11062         goto do_trap;
11063     case TGEU:
11064         mips32_op = OPC_TGEU;
11065         goto do_trap;
11066     case TLT:
11067         mips32_op = OPC_TLT;
11068         goto do_trap;
11069     case TLTU:
11070         mips32_op = OPC_TLTU;
11071         goto do_trap;
11072     case TNE:
11073         mips32_op = OPC_TNE;
11074     do_trap:
11075         gen_trap(ctx, mips32_op, rs, rt, -1);
11076         break;
11077 #ifndef CONFIG_USER_ONLY
11078     case MFC0:
11079     case MFC0 + 32:
11080         check_cp0_enabled(ctx);
11081         if (rt == 0) {
11082             /* Treat as NOP. */
11083             break;
11084         }
11085         gen_mfc0(env, ctx, cpu_gpr[rt], rs, (ctx->opcode >> 11) & 0x7);
11086         break;
11087     case MTC0:
11088     case MTC0 + 32:
11089         check_cp0_enabled(ctx);
11090         {
11091             TCGv t0 = tcg_temp_new();
11092
11093             gen_load_gpr(t0, rt);
11094             gen_mtc0(env, ctx, t0, rs, (ctx->opcode >> 11) & 0x7);
11095             tcg_temp_free(t0);
11096         }
11097         break;
11098 #endif
11099     case 0x2c:
11100         switch (minor) {
11101         case SEB:
11102             gen_bshfl(ctx, OPC_SEB, rs, rt);
11103             break;
11104         case SEH:
11105             gen_bshfl(ctx, OPC_SEH, rs, rt);
11106             break;
11107         case CLO:
11108             mips32_op = OPC_CLO;
11109             goto do_cl;
11110         case CLZ:
11111             mips32_op = OPC_CLZ;
11112         do_cl:
11113             check_insn(env, ctx, ISA_MIPS32);
11114             gen_cl(ctx, mips32_op, rt, rs);
11115             break;
11116         case RDHWR:
11117             gen_rdhwr(env, ctx, rt, rs);
11118             break;
11119         case WSBH:
11120             gen_bshfl(ctx, OPC_WSBH, rs, rt);
11121             break;
11122         case MULT:
11123             mips32_op = OPC_MULT;
11124             goto do_muldiv;
11125         case MULTU:
11126             mips32_op = OPC_MULTU;
11127             goto do_muldiv;
11128         case DIV:
11129             mips32_op = OPC_DIV;
11130             goto do_muldiv;
11131         case DIVU:
11132             mips32_op = OPC_DIVU;
11133             goto do_muldiv;
11134         case MADD:
11135             mips32_op = OPC_MADD;
11136             goto do_muldiv;
11137         case MADDU:
11138             mips32_op = OPC_MADDU;
11139             goto do_muldiv;
11140         case MSUB:
11141             mips32_op = OPC_MSUB;
11142             goto do_muldiv;
11143         case MSUBU:
11144             mips32_op = OPC_MSUBU;
11145         do_muldiv:
11146             check_insn(env, ctx, ISA_MIPS32);
11147             gen_muldiv(ctx, mips32_op, rs, rt);
11148             break;
11149         default:
11150             goto pool32axf_invalid;
11151         }
11152         break;
11153     case 0x34:
11154         switch (minor) {
11155         case MFC2:
11156         case MTC2:
11157         case MFHC2:
11158         case MTHC2:
11159         case CFC2:
11160         case CTC2:
11161             generate_exception_err(ctx, EXCP_CpU, 2);
11162             break;
11163         default:
11164             goto pool32axf_invalid;
11165         }
11166         break;
11167     case 0x3c:
11168         switch (minor) {
11169         case JALR:
11170         case JALR_HB:
11171             gen_compute_branch (ctx, OPC_JALR, 4, rs, rt, 0);
11172             *is_branch = 1;
11173             break;
11174         case JALRS:
11175         case JALRS_HB:
11176             gen_compute_branch (ctx, OPC_JALRS, 4, rs, rt, 0);
11177             *is_branch = 1;
11178             break;
11179         default:
11180             goto pool32axf_invalid;
11181         }
11182         break;
11183     case 0x05:
11184         switch (minor) {
11185         case RDPGPR:
11186             check_cp0_enabled(ctx);
11187             check_insn(env, ctx, ISA_MIPS32R2);
11188             gen_load_srsgpr(rt, rs);
11189             break;
11190         case WRPGPR:
11191             check_cp0_enabled(ctx);
11192             check_insn(env, ctx, ISA_MIPS32R2);
11193             gen_store_srsgpr(rt, rs);
11194             break;
11195         default:
11196             goto pool32axf_invalid;
11197         }
11198         break;
11199 #ifndef CONFIG_USER_ONLY
11200     case 0x0d:
11201         switch (minor) {
11202         case TLBP:
11203             mips32_op = OPC_TLBP;
11204             goto do_cp0;
11205         case TLBR:
11206             mips32_op = OPC_TLBR;
11207             goto do_cp0;
11208         case TLBWI:
11209             mips32_op = OPC_TLBWI;
11210             goto do_cp0;
11211         case TLBWR:
11212             mips32_op = OPC_TLBWR;
11213             goto do_cp0;
11214         case WAIT:
11215             mips32_op = OPC_WAIT;
11216             goto do_cp0;
11217         case DERET:
11218             mips32_op = OPC_DERET;
11219             goto do_cp0;
11220         case ERET:
11221             mips32_op = OPC_ERET;
11222         do_cp0:
11223             gen_cp0(env, ctx, mips32_op, rt, rs);
11224             break;
11225         default:
11226             goto pool32axf_invalid;
11227         }
11228         break;
11229     case 0x1d:
11230         switch (minor) {
11231         case DI:
11232             check_cp0_enabled(ctx);
11233             {
11234                 TCGv t0 = tcg_temp_new();
11235
11236                 save_cpu_state(ctx, 1);
11237                 gen_helper_di(t0, cpu_env);
11238                 gen_store_gpr(t0, rs);
11239                 /* Stop translation as we may have switched the execution mode */
11240                 ctx->bstate = BS_STOP;
11241                 tcg_temp_free(t0);
11242             }
11243             break;
11244         case EI:
11245             check_cp0_enabled(ctx);
11246             {
11247                 TCGv t0 = tcg_temp_new();
11248
11249                 save_cpu_state(ctx, 1);
11250                 gen_helper_ei(t0, cpu_env);
11251                 gen_store_gpr(t0, rs);
11252                 /* Stop translation as we may have switched the execution mode */
11253                 ctx->bstate = BS_STOP;
11254                 tcg_temp_free(t0);
11255             }
11256             break;
11257         default:
11258             goto pool32axf_invalid;
11259         }
11260         break;
11261 #endif
11262     case 0x2d:
11263         switch (minor) {
11264         case SYNC:
11265             /* NOP */
11266             break;
11267         case SYSCALL:
11268             generate_exception(ctx, EXCP_SYSCALL);
11269             ctx->bstate = BS_STOP;
11270             break;
11271         case SDBBP:
11272             check_insn(env, ctx, ISA_MIPS32);
11273             if (!(ctx->hflags & MIPS_HFLAG_DM)) {
11274                 generate_exception(ctx, EXCP_DBp);
11275             } else {
11276                 generate_exception(ctx, EXCP_DBp);
11277             }
11278             break;
11279         default:
11280             goto pool32axf_invalid;
11281         }
11282         break;
11283     case 0x35:
11284         switch (minor) {
11285         case MFHI32:
11286             gen_HILO(ctx, OPC_MFHI, rs);
11287             break;
11288         case MFLO32:
11289             gen_HILO(ctx, OPC_MFLO, rs);
11290             break;
11291         case MTHI32:
11292             gen_HILO(ctx, OPC_MTHI, rs);
11293             break;
11294         case MTLO32:
11295             gen_HILO(ctx, OPC_MTLO, rs);
11296             break;
11297         default:
11298             goto pool32axf_invalid;
11299         }
11300         break;
11301     default:
11302     pool32axf_invalid:
11303         MIPS_INVAL("pool32axf");
11304         generate_exception(ctx, EXCP_RI);
11305         break;
11306     }
11307 }
11308
11309 /* Values for microMIPS fmt field.  Variable-width, depending on which
11310    formats the instruction supports.  */
11311
11312 enum {
11313     FMT_SD_S = 0,
11314     FMT_SD_D = 1,
11315
11316     FMT_SDPS_S = 0,
11317     FMT_SDPS_D = 1,
11318     FMT_SDPS_PS = 2,
11319
11320     FMT_SWL_S = 0,
11321     FMT_SWL_W = 1,
11322     FMT_SWL_L = 2,
11323
11324     FMT_DWL_D = 0,
11325     FMT_DWL_W = 1,
11326     FMT_DWL_L = 2
11327 };
11328
11329 static void gen_pool32fxf (CPUMIPSState *env, DisasContext *ctx, int rt, int rs)
11330 {
11331     int extension = (ctx->opcode >> 6) & 0x3ff;
11332     uint32_t mips32_op;
11333
11334 #define FLOAT_1BIT_FMT(opc, fmt) (fmt << 8) | opc
11335 #define FLOAT_2BIT_FMT(opc, fmt) (fmt << 7) | opc
11336 #define COND_FLOAT_MOV(opc, cond) (cond << 7) | opc
11337
11338     switch (extension) {
11339     case FLOAT_1BIT_FMT(CFC1, 0):
11340         mips32_op = OPC_CFC1;
11341         goto do_cp1;
11342     case FLOAT_1BIT_FMT(CTC1, 0):
11343         mips32_op = OPC_CTC1;
11344         goto do_cp1;
11345     case FLOAT_1BIT_FMT(MFC1, 0):
11346         mips32_op = OPC_MFC1;
11347         goto do_cp1;
11348     case FLOAT_1BIT_FMT(MTC1, 0):
11349         mips32_op = OPC_MTC1;
11350         goto do_cp1;
11351     case FLOAT_1BIT_FMT(MFHC1, 0):
11352         mips32_op = OPC_MFHC1;
11353         goto do_cp1;
11354     case FLOAT_1BIT_FMT(MTHC1, 0):
11355         mips32_op = OPC_MTHC1;
11356     do_cp1:
11357         gen_cp1(ctx, mips32_op, rt, rs);
11358         break;
11359
11360         /* Reciprocal square root */
11361     case FLOAT_1BIT_FMT(RSQRT_FMT, FMT_SD_S):
11362         mips32_op = OPC_RSQRT_S;
11363         goto do_unaryfp;
11364     case FLOAT_1BIT_FMT(RSQRT_FMT, FMT_SD_D):
11365         mips32_op = OPC_RSQRT_D;
11366         goto do_unaryfp;
11367
11368         /* Square root */
11369     case FLOAT_1BIT_FMT(SQRT_FMT, FMT_SD_S):
11370         mips32_op = OPC_SQRT_S;
11371         goto do_unaryfp;
11372     case FLOAT_1BIT_FMT(SQRT_FMT, FMT_SD_D):
11373         mips32_op = OPC_SQRT_D;
11374         goto do_unaryfp;
11375
11376         /* Reciprocal */
11377     case FLOAT_1BIT_FMT(RECIP_FMT, FMT_SD_S):
11378         mips32_op = OPC_RECIP_S;
11379         goto do_unaryfp;
11380     case FLOAT_1BIT_FMT(RECIP_FMT, FMT_SD_D):
11381         mips32_op = OPC_RECIP_D;
11382         goto do_unaryfp;
11383
11384         /* Floor */
11385     case FLOAT_1BIT_FMT(FLOOR_L, FMT_SD_S):
11386         mips32_op = OPC_FLOOR_L_S;
11387         goto do_unaryfp;
11388     case FLOAT_1BIT_FMT(FLOOR_L, FMT_SD_D):
11389         mips32_op = OPC_FLOOR_L_D;
11390         goto do_unaryfp;
11391     case FLOAT_1BIT_FMT(FLOOR_W, FMT_SD_S):
11392         mips32_op = OPC_FLOOR_W_S;
11393         goto do_unaryfp;
11394     case FLOAT_1BIT_FMT(FLOOR_W, FMT_SD_D):
11395         mips32_op = OPC_FLOOR_W_D;
11396         goto do_unaryfp;
11397
11398         /* Ceiling */
11399     case FLOAT_1BIT_FMT(CEIL_L, FMT_SD_S):
11400         mips32_op = OPC_CEIL_L_S;
11401         goto do_unaryfp;
11402     case FLOAT_1BIT_FMT(CEIL_L, FMT_SD_D):
11403         mips32_op = OPC_CEIL_L_D;
11404         goto do_unaryfp;
11405     case FLOAT_1BIT_FMT(CEIL_W, FMT_SD_S):
11406         mips32_op = OPC_CEIL_W_S;
11407         goto do_unaryfp;
11408     case FLOAT_1BIT_FMT(CEIL_W, FMT_SD_D):
11409         mips32_op = OPC_CEIL_W_D;
11410         goto do_unaryfp;
11411
11412         /* Truncation */
11413     case FLOAT_1BIT_FMT(TRUNC_L, FMT_SD_S):
11414         mips32_op = OPC_TRUNC_L_S;
11415         goto do_unaryfp;
11416     case FLOAT_1BIT_FMT(TRUNC_L, FMT_SD_D):
11417         mips32_op = OPC_TRUNC_L_D;
11418         goto do_unaryfp;
11419     case FLOAT_1BIT_FMT(TRUNC_W, FMT_SD_S):
11420         mips32_op = OPC_TRUNC_W_S;
11421         goto do_unaryfp;
11422     case FLOAT_1BIT_FMT(TRUNC_W, FMT_SD_D):
11423         mips32_op = OPC_TRUNC_W_D;
11424         goto do_unaryfp;
11425
11426         /* Round */
11427     case FLOAT_1BIT_FMT(ROUND_L, FMT_SD_S):
11428         mips32_op = OPC_ROUND_L_S;
11429         goto do_unaryfp;
11430     case FLOAT_1BIT_FMT(ROUND_L, FMT_SD_D):
11431         mips32_op = OPC_ROUND_L_D;
11432         goto do_unaryfp;
11433     case FLOAT_1BIT_FMT(ROUND_W, FMT_SD_S):
11434         mips32_op = OPC_ROUND_W_S;
11435         goto do_unaryfp;
11436     case FLOAT_1BIT_FMT(ROUND_W, FMT_SD_D):
11437         mips32_op = OPC_ROUND_W_D;
11438         goto do_unaryfp;
11439
11440         /* Integer to floating-point conversion */
11441     case FLOAT_1BIT_FMT(CVT_L, FMT_SD_S):
11442         mips32_op = OPC_CVT_L_S;
11443         goto do_unaryfp;
11444     case FLOAT_1BIT_FMT(CVT_L, FMT_SD_D):
11445         mips32_op = OPC_CVT_L_D;
11446         goto do_unaryfp;
11447     case FLOAT_1BIT_FMT(CVT_W, FMT_SD_S):
11448         mips32_op = OPC_CVT_W_S;
11449         goto do_unaryfp;
11450     case FLOAT_1BIT_FMT(CVT_W, FMT_SD_D):
11451         mips32_op = OPC_CVT_W_D;
11452         goto do_unaryfp;
11453
11454         /* Paired-foo conversions */
11455     case FLOAT_1BIT_FMT(CVT_S_PL, 0):
11456         mips32_op = OPC_CVT_S_PL;
11457         goto do_unaryfp;
11458     case FLOAT_1BIT_FMT(CVT_S_PU, 0):
11459         mips32_op = OPC_CVT_S_PU;
11460         goto do_unaryfp;
11461     case FLOAT_1BIT_FMT(CVT_PW_PS, 0):
11462         mips32_op = OPC_CVT_PW_PS;
11463         goto do_unaryfp;
11464     case FLOAT_1BIT_FMT(CVT_PS_PW, 0):
11465         mips32_op = OPC_CVT_PS_PW;
11466         goto do_unaryfp;
11467
11468         /* Floating-point moves */
11469     case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_S):
11470         mips32_op = OPC_MOV_S;
11471         goto do_unaryfp;
11472     case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_D):
11473         mips32_op = OPC_MOV_D;
11474         goto do_unaryfp;
11475     case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_PS):
11476         mips32_op = OPC_MOV_PS;
11477         goto do_unaryfp;
11478
11479         /* Absolute value */
11480     case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_S):
11481         mips32_op = OPC_ABS_S;
11482         goto do_unaryfp;
11483     case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_D):
11484         mips32_op = OPC_ABS_D;
11485         goto do_unaryfp;
11486     case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_PS):
11487         mips32_op = OPC_ABS_PS;
11488         goto do_unaryfp;
11489
11490         /* Negation */
11491     case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_S):
11492         mips32_op = OPC_NEG_S;
11493         goto do_unaryfp;
11494     case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_D):
11495         mips32_op = OPC_NEG_D;
11496         goto do_unaryfp;
11497     case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_PS):
11498         mips32_op = OPC_NEG_PS;
11499         goto do_unaryfp;
11500
11501         /* Reciprocal square root step */
11502     case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_S):
11503         mips32_op = OPC_RSQRT1_S;
11504         goto do_unaryfp;
11505     case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_D):
11506         mips32_op = OPC_RSQRT1_D;
11507         goto do_unaryfp;
11508     case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_PS):
11509         mips32_op = OPC_RSQRT1_PS;
11510         goto do_unaryfp;
11511
11512         /* Reciprocal step */
11513     case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_S):
11514         mips32_op = OPC_RECIP1_S;
11515         goto do_unaryfp;
11516     case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_D):
11517         mips32_op = OPC_RECIP1_S;
11518         goto do_unaryfp;
11519     case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_PS):
11520         mips32_op = OPC_RECIP1_PS;
11521         goto do_unaryfp;
11522
11523         /* Conversions from double */
11524     case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_S):
11525         mips32_op = OPC_CVT_D_S;
11526         goto do_unaryfp;
11527     case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_W):
11528         mips32_op = OPC_CVT_D_W;
11529         goto do_unaryfp;
11530     case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_L):
11531         mips32_op = OPC_CVT_D_L;
11532         goto do_unaryfp;
11533
11534         /* Conversions from single */
11535     case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_D):
11536         mips32_op = OPC_CVT_S_D;
11537         goto do_unaryfp;
11538     case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_W):
11539         mips32_op = OPC_CVT_S_W;
11540         goto do_unaryfp;
11541     case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_L):
11542         mips32_op = OPC_CVT_S_L;
11543     do_unaryfp:
11544         gen_farith(ctx, mips32_op, -1, rs, rt, 0);
11545         break;
11546
11547         /* Conditional moves on floating-point codes */
11548     case COND_FLOAT_MOV(MOVT, 0):
11549     case COND_FLOAT_MOV(MOVT, 1):
11550     case COND_FLOAT_MOV(MOVT, 2):
11551     case COND_FLOAT_MOV(MOVT, 3):
11552     case COND_FLOAT_MOV(MOVT, 4):
11553     case COND_FLOAT_MOV(MOVT, 5):
11554     case COND_FLOAT_MOV(MOVT, 6):
11555     case COND_FLOAT_MOV(MOVT, 7):
11556         gen_movci(ctx, rt, rs, (ctx->opcode >> 13) & 0x7, 1);
11557         break;
11558     case COND_FLOAT_MOV(MOVF, 0):
11559     case COND_FLOAT_MOV(MOVF, 1):
11560     case COND_FLOAT_MOV(MOVF, 2):
11561     case COND_FLOAT_MOV(MOVF, 3):
11562     case COND_FLOAT_MOV(MOVF, 4):
11563     case COND_FLOAT_MOV(MOVF, 5):
11564     case COND_FLOAT_MOV(MOVF, 6):
11565     case COND_FLOAT_MOV(MOVF, 7):
11566         gen_movci(ctx, rt, rs, (ctx->opcode >> 13) & 0x7, 0);
11567         break;
11568     default:
11569         MIPS_INVAL("pool32fxf");
11570         generate_exception(ctx, EXCP_RI);
11571         break;
11572     }
11573 }
11574
11575 static void decode_micromips32_opc (CPUMIPSState *env, DisasContext *ctx,
11576                                     uint16_t insn_hw1, int *is_branch)
11577 {
11578     int32_t offset;
11579     uint16_t insn;
11580     int rt, rs, rd, rr;
11581     int16_t imm;
11582     uint32_t op, minor, mips32_op;
11583     uint32_t cond, fmt, cc;
11584
11585     insn = cpu_lduw_code(env, ctx->pc + 2);
11586     ctx->opcode = (ctx->opcode << 16) | insn;
11587
11588     rt = (ctx->opcode >> 21) & 0x1f;
11589     rs = (ctx->opcode >> 16) & 0x1f;
11590     rd = (ctx->opcode >> 11) & 0x1f;
11591     rr = (ctx->opcode >> 6) & 0x1f;
11592     imm = (int16_t) ctx->opcode;
11593
11594     op = (ctx->opcode >> 26) & 0x3f;
11595     switch (op) {
11596     case POOL32A:
11597         minor = ctx->opcode & 0x3f;
11598         switch (minor) {
11599         case 0x00:
11600             minor = (ctx->opcode >> 6) & 0xf;
11601             switch (minor) {
11602             case SLL32:
11603                 mips32_op = OPC_SLL;
11604                 goto do_shifti;
11605             case SRA:
11606                 mips32_op = OPC_SRA;
11607                 goto do_shifti;
11608             case SRL32:
11609                 mips32_op = OPC_SRL;
11610                 goto do_shifti;
11611             case ROTR:
11612                 mips32_op = OPC_ROTR;
11613             do_shifti:
11614                 gen_shift_imm(env, ctx, mips32_op, rt, rs, rd);
11615                 break;
11616             default:
11617                 goto pool32a_invalid;
11618             }
11619             break;
11620         case 0x10:
11621             minor = (ctx->opcode >> 6) & 0xf;
11622             switch (minor) {
11623                 /* Arithmetic */
11624             case ADD:
11625                 mips32_op = OPC_ADD;
11626                 goto do_arith;
11627             case ADDU32:
11628                 mips32_op = OPC_ADDU;
11629                 goto do_arith;
11630             case SUB:
11631                 mips32_op = OPC_SUB;
11632                 goto do_arith;
11633             case SUBU32:
11634                 mips32_op = OPC_SUBU;
11635                 goto do_arith;
11636             case MUL:
11637                 mips32_op = OPC_MUL;
11638             do_arith:
11639                 gen_arith(env, ctx, mips32_op, rd, rs, rt);
11640                 break;
11641                 /* Shifts */
11642             case SLLV:
11643                 mips32_op = OPC_SLLV;
11644                 goto do_shift;
11645             case SRLV:
11646                 mips32_op = OPC_SRLV;
11647                 goto do_shift;
11648             case SRAV:
11649                 mips32_op = OPC_SRAV;
11650                 goto do_shift;
11651             case ROTRV:
11652                 mips32_op = OPC_ROTRV;
11653             do_shift:
11654                 gen_shift(env, ctx, mips32_op, rd, rs, rt);
11655                 break;
11656                 /* Logical operations */
11657             case AND:
11658                 mips32_op = OPC_AND;
11659                 goto do_logic;
11660             case OR32:
11661                 mips32_op = OPC_OR;
11662                 goto do_logic;
11663             case NOR:
11664                 mips32_op = OPC_NOR;
11665                 goto do_logic;
11666             case XOR32:
11667                 mips32_op = OPC_XOR;
11668             do_logic:
11669                 gen_logic(env, ctx, mips32_op, rd, rs, rt);
11670                 break;
11671                 /* Set less than */
11672             case SLT:
11673                 mips32_op = OPC_SLT;
11674                 goto do_slt;
11675             case SLTU:
11676                 mips32_op = OPC_SLTU;
11677             do_slt:
11678                 gen_slt(env, ctx, mips32_op, rd, rs, rt);
11679                 break;
11680             default:
11681                 goto pool32a_invalid;
11682             }
11683             break;
11684         case 0x18:
11685             minor = (ctx->opcode >> 6) & 0xf;
11686             switch (minor) {
11687                 /* Conditional moves */
11688             case MOVN:
11689                 mips32_op = OPC_MOVN;
11690                 goto do_cmov;
11691             case MOVZ:
11692                 mips32_op = OPC_MOVZ;
11693             do_cmov:
11694                 gen_cond_move(env, ctx, mips32_op, rd, rs, rt);
11695                 break;
11696             case LWXS:
11697                 gen_ldxs(ctx, rs, rt, rd);
11698                 break;
11699             default:
11700                 goto pool32a_invalid;
11701             }
11702             break;
11703         case INS:
11704             gen_bitops(ctx, OPC_INS, rt, rs, rr, rd);
11705             return;
11706         case EXT:
11707             gen_bitops(ctx, OPC_EXT, rt, rs, rr, rd);
11708             return;
11709         case POOL32AXF:
11710             gen_pool32axf(env, ctx, rt, rs, is_branch);
11711             break;
11712         case 0x07:
11713             generate_exception(ctx, EXCP_BREAK);
11714             break;
11715         default:
11716         pool32a_invalid:
11717                 MIPS_INVAL("pool32a");
11718                 generate_exception(ctx, EXCP_RI);
11719                 break;
11720         }
11721         break;
11722     case POOL32B:
11723         minor = (ctx->opcode >> 12) & 0xf;
11724         switch (minor) {
11725         case CACHE:
11726             check_cp0_enabled(ctx);
11727             /* Treat as no-op. */
11728             break;
11729         case LWC2:
11730         case SWC2:
11731             /* COP2: Not implemented. */
11732             generate_exception_err(ctx, EXCP_CpU, 2);
11733             break;
11734         case LWP:
11735         case SWP:
11736 #ifdef TARGET_MIPS64
11737         case LDP:
11738         case SDP:
11739 #endif
11740             gen_ldst_pair(ctx, minor, rt, rs, SIMM(ctx->opcode, 0, 12));
11741             break;
11742         case LWM32:
11743         case SWM32:
11744 #ifdef TARGET_MIPS64
11745         case LDM:
11746         case SDM:
11747 #endif
11748             gen_ldst_multiple(ctx, minor, rt, rs, SIMM(ctx->opcode, 0, 12));
11749             break;
11750         default:
11751             MIPS_INVAL("pool32b");
11752             generate_exception(ctx, EXCP_RI);
11753             break;
11754         }
11755         break;
11756     case POOL32F:
11757         if (env->CP0_Config1 & (1 << CP0C1_FP)) {
11758             minor = ctx->opcode & 0x3f;
11759             check_cp1_enabled(ctx);
11760             switch (minor) {
11761             case ALNV_PS:
11762                 mips32_op = OPC_ALNV_PS;
11763                 goto do_madd;
11764             case MADD_S:
11765                 mips32_op = OPC_MADD_S;
11766                 goto do_madd;
11767             case MADD_D:
11768                 mips32_op = OPC_MADD_D;
11769                 goto do_madd;
11770             case MADD_PS:
11771                 mips32_op = OPC_MADD_PS;
11772                 goto do_madd;
11773             case MSUB_S:
11774                 mips32_op = OPC_MSUB_S;
11775                 goto do_madd;
11776             case MSUB_D:
11777                 mips32_op = OPC_MSUB_D;
11778                 goto do_madd;
11779             case MSUB_PS:
11780                 mips32_op = OPC_MSUB_PS;
11781                 goto do_madd;
11782             case NMADD_S:
11783                 mips32_op = OPC_NMADD_S;
11784                 goto do_madd;
11785             case NMADD_D:
11786                 mips32_op = OPC_NMADD_D;
11787                 goto do_madd;
11788             case NMADD_PS:
11789                 mips32_op = OPC_NMADD_PS;
11790                 goto do_madd;
11791             case NMSUB_S:
11792                 mips32_op = OPC_NMSUB_S;
11793                 goto do_madd;
11794             case NMSUB_D:
11795                 mips32_op = OPC_NMSUB_D;
11796                 goto do_madd;
11797             case NMSUB_PS:
11798                 mips32_op = OPC_NMSUB_PS;
11799             do_madd:
11800                 gen_flt3_arith(ctx, mips32_op, rd, rr, rs, rt);
11801                 break;
11802             case CABS_COND_FMT:
11803                 cond = (ctx->opcode >> 6) & 0xf;
11804                 cc = (ctx->opcode >> 13) & 0x7;
11805                 fmt = (ctx->opcode >> 10) & 0x3;
11806                 switch (fmt) {
11807                 case 0x0:
11808                     gen_cmpabs_s(ctx, cond, rt, rs, cc);
11809                     break;
11810                 case 0x1:
11811                     gen_cmpabs_d(ctx, cond, rt, rs, cc);
11812                     break;
11813                 case 0x2:
11814                     gen_cmpabs_ps(ctx, cond, rt, rs, cc);
11815                     break;
11816                 default:
11817                     goto pool32f_invalid;
11818                 }
11819                 break;
11820             case C_COND_FMT:
11821                 cond = (ctx->opcode >> 6) & 0xf;
11822                 cc = (ctx->opcode >> 13) & 0x7;
11823                 fmt = (ctx->opcode >> 10) & 0x3;
11824                 switch (fmt) {
11825                 case 0x0:
11826                     gen_cmp_s(ctx, cond, rt, rs, cc);
11827                     break;
11828                 case 0x1:
11829                     gen_cmp_d(ctx, cond, rt, rs, cc);
11830                     break;
11831                 case 0x2:
11832                     gen_cmp_ps(ctx, cond, rt, rs, cc);
11833                     break;
11834                 default:
11835                     goto pool32f_invalid;
11836                 }
11837                 break;
11838             case POOL32FXF:
11839                 gen_pool32fxf(env, ctx, rt, rs);
11840                 break;
11841             case 0x00:
11842                 /* PLL foo */
11843                 switch ((ctx->opcode >> 6) & 0x7) {
11844                 case PLL_PS:
11845                     mips32_op = OPC_PLL_PS;
11846                     goto do_ps;
11847                 case PLU_PS:
11848                     mips32_op = OPC_PLU_PS;
11849                     goto do_ps;
11850                 case PUL_PS:
11851                     mips32_op = OPC_PUL_PS;
11852                     goto do_ps;
11853                 case PUU_PS:
11854                     mips32_op = OPC_PUU_PS;
11855                     goto do_ps;
11856                 case CVT_PS_S:
11857                     mips32_op = OPC_CVT_PS_S;
11858                 do_ps:
11859                     gen_farith(ctx, mips32_op, rt, rs, rd, 0);
11860                     break;
11861                 default:
11862                     goto pool32f_invalid;
11863                 }
11864                 break;
11865             case 0x08:
11866                 /* [LS][WDU]XC1 */
11867                 switch ((ctx->opcode >> 6) & 0x7) {
11868                 case LWXC1:
11869                     mips32_op = OPC_LWXC1;
11870                     goto do_ldst_cp1;
11871                 case SWXC1:
11872                     mips32_op = OPC_SWXC1;
11873                     goto do_ldst_cp1;
11874                 case LDXC1:
11875                     mips32_op = OPC_LDXC1;
11876                     goto do_ldst_cp1;
11877                 case SDXC1:
11878                     mips32_op = OPC_SDXC1;
11879                     goto do_ldst_cp1;
11880                 case LUXC1:
11881                     mips32_op = OPC_LUXC1;
11882                     goto do_ldst_cp1;
11883                 case SUXC1:
11884                     mips32_op = OPC_SUXC1;
11885                 do_ldst_cp1:
11886                     gen_flt3_ldst(ctx, mips32_op, rd, rd, rt, rs);
11887                     break;
11888                 default:
11889                     goto pool32f_invalid;
11890                 }
11891                 break;
11892             case 0x18:
11893                 /* 3D insns */
11894                 fmt = (ctx->opcode >> 9) & 0x3;
11895                 switch ((ctx->opcode >> 6) & 0x7) {
11896                 case RSQRT2_FMT:
11897                     switch (fmt) {
11898                     case FMT_SDPS_S:
11899                         mips32_op = OPC_RSQRT2_S;
11900                         goto do_3d;
11901                     case FMT_SDPS_D:
11902                         mips32_op = OPC_RSQRT2_D;
11903                         goto do_3d;
11904                     case FMT_SDPS_PS:
11905                         mips32_op = OPC_RSQRT2_PS;
11906                         goto do_3d;
11907                     default:
11908                         goto pool32f_invalid;
11909                     }
11910                     break;
11911                 case RECIP2_FMT:
11912                     switch (fmt) {
11913                     case FMT_SDPS_S:
11914                         mips32_op = OPC_RECIP2_S;
11915                         goto do_3d;
11916                     case FMT_SDPS_D:
11917                         mips32_op = OPC_RECIP2_D;
11918                         goto do_3d;
11919                     case FMT_SDPS_PS:
11920                         mips32_op = OPC_RECIP2_PS;
11921                         goto do_3d;
11922                     default:
11923                         goto pool32f_invalid;
11924                     }
11925                     break;
11926                 case ADDR_PS:
11927                     mips32_op = OPC_ADDR_PS;
11928                     goto do_3d;
11929                 case MULR_PS:
11930                     mips32_op = OPC_MULR_PS;
11931                 do_3d:
11932                     gen_farith(ctx, mips32_op, rt, rs, rd, 0);
11933                     break;
11934                 default:
11935                     goto pool32f_invalid;
11936                 }
11937                 break;
11938             case 0x20:
11939                 /* MOV[FT].fmt and PREFX */
11940                 cc = (ctx->opcode >> 13) & 0x7;
11941                 fmt = (ctx->opcode >> 9) & 0x3;
11942                 switch ((ctx->opcode >> 6) & 0x7) {
11943                 case MOVF_FMT:
11944                     switch (fmt) {
11945                     case FMT_SDPS_S:
11946                         gen_movcf_s(rs, rt, cc, 0);
11947                         break;
11948                     case FMT_SDPS_D:
11949                         gen_movcf_d(ctx, rs, rt, cc, 0);
11950                         break;
11951                     case FMT_SDPS_PS:
11952                         gen_movcf_ps(rs, rt, cc, 0);
11953                         break;
11954                     default:
11955                         goto pool32f_invalid;
11956                     }
11957                     break;
11958                 case MOVT_FMT:
11959                     switch (fmt) {
11960                     case FMT_SDPS_S:
11961                         gen_movcf_s(rs, rt, cc, 1);
11962                         break;
11963                     case FMT_SDPS_D:
11964                         gen_movcf_d(ctx, rs, rt, cc, 1);
11965                         break;
11966                     case FMT_SDPS_PS:
11967                         gen_movcf_ps(rs, rt, cc, 1);
11968                         break;
11969                     default:
11970                         goto pool32f_invalid;
11971                     }
11972                     break;
11973                 case PREFX:
11974                     break;
11975                 default:
11976                     goto pool32f_invalid;
11977                 }
11978                 break;
11979 #define FINSN_3ARG_SDPS(prfx)                           \
11980                 switch ((ctx->opcode >> 8) & 0x3) {     \
11981                 case FMT_SDPS_S:                        \
11982                     mips32_op = OPC_##prfx##_S;         \
11983                     goto do_fpop;                       \
11984                 case FMT_SDPS_D:                        \
11985                     mips32_op = OPC_##prfx##_D;         \
11986                     goto do_fpop;                       \
11987                 case FMT_SDPS_PS:                       \
11988                     mips32_op = OPC_##prfx##_PS;        \
11989                     goto do_fpop;                       \
11990                 default:                                \
11991                     goto pool32f_invalid;               \
11992                 }
11993             case 0x30:
11994                 /* regular FP ops */
11995                 switch ((ctx->opcode >> 6) & 0x3) {
11996                 case ADD_FMT:
11997                     FINSN_3ARG_SDPS(ADD);
11998                     break;
11999                 case SUB_FMT:
12000                     FINSN_3ARG_SDPS(SUB);
12001                     break;
12002                 case MUL_FMT:
12003                     FINSN_3ARG_SDPS(MUL);
12004                     break;
12005                 case DIV_FMT:
12006                     fmt = (ctx->opcode >> 8) & 0x3;
12007                     if (fmt == 1) {
12008                         mips32_op = OPC_DIV_D;
12009                     } else if (fmt == 0) {
12010                         mips32_op = OPC_DIV_S;
12011                     } else {
12012                         goto pool32f_invalid;
12013                     }
12014                     goto do_fpop;
12015                 default:
12016                     goto pool32f_invalid;
12017                 }
12018                 break;
12019             case 0x38:
12020                 /* cmovs */
12021                 switch ((ctx->opcode >> 6) & 0x3) {
12022                 case MOVN_FMT:
12023                     FINSN_3ARG_SDPS(MOVN);
12024                     break;
12025                 case MOVZ_FMT:
12026                     FINSN_3ARG_SDPS(MOVZ);
12027                     break;
12028                 default:
12029                     goto pool32f_invalid;
12030                 }
12031                 break;
12032             do_fpop:
12033                 gen_farith(ctx, mips32_op, rt, rs, rd, 0);
12034                 break;
12035             default:
12036             pool32f_invalid:
12037                 MIPS_INVAL("pool32f");
12038                 generate_exception(ctx, EXCP_RI);
12039                 break;
12040             }
12041         } else {
12042             generate_exception_err(ctx, EXCP_CpU, 1);
12043         }
12044         break;
12045     case POOL32I:
12046         minor = (ctx->opcode >> 21) & 0x1f;
12047         switch (minor) {
12048         case BLTZ:
12049             mips32_op = OPC_BLTZ;
12050             goto do_branch;
12051         case BLTZAL:
12052             mips32_op = OPC_BLTZAL;
12053             goto do_branch;
12054         case BLTZALS:
12055             mips32_op = OPC_BLTZALS;
12056             goto do_branch;
12057         case BGEZ:
12058             mips32_op = OPC_BGEZ;
12059             goto do_branch;
12060         case BGEZAL:
12061             mips32_op = OPC_BGEZAL;
12062             goto do_branch;
12063         case BGEZALS:
12064             mips32_op = OPC_BGEZALS;
12065             goto do_branch;
12066         case BLEZ:
12067             mips32_op = OPC_BLEZ;
12068             goto do_branch;
12069         case BGTZ:
12070             mips32_op = OPC_BGTZ;
12071         do_branch:
12072             gen_compute_branch(ctx, mips32_op, 4, rs, -1, imm << 1);
12073             *is_branch = 1;
12074             break;
12075
12076             /* Traps */
12077         case TLTI:
12078             mips32_op = OPC_TLTI;
12079             goto do_trapi;
12080         case TGEI:
12081             mips32_op = OPC_TGEI;
12082             goto do_trapi;
12083         case TLTIU:
12084             mips32_op = OPC_TLTIU;
12085             goto do_trapi;
12086         case TGEIU:
12087             mips32_op = OPC_TGEIU;
12088             goto do_trapi;
12089         case TNEI:
12090             mips32_op = OPC_TNEI;
12091             goto do_trapi;
12092         case TEQI:
12093             mips32_op = OPC_TEQI;
12094         do_trapi:
12095             gen_trap(ctx, mips32_op, rs, -1, imm);
12096             break;
12097
12098         case BNEZC:
12099         case BEQZC:
12100             gen_compute_branch(ctx, minor == BNEZC ? OPC_BNE : OPC_BEQ,
12101                                4, rs, 0, imm << 1);
12102             /* Compact branches don't have a delay slot, so just let
12103                the normal delay slot handling take us to the branch
12104                target. */
12105             break;
12106         case LUI:
12107             gen_logic_imm(env, ctx, OPC_LUI, rs, -1, imm);
12108             break;
12109         case SYNCI:
12110             break;
12111         case BC2F:
12112         case BC2T:
12113             /* COP2: Not implemented. */
12114             generate_exception_err(ctx, EXCP_CpU, 2);
12115             break;
12116         case BC1F:
12117             mips32_op = (ctx->opcode & (1 << 16)) ? OPC_BC1FANY2 : OPC_BC1F;
12118             goto do_cp1branch;
12119         case BC1T:
12120             mips32_op = (ctx->opcode & (1 << 16)) ? OPC_BC1TANY2 : OPC_BC1T;
12121             goto do_cp1branch;
12122         case BC1ANY4F:
12123             mips32_op = OPC_BC1FANY4;
12124             goto do_cp1mips3d;
12125         case BC1ANY4T:
12126             mips32_op = OPC_BC1TANY4;
12127         do_cp1mips3d:
12128             check_cop1x(ctx);
12129             check_insn(env, ctx, ASE_MIPS3D);
12130             /* Fall through */
12131         do_cp1branch:
12132             gen_compute_branch1(env, ctx, mips32_op,
12133                                 (ctx->opcode >> 18) & 0x7, imm << 1);
12134             *is_branch = 1;
12135             break;
12136         case BPOSGE64:
12137         case BPOSGE32:
12138             /* MIPS DSP: not implemented */
12139             /* Fall through */
12140         default:
12141             MIPS_INVAL("pool32i");
12142             generate_exception(ctx, EXCP_RI);
12143             break;
12144         }
12145         break;
12146     case POOL32C:
12147         minor = (ctx->opcode >> 12) & 0xf;
12148         switch (minor) {
12149         case LWL:
12150             mips32_op = OPC_LWL;
12151             goto do_ld_lr;
12152         case SWL:
12153             mips32_op = OPC_SWL;
12154             goto do_st_lr;
12155         case LWR:
12156             mips32_op = OPC_LWR;
12157             goto do_ld_lr;
12158         case SWR:
12159             mips32_op = OPC_SWR;
12160             goto do_st_lr;
12161 #if defined(TARGET_MIPS64)
12162         case LDL:
12163             mips32_op = OPC_LDL;
12164             goto do_ld_lr;
12165         case SDL:
12166             mips32_op = OPC_SDL;
12167             goto do_st_lr;
12168         case LDR:
12169             mips32_op = OPC_LDR;
12170             goto do_ld_lr;
12171         case SDR:
12172             mips32_op = OPC_SDR;
12173             goto do_st_lr;
12174         case LWU:
12175             mips32_op = OPC_LWU;
12176             goto do_ld_lr;
12177         case LLD:
12178             mips32_op = OPC_LLD;
12179             goto do_ld_lr;
12180 #endif
12181         case LL:
12182             mips32_op = OPC_LL;
12183             goto do_ld_lr;
12184         do_ld_lr:
12185             gen_ld(env, ctx, mips32_op, rt, rs, SIMM(ctx->opcode, 0, 12));
12186             break;
12187         do_st_lr:
12188             gen_st(ctx, mips32_op, rt, rs, SIMM(ctx->opcode, 0, 12));
12189             break;
12190         case SC:
12191             gen_st_cond(ctx, OPC_SC, rt, rs, SIMM(ctx->opcode, 0, 12));
12192             break;
12193 #if defined(TARGET_MIPS64)
12194         case SCD:
12195             gen_st_cond(ctx, OPC_SCD, rt, rs, SIMM(ctx->opcode, 0, 12));
12196             break;
12197 #endif
12198         case PREF:
12199             /* Treat as no-op */
12200             break;
12201         default:
12202             MIPS_INVAL("pool32c");
12203             generate_exception(ctx, EXCP_RI);
12204             break;
12205         }
12206         break;
12207     case ADDI32:
12208         mips32_op = OPC_ADDI;
12209         goto do_addi;
12210     case ADDIU32:
12211         mips32_op = OPC_ADDIU;
12212     do_addi:
12213         gen_arith_imm(env, ctx, mips32_op, rt, rs, imm);
12214         break;
12215
12216         /* Logical operations */
12217     case ORI32:
12218         mips32_op = OPC_ORI;
12219         goto do_logici;
12220     case XORI32:
12221         mips32_op = OPC_XORI;
12222         goto do_logici;
12223     case ANDI32:
12224         mips32_op = OPC_ANDI;
12225     do_logici:
12226         gen_logic_imm(env, ctx, mips32_op, rt, rs, imm);
12227         break;
12228
12229         /* Set less than immediate */
12230     case SLTI32:
12231         mips32_op = OPC_SLTI;
12232         goto do_slti;
12233     case SLTIU32:
12234         mips32_op = OPC_SLTIU;
12235     do_slti:
12236         gen_slt_imm(env, ctx, mips32_op, rt, rs, imm);
12237         break;
12238     case JALX32:
12239         offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
12240         gen_compute_branch(ctx, OPC_JALX, 4, rt, rs, offset);
12241         *is_branch = 1;
12242         break;
12243     case JALS32:
12244         offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 1;
12245         gen_compute_branch(ctx, OPC_JALS, 4, rt, rs, offset);
12246         *is_branch = 1;
12247         break;
12248     case BEQ32:
12249         gen_compute_branch(ctx, OPC_BEQ, 4, rt, rs, imm << 1);
12250         *is_branch = 1;
12251         break;
12252     case BNE32:
12253         gen_compute_branch(ctx, OPC_BNE, 4, rt, rs, imm << 1);
12254         *is_branch = 1;
12255         break;
12256     case J32:
12257         gen_compute_branch(ctx, OPC_J, 4, rt, rs,
12258                            (int32_t)(ctx->opcode & 0x3FFFFFF) << 1);
12259         *is_branch = 1;
12260         break;
12261     case JAL32:
12262         gen_compute_branch(ctx, OPC_JAL, 4, rt, rs,
12263                            (int32_t)(ctx->opcode & 0x3FFFFFF) << 1);
12264         *is_branch = 1;
12265         break;
12266         /* Floating point (COP1) */
12267     case LWC132:
12268         mips32_op = OPC_LWC1;
12269         goto do_cop1;
12270     case LDC132:
12271         mips32_op = OPC_LDC1;
12272         goto do_cop1;
12273     case SWC132:
12274         mips32_op = OPC_SWC1;
12275         goto do_cop1;
12276     case SDC132:
12277         mips32_op = OPC_SDC1;
12278     do_cop1:
12279         gen_cop1_ldst(env, ctx, mips32_op, rt, rs, imm);
12280         break;
12281     case ADDIUPC:
12282         {
12283             int reg = mmreg(ZIMM(ctx->opcode, 23, 3));
12284             int offset = SIMM(ctx->opcode, 0, 23) << 2;
12285
12286             gen_addiupc(ctx, reg, offset, 0, 0);
12287         }
12288         break;
12289         /* Loads and stores */
12290     case LB32:
12291         mips32_op = OPC_LB;
12292         goto do_ld;
12293     case LBU32:
12294         mips32_op = OPC_LBU;
12295         goto do_ld;
12296     case LH32:
12297         mips32_op = OPC_LH;
12298         goto do_ld;
12299     case LHU32:
12300         mips32_op = OPC_LHU;
12301         goto do_ld;
12302     case LW32:
12303         mips32_op = OPC_LW;
12304         goto do_ld;
12305 #ifdef TARGET_MIPS64
12306     case LD32:
12307         mips32_op = OPC_LD;
12308         goto do_ld;
12309     case SD32:
12310         mips32_op = OPC_SD;
12311         goto do_st;
12312 #endif
12313     case SB32:
12314         mips32_op = OPC_SB;
12315         goto do_st;
12316     case SH32:
12317         mips32_op = OPC_SH;
12318         goto do_st;
12319     case SW32:
12320         mips32_op = OPC_SW;
12321         goto do_st;
12322     do_ld:
12323         gen_ld(env, ctx, mips32_op, rt, rs, imm);
12324         break;
12325     do_st:
12326         gen_st(ctx, mips32_op, rt, rs, imm);
12327         break;
12328     default:
12329         generate_exception(ctx, EXCP_RI);
12330         break;
12331     }
12332 }
12333
12334 static int decode_micromips_opc (CPUMIPSState *env, DisasContext *ctx, int *is_branch)
12335 {
12336     uint32_t op;
12337
12338     /* make sure instructions are on a halfword boundary */
12339     if (ctx->pc & 0x1) {
12340         env->CP0_BadVAddr = ctx->pc;
12341         generate_exception(ctx, EXCP_AdEL);
12342         ctx->bstate = BS_STOP;
12343         return 2;
12344     }
12345
12346     op = (ctx->opcode >> 10) & 0x3f;
12347     /* Enforce properly-sized instructions in a delay slot */
12348     if (ctx->hflags & MIPS_HFLAG_BMASK) {
12349         int bits = ctx->hflags & MIPS_HFLAG_BMASK_EXT;
12350
12351         switch (op) {
12352         case POOL32A:
12353         case POOL32B:
12354         case POOL32I:
12355         case POOL32C:
12356         case ADDI32:
12357         case ADDIU32:
12358         case ORI32:
12359         case XORI32:
12360         case SLTI32:
12361         case SLTIU32:
12362         case ANDI32:
12363         case JALX32:
12364         case LBU32:
12365         case LHU32:
12366         case POOL32F:
12367         case JALS32:
12368         case BEQ32:
12369         case BNE32:
12370         case J32:
12371         case JAL32:
12372         case SB32:
12373         case SH32:
12374         case POOL32S:
12375         case ADDIUPC:
12376         case SWC132:
12377         case SDC132:
12378         case SD32:
12379         case SW32:
12380         case LB32:
12381         case LH32:
12382         case DADDIU32:
12383         case POOL48A:           /* ??? */
12384         case LWC132:
12385         case LDC132:
12386         case LD32:
12387         case LW32:
12388             if (bits & MIPS_HFLAG_BDS16) {
12389                 generate_exception(ctx, EXCP_RI);
12390                 /* Just stop translation; the user is confused.  */
12391                 ctx->bstate = BS_STOP;
12392                 return 2;
12393             }
12394             break;
12395         case POOL16A:
12396         case POOL16B:
12397         case POOL16C:
12398         case LWGP16:
12399         case POOL16F:
12400         case LBU16:
12401         case LHU16:
12402         case LWSP16:
12403         case LW16:
12404         case SB16:
12405         case SH16:
12406         case SWSP16:
12407         case SW16:
12408         case MOVE16:
12409         case ANDI16:
12410         case POOL16D:
12411         case POOL16E:
12412         case BEQZ16:
12413         case BNEZ16:
12414         case B16:
12415         case LI16:
12416             if (bits & MIPS_HFLAG_BDS32) {
12417                 generate_exception(ctx, EXCP_RI);
12418                 /* Just stop translation; the user is confused.  */
12419                 ctx->bstate = BS_STOP;
12420                 return 2;
12421             }
12422             break;
12423         default:
12424             break;
12425         }
12426     }
12427     switch (op) {
12428     case POOL16A:
12429         {
12430             int rd = mmreg(uMIPS_RD(ctx->opcode));
12431             int rs1 = mmreg(uMIPS_RS1(ctx->opcode));
12432             int rs2 = mmreg(uMIPS_RS2(ctx->opcode));
12433             uint32_t opc = 0;
12434
12435             switch (ctx->opcode & 0x1) {
12436             case ADDU16:
12437                 opc = OPC_ADDU;
12438                 break;
12439             case SUBU16:
12440                 opc = OPC_SUBU;
12441                 break;
12442             }
12443
12444             gen_arith(env, ctx, opc, rd, rs1, rs2);
12445         }
12446         break;
12447     case POOL16B:
12448         {
12449             int rd = mmreg(uMIPS_RD(ctx->opcode));
12450             int rs = mmreg(uMIPS_RS(ctx->opcode));
12451             int amount = (ctx->opcode >> 1) & 0x7;
12452             uint32_t opc = 0;
12453             amount = amount == 0 ? 8 : amount;
12454
12455             switch (ctx->opcode & 0x1) {
12456             case SLL16:
12457                 opc = OPC_SLL;
12458                 break;
12459             case SRL16:
12460                 opc = OPC_SRL;
12461                 break;
12462             }
12463
12464             gen_shift_imm(env, ctx, opc, rd, rs, amount);
12465         }
12466         break;
12467     case POOL16C:
12468         gen_pool16c_insn(env, ctx, is_branch);
12469         break;
12470     case LWGP16:
12471         {
12472             int rd = mmreg(uMIPS_RD(ctx->opcode));
12473             int rb = 28;            /* GP */
12474             int16_t offset = SIMM(ctx->opcode, 0, 7) << 2;
12475
12476             gen_ld(env, ctx, OPC_LW, rd, rb, offset);
12477         }
12478         break;
12479     case POOL16F:
12480         if (ctx->opcode & 1) {
12481             generate_exception(ctx, EXCP_RI);
12482         } else {
12483             /* MOVEP */
12484             int enc_dest = uMIPS_RD(ctx->opcode);
12485             int enc_rt = uMIPS_RS2(ctx->opcode);
12486             int enc_rs = uMIPS_RS1(ctx->opcode);
12487             int rd, rs, re, rt;
12488             static const int rd_enc[] = { 5, 5, 6, 4, 4, 4, 4, 4 };
12489             static const int re_enc[] = { 6, 7, 7, 21, 22, 5, 6, 7 };
12490             static const int rs_rt_enc[] = { 0, 17, 2, 3, 16, 18, 19, 20 };
12491
12492             rd = rd_enc[enc_dest];
12493             re = re_enc[enc_dest];
12494             rs = rs_rt_enc[enc_rs];
12495             rt = rs_rt_enc[enc_rt];
12496
12497             gen_arith_imm(env, ctx, OPC_ADDIU, rd, rs, 0);
12498             gen_arith_imm(env, ctx, OPC_ADDIU, re, rt, 0);
12499         }
12500         break;
12501     case LBU16:
12502         {
12503             int rd = mmreg(uMIPS_RD(ctx->opcode));
12504             int rb = mmreg(uMIPS_RS(ctx->opcode));
12505             int16_t offset = ZIMM(ctx->opcode, 0, 4);
12506             offset = (offset == 0xf ? -1 : offset);
12507
12508             gen_ld(env, ctx, OPC_LBU, rd, rb, offset);
12509         }
12510         break;
12511     case LHU16:
12512         {
12513             int rd = mmreg(uMIPS_RD(ctx->opcode));
12514             int rb = mmreg(uMIPS_RS(ctx->opcode));
12515             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 1;
12516
12517             gen_ld(env, ctx, OPC_LHU, rd, rb, offset);
12518         }
12519         break;
12520     case LWSP16:
12521         {
12522             int rd = (ctx->opcode >> 5) & 0x1f;
12523             int rb = 29;            /* SP */
12524             int16_t offset = ZIMM(ctx->opcode, 0, 5) << 2;
12525
12526             gen_ld(env, ctx, OPC_LW, rd, rb, offset);
12527         }
12528         break;
12529     case LW16:
12530         {
12531             int rd = mmreg(uMIPS_RD(ctx->opcode));
12532             int rb = mmreg(uMIPS_RS(ctx->opcode));
12533             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 2;
12534
12535             gen_ld(env, ctx, OPC_LW, rd, rb, offset);
12536         }
12537         break;
12538     case SB16:
12539         {
12540             int rd = mmreg2(uMIPS_RD(ctx->opcode));
12541             int rb = mmreg(uMIPS_RS(ctx->opcode));
12542             int16_t offset = ZIMM(ctx->opcode, 0, 4);
12543
12544             gen_st(ctx, OPC_SB, rd, rb, offset);
12545         }
12546         break;
12547     case SH16:
12548         {
12549             int rd = mmreg2(uMIPS_RD(ctx->opcode));
12550             int rb = mmreg(uMIPS_RS(ctx->opcode));
12551             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 1;
12552
12553             gen_st(ctx, OPC_SH, rd, rb, offset);
12554         }
12555         break;
12556     case SWSP16:
12557         {
12558             int rd = (ctx->opcode >> 5) & 0x1f;
12559             int rb = 29;            /* SP */
12560             int16_t offset = ZIMM(ctx->opcode, 0, 5) << 2;
12561
12562             gen_st(ctx, OPC_SW, rd, rb, offset);
12563         }
12564         break;
12565     case SW16:
12566         {
12567             int rd = mmreg2(uMIPS_RD(ctx->opcode));
12568             int rb = mmreg(uMIPS_RS(ctx->opcode));
12569             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 2;
12570
12571             gen_st(ctx, OPC_SW, rd, rb, offset);
12572         }
12573         break;
12574     case MOVE16:
12575         {
12576             int rd = uMIPS_RD5(ctx->opcode);
12577             int rs = uMIPS_RS5(ctx->opcode);
12578
12579             gen_arith_imm(env, ctx, OPC_ADDIU, rd, rs, 0);
12580         }
12581         break;
12582     case ANDI16:
12583         gen_andi16(env, ctx);
12584         break;
12585     case POOL16D:
12586         switch (ctx->opcode & 0x1) {
12587         case ADDIUS5:
12588             gen_addius5(env, ctx);
12589             break;
12590         case ADDIUSP:
12591             gen_addiusp(env, ctx);
12592             break;
12593         }
12594         break;
12595     case POOL16E:
12596         switch (ctx->opcode & 0x1) {
12597         case ADDIUR2:
12598             gen_addiur2(env, ctx);
12599             break;
12600         case ADDIUR1SP:
12601             gen_addiur1sp(env, ctx);
12602             break;
12603         }
12604         break;
12605     case B16:
12606         gen_compute_branch(ctx, OPC_BEQ, 2, 0, 0,
12607                            SIMM(ctx->opcode, 0, 10) << 1);
12608         *is_branch = 1;
12609         break;
12610     case BNEZ16:
12611     case BEQZ16:
12612         gen_compute_branch(ctx, op == BNEZ16 ? OPC_BNE : OPC_BEQ, 2,
12613                            mmreg(uMIPS_RD(ctx->opcode)),
12614                            0, SIMM(ctx->opcode, 0, 7) << 1);
12615         *is_branch = 1;
12616         break;
12617     case LI16:
12618         {
12619             int reg = mmreg(uMIPS_RD(ctx->opcode));
12620             int imm = ZIMM(ctx->opcode, 0, 7);
12621
12622             imm = (imm == 0x7f ? -1 : imm);
12623             tcg_gen_movi_tl(cpu_gpr[reg], imm);
12624         }
12625         break;
12626     case RES_20:
12627     case RES_28:
12628     case RES_29:
12629     case RES_30:
12630     case RES_31:
12631     case RES_38:
12632     case RES_39:
12633         generate_exception(ctx, EXCP_RI);
12634         break;
12635     default:
12636         decode_micromips32_opc (env, ctx, op, is_branch);
12637         return 4;
12638     }
12639
12640     return 2;
12641 }
12642
12643 /* SmartMIPS extension to MIPS32 */
12644
12645 #if defined(TARGET_MIPS64)
12646
12647 /* MDMX extension to MIPS64 */
12648
12649 #endif
12650
12651 /* MIPSDSP functions. */
12652 static void gen_mipsdsp_ld(CPUMIPSState *env, DisasContext *ctx, uint32_t opc,
12653                            int rd, int base, int offset)
12654 {
12655     const char *opn = "ldx";
12656     TCGv t0;
12657
12658     if (rd == 0) {
12659         MIPS_DEBUG("NOP");
12660         return;
12661     }
12662
12663     check_dsp(ctx);
12664     t0 = tcg_temp_new();
12665
12666     if (base == 0) {
12667         gen_load_gpr(t0, offset);
12668     } else if (offset == 0) {
12669         gen_load_gpr(t0, base);
12670     } else {
12671         gen_op_addr_add(ctx, t0, cpu_gpr[base], cpu_gpr[offset]);
12672     }
12673
12674     save_cpu_state(ctx, 0);
12675     switch (opc) {
12676     case OPC_LBUX:
12677         op_ld_lbu(t0, t0, ctx);
12678         gen_store_gpr(t0, rd);
12679         opn = "lbux";
12680         break;
12681     case OPC_LHX:
12682         op_ld_lh(t0, t0, ctx);
12683         gen_store_gpr(t0, rd);
12684         opn = "lhx";
12685         break;
12686     case OPC_LWX:
12687         op_ld_lw(t0, t0, ctx);
12688         gen_store_gpr(t0, rd);
12689         opn = "lwx";
12690         break;
12691 #if defined(TARGET_MIPS64)
12692     case OPC_LDX:
12693         op_ld_ld(t0, t0, ctx);
12694         gen_store_gpr(t0, rd);
12695         opn = "ldx";
12696         break;
12697 #endif
12698     }
12699     (void)opn; /* avoid a compiler warning */
12700     MIPS_DEBUG("%s %s, %s(%s)", opn,
12701                regnames[rd], regnames[offset], regnames[base]);
12702     tcg_temp_free(t0);
12703 }
12704
12705 static void gen_mipsdsp_arith(DisasContext *ctx, uint32_t op1, uint32_t op2,
12706                               int ret, int v1, int v2)
12707 {
12708     const char *opn = "mipsdsp arith";
12709     TCGv v1_t;
12710     TCGv v2_t;
12711
12712     if (ret == 0) {
12713         /* Treat as NOP. */
12714         MIPS_DEBUG("NOP");
12715         return;
12716     }
12717
12718     v1_t = tcg_temp_new();
12719     v2_t = tcg_temp_new();
12720
12721     gen_load_gpr(v1_t, v1);
12722     gen_load_gpr(v2_t, v2);
12723
12724     switch (op1) {
12725     /* OPC_MULT_G_2E is equal OPC_ADDUH_QB_DSP */
12726     case OPC_MULT_G_2E:
12727         check_dspr2(ctx);
12728         switch (op2) {
12729         case OPC_ADDUH_QB:
12730             gen_helper_adduh_qb(cpu_gpr[ret], v1_t, v2_t);
12731             break;
12732         case OPC_ADDUH_R_QB:
12733             gen_helper_adduh_r_qb(cpu_gpr[ret], v1_t, v2_t);
12734             break;
12735         case OPC_ADDQH_PH:
12736             gen_helper_addqh_ph(cpu_gpr[ret], v1_t, v2_t);
12737             break;
12738         case OPC_ADDQH_R_PH:
12739             gen_helper_addqh_r_ph(cpu_gpr[ret], v1_t, v2_t);
12740             break;
12741         case OPC_ADDQH_W:
12742             gen_helper_addqh_w(cpu_gpr[ret], v1_t, v2_t);
12743             break;
12744         case OPC_ADDQH_R_W:
12745             gen_helper_addqh_r_w(cpu_gpr[ret], v1_t, v2_t);
12746             break;
12747         case OPC_SUBUH_QB:
12748             gen_helper_subuh_qb(cpu_gpr[ret], v1_t, v2_t);
12749             break;
12750         case OPC_SUBUH_R_QB:
12751             gen_helper_subuh_r_qb(cpu_gpr[ret], v1_t, v2_t);
12752             break;
12753         case OPC_SUBQH_PH:
12754             gen_helper_subqh_ph(cpu_gpr[ret], v1_t, v2_t);
12755             break;
12756         case OPC_SUBQH_R_PH:
12757             gen_helper_subqh_r_ph(cpu_gpr[ret], v1_t, v2_t);
12758             break;
12759         case OPC_SUBQH_W:
12760             gen_helper_subqh_w(cpu_gpr[ret], v1_t, v2_t);
12761             break;
12762         case OPC_SUBQH_R_W:
12763             gen_helper_subqh_r_w(cpu_gpr[ret], v1_t, v2_t);
12764             break;
12765         }
12766         break;
12767     case OPC_ABSQ_S_PH_DSP:
12768         switch (op2) {
12769         case OPC_ABSQ_S_QB:
12770             check_dspr2(ctx);
12771             gen_helper_absq_s_qb(cpu_gpr[ret], v2_t, cpu_env);
12772             break;
12773         case OPC_ABSQ_S_PH:
12774             check_dsp(ctx);
12775             gen_helper_absq_s_ph(cpu_gpr[ret], v2_t, cpu_env);
12776             break;
12777         case OPC_ABSQ_S_W:
12778             check_dsp(ctx);
12779             gen_helper_absq_s_w(cpu_gpr[ret], v2_t, cpu_env);
12780             break;
12781         case OPC_PRECEQ_W_PHL:
12782             check_dsp(ctx);
12783             tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0xFFFF0000);
12784             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
12785             break;
12786         case OPC_PRECEQ_W_PHR:
12787             check_dsp(ctx);
12788             tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0x0000FFFF);
12789             tcg_gen_shli_tl(cpu_gpr[ret], cpu_gpr[ret], 16);
12790             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
12791             break;
12792         case OPC_PRECEQU_PH_QBL:
12793             check_dsp(ctx);
12794             gen_helper_precequ_ph_qbl(cpu_gpr[ret], v2_t);
12795             break;
12796         case OPC_PRECEQU_PH_QBR:
12797             check_dsp(ctx);
12798             gen_helper_precequ_ph_qbr(cpu_gpr[ret], v2_t);
12799             break;
12800         case OPC_PRECEQU_PH_QBLA:
12801             check_dsp(ctx);
12802             gen_helper_precequ_ph_qbla(cpu_gpr[ret], v2_t);
12803             break;
12804         case OPC_PRECEQU_PH_QBRA:
12805             check_dsp(ctx);
12806             gen_helper_precequ_ph_qbra(cpu_gpr[ret], v2_t);
12807             break;
12808         case OPC_PRECEU_PH_QBL:
12809             check_dsp(ctx);
12810             gen_helper_preceu_ph_qbl(cpu_gpr[ret], v2_t);
12811             break;
12812         case OPC_PRECEU_PH_QBR:
12813             check_dsp(ctx);
12814             gen_helper_preceu_ph_qbr(cpu_gpr[ret], v2_t);
12815             break;
12816         case OPC_PRECEU_PH_QBLA:
12817             check_dsp(ctx);
12818             gen_helper_preceu_ph_qbla(cpu_gpr[ret], v2_t);
12819             break;
12820         case OPC_PRECEU_PH_QBRA:
12821             check_dsp(ctx);
12822             gen_helper_preceu_ph_qbra(cpu_gpr[ret], v2_t);
12823             break;
12824         }
12825         break;
12826     case OPC_ADDU_QB_DSP:
12827         switch (op2) {
12828         case OPC_ADDQ_PH:
12829             check_dsp(ctx);
12830             gen_helper_addq_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12831             break;
12832         case OPC_ADDQ_S_PH:
12833             check_dsp(ctx);
12834             gen_helper_addq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12835             break;
12836         case OPC_ADDQ_S_W:
12837             check_dsp(ctx);
12838             gen_helper_addq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12839             break;
12840         case OPC_ADDU_QB:
12841             check_dsp(ctx);
12842             gen_helper_addu_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12843             break;
12844         case OPC_ADDU_S_QB:
12845             check_dsp(ctx);
12846             gen_helper_addu_s_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12847             break;
12848         case OPC_ADDU_PH:
12849             check_dspr2(ctx);
12850             gen_helper_addu_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12851             break;
12852         case OPC_ADDU_S_PH:
12853             check_dspr2(ctx);
12854             gen_helper_addu_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12855             break;
12856         case OPC_SUBQ_PH:
12857             check_dsp(ctx);
12858             gen_helper_subq_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12859             break;
12860         case OPC_SUBQ_S_PH:
12861             check_dsp(ctx);
12862             gen_helper_subq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12863             break;
12864         case OPC_SUBQ_S_W:
12865             check_dsp(ctx);
12866             gen_helper_subq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12867             break;
12868         case OPC_SUBU_QB:
12869             check_dsp(ctx);
12870             gen_helper_subu_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12871             break;
12872         case OPC_SUBU_S_QB:
12873             check_dsp(ctx);
12874             gen_helper_subu_s_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12875             break;
12876         case OPC_SUBU_PH:
12877             check_dspr2(ctx);
12878             gen_helper_subu_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12879             break;
12880         case OPC_SUBU_S_PH:
12881             check_dspr2(ctx);
12882             gen_helper_subu_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12883             break;
12884         case OPC_ADDSC:
12885             check_dsp(ctx);
12886             gen_helper_addsc(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12887             break;
12888         case OPC_ADDWC:
12889             check_dsp(ctx);
12890             gen_helper_addwc(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12891             break;
12892         case OPC_MODSUB:
12893             check_dsp(ctx);
12894             gen_helper_modsub(cpu_gpr[ret], v1_t, v2_t);
12895             break;
12896         case OPC_RADDU_W_QB:
12897             check_dsp(ctx);
12898             gen_helper_raddu_w_qb(cpu_gpr[ret], v1_t);
12899             break;
12900         }
12901         break;
12902     case OPC_CMPU_EQ_QB_DSP:
12903         switch (op2) {
12904         case OPC_PRECR_QB_PH:
12905             check_dspr2(ctx);
12906             gen_helper_precr_qb_ph(cpu_gpr[ret], v1_t, v2_t);
12907             break;
12908         case OPC_PRECRQ_QB_PH:
12909             check_dsp(ctx);
12910             gen_helper_precrq_qb_ph(cpu_gpr[ret], v1_t, v2_t);
12911             break;
12912         case OPC_PRECR_SRA_PH_W:
12913             check_dspr2(ctx);
12914             {
12915                 TCGv_i32 sa_t = tcg_const_i32(v2);
12916                 gen_helper_precr_sra_ph_w(cpu_gpr[ret], sa_t, v1_t,
12917                                           cpu_gpr[ret]);
12918                 tcg_temp_free_i32(sa_t);
12919                 break;
12920             }
12921         case OPC_PRECR_SRA_R_PH_W:
12922             check_dspr2(ctx);
12923             {
12924                 TCGv_i32 sa_t = tcg_const_i32(v2);
12925                 gen_helper_precr_sra_r_ph_w(cpu_gpr[ret], sa_t, v1_t,
12926                                             cpu_gpr[ret]);
12927                 tcg_temp_free_i32(sa_t);
12928                 break;
12929             }
12930         case OPC_PRECRQ_PH_W:
12931             check_dsp(ctx);
12932             gen_helper_precrq_ph_w(cpu_gpr[ret], v1_t, v2_t);
12933             break;
12934         case OPC_PRECRQ_RS_PH_W:
12935             check_dsp(ctx);
12936             gen_helper_precrq_rs_ph_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12937             break;
12938         case OPC_PRECRQU_S_QB_PH:
12939             check_dsp(ctx);
12940             gen_helper_precrqu_s_qb_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12941             break;
12942         }
12943         break;
12944 #ifdef TARGET_MIPS64
12945     case OPC_ABSQ_S_QH_DSP:
12946         switch (op2) {
12947         case OPC_PRECEQ_L_PWL:
12948             check_dsp(ctx);
12949             tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0xFFFFFFFF00000000ull);
12950             break;
12951         case OPC_PRECEQ_L_PWR:
12952             check_dsp(ctx);
12953             tcg_gen_shli_tl(cpu_gpr[ret], v2_t, 32);
12954             break;
12955         case OPC_PRECEQ_PW_QHL:
12956             check_dsp(ctx);
12957             gen_helper_preceq_pw_qhl(cpu_gpr[ret], v2_t);
12958             break;
12959         case OPC_PRECEQ_PW_QHR:
12960             check_dsp(ctx);
12961             gen_helper_preceq_pw_qhr(cpu_gpr[ret], v2_t);
12962             break;
12963         case OPC_PRECEQ_PW_QHLA:
12964             check_dsp(ctx);
12965             gen_helper_preceq_pw_qhla(cpu_gpr[ret], v2_t);
12966             break;
12967         case OPC_PRECEQ_PW_QHRA:
12968             check_dsp(ctx);
12969             gen_helper_preceq_pw_qhra(cpu_gpr[ret], v2_t);
12970             break;
12971         case OPC_PRECEQU_QH_OBL:
12972             check_dsp(ctx);
12973             gen_helper_precequ_qh_obl(cpu_gpr[ret], v2_t);
12974             break;
12975         case OPC_PRECEQU_QH_OBR:
12976             check_dsp(ctx);
12977             gen_helper_precequ_qh_obr(cpu_gpr[ret], v2_t);
12978             break;
12979         case OPC_PRECEQU_QH_OBLA:
12980             check_dsp(ctx);
12981             gen_helper_precequ_qh_obla(cpu_gpr[ret], v2_t);
12982             break;
12983         case OPC_PRECEQU_QH_OBRA:
12984             check_dsp(ctx);
12985             gen_helper_precequ_qh_obra(cpu_gpr[ret], v2_t);
12986             break;
12987         case OPC_PRECEU_QH_OBL:
12988             check_dsp(ctx);
12989             gen_helper_preceu_qh_obl(cpu_gpr[ret], v2_t);
12990             break;
12991         case OPC_PRECEU_QH_OBR:
12992             check_dsp(ctx);
12993             gen_helper_preceu_qh_obr(cpu_gpr[ret], v2_t);
12994             break;
12995         case OPC_PRECEU_QH_OBLA:
12996             check_dsp(ctx);
12997             gen_helper_preceu_qh_obla(cpu_gpr[ret], v2_t);
12998             break;
12999         case OPC_PRECEU_QH_OBRA:
13000             check_dsp(ctx);
13001             gen_helper_preceu_qh_obra(cpu_gpr[ret], v2_t);
13002             break;
13003         case OPC_ABSQ_S_OB:
13004             check_dspr2(ctx);
13005             gen_helper_absq_s_ob(cpu_gpr[ret], v2_t, cpu_env);
13006             break;
13007         case OPC_ABSQ_S_PW:
13008             check_dsp(ctx);
13009             gen_helper_absq_s_pw(cpu_gpr[ret], v2_t, cpu_env);
13010             break;
13011         case OPC_ABSQ_S_QH:
13012             check_dsp(ctx);
13013             gen_helper_absq_s_qh(cpu_gpr[ret], v2_t, cpu_env);
13014             break;
13015         }
13016         break;
13017     case OPC_ADDU_OB_DSP:
13018         switch (op2) {
13019         case OPC_RADDU_L_OB:
13020             check_dsp(ctx);
13021             gen_helper_raddu_l_ob(cpu_gpr[ret], v1_t);
13022             break;
13023         case OPC_SUBQ_PW:
13024             check_dsp(ctx);
13025             gen_helper_subq_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13026             break;
13027         case OPC_SUBQ_S_PW:
13028             check_dsp(ctx);
13029             gen_helper_subq_s_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13030             break;
13031         case OPC_SUBQ_QH:
13032             check_dsp(ctx);
13033             gen_helper_subq_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13034             break;
13035         case OPC_SUBQ_S_QH:
13036             check_dsp(ctx);
13037             gen_helper_subq_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13038             break;
13039         case OPC_SUBU_OB:
13040             check_dsp(ctx);
13041             gen_helper_subu_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13042             break;
13043         case OPC_SUBU_S_OB:
13044             check_dsp(ctx);
13045             gen_helper_subu_s_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13046             break;
13047         case OPC_SUBU_QH:
13048             check_dspr2(ctx);
13049             gen_helper_subu_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13050             break;
13051         case OPC_SUBU_S_QH:
13052             check_dspr2(ctx);
13053             gen_helper_subu_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13054             break;
13055         case OPC_SUBUH_OB:
13056             check_dspr2(ctx);
13057             gen_helper_subuh_ob(cpu_gpr[ret], v1_t, v2_t);
13058             break;
13059         case OPC_SUBUH_R_OB:
13060             check_dspr2(ctx);
13061             gen_helper_subuh_r_ob(cpu_gpr[ret], v1_t, v2_t);
13062             break;
13063         case OPC_ADDQ_PW:
13064             check_dsp(ctx);
13065             gen_helper_addq_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13066             break;
13067         case OPC_ADDQ_S_PW:
13068             check_dsp(ctx);
13069             gen_helper_addq_s_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13070             break;
13071         case OPC_ADDQ_QH:
13072             check_dsp(ctx);
13073             gen_helper_addq_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13074             break;
13075         case OPC_ADDQ_S_QH:
13076             check_dsp(ctx);
13077             gen_helper_addq_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13078             break;
13079         case OPC_ADDU_OB:
13080             check_dsp(ctx);
13081             gen_helper_addu_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13082             break;
13083         case OPC_ADDU_S_OB:
13084             check_dsp(ctx);
13085             gen_helper_addu_s_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13086             break;
13087         case OPC_ADDU_QH:
13088             check_dspr2(ctx);
13089             gen_helper_addu_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13090             break;
13091         case OPC_ADDU_S_QH:
13092             check_dspr2(ctx);
13093             gen_helper_addu_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13094             break;
13095         case OPC_ADDUH_OB:
13096             check_dspr2(ctx);
13097             gen_helper_adduh_ob(cpu_gpr[ret], v1_t, v2_t);
13098             break;
13099         case OPC_ADDUH_R_OB:
13100             check_dspr2(ctx);
13101             gen_helper_adduh_r_ob(cpu_gpr[ret], v1_t, v2_t);
13102             break;
13103         }
13104         break;
13105     case OPC_CMPU_EQ_OB_DSP:
13106         switch (op2) {
13107         case OPC_PRECR_OB_QH:
13108             check_dspr2(ctx);
13109             gen_helper_precr_ob_qh(cpu_gpr[ret], v1_t, v2_t);
13110             break;
13111         case OPC_PRECR_SRA_QH_PW:
13112             check_dspr2(ctx);
13113             {
13114                 TCGv_i32 ret_t = tcg_const_i32(ret);
13115                 gen_helper_precr_sra_qh_pw(v2_t, v1_t, v2_t, ret_t);
13116                 tcg_temp_free_i32(ret_t);
13117                 break;
13118             }
13119         case OPC_PRECR_SRA_R_QH_PW:
13120             check_dspr2(ctx);
13121             {
13122                 TCGv_i32 sa_v = tcg_const_i32(ret);
13123                 gen_helper_precr_sra_r_qh_pw(v2_t, v1_t, v2_t, sa_v);
13124                 tcg_temp_free_i32(sa_v);
13125                 break;
13126             }
13127         case OPC_PRECRQ_OB_QH:
13128             check_dsp(ctx);
13129             gen_helper_precrq_ob_qh(cpu_gpr[ret], v1_t, v2_t);
13130             break;
13131         case OPC_PRECRQ_PW_L:
13132             check_dsp(ctx);
13133             gen_helper_precrq_pw_l(cpu_gpr[ret], v1_t, v2_t);
13134             break;
13135         case OPC_PRECRQ_QH_PW:
13136             check_dsp(ctx);
13137             gen_helper_precrq_qh_pw(cpu_gpr[ret], v1_t, v2_t);
13138             break;
13139         case OPC_PRECRQ_RS_QH_PW:
13140             check_dsp(ctx);
13141             gen_helper_precrq_rs_qh_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13142             break;
13143         case OPC_PRECRQU_S_OB_QH:
13144             check_dsp(ctx);
13145             gen_helper_precrqu_s_ob_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13146             break;
13147         }
13148         break;
13149 #endif
13150     }
13151
13152     tcg_temp_free(v1_t);
13153     tcg_temp_free(v2_t);
13154
13155     (void)opn; /* avoid a compiler warning */
13156     MIPS_DEBUG("%s", opn);
13157 }
13158
13159 static void gen_mipsdsp_shift(DisasContext *ctx, uint32_t opc,
13160                               int ret, int v1, int v2)
13161 {
13162     uint32_t op2;
13163     const char *opn = "mipsdsp shift";
13164     TCGv t0;
13165     TCGv v1_t;
13166     TCGv v2_t;
13167
13168     if (ret == 0) {
13169         /* Treat as NOP. */
13170         MIPS_DEBUG("NOP");
13171         return;
13172     }
13173
13174     t0 = tcg_temp_new();
13175     v1_t = tcg_temp_new();
13176     v2_t = tcg_temp_new();
13177
13178     tcg_gen_movi_tl(t0, v1);
13179     gen_load_gpr(v1_t, v1);
13180     gen_load_gpr(v2_t, v2);
13181
13182     switch (opc) {
13183     case OPC_SHLL_QB_DSP:
13184         {
13185             op2 = MASK_SHLL_QB(ctx->opcode);
13186             switch (op2) {
13187             case OPC_SHLL_QB:
13188                 check_dsp(ctx);
13189                 gen_helper_shll_qb(cpu_gpr[ret], t0, v2_t, cpu_env);
13190                 break;
13191             case OPC_SHLLV_QB:
13192                 check_dsp(ctx);
13193                 gen_helper_shll_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13194                 break;
13195             case OPC_SHLL_PH:
13196                 check_dsp(ctx);
13197                 gen_helper_shll_ph(cpu_gpr[ret], t0, v2_t, cpu_env);
13198                 break;
13199             case OPC_SHLLV_PH:
13200                 check_dsp(ctx);
13201                 gen_helper_shll_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13202                 break;
13203             case OPC_SHLL_S_PH:
13204                 check_dsp(ctx);
13205                 gen_helper_shll_s_ph(cpu_gpr[ret], t0, v2_t, cpu_env);
13206                 break;
13207             case OPC_SHLLV_S_PH:
13208                 check_dsp(ctx);
13209                 gen_helper_shll_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13210                 break;
13211             case OPC_SHLL_S_W:
13212                 check_dsp(ctx);
13213                 gen_helper_shll_s_w(cpu_gpr[ret], t0, v2_t, cpu_env);
13214                 break;
13215             case OPC_SHLLV_S_W:
13216                 check_dsp(ctx);
13217                 gen_helper_shll_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13218                 break;
13219             case OPC_SHRL_QB:
13220                 check_dsp(ctx);
13221                 gen_helper_shrl_qb(cpu_gpr[ret], t0, v2_t);
13222                 break;
13223             case OPC_SHRLV_QB:
13224                 check_dsp(ctx);
13225                 gen_helper_shrl_qb(cpu_gpr[ret], v1_t, v2_t);
13226                 break;
13227             case OPC_SHRL_PH:
13228                 check_dspr2(ctx);
13229                 gen_helper_shrl_ph(cpu_gpr[ret], t0, v2_t);
13230                 break;
13231             case OPC_SHRLV_PH:
13232                 check_dspr2(ctx);
13233                 gen_helper_shrl_ph(cpu_gpr[ret], v1_t, v2_t);
13234                 break;
13235             case OPC_SHRA_QB:
13236                 check_dspr2(ctx);
13237                 gen_helper_shra_qb(cpu_gpr[ret], t0, v2_t);
13238                 break;
13239             case OPC_SHRA_R_QB:
13240                 check_dspr2(ctx);
13241                 gen_helper_shra_r_qb(cpu_gpr[ret], t0, v2_t);
13242                 break;
13243             case OPC_SHRAV_QB:
13244                 check_dspr2(ctx);
13245                 gen_helper_shra_qb(cpu_gpr[ret], v1_t, v2_t);
13246                 break;
13247             case OPC_SHRAV_R_QB:
13248                 check_dspr2(ctx);
13249                 gen_helper_shra_r_qb(cpu_gpr[ret], v1_t, v2_t);
13250                 break;
13251             case OPC_SHRA_PH:
13252                 check_dsp(ctx);
13253                 gen_helper_shra_ph(cpu_gpr[ret], t0, v2_t);
13254                 break;
13255             case OPC_SHRA_R_PH:
13256                 check_dsp(ctx);
13257                 gen_helper_shra_r_ph(cpu_gpr[ret], t0, v2_t);
13258                 break;
13259             case OPC_SHRAV_PH:
13260                 check_dsp(ctx);
13261                 gen_helper_shra_ph(cpu_gpr[ret], v1_t, v2_t);
13262                 break;
13263             case OPC_SHRAV_R_PH:
13264                 check_dsp(ctx);
13265                 gen_helper_shra_r_ph(cpu_gpr[ret], v1_t, v2_t);
13266                 break;
13267             case OPC_SHRA_R_W:
13268                 check_dsp(ctx);
13269                 gen_helper_shra_r_w(cpu_gpr[ret], t0, v2_t);
13270                 break;
13271             case OPC_SHRAV_R_W:
13272                 check_dsp(ctx);
13273                 gen_helper_shra_r_w(cpu_gpr[ret], v1_t, v2_t);
13274                 break;
13275             default:            /* Invalid */
13276                 MIPS_INVAL("MASK SHLL.QB");
13277                 generate_exception(ctx, EXCP_RI);
13278                 break;
13279             }
13280             break;
13281         }
13282 #ifdef TARGET_MIPS64
13283     case OPC_SHLL_OB_DSP:
13284         op2 = MASK_SHLL_OB(ctx->opcode);
13285         switch (op2) {
13286         case OPC_SHLL_PW:
13287             check_dsp(ctx);
13288             gen_helper_shll_pw(cpu_gpr[ret], v2_t, t0, cpu_env);
13289             break;
13290         case OPC_SHLLV_PW:
13291             check_dsp(ctx);
13292             gen_helper_shll_pw(cpu_gpr[ret], v2_t, v1_t, cpu_env);
13293             break;
13294         case OPC_SHLL_S_PW:
13295             check_dsp(ctx);
13296             gen_helper_shll_s_pw(cpu_gpr[ret], v2_t, t0, cpu_env);
13297             break;
13298         case OPC_SHLLV_S_PW:
13299             check_dsp(ctx);
13300             gen_helper_shll_s_pw(cpu_gpr[ret], v2_t, v1_t, cpu_env);
13301             break;
13302         case OPC_SHLL_OB:
13303             check_dsp(ctx);
13304             gen_helper_shll_ob(cpu_gpr[ret], v2_t, t0, cpu_env);
13305             break;
13306         case OPC_SHLLV_OB:
13307             check_dsp(ctx);
13308             gen_helper_shll_ob(cpu_gpr[ret], v2_t, v1_t, cpu_env);
13309             break;
13310         case OPC_SHLL_QH:
13311             check_dsp(ctx);
13312             gen_helper_shll_qh(cpu_gpr[ret], v2_t, t0, cpu_env);
13313             break;
13314         case OPC_SHLLV_QH:
13315             check_dsp(ctx);
13316             gen_helper_shll_qh(cpu_gpr[ret], v2_t, v1_t, cpu_env);
13317             break;
13318         case OPC_SHLL_S_QH:
13319             check_dsp(ctx);
13320             gen_helper_shll_s_qh(cpu_gpr[ret], v2_t, t0, cpu_env);
13321             break;
13322         case OPC_SHLLV_S_QH:
13323             check_dsp(ctx);
13324             gen_helper_shll_s_qh(cpu_gpr[ret], v2_t, v1_t, cpu_env);
13325             break;
13326         case OPC_SHRA_OB:
13327             check_dspr2(ctx);
13328             gen_helper_shra_ob(cpu_gpr[ret], v2_t, t0);
13329             break;
13330         case OPC_SHRAV_OB:
13331             check_dspr2(ctx);
13332             gen_helper_shra_ob(cpu_gpr[ret], v2_t, v1_t);
13333             break;
13334         case OPC_SHRA_R_OB:
13335             check_dspr2(ctx);
13336             gen_helper_shra_r_ob(cpu_gpr[ret], v2_t, t0);
13337             break;
13338         case OPC_SHRAV_R_OB:
13339             check_dspr2(ctx);
13340             gen_helper_shra_r_ob(cpu_gpr[ret], v2_t, v1_t);
13341             break;
13342         case OPC_SHRA_PW:
13343             check_dsp(ctx);
13344             gen_helper_shra_pw(cpu_gpr[ret], v2_t, t0);
13345             break;
13346         case OPC_SHRAV_PW:
13347             check_dsp(ctx);
13348             gen_helper_shra_pw(cpu_gpr[ret], v2_t, v1_t);
13349             break;
13350         case OPC_SHRA_R_PW:
13351             check_dsp(ctx);
13352             gen_helper_shra_r_pw(cpu_gpr[ret], v2_t, t0);
13353             break;
13354         case OPC_SHRAV_R_PW:
13355             check_dsp(ctx);
13356             gen_helper_shra_r_pw(cpu_gpr[ret], v2_t, v1_t);
13357             break;
13358         case OPC_SHRA_QH:
13359             check_dsp(ctx);
13360             gen_helper_shra_qh(cpu_gpr[ret], v2_t, t0);
13361             break;
13362         case OPC_SHRAV_QH:
13363             check_dsp(ctx);
13364             gen_helper_shra_qh(cpu_gpr[ret], v2_t, v1_t);
13365             break;
13366         case OPC_SHRA_R_QH:
13367             check_dsp(ctx);
13368             gen_helper_shra_r_qh(cpu_gpr[ret], v2_t, t0);
13369             break;
13370         case OPC_SHRAV_R_QH:
13371             check_dsp(ctx);
13372             gen_helper_shra_r_qh(cpu_gpr[ret], v2_t, v1_t);
13373             break;
13374         case OPC_SHRL_OB:
13375             check_dsp(ctx);
13376             gen_helper_shrl_ob(cpu_gpr[ret], v2_t, t0);
13377             break;
13378         case OPC_SHRLV_OB:
13379             check_dsp(ctx);
13380             gen_helper_shrl_ob(cpu_gpr[ret], v2_t, v1_t);
13381             break;
13382         case OPC_SHRL_QH:
13383             check_dspr2(ctx);
13384             gen_helper_shrl_qh(cpu_gpr[ret], v2_t, t0);
13385             break;
13386         case OPC_SHRLV_QH:
13387             check_dspr2(ctx);
13388             gen_helper_shrl_qh(cpu_gpr[ret], v2_t, v1_t);
13389             break;
13390         default:            /* Invalid */
13391             MIPS_INVAL("MASK SHLL.OB");
13392             generate_exception(ctx, EXCP_RI);
13393             break;
13394         }
13395         break;
13396 #endif
13397     }
13398
13399     tcg_temp_free(t0);
13400     tcg_temp_free(v1_t);
13401     tcg_temp_free(v2_t);
13402     (void)opn; /* avoid a compiler warning */
13403     MIPS_DEBUG("%s", opn);
13404 }
13405
13406 static void gen_mipsdsp_multiply(DisasContext *ctx, uint32_t op1, uint32_t op2,
13407                                  int ret, int v1, int v2, int check_ret)
13408 {
13409     const char *opn = "mipsdsp multiply";
13410     TCGv_i32 t0;
13411     TCGv v1_t;
13412     TCGv v2_t;
13413
13414     if ((ret == 0) && (check_ret == 1)) {
13415         /* Treat as NOP. */
13416         MIPS_DEBUG("NOP");
13417         return;
13418     }
13419
13420     t0 = tcg_temp_new_i32();
13421     v1_t = tcg_temp_new();
13422     v2_t = tcg_temp_new();
13423
13424     tcg_gen_movi_i32(t0, ret);
13425     gen_load_gpr(v1_t, v1);
13426     gen_load_gpr(v2_t, v2);
13427
13428     switch (op1) {
13429     /* OPC_MULT_G_2E, OPC_ADDUH_QB_DSP, OPC_MUL_PH_DSP have
13430      * the same mask and op1. */
13431     case OPC_MULT_G_2E:
13432         switch (op2) {
13433         case  OPC_MUL_PH:
13434             gen_helper_mul_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13435             break;
13436         case  OPC_MUL_S_PH:
13437             gen_helper_mul_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13438             break;
13439         case OPC_MULQ_S_W:
13440             gen_helper_mulq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13441             break;
13442         case OPC_MULQ_RS_W:
13443             gen_helper_mulq_rs_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13444             break;
13445         }
13446         break;
13447     case OPC_DPA_W_PH_DSP:
13448         switch (op2) {
13449         case OPC_DPAU_H_QBL:
13450             check_dsp(ctx);
13451             gen_helper_dpau_h_qbl(t0, v1_t, v2_t, cpu_env);
13452             break;
13453         case OPC_DPAU_H_QBR:
13454             check_dsp(ctx);
13455             gen_helper_dpau_h_qbr(t0, v1_t, v2_t, cpu_env);
13456             break;
13457         case OPC_DPSU_H_QBL:
13458             check_dsp(ctx);
13459             gen_helper_dpsu_h_qbl(t0, v1_t, v2_t, cpu_env);
13460             break;
13461         case OPC_DPSU_H_QBR:
13462             check_dsp(ctx);
13463             gen_helper_dpsu_h_qbr(t0, v1_t, v2_t, cpu_env);
13464             break;
13465         case OPC_DPA_W_PH:
13466             check_dspr2(ctx);
13467             gen_helper_dpa_w_ph(t0, v1_t, v2_t, cpu_env);
13468             break;
13469         case OPC_DPAX_W_PH:
13470             check_dspr2(ctx);
13471             gen_helper_dpax_w_ph(t0, v1_t, v2_t, cpu_env);
13472             break;
13473         case OPC_DPAQ_S_W_PH:
13474             check_dsp(ctx);
13475             gen_helper_dpaq_s_w_ph(t0, v1_t, v2_t, cpu_env);
13476             break;
13477         case OPC_DPAQX_S_W_PH:
13478             check_dspr2(ctx);
13479             gen_helper_dpaqx_s_w_ph(t0, v1_t, v2_t, cpu_env);
13480             break;
13481         case OPC_DPAQX_SA_W_PH:
13482             check_dspr2(ctx);
13483             gen_helper_dpaqx_sa_w_ph(t0, v1_t, v2_t, cpu_env);
13484             break;
13485         case OPC_DPS_W_PH:
13486             check_dspr2(ctx);
13487             gen_helper_dps_w_ph(t0, v1_t, v2_t, cpu_env);
13488             break;
13489         case OPC_DPSX_W_PH:
13490             check_dspr2(ctx);
13491             gen_helper_dpsx_w_ph(t0, v1_t, v2_t, cpu_env);
13492             break;
13493         case OPC_DPSQ_S_W_PH:
13494             check_dsp(ctx);
13495             gen_helper_dpsq_s_w_ph(t0, v1_t, v2_t, cpu_env);
13496             break;
13497         case OPC_DPSQX_S_W_PH:
13498             check_dspr2(ctx);
13499             gen_helper_dpsqx_s_w_ph(t0, v1_t, v2_t, cpu_env);
13500             break;
13501         case OPC_DPSQX_SA_W_PH:
13502             check_dspr2(ctx);
13503             gen_helper_dpsqx_sa_w_ph(t0, v1_t, v2_t, cpu_env);
13504             break;
13505         case OPC_MULSAQ_S_W_PH:
13506             check_dsp(ctx);
13507             gen_helper_mulsaq_s_w_ph(t0, v1_t, v2_t, cpu_env);
13508             break;
13509         case OPC_DPAQ_SA_L_W:
13510             check_dsp(ctx);
13511             gen_helper_dpaq_sa_l_w(t0, v1_t, v2_t, cpu_env);
13512             break;
13513         case OPC_DPSQ_SA_L_W:
13514             check_dsp(ctx);
13515             gen_helper_dpsq_sa_l_w(t0, v1_t, v2_t, cpu_env);
13516             break;
13517         case OPC_MAQ_S_W_PHL:
13518             check_dsp(ctx);
13519             gen_helper_maq_s_w_phl(t0, v1_t, v2_t, cpu_env);
13520             break;
13521         case OPC_MAQ_S_W_PHR:
13522             check_dsp(ctx);
13523             gen_helper_maq_s_w_phr(t0, v1_t, v2_t, cpu_env);
13524             break;
13525         case OPC_MAQ_SA_W_PHL:
13526             check_dsp(ctx);
13527             gen_helper_maq_sa_w_phl(t0, v1_t, v2_t, cpu_env);
13528             break;
13529         case OPC_MAQ_SA_W_PHR:
13530             check_dsp(ctx);
13531             gen_helper_maq_sa_w_phr(t0, v1_t, v2_t, cpu_env);
13532             break;
13533         case OPC_MULSA_W_PH:
13534             check_dspr2(ctx);
13535             gen_helper_mulsa_w_ph(t0, v1_t, v2_t, cpu_env);
13536             break;
13537         }
13538         break;
13539 #ifdef TARGET_MIPS64
13540     case OPC_DPAQ_W_QH_DSP:
13541         {
13542             int ac = ret & 0x03;
13543             tcg_gen_movi_i32(t0, ac);
13544
13545             switch (op2) {
13546             case OPC_DMADD:
13547                 check_dsp(ctx);
13548                 gen_helper_dmadd(v1_t, v2_t, t0, cpu_env);
13549                 break;
13550             case OPC_DMADDU:
13551                 check_dsp(ctx);
13552                 gen_helper_dmaddu(v1_t, v2_t, t0, cpu_env);
13553                 break;
13554             case OPC_DMSUB:
13555                 check_dsp(ctx);
13556                 gen_helper_dmsub(v1_t, v2_t, t0, cpu_env);
13557                 break;
13558             case OPC_DMSUBU:
13559                 check_dsp(ctx);
13560                 gen_helper_dmsubu(v1_t, v2_t, t0, cpu_env);
13561                 break;
13562             case OPC_DPA_W_QH:
13563                 check_dspr2(ctx);
13564                 gen_helper_dpa_w_qh(v1_t, v2_t, t0, cpu_env);
13565                 break;
13566             case OPC_DPAQ_S_W_QH:
13567                 check_dsp(ctx);
13568                 gen_helper_dpaq_s_w_qh(v1_t, v2_t, t0, cpu_env);
13569                 break;
13570             case OPC_DPAQ_SA_L_PW:
13571                 check_dsp(ctx);
13572                 gen_helper_dpaq_sa_l_pw(v1_t, v2_t, t0, cpu_env);
13573                 break;
13574             case OPC_DPAU_H_OBL:
13575                 check_dsp(ctx);
13576                 gen_helper_dpau_h_obl(v1_t, v2_t, t0, cpu_env);
13577                 break;
13578             case OPC_DPAU_H_OBR:
13579                 check_dsp(ctx);
13580                 gen_helper_dpau_h_obr(v1_t, v2_t, t0, cpu_env);
13581                 break;
13582             case OPC_DPS_W_QH:
13583                 check_dspr2(ctx);
13584                 gen_helper_dps_w_qh(v1_t, v2_t, t0, cpu_env);
13585                 break;
13586             case OPC_DPSQ_S_W_QH:
13587                 check_dsp(ctx);
13588                 gen_helper_dpsq_s_w_qh(v1_t, v2_t, t0, cpu_env);
13589                 break;
13590             case OPC_DPSQ_SA_L_PW:
13591                 check_dsp(ctx);
13592                 gen_helper_dpsq_sa_l_pw(v1_t, v2_t, t0, cpu_env);
13593                 break;
13594             case OPC_DPSU_H_OBL:
13595                 check_dsp(ctx);
13596                 gen_helper_dpsu_h_obl(v1_t, v2_t, t0, cpu_env);
13597                 break;
13598             case OPC_DPSU_H_OBR:
13599                 check_dsp(ctx);
13600                 gen_helper_dpsu_h_obr(v1_t, v2_t, t0, cpu_env);
13601                 break;
13602             case OPC_MAQ_S_L_PWL:
13603                 check_dsp(ctx);
13604                 gen_helper_maq_s_l_pwl(v1_t, v2_t, t0, cpu_env);
13605                 break;
13606             case OPC_MAQ_S_L_PWR:
13607                 check_dsp(ctx);
13608                 gen_helper_maq_s_l_pwr(v1_t, v2_t, t0, cpu_env);
13609                 break;
13610             case OPC_MAQ_S_W_QHLL:
13611                 check_dsp(ctx);
13612                 gen_helper_maq_s_w_qhll(v1_t, v2_t, t0, cpu_env);
13613                 break;
13614             case OPC_MAQ_SA_W_QHLL:
13615                 check_dsp(ctx);
13616                 gen_helper_maq_sa_w_qhll(v1_t, v2_t, t0, cpu_env);
13617                 break;
13618             case OPC_MAQ_S_W_QHLR:
13619                 check_dsp(ctx);
13620                 gen_helper_maq_s_w_qhlr(v1_t, v2_t, t0, cpu_env);
13621                 break;
13622             case OPC_MAQ_SA_W_QHLR:
13623                 check_dsp(ctx);
13624                 gen_helper_maq_sa_w_qhlr(v1_t, v2_t, t0, cpu_env);
13625                 break;
13626             case OPC_MAQ_S_W_QHRL:
13627                 check_dsp(ctx);
13628                 gen_helper_maq_s_w_qhrl(v1_t, v2_t, t0, cpu_env);
13629                 break;
13630             case OPC_MAQ_SA_W_QHRL:
13631                 check_dsp(ctx);
13632                 gen_helper_maq_sa_w_qhrl(v1_t, v2_t, t0, cpu_env);
13633                 break;
13634             case OPC_MAQ_S_W_QHRR:
13635                 check_dsp(ctx);
13636                 gen_helper_maq_s_w_qhrr(v1_t, v2_t, t0, cpu_env);
13637                 break;
13638             case OPC_MAQ_SA_W_QHRR:
13639                 check_dsp(ctx);
13640                 gen_helper_maq_sa_w_qhrr(v1_t, v2_t, t0, cpu_env);
13641                 break;
13642             case OPC_MULSAQ_S_L_PW:
13643                 check_dsp(ctx);
13644                 gen_helper_mulsaq_s_l_pw(v1_t, v2_t, t0, cpu_env);
13645                 break;
13646             case OPC_MULSAQ_S_W_QH:
13647                 check_dsp(ctx);
13648                 gen_helper_mulsaq_s_w_qh(v1_t, v2_t, t0, cpu_env);
13649                 break;
13650             }
13651         }
13652         break;
13653 #endif
13654     case OPC_ADDU_QB_DSP:
13655         switch (op2) {
13656         case OPC_MULEU_S_PH_QBL:
13657             check_dsp(ctx);
13658             gen_helper_muleu_s_ph_qbl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13659             break;
13660         case OPC_MULEU_S_PH_QBR:
13661             check_dsp(ctx);
13662             gen_helper_muleu_s_ph_qbr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13663             break;
13664         case OPC_MULQ_RS_PH:
13665             check_dsp(ctx);
13666             gen_helper_mulq_rs_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13667             break;
13668         case OPC_MULEQ_S_W_PHL:
13669             check_dsp(ctx);
13670             gen_helper_muleq_s_w_phl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13671             break;
13672         case OPC_MULEQ_S_W_PHR:
13673             check_dsp(ctx);
13674             gen_helper_muleq_s_w_phr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13675             break;
13676         case OPC_MULQ_S_PH:
13677             check_dspr2(ctx);
13678             gen_helper_mulq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13679             break;
13680         }
13681         break;
13682 #ifdef TARGET_MIPS64
13683     case OPC_ADDU_OB_DSP:
13684         switch (op2) {
13685         case OPC_MULEQ_S_PW_QHL:
13686             check_dsp(ctx);
13687             gen_helper_muleq_s_pw_qhl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13688             break;
13689         case OPC_MULEQ_S_PW_QHR:
13690             check_dsp(ctx);
13691             gen_helper_muleq_s_pw_qhr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13692             break;
13693         case OPC_MULEU_S_QH_OBL:
13694             check_dsp(ctx);
13695             gen_helper_muleu_s_qh_obl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13696             break;
13697         case OPC_MULEU_S_QH_OBR:
13698             check_dsp(ctx);
13699             gen_helper_muleu_s_qh_obr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13700             break;
13701         case OPC_MULQ_RS_QH:
13702             check_dsp(ctx);
13703             gen_helper_mulq_rs_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13704             break;
13705         }
13706         break;
13707 #endif
13708     }
13709
13710     tcg_temp_free_i32(t0);
13711     tcg_temp_free(v1_t);
13712     tcg_temp_free(v2_t);
13713
13714     (void)opn; /* avoid a compiler warning */
13715     MIPS_DEBUG("%s", opn);
13716
13717 }
13718
13719 static void gen_mipsdsp_bitinsn(CPUMIPSState *env, DisasContext *ctx,
13720                                 uint32_t op1, uint32_t op2,
13721                                 int ret, int val)
13722 {
13723     const char *opn = "mipsdsp Bit/ Manipulation";
13724     int16_t imm;
13725     TCGv t0;
13726     TCGv val_t;
13727
13728     if (ret == 0) {
13729         /* Treat as NOP. */
13730         MIPS_DEBUG("NOP");
13731         return;
13732     }
13733
13734     t0 = tcg_temp_new();
13735     val_t = tcg_temp_new();
13736     gen_load_gpr(val_t, val);
13737
13738     switch (op1) {
13739     case OPC_ABSQ_S_PH_DSP:
13740         switch (op2) {
13741         case OPC_BITREV:
13742             check_dsp(ctx);
13743             gen_helper_bitrev(cpu_gpr[ret], val_t);
13744             break;
13745         case OPC_REPL_QB:
13746             check_dsp(ctx);
13747             {
13748                 target_long result;
13749                 imm = (ctx->opcode >> 16) & 0xFF;
13750                 result = (uint32_t)imm << 24 |
13751                          (uint32_t)imm << 16 |
13752                          (uint32_t)imm << 8  |
13753                          (uint32_t)imm;
13754                 result = (int32_t)result;
13755                 tcg_gen_movi_tl(cpu_gpr[ret], result);
13756             }
13757             break;
13758         case OPC_REPLV_QB:
13759             check_dsp(ctx);
13760             tcg_gen_ext8u_tl(cpu_gpr[ret], val_t);
13761             tcg_gen_shli_tl(t0, cpu_gpr[ret], 8);
13762             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13763             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
13764             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13765             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
13766             break;
13767         case OPC_REPL_PH:
13768             check_dsp(ctx);
13769             {
13770                 imm = (ctx->opcode >> 16) & 0x03FF;
13771                 tcg_gen_movi_tl(cpu_gpr[ret], \
13772                                 (target_long)((int32_t)imm << 16 | \
13773                                 (uint32_t)(uint16_t)imm));
13774             }
13775             break;
13776         case OPC_REPLV_PH:
13777             check_dsp(ctx);
13778             tcg_gen_ext16u_tl(cpu_gpr[ret], val_t);
13779             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
13780             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13781             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
13782             break;
13783         }
13784         break;
13785 #ifdef TARGET_MIPS64
13786     case OPC_ABSQ_S_QH_DSP:
13787         switch (op2) {
13788         case OPC_REPL_OB:
13789             check_dsp(ctx);
13790             {
13791                 target_long temp;
13792
13793                 imm = (ctx->opcode >> 16) & 0xFF;
13794                 temp = ((uint64_t)imm << 8) | (uint64_t)imm;
13795                 temp = (temp << 16) | temp;
13796                 temp = (temp << 32) | temp;
13797                 tcg_gen_movi_tl(cpu_gpr[ret], temp);
13798                 break;
13799             }
13800         case OPC_REPL_PW:
13801             check_dsp(ctx);
13802             {
13803                 target_long temp;
13804
13805                 imm = (ctx->opcode >> 16) & 0x03FF;
13806                 imm = (int16_t)(imm << 6) >> 6;
13807                 temp = ((target_long)imm << 32) \
13808                        | ((target_long)imm & 0xFFFFFFFF);
13809                 tcg_gen_movi_tl(cpu_gpr[ret], temp);
13810                 break;
13811             }
13812         case OPC_REPL_QH:
13813             check_dsp(ctx);
13814             {
13815                 target_long temp;
13816
13817                 imm = (ctx->opcode >> 16) & 0x03FF;
13818                 imm = (int16_t)(imm << 6) >> 6;
13819
13820                 temp = ((uint64_t)(uint16_t)imm << 48) |
13821                        ((uint64_t)(uint16_t)imm << 32) |
13822                        ((uint64_t)(uint16_t)imm << 16) |
13823                        (uint64_t)(uint16_t)imm;
13824                 tcg_gen_movi_tl(cpu_gpr[ret], temp);
13825                 break;
13826             }
13827         case OPC_REPLV_OB:
13828             check_dsp(ctx);
13829             tcg_gen_ext8u_tl(cpu_gpr[ret], val_t);
13830             tcg_gen_shli_tl(t0, cpu_gpr[ret], 8);
13831             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13832             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
13833             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13834             tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
13835             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13836             break;
13837         case OPC_REPLV_PW:
13838             check_dsp(ctx);
13839             tcg_gen_ext32u_i64(cpu_gpr[ret], val_t);
13840             tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
13841             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13842             break;
13843         case OPC_REPLV_QH:
13844             check_dsp(ctx);
13845             tcg_gen_ext16u_tl(cpu_gpr[ret], val_t);
13846             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
13847             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13848             tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
13849             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13850             break;
13851         }
13852         break;
13853 #endif
13854     }
13855     tcg_temp_free(t0);
13856     tcg_temp_free(val_t);
13857
13858     (void)opn; /* avoid a compiler warning */
13859     MIPS_DEBUG("%s", opn);
13860 }
13861
13862 static void gen_mipsdsp_add_cmp_pick(DisasContext *ctx,
13863                                      uint32_t op1, uint32_t op2,
13864                                      int ret, int v1, int v2, int check_ret)
13865 {
13866     const char *opn = "mipsdsp add compare pick";
13867     TCGv_i32 t0;
13868     TCGv t1;
13869     TCGv v1_t;
13870     TCGv v2_t;
13871
13872     if ((ret == 0) && (check_ret == 1)) {
13873         /* Treat as NOP. */
13874         MIPS_DEBUG("NOP");
13875         return;
13876     }
13877
13878     t0 = tcg_temp_new_i32();
13879     t1 = tcg_temp_new();
13880     v1_t = tcg_temp_new();
13881     v2_t = tcg_temp_new();
13882
13883     gen_load_gpr(v1_t, v1);
13884     gen_load_gpr(v2_t, v2);
13885
13886     switch (op1) {
13887     case OPC_APPEND_DSP:
13888         switch (op2) {
13889         case OPC_APPEND:
13890             tcg_gen_movi_i32(t0, v2);
13891             gen_helper_append(cpu_gpr[ret], cpu_gpr[ret], v1_t, t0);
13892             break;
13893         case OPC_PREPEND:
13894             tcg_gen_movi_i32(t0, v2);
13895             gen_helper_prepend(cpu_gpr[ret], v1_t, cpu_gpr[ret], t0);
13896             break;
13897         case OPC_BALIGN:
13898             tcg_gen_movi_i32(t0, v2);
13899             gen_helper_balign(cpu_gpr[ret], v1_t, cpu_gpr[ret], t0);
13900             break;
13901         default:            /* Invid */
13902             MIPS_INVAL("MASK APPEND");
13903             generate_exception(ctx, EXCP_RI);
13904             break;
13905         }
13906         break;
13907     case OPC_CMPU_EQ_QB_DSP:
13908         switch (op2) {
13909         case OPC_CMPU_EQ_QB:
13910             check_dsp(ctx);
13911             gen_helper_cmpu_eq_qb(v1_t, v2_t, cpu_env);
13912             break;
13913         case OPC_CMPU_LT_QB:
13914             check_dsp(ctx);
13915             gen_helper_cmpu_lt_qb(v1_t, v2_t, cpu_env);
13916             break;
13917         case OPC_CMPU_LE_QB:
13918             check_dsp(ctx);
13919             gen_helper_cmpu_le_qb(v1_t, v2_t, cpu_env);
13920             break;
13921         case OPC_CMPGU_EQ_QB:
13922             check_dsp(ctx);
13923             gen_helper_cmpgu_eq_qb(cpu_gpr[ret], v1_t, v2_t);
13924             break;
13925         case OPC_CMPGU_LT_QB:
13926             check_dsp(ctx);
13927             gen_helper_cmpgu_lt_qb(cpu_gpr[ret], v1_t, v2_t);
13928             break;
13929         case OPC_CMPGU_LE_QB:
13930             check_dsp(ctx);
13931             gen_helper_cmpgu_le_qb(cpu_gpr[ret], v1_t, v2_t);
13932             break;
13933         case OPC_CMPGDU_EQ_QB:
13934             check_dspr2(ctx);
13935             gen_helper_cmpgu_eq_qb(t1, v1_t, v2_t);
13936             tcg_gen_mov_tl(cpu_gpr[ret], t1);
13937             tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
13938             tcg_gen_shli_tl(t1, t1, 24);
13939             tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
13940             break;
13941         case OPC_CMPGDU_LT_QB:
13942             check_dspr2(ctx);
13943             gen_helper_cmpgu_lt_qb(t1, v1_t, v2_t);
13944             tcg_gen_mov_tl(cpu_gpr[ret], t1);
13945             tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
13946             tcg_gen_shli_tl(t1, t1, 24);
13947             tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
13948             break;
13949         case OPC_CMPGDU_LE_QB:
13950             check_dspr2(ctx);
13951             gen_helper_cmpgu_le_qb(t1, v1_t, v2_t);
13952             tcg_gen_mov_tl(cpu_gpr[ret], t1);
13953             tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
13954             tcg_gen_shli_tl(t1, t1, 24);
13955             tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
13956             break;
13957         case OPC_CMP_EQ_PH:
13958             check_dsp(ctx);
13959             gen_helper_cmp_eq_ph(v1_t, v2_t, cpu_env);
13960             break;
13961         case OPC_CMP_LT_PH:
13962             check_dsp(ctx);
13963             gen_helper_cmp_lt_ph(v1_t, v2_t, cpu_env);
13964             break;
13965         case OPC_CMP_LE_PH:
13966             check_dsp(ctx);
13967             gen_helper_cmp_le_ph(v1_t, v2_t, cpu_env);
13968             break;
13969         case OPC_PICK_QB:
13970             check_dsp(ctx);
13971             gen_helper_pick_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13972             break;
13973         case OPC_PICK_PH:
13974             check_dsp(ctx);
13975             gen_helper_pick_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13976             break;
13977         case OPC_PACKRL_PH:
13978             check_dsp(ctx);
13979             gen_helper_packrl_ph(cpu_gpr[ret], v1_t, v2_t);
13980             break;
13981         }
13982         break;
13983 #ifdef TARGET_MIPS64
13984     case OPC_CMPU_EQ_OB_DSP:
13985         switch (op2) {
13986         case OPC_CMP_EQ_PW:
13987             check_dsp(ctx);
13988             gen_helper_cmp_eq_pw(v1_t, v2_t, cpu_env);
13989             break;
13990         case OPC_CMP_LT_PW:
13991             check_dsp(ctx);
13992             gen_helper_cmp_lt_pw(v1_t, v2_t, cpu_env);
13993             break;
13994         case OPC_CMP_LE_PW:
13995             check_dsp(ctx);
13996             gen_helper_cmp_le_pw(v1_t, v2_t, cpu_env);
13997             break;
13998         case OPC_CMP_EQ_QH:
13999             check_dsp(ctx);
14000             gen_helper_cmp_eq_qh(v1_t, v2_t, cpu_env);
14001             break;
14002         case OPC_CMP_LT_QH:
14003             check_dsp(ctx);
14004             gen_helper_cmp_lt_qh(v1_t, v2_t, cpu_env);
14005             break;
14006         case OPC_CMP_LE_QH:
14007             check_dsp(ctx);
14008             gen_helper_cmp_le_qh(v1_t, v2_t, cpu_env);
14009             break;
14010         case OPC_CMPGDU_EQ_OB:
14011             check_dspr2(ctx);
14012             gen_helper_cmpgdu_eq_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14013             break;
14014         case OPC_CMPGDU_LT_OB:
14015             check_dspr2(ctx);
14016             gen_helper_cmpgdu_lt_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14017             break;
14018         case OPC_CMPGDU_LE_OB:
14019             check_dspr2(ctx);
14020             gen_helper_cmpgdu_le_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14021             break;
14022         case OPC_CMPGU_EQ_OB:
14023             check_dsp(ctx);
14024             gen_helper_cmpgu_eq_ob(cpu_gpr[ret], v1_t, v2_t);
14025             break;
14026         case OPC_CMPGU_LT_OB:
14027             check_dsp(ctx);
14028             gen_helper_cmpgu_lt_ob(cpu_gpr[ret], v1_t, v2_t);
14029             break;
14030         case OPC_CMPGU_LE_OB:
14031             check_dsp(ctx);
14032             gen_helper_cmpgu_le_ob(cpu_gpr[ret], v1_t, v2_t);
14033             break;
14034         case OPC_CMPU_EQ_OB:
14035             check_dsp(ctx);
14036             gen_helper_cmpu_eq_ob(v1_t, v2_t, cpu_env);
14037             break;
14038         case OPC_CMPU_LT_OB:
14039             check_dsp(ctx);
14040             gen_helper_cmpu_lt_ob(v1_t, v2_t, cpu_env);
14041             break;
14042         case OPC_CMPU_LE_OB:
14043             check_dsp(ctx);
14044             gen_helper_cmpu_le_ob(v1_t, v2_t, cpu_env);
14045             break;
14046         case OPC_PACKRL_PW:
14047             check_dsp(ctx);
14048             gen_helper_packrl_pw(cpu_gpr[ret], v1_t, v2_t);
14049             break;
14050         case OPC_PICK_OB:
14051             check_dsp(ctx);
14052             gen_helper_pick_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14053             break;
14054         case OPC_PICK_PW:
14055             check_dsp(ctx);
14056             gen_helper_pick_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14057             break;
14058         case OPC_PICK_QH:
14059             check_dsp(ctx);
14060             gen_helper_pick_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14061             break;
14062         }
14063         break;
14064     case OPC_DAPPEND_DSP:
14065         switch (op2) {
14066         case OPC_DAPPEND:
14067             tcg_gen_movi_i32(t0, v2);
14068             gen_helper_dappend(cpu_gpr[ret], v1_t, cpu_gpr[ret], t0);
14069             break;
14070         case OPC_PREPENDD:
14071             tcg_gen_movi_i32(t0, v2);
14072             gen_helper_prependd(cpu_gpr[ret], v1_t, cpu_gpr[ret], t0);
14073             break;
14074         case OPC_PREPENDW:
14075             tcg_gen_movi_i32(t0, v2);
14076             gen_helper_prependw(cpu_gpr[ret], v1_t, cpu_gpr[ret], t0);
14077             break;
14078         case OPC_DBALIGN:
14079             tcg_gen_movi_i32(t0, v2);
14080             gen_helper_dbalign(cpu_gpr[ret], v1_t, cpu_gpr[ret], t0);
14081             break;
14082         default:            /* Invalid */
14083             MIPS_INVAL("MASK DAPPEND");
14084             generate_exception(ctx, EXCP_RI);
14085             break;
14086         }
14087         break;
14088 #endif
14089     }
14090
14091     tcg_temp_free_i32(t0);
14092     tcg_temp_free(t1);
14093     tcg_temp_free(v1_t);
14094     tcg_temp_free(v2_t);
14095
14096     (void)opn; /* avoid a compiler warning */
14097     MIPS_DEBUG("%s", opn);
14098 }
14099
14100 static void gen_mipsdsp_accinsn(DisasContext *ctx, uint32_t op1, uint32_t op2,
14101                                 int ret, int v1, int v2, int check_ret)
14102
14103 {
14104     const char *opn = "mipsdsp accumulator";
14105     TCGv t0;
14106     TCGv t1;
14107     TCGv v1_t;
14108     TCGv v2_t;
14109     int16_t imm;
14110
14111     if ((ret == 0) && (check_ret == 1)) {
14112         /* Treat as NOP. */
14113         MIPS_DEBUG("NOP");
14114         return;
14115     }
14116
14117     t0 = tcg_temp_new();
14118     t1 = tcg_temp_new();
14119     v1_t = tcg_temp_new();
14120     v2_t = tcg_temp_new();
14121
14122     gen_load_gpr(v1_t, v1);
14123     gen_load_gpr(v2_t, v2);
14124
14125     switch (op1) {
14126     case OPC_EXTR_W_DSP:
14127         check_dsp(ctx);
14128         switch (op2) {
14129         case OPC_EXTR_W:
14130             tcg_gen_movi_tl(t0, v2);
14131             tcg_gen_movi_tl(t1, v1);
14132             gen_helper_extr_w(cpu_gpr[ret], t0, t1, cpu_env);
14133             break;
14134         case OPC_EXTR_R_W:
14135             tcg_gen_movi_tl(t0, v2);
14136             tcg_gen_movi_tl(t1, v1);
14137             gen_helper_extr_r_w(cpu_gpr[ret], t0, t1, cpu_env);
14138             break;
14139         case OPC_EXTR_RS_W:
14140             tcg_gen_movi_tl(t0, v2);
14141             tcg_gen_movi_tl(t1, v1);
14142             gen_helper_extr_rs_w(cpu_gpr[ret], t0, t1, cpu_env);
14143             break;
14144         case OPC_EXTR_S_H:
14145             tcg_gen_movi_tl(t0, v2);
14146             tcg_gen_movi_tl(t1, v1);
14147             gen_helper_extr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
14148             break;
14149         case OPC_EXTRV_S_H:
14150             tcg_gen_movi_tl(t0, v2);
14151             gen_helper_extr_s_h(cpu_gpr[ret], t0, v1_t, cpu_env);
14152             break;
14153         case OPC_EXTRV_W:
14154             tcg_gen_movi_tl(t0, v2);
14155             gen_helper_extr_w(cpu_gpr[ret], t0, v1_t, cpu_env);
14156             break;
14157         case OPC_EXTRV_R_W:
14158             tcg_gen_movi_tl(t0, v2);
14159             gen_helper_extr_r_w(cpu_gpr[ret], t0, v1_t, cpu_env);
14160             break;
14161         case OPC_EXTRV_RS_W:
14162             tcg_gen_movi_tl(t0, v2);
14163             gen_helper_extr_rs_w(cpu_gpr[ret], t0, v1_t, cpu_env);
14164             break;
14165         case OPC_EXTP:
14166             tcg_gen_movi_tl(t0, v2);
14167             tcg_gen_movi_tl(t1, v1);
14168             gen_helper_extp(cpu_gpr[ret], t0, t1, cpu_env);
14169             break;
14170         case OPC_EXTPV:
14171             tcg_gen_movi_tl(t0, v2);
14172             gen_helper_extp(cpu_gpr[ret], t0, v1_t, cpu_env);
14173             break;
14174         case OPC_EXTPDP:
14175             tcg_gen_movi_tl(t0, v2);
14176             tcg_gen_movi_tl(t1, v1);
14177             gen_helper_extpdp(cpu_gpr[ret], t0, t1, cpu_env);
14178             break;
14179         case OPC_EXTPDPV:
14180             tcg_gen_movi_tl(t0, v2);
14181             gen_helper_extpdp(cpu_gpr[ret], t0, v1_t, cpu_env);
14182             break;
14183         case OPC_SHILO:
14184             imm = (ctx->opcode >> 20) & 0x3F;
14185             tcg_gen_movi_tl(t0, ret);
14186             tcg_gen_movi_tl(t1, imm);
14187             gen_helper_shilo(t0, t1, cpu_env);
14188             break;
14189         case OPC_SHILOV:
14190             tcg_gen_movi_tl(t0, ret);
14191             gen_helper_shilo(t0, v1_t, cpu_env);
14192             break;
14193         case OPC_MTHLIP:
14194             tcg_gen_movi_tl(t0, ret);
14195             gen_helper_mthlip(t0, v1_t, cpu_env);
14196             break;
14197         case OPC_WRDSP:
14198             imm = (ctx->opcode >> 11) & 0x3FF;
14199             tcg_gen_movi_tl(t0, imm);
14200             gen_helper_wrdsp(v1_t, t0, cpu_env);
14201             break;
14202         case OPC_RDDSP:
14203             imm = (ctx->opcode >> 16) & 0x03FF;
14204             tcg_gen_movi_tl(t0, imm);
14205             gen_helper_rddsp(cpu_gpr[ret], t0, cpu_env);
14206             break;
14207         }
14208         break;
14209 #ifdef TARGET_MIPS64
14210     case OPC_DEXTR_W_DSP:
14211         check_dsp(ctx);
14212         switch (op2) {
14213         case OPC_DMTHLIP:
14214             tcg_gen_movi_tl(t0, ret);
14215             gen_helper_dmthlip(v1_t, t0, cpu_env);
14216             break;
14217         case OPC_DSHILO:
14218             {
14219                 int shift = (ctx->opcode >> 19) & 0x7F;
14220                 int ac = (ctx->opcode >> 11) & 0x03;
14221                 tcg_gen_movi_tl(t0, shift);
14222                 tcg_gen_movi_tl(t1, ac);
14223                 gen_helper_dshilo(t0, t1, cpu_env);
14224                 break;
14225             }
14226         case OPC_DSHILOV:
14227             {
14228                 int ac = (ctx->opcode >> 11) & 0x03;
14229                 tcg_gen_movi_tl(t0, ac);
14230                 gen_helper_dshilo(v1_t, t0, cpu_env);
14231                 break;
14232             }
14233         case OPC_DEXTP:
14234             tcg_gen_movi_tl(t0, v2);
14235             tcg_gen_movi_tl(t1, v1);
14236
14237             gen_helper_dextp(cpu_gpr[ret], t0, t1, cpu_env);
14238             break;
14239         case OPC_DEXTPV:
14240             tcg_gen_movi_tl(t0, v2);
14241             gen_helper_dextp(cpu_gpr[ret], t0, v1_t, cpu_env);
14242             break;
14243         case OPC_DEXTPDP:
14244             tcg_gen_movi_tl(t0, v2);
14245             tcg_gen_movi_tl(t1, v1);
14246             gen_helper_dextpdp(cpu_gpr[ret], t0, t1, cpu_env);
14247             break;
14248         case OPC_DEXTPDPV:
14249             tcg_gen_movi_tl(t0, v2);
14250             gen_helper_dextpdp(cpu_gpr[ret], t0, v1_t, cpu_env);
14251             break;
14252         case OPC_DEXTR_L:
14253             tcg_gen_movi_tl(t0, v2);
14254             tcg_gen_movi_tl(t1, v1);
14255             gen_helper_dextr_l(cpu_gpr[ret], t0, t1, cpu_env);
14256             break;
14257         case OPC_DEXTR_R_L:
14258             tcg_gen_movi_tl(t0, v2);
14259             tcg_gen_movi_tl(t1, v1);
14260             gen_helper_dextr_r_l(cpu_gpr[ret], t0, t1, cpu_env);
14261             break;
14262         case OPC_DEXTR_RS_L:
14263             tcg_gen_movi_tl(t0, v2);
14264             tcg_gen_movi_tl(t1, v1);
14265             gen_helper_dextr_rs_l(cpu_gpr[ret], t0, t1, cpu_env);
14266             break;
14267         case OPC_DEXTR_W:
14268             tcg_gen_movi_tl(t0, v2);
14269             tcg_gen_movi_tl(t1, v1);
14270             gen_helper_dextr_w(cpu_gpr[ret], t0, t1, cpu_env);
14271             break;
14272         case OPC_DEXTR_R_W:
14273             tcg_gen_movi_tl(t0, v2);
14274             tcg_gen_movi_tl(t1, v1);
14275             gen_helper_dextr_r_w(cpu_gpr[ret], t0, t1, cpu_env);
14276             break;
14277         case OPC_DEXTR_RS_W:
14278             tcg_gen_movi_tl(t0, v2);
14279             tcg_gen_movi_tl(t1, v1);
14280             gen_helper_dextr_rs_w(cpu_gpr[ret], t0, t1, cpu_env);
14281             break;
14282         case OPC_DEXTR_S_H:
14283             tcg_gen_movi_tl(t0, v2);
14284             tcg_gen_movi_tl(t1, v1);
14285             gen_helper_dextr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
14286             break;
14287         case OPC_DEXTRV_S_H:
14288             tcg_gen_movi_tl(t0, v2);
14289             tcg_gen_movi_tl(t1, v1);
14290             gen_helper_dextr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
14291             break;
14292         case OPC_DEXTRV_L:
14293             tcg_gen_movi_tl(t0, v2);
14294             gen_helper_dextr_l(cpu_gpr[ret], t0, v1_t, cpu_env);
14295             break;
14296         case OPC_DEXTRV_R_L:
14297             tcg_gen_movi_tl(t0, v2);
14298             gen_helper_dextr_r_l(cpu_gpr[ret], t0, v1_t, cpu_env);
14299             break;
14300         case OPC_DEXTRV_RS_L:
14301             tcg_gen_movi_tl(t0, v2);
14302             gen_helper_dextr_rs_l(cpu_gpr[ret], t0, v1_t, cpu_env);
14303             break;
14304         case OPC_DEXTRV_W:
14305             tcg_gen_movi_tl(t0, v2);
14306             gen_helper_dextr_w(cpu_gpr[ret], t0, v1_t, cpu_env);
14307             break;
14308         case OPC_DEXTRV_R_W:
14309             tcg_gen_movi_tl(t0, v2);
14310             gen_helper_dextr_r_w(cpu_gpr[ret], t0, v1_t, cpu_env);
14311             break;
14312         case OPC_DEXTRV_RS_W:
14313             tcg_gen_movi_tl(t0, v2);
14314             gen_helper_dextr_rs_w(cpu_gpr[ret], t0, v1_t, cpu_env);
14315             break;
14316         }
14317         break;
14318 #endif
14319     }
14320
14321     tcg_temp_free(t0);
14322     tcg_temp_free(t1);
14323     tcg_temp_free(v1_t);
14324     tcg_temp_free(v2_t);
14325
14326     (void)opn; /* avoid a compiler warning */
14327     MIPS_DEBUG("%s", opn);
14328 }
14329
14330 /* End MIPSDSP functions. */
14331
14332 static void decode_opc (CPUMIPSState *env, DisasContext *ctx, int *is_branch)
14333 {
14334     int32_t offset;
14335     int rs, rt, rd, sa;
14336     uint32_t op, op1, op2;
14337     int16_t imm;
14338
14339     /* make sure instructions are on a word boundary */
14340     if (ctx->pc & 0x3) {
14341         env->CP0_BadVAddr = ctx->pc;
14342         generate_exception(ctx, EXCP_AdEL);
14343         return;
14344     }
14345
14346     /* Handle blikely not taken case */
14347     if ((ctx->hflags & MIPS_HFLAG_BMASK_BASE) == MIPS_HFLAG_BL) {
14348         int l1 = gen_new_label();
14349
14350         MIPS_DEBUG("blikely condition (" TARGET_FMT_lx ")", ctx->pc + 4);
14351         tcg_gen_brcondi_tl(TCG_COND_NE, bcond, 0, l1);
14352         tcg_gen_movi_i32(hflags, ctx->hflags & ~MIPS_HFLAG_BMASK);
14353         gen_goto_tb(ctx, 1, ctx->pc + 4);
14354         gen_set_label(l1);
14355     }
14356
14357     if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP | CPU_LOG_TB_OP_OPT))) {
14358         tcg_gen_debug_insn_start(ctx->pc);
14359     }
14360
14361     op = MASK_OP_MAJOR(ctx->opcode);
14362     rs = (ctx->opcode >> 21) & 0x1f;
14363     rt = (ctx->opcode >> 16) & 0x1f;
14364     rd = (ctx->opcode >> 11) & 0x1f;
14365     sa = (ctx->opcode >> 6) & 0x1f;
14366     imm = (int16_t)ctx->opcode;
14367     switch (op) {
14368     case OPC_SPECIAL:
14369         op1 = MASK_SPECIAL(ctx->opcode);
14370         switch (op1) {
14371         case OPC_SLL:          /* Shift with immediate */
14372         case OPC_SRA:
14373             gen_shift_imm(env, ctx, op1, rd, rt, sa);
14374             break;
14375         case OPC_SRL:
14376             switch ((ctx->opcode >> 21) & 0x1f) {
14377             case 1:
14378                 /* rotr is decoded as srl on non-R2 CPUs */
14379                 if (env->insn_flags & ISA_MIPS32R2) {
14380                     op1 = OPC_ROTR;
14381                 }
14382                 /* Fallthrough */
14383             case 0:
14384                 gen_shift_imm(env, ctx, op1, rd, rt, sa);
14385                 break;
14386             default:
14387                 generate_exception(ctx, EXCP_RI);
14388                 break;
14389             }
14390             break;
14391         case OPC_MOVN:         /* Conditional move */
14392         case OPC_MOVZ:
14393             check_insn(env, ctx, ISA_MIPS4 | ISA_MIPS32 |
14394                                  INSN_LOONGSON2E | INSN_LOONGSON2F);
14395             gen_cond_move(env, ctx, op1, rd, rs, rt);
14396             break;
14397         case OPC_ADD ... OPC_SUBU:
14398             gen_arith(env, ctx, op1, rd, rs, rt);
14399             break;
14400         case OPC_SLLV:         /* Shifts */
14401         case OPC_SRAV:
14402             gen_shift(env, ctx, op1, rd, rs, rt);
14403             break;
14404         case OPC_SRLV:
14405             switch ((ctx->opcode >> 6) & 0x1f) {
14406             case 1:
14407                 /* rotrv is decoded as srlv on non-R2 CPUs */
14408                 if (env->insn_flags & ISA_MIPS32R2) {
14409                     op1 = OPC_ROTRV;
14410                 }
14411                 /* Fallthrough */
14412             case 0:
14413                 gen_shift(env, ctx, op1, rd, rs, rt);
14414                 break;
14415             default:
14416                 generate_exception(ctx, EXCP_RI);
14417                 break;
14418             }
14419             break;
14420         case OPC_SLT:          /* Set on less than */
14421         case OPC_SLTU:
14422             gen_slt(env, ctx, op1, rd, rs, rt);
14423             break;
14424         case OPC_AND:          /* Logic*/
14425         case OPC_OR:
14426         case OPC_NOR:
14427         case OPC_XOR:
14428             gen_logic(env, ctx, op1, rd, rs, rt);
14429             break;
14430         case OPC_MULT ... OPC_DIVU:
14431             if (sa) {
14432                 check_insn(env, ctx, INSN_VR54XX);
14433                 op1 = MASK_MUL_VR54XX(ctx->opcode);
14434                 gen_mul_vr54xx(ctx, op1, rd, rs, rt);
14435             } else
14436                 gen_muldiv(ctx, op1, rs, rt);
14437             break;
14438         case OPC_JR ... OPC_JALR:
14439             gen_compute_branch(ctx, op1, 4, rs, rd, sa);
14440             *is_branch = 1;
14441             break;
14442         case OPC_TGE ... OPC_TEQ: /* Traps */
14443         case OPC_TNE:
14444             gen_trap(ctx, op1, rs, rt, -1);
14445             break;
14446         case OPC_MFHI:          /* Move from HI/LO */
14447         case OPC_MFLO:
14448             gen_HILO(ctx, op1, rd);
14449             break;
14450         case OPC_MTHI:
14451         case OPC_MTLO:          /* Move to HI/LO */
14452             gen_HILO(ctx, op1, rs);
14453             break;
14454         case OPC_PMON:          /* Pmon entry point, also R4010 selsl */
14455 #ifdef MIPS_STRICT_STANDARD
14456             MIPS_INVAL("PMON / selsl");
14457             generate_exception(ctx, EXCP_RI);
14458 #else
14459             gen_helper_0e0i(pmon, sa);
14460 #endif
14461             break;
14462         case OPC_SYSCALL:
14463             generate_exception(ctx, EXCP_SYSCALL);
14464             ctx->bstate = BS_STOP;
14465             break;
14466         case OPC_BREAK:
14467             generate_exception(ctx, EXCP_BREAK);
14468             break;
14469         case OPC_SPIM:
14470 #ifdef MIPS_STRICT_STANDARD
14471             MIPS_INVAL("SPIM");
14472             generate_exception(ctx, EXCP_RI);
14473 #else
14474            /* Implemented as RI exception for now. */
14475             MIPS_INVAL("spim (unofficial)");
14476             generate_exception(ctx, EXCP_RI);
14477 #endif
14478             break;
14479         case OPC_SYNC:
14480             /* Treat as NOP. */
14481             break;
14482
14483         case OPC_MOVCI:
14484             check_insn(env, ctx, ISA_MIPS4 | ISA_MIPS32);
14485             if (env->CP0_Config1 & (1 << CP0C1_FP)) {
14486                 check_cp1_enabled(ctx);
14487                 gen_movci(ctx, rd, rs, (ctx->opcode >> 18) & 0x7,
14488                           (ctx->opcode >> 16) & 1);
14489             } else {
14490                 generate_exception_err(ctx, EXCP_CpU, 1);
14491             }
14492             break;
14493
14494 #if defined(TARGET_MIPS64)
14495        /* MIPS64 specific opcodes */
14496         case OPC_DSLL:
14497         case OPC_DSRA:
14498         case OPC_DSLL32:
14499         case OPC_DSRA32:
14500             check_insn(env, ctx, ISA_MIPS3);
14501             check_mips_64(ctx);
14502             gen_shift_imm(env, ctx, op1, rd, rt, sa);
14503             break;
14504         case OPC_DSRL:
14505             switch ((ctx->opcode >> 21) & 0x1f) {
14506             case 1:
14507                 /* drotr is decoded as dsrl on non-R2 CPUs */
14508                 if (env->insn_flags & ISA_MIPS32R2) {
14509                     op1 = OPC_DROTR;
14510                 }
14511                 /* Fallthrough */
14512             case 0:
14513                 check_insn(env, ctx, ISA_MIPS3);
14514                 check_mips_64(ctx);
14515                 gen_shift_imm(env, ctx, op1, rd, rt, sa);
14516                 break;
14517             default:
14518                 generate_exception(ctx, EXCP_RI);
14519                 break;
14520             }
14521             break;
14522         case OPC_DSRL32:
14523             switch ((ctx->opcode >> 21) & 0x1f) {
14524             case 1:
14525                 /* drotr32 is decoded as dsrl32 on non-R2 CPUs */
14526                 if (env->insn_flags & ISA_MIPS32R2) {
14527                     op1 = OPC_DROTR32;
14528                 }
14529                 /* Fallthrough */
14530             case 0:
14531                 check_insn(env, ctx, ISA_MIPS3);
14532                 check_mips_64(ctx);
14533                 gen_shift_imm(env, ctx, op1, rd, rt, sa);
14534                 break;
14535             default:
14536                 generate_exception(ctx, EXCP_RI);
14537                 break;
14538             }
14539             break;
14540         case OPC_DADD ... OPC_DSUBU:
14541             check_insn(env, ctx, ISA_MIPS3);
14542             check_mips_64(ctx);
14543             gen_arith(env, ctx, op1, rd, rs, rt);
14544             break;
14545         case OPC_DSLLV:
14546         case OPC_DSRAV:
14547             check_insn(env, ctx, ISA_MIPS3);
14548             check_mips_64(ctx);
14549             gen_shift(env, ctx, op1, rd, rs, rt);
14550             break;
14551         case OPC_DSRLV:
14552             switch ((ctx->opcode >> 6) & 0x1f) {
14553             case 1:
14554                 /* drotrv is decoded as dsrlv on non-R2 CPUs */
14555                 if (env->insn_flags & ISA_MIPS32R2) {
14556                     op1 = OPC_DROTRV;
14557                 }
14558                 /* Fallthrough */
14559             case 0:
14560                 check_insn(env, ctx, ISA_MIPS3);
14561                 check_mips_64(ctx);
14562                 gen_shift(env, ctx, op1, rd, rs, rt);
14563                 break;
14564             default:
14565                 generate_exception(ctx, EXCP_RI);
14566                 break;
14567             }
14568             break;
14569         case OPC_DMULT ... OPC_DDIVU:
14570             check_insn(env, ctx, ISA_MIPS3);
14571             check_mips_64(ctx);
14572             gen_muldiv(ctx, op1, rs, rt);
14573             break;
14574 #endif
14575         default:            /* Invalid */
14576             MIPS_INVAL("special");
14577             generate_exception(ctx, EXCP_RI);
14578             break;
14579         }
14580         break;
14581     case OPC_SPECIAL2:
14582         op1 = MASK_SPECIAL2(ctx->opcode);
14583         switch (op1) {
14584         case OPC_MADD ... OPC_MADDU: /* Multiply and add/sub */
14585         case OPC_MSUB ... OPC_MSUBU:
14586             check_insn(env, ctx, ISA_MIPS32);
14587             gen_muldiv(ctx, op1, rs, rt);
14588             break;
14589         case OPC_MUL:
14590             gen_arith(env, ctx, op1, rd, rs, rt);
14591             break;
14592         case OPC_CLO:
14593         case OPC_CLZ:
14594             check_insn(env, ctx, ISA_MIPS32);
14595             gen_cl(ctx, op1, rd, rs);
14596             break;
14597         case OPC_SDBBP:
14598             /* XXX: not clear which exception should be raised
14599              *      when in debug mode...
14600              */
14601             check_insn(env, ctx, ISA_MIPS32);
14602             if (!(ctx->hflags & MIPS_HFLAG_DM)) {
14603                 generate_exception(ctx, EXCP_DBp);
14604             } else {
14605                 generate_exception(ctx, EXCP_DBp);
14606             }
14607             /* Treat as NOP. */
14608             break;
14609         case OPC_DIV_G_2F:
14610         case OPC_DIVU_G_2F:
14611         case OPC_MULT_G_2F:
14612         case OPC_MULTU_G_2F:
14613         case OPC_MOD_G_2F:
14614         case OPC_MODU_G_2F:
14615             check_insn(env, ctx, INSN_LOONGSON2F);
14616             gen_loongson_integer(ctx, op1, rd, rs, rt);
14617             break;
14618 #if defined(TARGET_MIPS64)
14619         case OPC_DCLO:
14620         case OPC_DCLZ:
14621             check_insn(env, ctx, ISA_MIPS64);
14622             check_mips_64(ctx);
14623             gen_cl(ctx, op1, rd, rs);
14624             break;
14625         case OPC_DMULT_G_2F:
14626         case OPC_DMULTU_G_2F:
14627         case OPC_DDIV_G_2F:
14628         case OPC_DDIVU_G_2F:
14629         case OPC_DMOD_G_2F:
14630         case OPC_DMODU_G_2F:
14631             check_insn(env, ctx, INSN_LOONGSON2F);
14632             gen_loongson_integer(ctx, op1, rd, rs, rt);
14633             break;
14634 #endif
14635         default:            /* Invalid */
14636             MIPS_INVAL("special2");
14637             generate_exception(ctx, EXCP_RI);
14638             break;
14639         }
14640         break;
14641     case OPC_SPECIAL3:
14642         op1 = MASK_SPECIAL3(ctx->opcode);
14643         switch (op1) {
14644         case OPC_EXT:
14645         case OPC_INS:
14646             check_insn(env, ctx, ISA_MIPS32R2);
14647             gen_bitops(ctx, op1, rt, rs, sa, rd);
14648             break;
14649         case OPC_BSHFL:
14650             check_insn(env, ctx, ISA_MIPS32R2);
14651             op2 = MASK_BSHFL(ctx->opcode);
14652             gen_bshfl(ctx, op2, rt, rd);
14653             break;
14654         case OPC_RDHWR:
14655             gen_rdhwr(env, ctx, rt, rd);
14656             break;
14657         case OPC_FORK:
14658             check_insn(env, ctx, ASE_MT);
14659             {
14660                 TCGv t0 = tcg_temp_new();
14661                 TCGv t1 = tcg_temp_new();
14662
14663                 gen_load_gpr(t0, rt);
14664                 gen_load_gpr(t1, rs);
14665                 gen_helper_fork(t0, t1);
14666                 tcg_temp_free(t0);
14667                 tcg_temp_free(t1);
14668             }
14669             break;
14670         case OPC_YIELD:
14671             check_insn(env, ctx, ASE_MT);
14672             {
14673                 TCGv t0 = tcg_temp_new();
14674
14675                 save_cpu_state(ctx, 1);
14676                 gen_load_gpr(t0, rs);
14677                 gen_helper_yield(t0, cpu_env, t0);
14678                 gen_store_gpr(t0, rd);
14679                 tcg_temp_free(t0);
14680             }
14681             break;
14682         case OPC_DIV_G_2E ... OPC_DIVU_G_2E:
14683         case OPC_MOD_G_2E ... OPC_MODU_G_2E:
14684         case OPC_MULT_G_2E ... OPC_MULTU_G_2E:
14685         /* OPC_MULT_G_2E, OPC_ADDUH_QB_DSP, OPC_MUL_PH_DSP have
14686          * the same mask and op1. */
14687             if ((env->insn_flags & ASE_DSPR2) && (op1 == OPC_MULT_G_2E)) {
14688                 op2 = MASK_ADDUH_QB(ctx->opcode);
14689                 switch (op2) {
14690                 case OPC_ADDUH_QB:
14691                 case OPC_ADDUH_R_QB:
14692                 case OPC_ADDQH_PH:
14693                 case OPC_ADDQH_R_PH:
14694                 case OPC_ADDQH_W:
14695                 case OPC_ADDQH_R_W:
14696                 case OPC_SUBUH_QB:
14697                 case OPC_SUBUH_R_QB:
14698                 case OPC_SUBQH_PH:
14699                 case OPC_SUBQH_R_PH:
14700                 case OPC_SUBQH_W:
14701                 case OPC_SUBQH_R_W:
14702                     gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
14703                     break;
14704                 case OPC_MUL_PH:
14705                 case OPC_MUL_S_PH:
14706                 case OPC_MULQ_S_W:
14707                 case OPC_MULQ_RS_W:
14708                     gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
14709                     break;
14710                 default:
14711                     MIPS_INVAL("MASK ADDUH.QB");
14712                     generate_exception(ctx, EXCP_RI);
14713                     break;
14714                 }
14715             } else if (env->insn_flags & INSN_LOONGSON2E) {
14716                 gen_loongson_integer(ctx, op1, rd, rs, rt);
14717             } else {
14718                 generate_exception(ctx, EXCP_RI);
14719             }
14720             break;
14721         case OPC_LX_DSP:
14722             op2 = MASK_LX(ctx->opcode);
14723             switch (op2) {
14724 #if defined(TARGET_MIPS64)
14725             case OPC_LDX:
14726 #endif
14727             case OPC_LBUX:
14728             case OPC_LHX:
14729             case OPC_LWX:
14730                 gen_mipsdsp_ld(env, ctx, op2, rd, rs, rt);
14731                 break;
14732             default:            /* Invalid */
14733                 MIPS_INVAL("MASK LX");
14734                 generate_exception(ctx, EXCP_RI);
14735                 break;
14736             }
14737             break;
14738         case OPC_ABSQ_S_PH_DSP:
14739             op2 = MASK_ABSQ_S_PH(ctx->opcode);
14740             switch (op2) {
14741             case OPC_ABSQ_S_QB:
14742             case OPC_ABSQ_S_PH:
14743             case OPC_ABSQ_S_W:
14744             case OPC_PRECEQ_W_PHL:
14745             case OPC_PRECEQ_W_PHR:
14746             case OPC_PRECEQU_PH_QBL:
14747             case OPC_PRECEQU_PH_QBR:
14748             case OPC_PRECEQU_PH_QBLA:
14749             case OPC_PRECEQU_PH_QBRA:
14750             case OPC_PRECEU_PH_QBL:
14751             case OPC_PRECEU_PH_QBR:
14752             case OPC_PRECEU_PH_QBLA:
14753             case OPC_PRECEU_PH_QBRA:
14754                 gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
14755                 break;
14756             case OPC_BITREV:
14757             case OPC_REPL_QB:
14758             case OPC_REPLV_QB:
14759             case OPC_REPL_PH:
14760             case OPC_REPLV_PH:
14761                 gen_mipsdsp_bitinsn(env, ctx, op1, op2, rd, rt);
14762                 break;
14763             default:
14764                 MIPS_INVAL("MASK ABSQ_S.PH");
14765                 generate_exception(ctx, EXCP_RI);
14766                 break;
14767             }
14768             break;
14769         case OPC_ADDU_QB_DSP:
14770             op2 = MASK_ADDU_QB(ctx->opcode);
14771             switch (op2) {
14772             case OPC_ADDQ_PH:
14773             case OPC_ADDQ_S_PH:
14774             case OPC_ADDQ_S_W:
14775             case OPC_ADDU_QB:
14776             case OPC_ADDU_S_QB:
14777             case OPC_ADDU_PH:
14778             case OPC_ADDU_S_PH:
14779             case OPC_SUBQ_PH:
14780             case OPC_SUBQ_S_PH:
14781             case OPC_SUBQ_S_W:
14782             case OPC_SUBU_QB:
14783             case OPC_SUBU_S_QB:
14784             case OPC_SUBU_PH:
14785             case OPC_SUBU_S_PH:
14786             case OPC_ADDSC:
14787             case OPC_ADDWC:
14788             case OPC_MODSUB:
14789             case OPC_RADDU_W_QB:
14790                 gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
14791                 break;
14792             case OPC_MULEU_S_PH_QBL:
14793             case OPC_MULEU_S_PH_QBR:
14794             case OPC_MULQ_RS_PH:
14795             case OPC_MULEQ_S_W_PHL:
14796             case OPC_MULEQ_S_W_PHR:
14797             case OPC_MULQ_S_PH:
14798                 gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
14799                 break;
14800             default:            /* Invalid */
14801                 MIPS_INVAL("MASK ADDU.QB");
14802                 generate_exception(ctx, EXCP_RI);
14803                 break;
14804
14805             }
14806             break;
14807         case OPC_CMPU_EQ_QB_DSP:
14808             op2 = MASK_CMPU_EQ_QB(ctx->opcode);
14809             switch (op2) {
14810             case OPC_PRECR_SRA_PH_W:
14811             case OPC_PRECR_SRA_R_PH_W:
14812                 gen_mipsdsp_arith(ctx, op1, op2, rt, rs, rd);
14813                 break;
14814             case OPC_PRECR_QB_PH:
14815             case OPC_PRECRQ_QB_PH:
14816             case OPC_PRECRQ_PH_W:
14817             case OPC_PRECRQ_RS_PH_W:
14818             case OPC_PRECRQU_S_QB_PH:
14819                 gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
14820                 break;
14821             case OPC_CMPU_EQ_QB:
14822             case OPC_CMPU_LT_QB:
14823             case OPC_CMPU_LE_QB:
14824             case OPC_CMP_EQ_PH:
14825             case OPC_CMP_LT_PH:
14826             case OPC_CMP_LE_PH:
14827                 gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 0);
14828                 break;
14829             case OPC_CMPGU_EQ_QB:
14830             case OPC_CMPGU_LT_QB:
14831             case OPC_CMPGU_LE_QB:
14832             case OPC_CMPGDU_EQ_QB:
14833             case OPC_CMPGDU_LT_QB:
14834             case OPC_CMPGDU_LE_QB:
14835             case OPC_PICK_QB:
14836             case OPC_PICK_PH:
14837             case OPC_PACKRL_PH:
14838                 gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 1);
14839                 break;
14840             default:            /* Invalid */
14841                 MIPS_INVAL("MASK CMPU.EQ.QB");
14842                 generate_exception(ctx, EXCP_RI);
14843                 break;
14844             }
14845             break;
14846         case OPC_SHLL_QB_DSP:
14847             gen_mipsdsp_shift(ctx, op1, rd, rs, rt);
14848             break;
14849         case OPC_DPA_W_PH_DSP:
14850             op2 = MASK_DPA_W_PH(ctx->opcode);
14851             switch (op2) {
14852             case OPC_DPAU_H_QBL:
14853             case OPC_DPAU_H_QBR:
14854             case OPC_DPSU_H_QBL:
14855             case OPC_DPSU_H_QBR:
14856             case OPC_DPA_W_PH:
14857             case OPC_DPAX_W_PH:
14858             case OPC_DPAQ_S_W_PH:
14859             case OPC_DPAQX_S_W_PH:
14860             case OPC_DPAQX_SA_W_PH:
14861             case OPC_DPS_W_PH:
14862             case OPC_DPSX_W_PH:
14863             case OPC_DPSQ_S_W_PH:
14864             case OPC_DPSQX_S_W_PH:
14865             case OPC_DPSQX_SA_W_PH:
14866             case OPC_MULSAQ_S_W_PH:
14867             case OPC_DPAQ_SA_L_W:
14868             case OPC_DPSQ_SA_L_W:
14869             case OPC_MAQ_S_W_PHL:
14870             case OPC_MAQ_S_W_PHR:
14871             case OPC_MAQ_SA_W_PHL:
14872             case OPC_MAQ_SA_W_PHR:
14873             case OPC_MULSA_W_PH:
14874                 gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
14875                 break;
14876             default:            /* Invalid */
14877                 MIPS_INVAL("MASK DPAW.PH");
14878                 generate_exception(ctx, EXCP_RI);
14879                 break;
14880             }
14881             break;
14882         case OPC_INSV_DSP:
14883             op2 = MASK_INSV(ctx->opcode);
14884             switch (op2) {
14885             case OPC_INSV:
14886                 check_dsp(ctx);
14887                 {
14888                     TCGv t0, t1;
14889
14890                     if (rt == 0) {
14891                         MIPS_DEBUG("NOP");
14892                         break;
14893                     }
14894
14895                     t0 = tcg_temp_new();
14896                     t1 = tcg_temp_new();
14897
14898                     gen_load_gpr(t0, rt);
14899                     gen_load_gpr(t1, rs);
14900
14901                     gen_helper_insv(cpu_gpr[rt], cpu_env, t1, t0);
14902
14903                     tcg_temp_free(t0);
14904                     tcg_temp_free(t1);
14905                     break;
14906                 }
14907             default:            /* Invalid */
14908                 MIPS_INVAL("MASK INSV");
14909                 generate_exception(ctx, EXCP_RI);
14910                 break;
14911             }
14912             break;
14913         case OPC_APPEND_DSP:
14914             check_dspr2(ctx);
14915             op2 = MASK_APPEND(ctx->opcode);
14916             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rt, rs, rd, 1);
14917             break;
14918         case OPC_EXTR_W_DSP:
14919             op2 = MASK_EXTR_W(ctx->opcode);
14920             switch (op2) {
14921             case OPC_EXTR_W:
14922             case OPC_EXTR_R_W:
14923             case OPC_EXTR_RS_W:
14924             case OPC_EXTR_S_H:
14925             case OPC_EXTRV_S_H:
14926             case OPC_EXTRV_W:
14927             case OPC_EXTRV_R_W:
14928             case OPC_EXTRV_RS_W:
14929             case OPC_EXTP:
14930             case OPC_EXTPV:
14931             case OPC_EXTPDP:
14932             case OPC_EXTPDPV:
14933                 gen_mipsdsp_accinsn(ctx, op1, op2, rt, rs, rd, 1);
14934                 break;
14935             case OPC_RDDSP:
14936                 gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 1);
14937                 break;
14938             case OPC_SHILO:
14939             case OPC_SHILOV:
14940             case OPC_MTHLIP:
14941             case OPC_WRDSP:
14942                 gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 0);
14943                 break;
14944             default:            /* Invalid */
14945                 MIPS_INVAL("MASK EXTR.W");
14946                 generate_exception(ctx, EXCP_RI);
14947                 break;
14948             }
14949             break;
14950 #if defined(TARGET_MIPS64)
14951         case OPC_DEXTM ... OPC_DEXT:
14952         case OPC_DINSM ... OPC_DINS:
14953             check_insn(env, ctx, ISA_MIPS64R2);
14954             check_mips_64(ctx);
14955             gen_bitops(ctx, op1, rt, rs, sa, rd);
14956             break;
14957         case OPC_DBSHFL:
14958             check_insn(env, ctx, ISA_MIPS64R2);
14959             check_mips_64(ctx);
14960             op2 = MASK_DBSHFL(ctx->opcode);
14961             gen_bshfl(ctx, op2, rt, rd);
14962             break;
14963         case OPC_DDIV_G_2E ... OPC_DDIVU_G_2E:
14964         case OPC_DMULT_G_2E ... OPC_DMULTU_G_2E:
14965         case OPC_DMOD_G_2E ... OPC_DMODU_G_2E:
14966             check_insn(env, ctx, INSN_LOONGSON2E);
14967             gen_loongson_integer(ctx, op1, rd, rs, rt);
14968             break;
14969         case OPC_ABSQ_S_QH_DSP:
14970             op2 = MASK_ABSQ_S_QH(ctx->opcode);
14971             switch (op2) {
14972             case OPC_PRECEQ_L_PWL:
14973             case OPC_PRECEQ_L_PWR:
14974             case OPC_PRECEQ_PW_QHL:
14975             case OPC_PRECEQ_PW_QHR:
14976             case OPC_PRECEQ_PW_QHLA:
14977             case OPC_PRECEQ_PW_QHRA:
14978             case OPC_PRECEQU_QH_OBL:
14979             case OPC_PRECEQU_QH_OBR:
14980             case OPC_PRECEQU_QH_OBLA:
14981             case OPC_PRECEQU_QH_OBRA:
14982             case OPC_PRECEU_QH_OBL:
14983             case OPC_PRECEU_QH_OBR:
14984             case OPC_PRECEU_QH_OBLA:
14985             case OPC_PRECEU_QH_OBRA:
14986             case OPC_ABSQ_S_OB:
14987             case OPC_ABSQ_S_PW:
14988             case OPC_ABSQ_S_QH:
14989                 gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
14990                 break;
14991             case OPC_REPL_OB:
14992             case OPC_REPL_PW:
14993             case OPC_REPL_QH:
14994             case OPC_REPLV_OB:
14995             case OPC_REPLV_PW:
14996             case OPC_REPLV_QH:
14997                 gen_mipsdsp_bitinsn(env, ctx, op1, op2, rd, rt);
14998                 break;
14999             default:            /* Invalid */
15000                 MIPS_INVAL("MASK ABSQ_S.QH");
15001                 generate_exception(ctx, EXCP_RI);
15002                 break;
15003             }
15004             break;
15005         case OPC_ADDU_OB_DSP:
15006             op2 = MASK_ADDU_OB(ctx->opcode);
15007             switch (op2) {
15008             case OPC_RADDU_L_OB:
15009             case OPC_SUBQ_PW:
15010             case OPC_SUBQ_S_PW:
15011             case OPC_SUBQ_QH:
15012             case OPC_SUBQ_S_QH:
15013             case OPC_SUBU_OB:
15014             case OPC_SUBU_S_OB:
15015             case OPC_SUBU_QH:
15016             case OPC_SUBU_S_QH:
15017             case OPC_SUBUH_OB:
15018             case OPC_SUBUH_R_OB:
15019             case OPC_ADDQ_PW:
15020             case OPC_ADDQ_S_PW:
15021             case OPC_ADDQ_QH:
15022             case OPC_ADDQ_S_QH:
15023             case OPC_ADDU_OB:
15024             case OPC_ADDU_S_OB:
15025             case OPC_ADDU_QH:
15026             case OPC_ADDU_S_QH:
15027             case OPC_ADDUH_OB:
15028             case OPC_ADDUH_R_OB:
15029                 gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
15030                 break;
15031             case OPC_MULEQ_S_PW_QHL:
15032             case OPC_MULEQ_S_PW_QHR:
15033             case OPC_MULEU_S_QH_OBL:
15034             case OPC_MULEU_S_QH_OBR:
15035             case OPC_MULQ_RS_QH:
15036                 gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
15037                 break;
15038             default:            /* Invalid */
15039                 MIPS_INVAL("MASK ADDU.OB");
15040                 generate_exception(ctx, EXCP_RI);
15041                 break;
15042             }
15043             break;
15044         case OPC_CMPU_EQ_OB_DSP:
15045             op2 = MASK_CMPU_EQ_OB(ctx->opcode);
15046             switch (op2) {
15047             case OPC_PRECR_SRA_QH_PW:
15048             case OPC_PRECR_SRA_R_QH_PW:
15049                 /* Return value is rt. */
15050                 gen_mipsdsp_arith(ctx, op1, op2, rt, rs, rd);
15051                 break;
15052             case OPC_PRECR_OB_QH:
15053             case OPC_PRECRQ_OB_QH:
15054             case OPC_PRECRQ_PW_L:
15055             case OPC_PRECRQ_QH_PW:
15056             case OPC_PRECRQ_RS_QH_PW:
15057             case OPC_PRECRQU_S_OB_QH:
15058                 gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
15059                 break;
15060             case OPC_CMPU_EQ_OB:
15061             case OPC_CMPU_LT_OB:
15062             case OPC_CMPU_LE_OB:
15063             case OPC_CMP_EQ_QH:
15064             case OPC_CMP_LT_QH:
15065             case OPC_CMP_LE_QH:
15066             case OPC_CMP_EQ_PW:
15067             case OPC_CMP_LT_PW:
15068             case OPC_CMP_LE_PW:
15069                 gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 0);
15070                 break;
15071             case OPC_CMPGDU_EQ_OB:
15072             case OPC_CMPGDU_LT_OB:
15073             case OPC_CMPGDU_LE_OB:
15074             case OPC_CMPGU_EQ_OB:
15075             case OPC_CMPGU_LT_OB:
15076             case OPC_CMPGU_LE_OB:
15077             case OPC_PACKRL_PW:
15078             case OPC_PICK_OB:
15079             case OPC_PICK_PW:
15080             case OPC_PICK_QH:
15081                 gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 1);
15082                 break;
15083             default:            /* Invalid */
15084                 MIPS_INVAL("MASK CMPU_EQ.OB");
15085                 generate_exception(ctx, EXCP_RI);
15086                 break;
15087             }
15088             break;
15089         case OPC_DAPPEND_DSP:
15090             check_dspr2(ctx);
15091             op2 = MASK_DAPPEND(ctx->opcode);
15092             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rt, rs, rd, 1);
15093             break;
15094         case OPC_DEXTR_W_DSP:
15095             op2 = MASK_DEXTR_W(ctx->opcode);
15096             switch (op2) {
15097             case OPC_DEXTP:
15098             case OPC_DEXTPDP:
15099             case OPC_DEXTPDPV:
15100             case OPC_DEXTPV:
15101             case OPC_DEXTR_L:
15102             case OPC_DEXTR_R_L:
15103             case OPC_DEXTR_RS_L:
15104             case OPC_DEXTR_W:
15105             case OPC_DEXTR_R_W:
15106             case OPC_DEXTR_RS_W:
15107             case OPC_DEXTR_S_H:
15108             case OPC_DEXTRV_L:
15109             case OPC_DEXTRV_R_L:
15110             case OPC_DEXTRV_RS_L:
15111             case OPC_DEXTRV_S_H:
15112             case OPC_DEXTRV_W:
15113             case OPC_DEXTRV_R_W:
15114             case OPC_DEXTRV_RS_W:
15115                 gen_mipsdsp_accinsn(ctx, op1, op2, rt, rs, rd, 1);
15116                 break;
15117             case OPC_DMTHLIP:
15118             case OPC_DSHILO:
15119             case OPC_DSHILOV:
15120                 gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 0);
15121                 break;
15122             default:            /* Invalid */
15123                 MIPS_INVAL("MASK EXTR.W");
15124                 generate_exception(ctx, EXCP_RI);
15125                 break;
15126             }
15127             break;
15128         case OPC_DPAQ_W_QH_DSP:
15129             op2 = MASK_DPAQ_W_QH(ctx->opcode);
15130             switch (op2) {
15131             case OPC_DPAU_H_OBL:
15132             case OPC_DPAU_H_OBR:
15133             case OPC_DPSU_H_OBL:
15134             case OPC_DPSU_H_OBR:
15135             case OPC_DPA_W_QH:
15136             case OPC_DPAQ_S_W_QH:
15137             case OPC_DPS_W_QH:
15138             case OPC_DPSQ_S_W_QH:
15139             case OPC_MULSAQ_S_W_QH:
15140             case OPC_DPAQ_SA_L_PW:
15141             case OPC_DPSQ_SA_L_PW:
15142             case OPC_MULSAQ_S_L_PW:
15143                 gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
15144                 break;
15145             case OPC_MAQ_S_W_QHLL:
15146             case OPC_MAQ_S_W_QHLR:
15147             case OPC_MAQ_S_W_QHRL:
15148             case OPC_MAQ_S_W_QHRR:
15149             case OPC_MAQ_SA_W_QHLL:
15150             case OPC_MAQ_SA_W_QHLR:
15151             case OPC_MAQ_SA_W_QHRL:
15152             case OPC_MAQ_SA_W_QHRR:
15153             case OPC_MAQ_S_L_PWL:
15154             case OPC_MAQ_S_L_PWR:
15155             case OPC_DMADD:
15156             case OPC_DMADDU:
15157             case OPC_DMSUB:
15158             case OPC_DMSUBU:
15159                 gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
15160                 break;
15161             default:            /* Invalid */
15162                 MIPS_INVAL("MASK DPAQ.W.QH");
15163                 generate_exception(ctx, EXCP_RI);
15164                 break;
15165             }
15166             break;
15167         case OPC_DINSV_DSP:
15168             op2 = MASK_INSV(ctx->opcode);
15169             switch (op2) {
15170             case OPC_DINSV:
15171                 {
15172                     TCGv t0, t1;
15173
15174                     if (rt == 0) {
15175                         MIPS_DEBUG("NOP");
15176                         break;
15177                     }
15178                     check_dsp(ctx);
15179
15180                     t0 = tcg_temp_new();
15181                     t1 = tcg_temp_new();
15182
15183                     gen_load_gpr(t0, rt);
15184                     gen_load_gpr(t1, rs);
15185
15186                     gen_helper_dinsv(cpu_gpr[rt], cpu_env, t1, t0);
15187                     break;
15188                 }
15189             default:            /* Invalid */
15190                 MIPS_INVAL("MASK DINSV");
15191                 generate_exception(ctx, EXCP_RI);
15192                 break;
15193             }
15194             break;
15195         case OPC_SHLL_OB_DSP:
15196             gen_mipsdsp_shift(ctx, op1, rd, rs, rt);
15197             break;
15198 #endif
15199         default:            /* Invalid */
15200             MIPS_INVAL("special3");
15201             generate_exception(ctx, EXCP_RI);
15202             break;
15203         }
15204         break;
15205     case OPC_REGIMM:
15206         op1 = MASK_REGIMM(ctx->opcode);
15207         switch (op1) {
15208         case OPC_BLTZ ... OPC_BGEZL: /* REGIMM branches */
15209         case OPC_BLTZAL ... OPC_BGEZALL:
15210             gen_compute_branch(ctx, op1, 4, rs, -1, imm << 2);
15211             *is_branch = 1;
15212             break;
15213         case OPC_TGEI ... OPC_TEQI: /* REGIMM traps */
15214         case OPC_TNEI:
15215             gen_trap(ctx, op1, rs, -1, imm);
15216             break;
15217         case OPC_SYNCI:
15218             check_insn(env, ctx, ISA_MIPS32R2);
15219             /* Treat as NOP. */
15220             break;
15221         case OPC_BPOSGE32:    /* MIPS DSP branch */
15222 #if defined(TARGET_MIPS64)
15223         case OPC_BPOSGE64:
15224 #endif
15225             check_dsp(ctx);
15226             gen_compute_branch(ctx, op1, 4, -1, -2, (int32_t)imm << 2);
15227             *is_branch = 1;
15228             break;
15229         default:            /* Invalid */
15230             MIPS_INVAL("regimm");
15231             generate_exception(ctx, EXCP_RI);
15232             break;
15233         }
15234         break;
15235     case OPC_CP0:
15236         check_cp0_enabled(ctx);
15237         op1 = MASK_CP0(ctx->opcode);
15238         switch (op1) {
15239         case OPC_MFC0:
15240         case OPC_MTC0:
15241         case OPC_MFTR:
15242         case OPC_MTTR:
15243 #if defined(TARGET_MIPS64)
15244         case OPC_DMFC0:
15245         case OPC_DMTC0:
15246 #endif
15247 #ifndef CONFIG_USER_ONLY
15248             gen_cp0(env, ctx, op1, rt, rd);
15249 #endif /* !CONFIG_USER_ONLY */
15250             break;
15251         case OPC_C0_FIRST ... OPC_C0_LAST:
15252 #ifndef CONFIG_USER_ONLY
15253             gen_cp0(env, ctx, MASK_C0(ctx->opcode), rt, rd);
15254 #endif /* !CONFIG_USER_ONLY */
15255             break;
15256         case OPC_MFMC0:
15257 #ifndef CONFIG_USER_ONLY
15258             {
15259                 TCGv t0 = tcg_temp_new();
15260
15261                 op2 = MASK_MFMC0(ctx->opcode);
15262                 switch (op2) {
15263                 case OPC_DMT:
15264                     check_insn(env, ctx, ASE_MT);
15265                     gen_helper_dmt(t0);
15266                     gen_store_gpr(t0, rt);
15267                     break;
15268                 case OPC_EMT:
15269                     check_insn(env, ctx, ASE_MT);
15270                     gen_helper_emt(t0);
15271                     gen_store_gpr(t0, rt);
15272                     break;
15273                 case OPC_DVPE:
15274                     check_insn(env, ctx, ASE_MT);
15275                     gen_helper_dvpe(t0, cpu_env);
15276                     gen_store_gpr(t0, rt);
15277                     break;
15278                 case OPC_EVPE:
15279                     check_insn(env, ctx, ASE_MT);
15280                     gen_helper_evpe(t0, cpu_env);
15281                     gen_store_gpr(t0, rt);
15282                     break;
15283                 case OPC_DI:
15284                     check_insn(env, ctx, ISA_MIPS32R2);
15285                     save_cpu_state(ctx, 1);
15286                     gen_helper_di(t0, cpu_env);
15287                     gen_store_gpr(t0, rt);
15288                     /* Stop translation as we may have switched the execution mode */
15289                     ctx->bstate = BS_STOP;
15290                     break;
15291                 case OPC_EI:
15292                     check_insn(env, ctx, ISA_MIPS32R2);
15293                     save_cpu_state(ctx, 1);
15294                     gen_helper_ei(t0, cpu_env);
15295                     gen_store_gpr(t0, rt);
15296                     /* Stop translation as we may have switched the execution mode */
15297                     ctx->bstate = BS_STOP;
15298                     break;
15299                 default:            /* Invalid */
15300                     MIPS_INVAL("mfmc0");
15301                     generate_exception(ctx, EXCP_RI);
15302                     break;
15303                 }
15304                 tcg_temp_free(t0);
15305             }
15306 #endif /* !CONFIG_USER_ONLY */
15307             break;
15308         case OPC_RDPGPR:
15309             check_insn(env, ctx, ISA_MIPS32R2);
15310             gen_load_srsgpr(rt, rd);
15311             break;
15312         case OPC_WRPGPR:
15313             check_insn(env, ctx, ISA_MIPS32R2);
15314             gen_store_srsgpr(rt, rd);
15315             break;
15316         default:
15317             MIPS_INVAL("cp0");
15318             generate_exception(ctx, EXCP_RI);
15319             break;
15320         }
15321         break;
15322     case OPC_ADDI: /* Arithmetic with immediate opcode */
15323     case OPC_ADDIU:
15324          gen_arith_imm(env, ctx, op, rt, rs, imm);
15325          break;
15326     case OPC_SLTI: /* Set on less than with immediate opcode */
15327     case OPC_SLTIU:
15328          gen_slt_imm(env, ctx, op, rt, rs, imm);
15329          break;
15330     case OPC_ANDI: /* Arithmetic with immediate opcode */
15331     case OPC_LUI:
15332     case OPC_ORI:
15333     case OPC_XORI:
15334          gen_logic_imm(env, ctx, op, rt, rs, imm);
15335          break;
15336     case OPC_J ... OPC_JAL: /* Jump */
15337          offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
15338          gen_compute_branch(ctx, op, 4, rs, rt, offset);
15339          *is_branch = 1;
15340          break;
15341     case OPC_BEQ ... OPC_BGTZ: /* Branch */
15342     case OPC_BEQL ... OPC_BGTZL:
15343          gen_compute_branch(ctx, op, 4, rs, rt, imm << 2);
15344          *is_branch = 1;
15345          break;
15346     case OPC_LB ... OPC_LWR: /* Load and stores */
15347     case OPC_LL:
15348          gen_ld(env, ctx, op, rt, rs, imm);
15349          break;
15350     case OPC_SB ... OPC_SW:
15351     case OPC_SWR:
15352          gen_st(ctx, op, rt, rs, imm);
15353          break;
15354     case OPC_SC:
15355          gen_st_cond(ctx, op, rt, rs, imm);
15356          break;
15357     case OPC_CACHE:
15358         check_cp0_enabled(ctx);
15359         check_insn(env, ctx, ISA_MIPS3 | ISA_MIPS32);
15360         /* Treat as NOP. */
15361         break;
15362     case OPC_PREF:
15363         check_insn(env, ctx, ISA_MIPS4 | ISA_MIPS32);
15364         /* Treat as NOP. */
15365         break;
15366
15367     /* Floating point (COP1). */
15368     case OPC_LWC1:
15369     case OPC_LDC1:
15370     case OPC_SWC1:
15371     case OPC_SDC1:
15372         gen_cop1_ldst(env, ctx, op, rt, rs, imm);
15373         break;
15374
15375     case OPC_CP1:
15376         if (env->CP0_Config1 & (1 << CP0C1_FP)) {
15377             check_cp1_enabled(ctx);
15378             op1 = MASK_CP1(ctx->opcode);
15379             switch (op1) {
15380             case OPC_MFHC1:
15381             case OPC_MTHC1:
15382                 check_insn(env, ctx, ISA_MIPS32R2);
15383             case OPC_MFC1:
15384             case OPC_CFC1:
15385             case OPC_MTC1:
15386             case OPC_CTC1:
15387                 gen_cp1(ctx, op1, rt, rd);
15388                 break;
15389 #if defined(TARGET_MIPS64)
15390             case OPC_DMFC1:
15391             case OPC_DMTC1:
15392                 check_insn(env, ctx, ISA_MIPS3);
15393                 gen_cp1(ctx, op1, rt, rd);
15394                 break;
15395 #endif
15396             case OPC_BC1ANY2:
15397             case OPC_BC1ANY4:
15398                 check_cop1x(ctx);
15399                 check_insn(env, ctx, ASE_MIPS3D);
15400                 /* fall through */
15401             case OPC_BC1:
15402                 gen_compute_branch1(env, ctx, MASK_BC1(ctx->opcode),
15403                                     (rt >> 2) & 0x7, imm << 2);
15404                 *is_branch = 1;
15405                 break;
15406             case OPC_S_FMT:
15407             case OPC_D_FMT:
15408             case OPC_W_FMT:
15409             case OPC_L_FMT:
15410             case OPC_PS_FMT:
15411                 gen_farith(ctx, ctx->opcode & FOP(0x3f, 0x1f), rt, rd, sa,
15412                            (imm >> 8) & 0x7);
15413                 break;
15414             default:
15415                 MIPS_INVAL("cp1");
15416                 generate_exception (ctx, EXCP_RI);
15417                 break;
15418             }
15419         } else {
15420             generate_exception_err(ctx, EXCP_CpU, 1);
15421         }
15422         break;
15423
15424     /* COP2.  */
15425     case OPC_LWC2:
15426     case OPC_LDC2:
15427     case OPC_SWC2:
15428     case OPC_SDC2:
15429         /* COP2: Not implemented. */
15430         generate_exception_err(ctx, EXCP_CpU, 2);
15431         break;
15432     case OPC_CP2:
15433         check_insn(env, ctx, INSN_LOONGSON2F);
15434         /* Note that these instructions use different fields.  */
15435         gen_loongson_multimedia(ctx, sa, rd, rt);
15436         break;
15437
15438     case OPC_CP3:
15439         if (env->CP0_Config1 & (1 << CP0C1_FP)) {
15440             check_cp1_enabled(ctx);
15441             op1 = MASK_CP3(ctx->opcode);
15442             switch (op1) {
15443             case OPC_LWXC1:
15444             case OPC_LDXC1:
15445             case OPC_LUXC1:
15446             case OPC_SWXC1:
15447             case OPC_SDXC1:
15448             case OPC_SUXC1:
15449                 gen_flt3_ldst(ctx, op1, sa, rd, rs, rt);
15450                 break;
15451             case OPC_PREFX:
15452                 /* Treat as NOP. */
15453                 break;
15454             case OPC_ALNV_PS:
15455             case OPC_MADD_S:
15456             case OPC_MADD_D:
15457             case OPC_MADD_PS:
15458             case OPC_MSUB_S:
15459             case OPC_MSUB_D:
15460             case OPC_MSUB_PS:
15461             case OPC_NMADD_S:
15462             case OPC_NMADD_D:
15463             case OPC_NMADD_PS:
15464             case OPC_NMSUB_S:
15465             case OPC_NMSUB_D:
15466             case OPC_NMSUB_PS:
15467                 gen_flt3_arith(ctx, op1, sa, rs, rd, rt);
15468                 break;
15469             default:
15470                 MIPS_INVAL("cp3");
15471                 generate_exception (ctx, EXCP_RI);
15472                 break;
15473             }
15474         } else {
15475             generate_exception_err(ctx, EXCP_CpU, 1);
15476         }
15477         break;
15478
15479 #if defined(TARGET_MIPS64)
15480     /* MIPS64 opcodes */
15481     case OPC_LWU:
15482     case OPC_LDL ... OPC_LDR:
15483     case OPC_LLD:
15484     case OPC_LD:
15485         check_insn(env, ctx, ISA_MIPS3);
15486         check_mips_64(ctx);
15487         gen_ld(env, ctx, op, rt, rs, imm);
15488         break;
15489     case OPC_SDL ... OPC_SDR:
15490     case OPC_SD:
15491         check_insn(env, ctx, ISA_MIPS3);
15492         check_mips_64(ctx);
15493         gen_st(ctx, op, rt, rs, imm);
15494         break;
15495     case OPC_SCD:
15496         check_insn(env, ctx, ISA_MIPS3);
15497         check_mips_64(ctx);
15498         gen_st_cond(ctx, op, rt, rs, imm);
15499         break;
15500     case OPC_DADDI:
15501     case OPC_DADDIU:
15502         check_insn(env, ctx, ISA_MIPS3);
15503         check_mips_64(ctx);
15504         gen_arith_imm(env, ctx, op, rt, rs, imm);
15505         break;
15506 #endif
15507     case OPC_JALX:
15508         check_insn(env, ctx, ASE_MIPS16 | ASE_MICROMIPS);
15509         offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
15510         gen_compute_branch(ctx, op, 4, rs, rt, offset);
15511         *is_branch = 1;
15512         break;
15513     case OPC_MDMX:
15514         check_insn(env, ctx, ASE_MDMX);
15515         /* MDMX: Not implemented. */
15516     default:            /* Invalid */
15517         MIPS_INVAL("major opcode");
15518         generate_exception(ctx, EXCP_RI);
15519         break;
15520     }
15521 }
15522
15523 static inline void
15524 gen_intermediate_code_internal (CPUMIPSState *env, TranslationBlock *tb,
15525                                 int search_pc)
15526 {
15527     DisasContext ctx;
15528     target_ulong pc_start;
15529     uint16_t *gen_opc_end;
15530     CPUBreakpoint *bp;
15531     int j, lj = -1;
15532     int num_insns;
15533     int max_insns;
15534     int insn_bytes;
15535     int is_branch;
15536
15537     if (search_pc)
15538         qemu_log("search pc %d\n", search_pc);
15539
15540     pc_start = tb->pc;
15541     gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
15542     ctx.pc = pc_start;
15543     ctx.saved_pc = -1;
15544     ctx.singlestep_enabled = env->singlestep_enabled;
15545     ctx.tb = tb;
15546     ctx.bstate = BS_NONE;
15547     /* Restore delay slot state from the tb context.  */
15548     ctx.hflags = (uint32_t)tb->flags; /* FIXME: maybe use 64 bits here? */
15549     restore_cpu_state(env, &ctx);
15550 #ifdef CONFIG_USER_ONLY
15551         ctx.mem_idx = MIPS_HFLAG_UM;
15552 #else
15553         ctx.mem_idx = ctx.hflags & MIPS_HFLAG_KSU;
15554 #endif
15555     num_insns = 0;
15556     max_insns = tb->cflags & CF_COUNT_MASK;
15557     if (max_insns == 0)
15558         max_insns = CF_COUNT_MASK;
15559     LOG_DISAS("\ntb %p idx %d hflags %04x\n", tb, ctx.mem_idx, ctx.hflags);
15560     gen_icount_start();
15561     while (ctx.bstate == BS_NONE) {
15562         if (unlikely(!QTAILQ_EMPTY(&env->breakpoints))) {
15563             QTAILQ_FOREACH(bp, &env->breakpoints, entry) {
15564                 if (bp->pc == ctx.pc) {
15565                     save_cpu_state(&ctx, 1);
15566                     ctx.bstate = BS_BRANCH;
15567                     gen_helper_0e0i(raise_exception, EXCP_DEBUG);
15568                     /* Include the breakpoint location or the tb won't
15569                      * be flushed when it must be.  */
15570                     ctx.pc += 4;
15571                     goto done_generating;
15572                 }
15573             }
15574         }
15575
15576         if (search_pc) {
15577             j = gen_opc_ptr - gen_opc_buf;
15578             if (lj < j) {
15579                 lj++;
15580                 while (lj < j)
15581                     gen_opc_instr_start[lj++] = 0;
15582             }
15583             gen_opc_pc[lj] = ctx.pc;
15584             gen_opc_hflags[lj] = ctx.hflags & MIPS_HFLAG_BMASK;
15585             gen_opc_btarget[lj] = ctx.btarget;
15586             gen_opc_instr_start[lj] = 1;
15587             gen_opc_icount[lj] = num_insns;
15588         }
15589         if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO))
15590             gen_io_start();
15591
15592         is_branch = 0;
15593         if (!(ctx.hflags & MIPS_HFLAG_M16)) {
15594             ctx.opcode = cpu_ldl_code(env, ctx.pc);
15595             insn_bytes = 4;
15596             decode_opc(env, &ctx, &is_branch);
15597         } else if (env->insn_flags & ASE_MICROMIPS) {
15598             ctx.opcode = cpu_lduw_code(env, ctx.pc);
15599             insn_bytes = decode_micromips_opc(env, &ctx, &is_branch);
15600         } else if (env->insn_flags & ASE_MIPS16) {
15601             ctx.opcode = cpu_lduw_code(env, ctx.pc);
15602             insn_bytes = decode_mips16_opc(env, &ctx, &is_branch);
15603         } else {
15604             generate_exception(&ctx, EXCP_RI);
15605             ctx.bstate = BS_STOP;
15606             break;
15607         }
15608         if (!is_branch) {
15609             handle_delay_slot(env, &ctx, insn_bytes);
15610         }
15611         ctx.pc += insn_bytes;
15612
15613         num_insns++;
15614
15615         /* Execute a branch and its delay slot as a single instruction.
15616            This is what GDB expects and is consistent with what the
15617            hardware does (e.g. if a delay slot instruction faults, the
15618            reported PC is the PC of the branch).  */
15619         if (env->singlestep_enabled && (ctx.hflags & MIPS_HFLAG_BMASK) == 0)
15620             break;
15621
15622         if ((ctx.pc & (TARGET_PAGE_SIZE - 1)) == 0)
15623             break;
15624
15625         if (gen_opc_ptr >= gen_opc_end)
15626             break;
15627
15628         if (num_insns >= max_insns)
15629             break;
15630
15631         if (singlestep)
15632             break;
15633     }
15634     if (tb->cflags & CF_LAST_IO)
15635         gen_io_end();
15636     if (env->singlestep_enabled && ctx.bstate != BS_BRANCH) {
15637         save_cpu_state(&ctx, ctx.bstate == BS_NONE);
15638         gen_helper_0e0i(raise_exception, EXCP_DEBUG);
15639     } else {
15640         switch (ctx.bstate) {
15641         case BS_STOP:
15642             gen_goto_tb(&ctx, 0, ctx.pc);
15643             break;
15644         case BS_NONE:
15645             save_cpu_state(&ctx, 0);
15646             gen_goto_tb(&ctx, 0, ctx.pc);
15647             break;
15648         case BS_EXCP:
15649             tcg_gen_exit_tb(0);
15650             break;
15651         case BS_BRANCH:
15652         default:
15653             break;
15654         }
15655     }
15656 done_generating:
15657     gen_icount_end(tb, num_insns);
15658     *gen_opc_ptr = INDEX_op_end;
15659     if (search_pc) {
15660         j = gen_opc_ptr - gen_opc_buf;
15661         lj++;
15662         while (lj <= j)
15663             gen_opc_instr_start[lj++] = 0;
15664     } else {
15665         tb->size = ctx.pc - pc_start;
15666         tb->icount = num_insns;
15667     }
15668 #ifdef DEBUG_DISAS
15669     LOG_DISAS("\n");
15670     if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)) {
15671         qemu_log("IN: %s\n", lookup_symbol(pc_start));
15672         log_target_disas(pc_start, ctx.pc - pc_start, 0);
15673         qemu_log("\n");
15674     }
15675 #endif
15676 }
15677
15678 void gen_intermediate_code (CPUMIPSState *env, struct TranslationBlock *tb)
15679 {
15680     gen_intermediate_code_internal(env, tb, 0);
15681 }
15682
15683 void gen_intermediate_code_pc (CPUMIPSState *env, struct TranslationBlock *tb)
15684 {
15685     gen_intermediate_code_internal(env, tb, 1);
15686 }
15687
15688 static void fpu_dump_state(CPUMIPSState *env, FILE *f, fprintf_function fpu_fprintf,
15689                            int flags)
15690 {
15691     int i;
15692     int is_fpu64 = !!(env->hflags & MIPS_HFLAG_F64);
15693
15694 #define printfpr(fp)                                                    \
15695     do {                                                                \
15696         if (is_fpu64)                                                   \
15697             fpu_fprintf(f, "w:%08x d:%016" PRIx64                       \
15698                         " fd:%13g fs:%13g psu: %13g\n",                 \
15699                         (fp)->w[FP_ENDIAN_IDX], (fp)->d,                \
15700                         (double)(fp)->fd,                               \
15701                         (double)(fp)->fs[FP_ENDIAN_IDX],                \
15702                         (double)(fp)->fs[!FP_ENDIAN_IDX]);              \
15703         else {                                                          \
15704             fpr_t tmp;                                                  \
15705             tmp.w[FP_ENDIAN_IDX] = (fp)->w[FP_ENDIAN_IDX];              \
15706             tmp.w[!FP_ENDIAN_IDX] = ((fp) + 1)->w[FP_ENDIAN_IDX];       \
15707             fpu_fprintf(f, "w:%08x d:%016" PRIx64                       \
15708                         " fd:%13g fs:%13g psu:%13g\n",                  \
15709                         tmp.w[FP_ENDIAN_IDX], tmp.d,                    \
15710                         (double)tmp.fd,                                 \
15711                         (double)tmp.fs[FP_ENDIAN_IDX],                  \
15712                         (double)tmp.fs[!FP_ENDIAN_IDX]);                \
15713         }                                                               \
15714     } while(0)
15715
15716
15717     fpu_fprintf(f, "CP1 FCR0 0x%08x  FCR31 0x%08x  SR.FR %d  fp_status 0x%02x\n",
15718                 env->active_fpu.fcr0, env->active_fpu.fcr31, is_fpu64,
15719                 get_float_exception_flags(&env->active_fpu.fp_status));
15720     for (i = 0; i < 32; (is_fpu64) ? i++ : (i += 2)) {
15721         fpu_fprintf(f, "%3s: ", fregnames[i]);
15722         printfpr(&env->active_fpu.fpr[i]);
15723     }
15724
15725 #undef printfpr
15726 }
15727
15728 #if defined(TARGET_MIPS64) && defined(MIPS_DEBUG_SIGN_EXTENSIONS)
15729 /* Debug help: The architecture requires 32bit code to maintain proper
15730    sign-extended values on 64bit machines.  */
15731
15732 #define SIGN_EXT_P(val) ((((val) & ~0x7fffffff) == 0) || (((val) & ~0x7fffffff) == ~0x7fffffff))
15733
15734 static void
15735 cpu_mips_check_sign_extensions (CPUMIPSState *env, FILE *f,
15736                                 fprintf_function cpu_fprintf,
15737                                 int flags)
15738 {
15739     int i;
15740
15741     if (!SIGN_EXT_P(env->active_tc.PC))
15742         cpu_fprintf(f, "BROKEN: pc=0x" TARGET_FMT_lx "\n", env->active_tc.PC);
15743     if (!SIGN_EXT_P(env->active_tc.HI[0]))
15744         cpu_fprintf(f, "BROKEN: HI=0x" TARGET_FMT_lx "\n", env->active_tc.HI[0]);
15745     if (!SIGN_EXT_P(env->active_tc.LO[0]))
15746         cpu_fprintf(f, "BROKEN: LO=0x" TARGET_FMT_lx "\n", env->active_tc.LO[0]);
15747     if (!SIGN_EXT_P(env->btarget))
15748         cpu_fprintf(f, "BROKEN: btarget=0x" TARGET_FMT_lx "\n", env->btarget);
15749
15750     for (i = 0; i < 32; i++) {
15751         if (!SIGN_EXT_P(env->active_tc.gpr[i]))
15752             cpu_fprintf(f, "BROKEN: %s=0x" TARGET_FMT_lx "\n", regnames[i], env->active_tc.gpr[i]);
15753     }
15754
15755     if (!SIGN_EXT_P(env->CP0_EPC))
15756         cpu_fprintf(f, "BROKEN: EPC=0x" TARGET_FMT_lx "\n", env->CP0_EPC);
15757     if (!SIGN_EXT_P(env->lladdr))
15758         cpu_fprintf(f, "BROKEN: LLAddr=0x" TARGET_FMT_lx "\n", env->lladdr);
15759 }
15760 #endif
15761
15762 void cpu_dump_state (CPUMIPSState *env, FILE *f, fprintf_function cpu_fprintf,
15763                      int flags)
15764 {
15765     int i;
15766
15767     cpu_fprintf(f, "pc=0x" TARGET_FMT_lx " HI=0x" TARGET_FMT_lx
15768                 " LO=0x" TARGET_FMT_lx " ds %04x "
15769                 TARGET_FMT_lx " " TARGET_FMT_ld "\n",
15770                 env->active_tc.PC, env->active_tc.HI[0], env->active_tc.LO[0],
15771                 env->hflags, env->btarget, env->bcond);
15772     for (i = 0; i < 32; i++) {
15773         if ((i & 3) == 0)
15774             cpu_fprintf(f, "GPR%02d:", i);
15775         cpu_fprintf(f, " %s " TARGET_FMT_lx, regnames[i], env->active_tc.gpr[i]);
15776         if ((i & 3) == 3)
15777             cpu_fprintf(f, "\n");
15778     }
15779
15780     cpu_fprintf(f, "CP0 Status  0x%08x Cause   0x%08x EPC    0x" TARGET_FMT_lx "\n",
15781                 env->CP0_Status, env->CP0_Cause, env->CP0_EPC);
15782     cpu_fprintf(f, "    Config0 0x%08x Config1 0x%08x LLAddr 0x" TARGET_FMT_lx "\n",
15783                 env->CP0_Config0, env->CP0_Config1, env->lladdr);
15784     if (env->hflags & MIPS_HFLAG_FPU)
15785         fpu_dump_state(env, f, cpu_fprintf, flags);
15786 #if defined(TARGET_MIPS64) && defined(MIPS_DEBUG_SIGN_EXTENSIONS)
15787     cpu_mips_check_sign_extensions(env, f, cpu_fprintf, flags);
15788 #endif
15789 }
15790
15791 static void mips_tcg_init(void)
15792 {
15793     int i;
15794     static int inited;
15795
15796     /* Initialize various static tables. */
15797     if (inited)
15798         return;
15799
15800     cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env");
15801     TCGV_UNUSED(cpu_gpr[0]);
15802     for (i = 1; i < 32; i++)
15803         cpu_gpr[i] = tcg_global_mem_new(TCG_AREG0,
15804                                         offsetof(CPUMIPSState, active_tc.gpr[i]),
15805                                         regnames[i]);
15806
15807     for (i = 0; i < 32; i++) {
15808         int off = offsetof(CPUMIPSState, active_fpu.fpr[i]);
15809         fpu_f64[i] = tcg_global_mem_new_i64(TCG_AREG0, off, fregnames[i]);
15810     }
15811
15812     cpu_PC = tcg_global_mem_new(TCG_AREG0,
15813                                 offsetof(CPUMIPSState, active_tc.PC), "PC");
15814     for (i = 0; i < MIPS_DSP_ACC; i++) {
15815         cpu_HI[i] = tcg_global_mem_new(TCG_AREG0,
15816                                        offsetof(CPUMIPSState, active_tc.HI[i]),
15817                                        regnames_HI[i]);
15818         cpu_LO[i] = tcg_global_mem_new(TCG_AREG0,
15819                                        offsetof(CPUMIPSState, active_tc.LO[i]),
15820                                        regnames_LO[i]);
15821         cpu_ACX[i] = tcg_global_mem_new(TCG_AREG0,
15822                                         offsetof(CPUMIPSState, active_tc.ACX[i]),
15823                                         regnames_ACX[i]);
15824     }
15825     cpu_dspctrl = tcg_global_mem_new(TCG_AREG0,
15826                                      offsetof(CPUMIPSState, active_tc.DSPControl),
15827                                      "DSPControl");
15828     bcond = tcg_global_mem_new(TCG_AREG0,
15829                                offsetof(CPUMIPSState, bcond), "bcond");
15830     btarget = tcg_global_mem_new(TCG_AREG0,
15831                                  offsetof(CPUMIPSState, btarget), "btarget");
15832     hflags = tcg_global_mem_new_i32(TCG_AREG0,
15833                                     offsetof(CPUMIPSState, hflags), "hflags");
15834
15835     fpu_fcr0 = tcg_global_mem_new_i32(TCG_AREG0,
15836                                       offsetof(CPUMIPSState, active_fpu.fcr0),
15837                                       "fcr0");
15838     fpu_fcr31 = tcg_global_mem_new_i32(TCG_AREG0,
15839                                        offsetof(CPUMIPSState, active_fpu.fcr31),
15840                                        "fcr31");
15841
15842     /* register helpers */
15843 #define GEN_HELPER 2
15844 #include "helper.h"
15845
15846     inited = 1;
15847 }
15848
15849 #include "translate_init.c"
15850
15851 MIPSCPU *cpu_mips_init(const char *cpu_model)
15852 {
15853     MIPSCPU *cpu;
15854     CPUMIPSState *env;
15855     const mips_def_t *def;
15856
15857     def = cpu_mips_find_by_name(cpu_model);
15858     if (!def)
15859         return NULL;
15860     cpu = MIPS_CPU(object_new(TYPE_MIPS_CPU));
15861     env = &cpu->env;
15862     env->cpu_model = def;
15863     env->cpu_model_str = cpu_model;
15864
15865 #ifndef CONFIG_USER_ONLY
15866     mmu_init(env, def);
15867 #endif
15868     fpu_init(env, def);
15869     mvp_init(env, def);
15870     mips_tcg_init();
15871     cpu_reset(CPU(cpu));
15872     qemu_init_vcpu(env);
15873     return cpu;
15874 }
15875
15876 void cpu_state_reset(CPUMIPSState *env)
15877 {
15878     if (qemu_loglevel_mask(CPU_LOG_RESET)) {
15879         qemu_log("CPU Reset (CPU %d)\n", env->cpu_index);
15880         log_cpu_state(env, 0);
15881     }
15882
15883     memset(env, 0, offsetof(CPUMIPSState, breakpoints));
15884     tlb_flush(env, 1);
15885
15886     /* Reset registers to their default values */
15887     env->CP0_PRid = env->cpu_model->CP0_PRid;
15888     env->CP0_Config0 = env->cpu_model->CP0_Config0;
15889 #ifdef TARGET_WORDS_BIGENDIAN
15890     env->CP0_Config0 |= (1 << CP0C0_BE);
15891 #endif
15892     env->CP0_Config1 = env->cpu_model->CP0_Config1;
15893     env->CP0_Config2 = env->cpu_model->CP0_Config2;
15894     env->CP0_Config3 = env->cpu_model->CP0_Config3;
15895     env->CP0_Config6 = env->cpu_model->CP0_Config6;
15896     env->CP0_Config7 = env->cpu_model->CP0_Config7;
15897     env->CP0_LLAddr_rw_bitmask = env->cpu_model->CP0_LLAddr_rw_bitmask
15898                                  << env->cpu_model->CP0_LLAddr_shift;
15899     env->CP0_LLAddr_shift = env->cpu_model->CP0_LLAddr_shift;
15900     env->SYNCI_Step = env->cpu_model->SYNCI_Step;
15901     env->CCRes = env->cpu_model->CCRes;
15902     env->CP0_Status_rw_bitmask = env->cpu_model->CP0_Status_rw_bitmask;
15903     env->CP0_TCStatus_rw_bitmask = env->cpu_model->CP0_TCStatus_rw_bitmask;
15904     env->CP0_SRSCtl = env->cpu_model->CP0_SRSCtl;
15905     env->current_tc = 0;
15906     env->SEGBITS = env->cpu_model->SEGBITS;
15907     env->SEGMask = (target_ulong)((1ULL << env->cpu_model->SEGBITS) - 1);
15908 #if defined(TARGET_MIPS64)
15909     if (env->cpu_model->insn_flags & ISA_MIPS3) {
15910         env->SEGMask |= 3ULL << 62;
15911     }
15912 #endif
15913     env->PABITS = env->cpu_model->PABITS;
15914     env->PAMask = (target_ulong)((1ULL << env->cpu_model->PABITS) - 1);
15915     env->CP0_SRSConf0_rw_bitmask = env->cpu_model->CP0_SRSConf0_rw_bitmask;
15916     env->CP0_SRSConf0 = env->cpu_model->CP0_SRSConf0;
15917     env->CP0_SRSConf1_rw_bitmask = env->cpu_model->CP0_SRSConf1_rw_bitmask;
15918     env->CP0_SRSConf1 = env->cpu_model->CP0_SRSConf1;
15919     env->CP0_SRSConf2_rw_bitmask = env->cpu_model->CP0_SRSConf2_rw_bitmask;
15920     env->CP0_SRSConf2 = env->cpu_model->CP0_SRSConf2;
15921     env->CP0_SRSConf3_rw_bitmask = env->cpu_model->CP0_SRSConf3_rw_bitmask;
15922     env->CP0_SRSConf3 = env->cpu_model->CP0_SRSConf3;
15923     env->CP0_SRSConf4_rw_bitmask = env->cpu_model->CP0_SRSConf4_rw_bitmask;
15924     env->CP0_SRSConf4 = env->cpu_model->CP0_SRSConf4;
15925     env->active_fpu.fcr0 = env->cpu_model->CP1_fcr0;
15926     env->insn_flags = env->cpu_model->insn_flags;
15927
15928 #if defined(CONFIG_USER_ONLY)
15929     env->CP0_Status = (MIPS_HFLAG_UM << CP0St_KSU);
15930     /* Enable access to the CPUNum, SYNCI_Step, CC, and CCRes RDHWR
15931        hardware registers.  */
15932     env->CP0_HWREna |= 0x0000000F;
15933     if (env->CP0_Config1 & (1 << CP0C1_FP)) {
15934         env->CP0_Status |= (1 << CP0St_CU1);
15935     }
15936     if (env->cpu_model->insn_flags & ASE_DSPR2) {
15937         env->hflags |= MIPS_HFLAG_DSP | MIPS_HFLAG_DSPR2;
15938     } else if (env->cpu_model->insn_flags & ASE_DSP) {
15939         env->hflags |= MIPS_HFLAG_DSP;
15940     }
15941 #else
15942     if (env->hflags & MIPS_HFLAG_BMASK) {
15943         /* If the exception was raised from a delay slot,
15944            come back to the jump.  */
15945         env->CP0_ErrorEPC = env->active_tc.PC - 4;
15946     } else {
15947         env->CP0_ErrorEPC = env->active_tc.PC;
15948     }
15949     env->active_tc.PC = (int32_t)0xBFC00000;
15950     env->CP0_Random = env->tlb->nb_tlb - 1;
15951     env->tlb->tlb_in_use = env->tlb->nb_tlb;
15952     env->CP0_Wired = 0;
15953     env->CP0_EBase = 0x80000000 | (env->cpu_index & 0x3FF);
15954     env->CP0_Status = (1 << CP0St_BEV) | (1 << CP0St_ERL);
15955     /* vectored interrupts not implemented, timer on int 7,
15956        no performance counters. */
15957     env->CP0_IntCtl = 0xe0000000;
15958     {
15959         int i;
15960
15961         for (i = 0; i < 7; i++) {
15962             env->CP0_WatchLo[i] = 0;
15963             env->CP0_WatchHi[i] = 0x80000000;
15964         }
15965         env->CP0_WatchLo[7] = 0;
15966         env->CP0_WatchHi[7] = 0;
15967     }
15968     /* Count register increments in debug mode, EJTAG version 1 */
15969     env->CP0_Debug = (1 << CP0DB_CNT) | (0x1 << CP0DB_VER);
15970
15971     if (env->CP0_Config3 & (1 << CP0C3_MT)) {
15972         int i;
15973
15974         /* Only TC0 on VPE 0 starts as active.  */
15975         for (i = 0; i < ARRAY_SIZE(env->tcs); i++) {
15976             env->tcs[i].CP0_TCBind = env->cpu_index << CP0TCBd_CurVPE;
15977             env->tcs[i].CP0_TCHalt = 1;
15978         }
15979         env->active_tc.CP0_TCHalt = 1;
15980         env->halted = 1;
15981
15982         if (!env->cpu_index) {
15983             /* VPE0 starts up enabled.  */
15984             env->mvp->CP0_MVPControl |= (1 << CP0MVPCo_EVP);
15985             env->CP0_VPEConf0 |= (1 << CP0VPEC0_MVP) | (1 << CP0VPEC0_VPA);
15986
15987             /* TC0 starts up unhalted.  */
15988             env->halted = 0;
15989             env->active_tc.CP0_TCHalt = 0;
15990             env->tcs[0].CP0_TCHalt = 0;
15991             /* With thread 0 active.  */
15992             env->active_tc.CP0_TCStatus = (1 << CP0TCSt_A);
15993             env->tcs[0].CP0_TCStatus = (1 << CP0TCSt_A);
15994         }
15995     }
15996 #endif
15997     compute_hflags(env);
15998     env->exception_index = EXCP_NONE;
15999 }
16000
16001 void restore_state_to_opc(CPUMIPSState *env, TranslationBlock *tb, int pc_pos)
16002 {
16003     env->active_tc.PC = gen_opc_pc[pc_pos];
16004     env->hflags &= ~MIPS_HFLAG_BMASK;
16005     env->hflags |= gen_opc_hflags[pc_pos];
16006     switch (env->hflags & MIPS_HFLAG_BMASK_BASE) {
16007     case MIPS_HFLAG_BR:
16008         break;
16009     case MIPS_HFLAG_BC:
16010     case MIPS_HFLAG_BL:
16011     case MIPS_HFLAG_B:
16012         env->btarget = gen_opc_btarget[pc_pos];
16013         break;
16014     }
16015 }