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