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