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