xref: /openbmc/qemu/target/mips/tcg/translate.c (revision 948516a3fac0bdd47eb127fe1a86148ed86d5c65)
1 /*
2  *  MIPS 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  *  Copyright (c) 2020 Philippe Mathieu-Daudé
10  *
11  * This library is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Lesser General Public
13  * License as published by the Free Software Foundation; either
14  * version 2.1 of the License, or (at your option) any later version.
15  *
16  * This library is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * Lesser General Public License for more details.
20  *
21  * You should have received a copy of the GNU Lesser General Public
22  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
23  */
24 
25 #include "qemu/osdep.h"
26 #include "cpu.h"
27 #include "internal.h"
28 #include "tcg/tcg-op.h"
29 #include "exec/translator.h"
30 #include "exec/helper-proto.h"
31 #include "exec/helper-gen.h"
32 #include "semihosting/semihost.h"
33 
34 #include "trace.h"
35 #include "exec/translator.h"
36 #include "exec/log.h"
37 #include "qemu/qemu-print.h"
38 #include "fpu_helper.h"
39 #include "translate.h"
40 
41 /*
42  * Many sysemu-only helpers are not reachable for user-only.
43  * Define stub generators here, so that we need not either sprinkle
44  * ifdefs through the translator, nor provide the helper function.
45  */
46 #define STUB_HELPER(NAME, ...) \
47     static inline void gen_helper_##NAME(__VA_ARGS__) \
48     { g_assert_not_reached(); }
49 
50 #ifdef CONFIG_USER_ONLY
51 STUB_HELPER(cache, TCGv_env env, TCGv val, TCGv_i32 reg)
52 #endif
53 
54 enum {
55     /* indirect opcode tables */
56     OPC_SPECIAL  = (0x00 << 26),
57     OPC_REGIMM   = (0x01 << 26),
58     OPC_CP0      = (0x10 << 26),
59     OPC_CP2      = (0x12 << 26),
60     OPC_CP3      = (0x13 << 26),
61     OPC_SPECIAL2 = (0x1C << 26),
62     OPC_SPECIAL3 = (0x1F << 26),
63     /* arithmetic with immediate */
64     OPC_ADDI     = (0x08 << 26),
65     OPC_ADDIU    = (0x09 << 26),
66     OPC_SLTI     = (0x0A << 26),
67     OPC_SLTIU    = (0x0B << 26),
68     /* logic with immediate */
69     OPC_ANDI     = (0x0C << 26),
70     OPC_ORI      = (0x0D << 26),
71     OPC_XORI     = (0x0E << 26),
72     OPC_LUI      = (0x0F << 26),
73     /* arithmetic with immediate */
74     OPC_DADDI    = (0x18 << 26),
75     OPC_DADDIU   = (0x19 << 26),
76     /* Jump and branches */
77     OPC_J        = (0x02 << 26),
78     OPC_JAL      = (0x03 << 26),
79     OPC_BEQ      = (0x04 << 26),  /* Unconditional if rs = rt = 0 (B) */
80     OPC_BEQL     = (0x14 << 26),
81     OPC_BNE      = (0x05 << 26),
82     OPC_BNEL     = (0x15 << 26),
83     OPC_BLEZ     = (0x06 << 26),
84     OPC_BLEZL    = (0x16 << 26),
85     OPC_BGTZ     = (0x07 << 26),
86     OPC_BGTZL    = (0x17 << 26),
87     OPC_JALX     = (0x1D << 26),
88     OPC_DAUI     = (0x1D << 26),
89     /* Load and stores */
90     OPC_LDL      = (0x1A << 26),
91     OPC_LDR      = (0x1B << 26),
92     OPC_LB       = (0x20 << 26),
93     OPC_LH       = (0x21 << 26),
94     OPC_LWL      = (0x22 << 26),
95     OPC_LW       = (0x23 << 26),
96     OPC_LWPC     = OPC_LW | 0x5,
97     OPC_LBU      = (0x24 << 26),
98     OPC_LHU      = (0x25 << 26),
99     OPC_LWR      = (0x26 << 26),
100     OPC_LWU      = (0x27 << 26),
101     OPC_SB       = (0x28 << 26),
102     OPC_SH       = (0x29 << 26),
103     OPC_SWL      = (0x2A << 26),
104     OPC_SW       = (0x2B << 26),
105     OPC_SDL      = (0x2C << 26),
106     OPC_SDR      = (0x2D << 26),
107     OPC_SWR      = (0x2E << 26),
108     OPC_LL       = (0x30 << 26),
109     OPC_LLD      = (0x34 << 26),
110     OPC_LD       = (0x37 << 26),
111     OPC_LDPC     = OPC_LD | 0x5,
112     OPC_SC       = (0x38 << 26),
113     OPC_SCD      = (0x3C << 26),
114     OPC_SD       = (0x3F << 26),
115     /* Floating point load/store */
116     OPC_LWC1     = (0x31 << 26),
117     OPC_LWC2     = (0x32 << 26),
118     OPC_LDC1     = (0x35 << 26),
119     OPC_LDC2     = (0x36 << 26),
120     OPC_SWC1     = (0x39 << 26),
121     OPC_SWC2     = (0x3A << 26),
122     OPC_SDC1     = (0x3D << 26),
123     OPC_SDC2     = (0x3E << 26),
124     /* Compact Branches */
125     OPC_BLEZALC  = (0x06 << 26),
126     OPC_BGEZALC  = (0x06 << 26),
127     OPC_BGEUC    = (0x06 << 26),
128     OPC_BGTZALC  = (0x07 << 26),
129     OPC_BLTZALC  = (0x07 << 26),
130     OPC_BLTUC    = (0x07 << 26),
131     OPC_BOVC     = (0x08 << 26),
132     OPC_BEQZALC  = (0x08 << 26),
133     OPC_BEQC     = (0x08 << 26),
134     OPC_BLEZC    = (0x16 << 26),
135     OPC_BGEZC    = (0x16 << 26),
136     OPC_BGEC     = (0x16 << 26),
137     OPC_BGTZC    = (0x17 << 26),
138     OPC_BLTZC    = (0x17 << 26),
139     OPC_BLTC     = (0x17 << 26),
140     OPC_BNVC     = (0x18 << 26),
141     OPC_BNEZALC  = (0x18 << 26),
142     OPC_BNEC     = (0x18 << 26),
143     OPC_BC       = (0x32 << 26),
144     OPC_BEQZC    = (0x36 << 26),
145     OPC_JIC      = (0x36 << 26),
146     OPC_BALC     = (0x3A << 26),
147     OPC_BNEZC    = (0x3E << 26),
148     OPC_JIALC    = (0x3E << 26),
149     /* MDMX ASE specific */
150     OPC_MDMX     = (0x1E << 26),
151     /* Cache and prefetch */
152     OPC_CACHE    = (0x2F << 26),
153     OPC_PREF     = (0x33 << 26),
154     /* PC-relative address computation / loads */
155     OPC_PCREL    = (0x3B << 26),
156 };
157 
158 /* PC-relative address computation / loads  */
159 #define MASK_OPC_PCREL_TOP2BITS(op) (MASK_OP_MAJOR(op) | (op & (3 << 19)))
160 #define MASK_OPC_PCREL_TOP5BITS(op) (MASK_OP_MAJOR(op) | (op & (0x1f << 16)))
161 enum {
162     /* Instructions determined by bits 19 and 20 */
163     OPC_ADDIUPC = OPC_PCREL | (0 << 19),
164     R6_OPC_LWPC = OPC_PCREL | (1 << 19),
165     OPC_LWUPC   = OPC_PCREL | (2 << 19),
166 
167     /* Instructions determined by bits 16 ... 20 */
168     OPC_AUIPC   = OPC_PCREL | (0x1e << 16),
169     OPC_ALUIPC  = OPC_PCREL | (0x1f << 16),
170 
171     /* Other */
172     R6_OPC_LDPC = OPC_PCREL | (6 << 18),
173 };
174 
175 /* MIPS special opcodes */
176 #define MASK_SPECIAL(op)            (MASK_OP_MAJOR(op) | (op & 0x3F))
177 
178 enum {
179     /* Shifts */
180     OPC_SLL      = 0x00 | OPC_SPECIAL,
181     /* NOP is SLL r0, r0, 0   */
182     /* SSNOP is SLL r0, r0, 1 */
183     /* EHB is SLL r0, r0, 3 */
184     OPC_SRL      = 0x02 | OPC_SPECIAL, /* also ROTR */
185     OPC_ROTR     = OPC_SRL | (1 << 21),
186     OPC_SRA      = 0x03 | OPC_SPECIAL,
187     OPC_SLLV     = 0x04 | OPC_SPECIAL,
188     OPC_SRLV     = 0x06 | OPC_SPECIAL, /* also ROTRV */
189     OPC_ROTRV    = OPC_SRLV | (1 << 6),
190     OPC_SRAV     = 0x07 | OPC_SPECIAL,
191     OPC_DSLLV    = 0x14 | OPC_SPECIAL,
192     OPC_DSRLV    = 0x16 | OPC_SPECIAL, /* also DROTRV */
193     OPC_DROTRV   = OPC_DSRLV | (1 << 6),
194     OPC_DSRAV    = 0x17 | OPC_SPECIAL,
195     OPC_DSLL     = 0x38 | OPC_SPECIAL,
196     OPC_DSRL     = 0x3A | OPC_SPECIAL, /* also DROTR */
197     OPC_DROTR    = OPC_DSRL | (1 << 21),
198     OPC_DSRA     = 0x3B | OPC_SPECIAL,
199     OPC_DSLL32   = 0x3C | OPC_SPECIAL,
200     OPC_DSRL32   = 0x3E | OPC_SPECIAL, /* also DROTR32 */
201     OPC_DROTR32  = OPC_DSRL32 | (1 << 21),
202     OPC_DSRA32   = 0x3F | OPC_SPECIAL,
203     /* Multiplication / division */
204     OPC_MULT     = 0x18 | OPC_SPECIAL,
205     OPC_MULTU    = 0x19 | OPC_SPECIAL,
206     OPC_DIV      = 0x1A | OPC_SPECIAL,
207     OPC_DIVU     = 0x1B | OPC_SPECIAL,
208     OPC_DMULT    = 0x1C | OPC_SPECIAL,
209     OPC_DMULTU   = 0x1D | OPC_SPECIAL,
210     OPC_DDIV     = 0x1E | OPC_SPECIAL,
211     OPC_DDIVU    = 0x1F | OPC_SPECIAL,
212 
213     /* 2 registers arithmetic / logic */
214     OPC_ADD      = 0x20 | OPC_SPECIAL,
215     OPC_ADDU     = 0x21 | OPC_SPECIAL,
216     OPC_SUB      = 0x22 | OPC_SPECIAL,
217     OPC_SUBU     = 0x23 | OPC_SPECIAL,
218     OPC_AND      = 0x24 | OPC_SPECIAL,
219     OPC_OR       = 0x25 | OPC_SPECIAL,
220     OPC_XOR      = 0x26 | OPC_SPECIAL,
221     OPC_NOR      = 0x27 | OPC_SPECIAL,
222     OPC_SLT      = 0x2A | OPC_SPECIAL,
223     OPC_SLTU     = 0x2B | OPC_SPECIAL,
224     OPC_DADD     = 0x2C | OPC_SPECIAL,
225     OPC_DADDU    = 0x2D | OPC_SPECIAL,
226     OPC_DSUB     = 0x2E | OPC_SPECIAL,
227     OPC_DSUBU    = 0x2F | OPC_SPECIAL,
228     /* Jumps */
229     OPC_JR       = 0x08 | OPC_SPECIAL, /* Also JR.HB */
230     OPC_JALR     = 0x09 | OPC_SPECIAL, /* Also JALR.HB */
231     /* Traps */
232     OPC_TGE      = 0x30 | OPC_SPECIAL,
233     OPC_TGEU     = 0x31 | OPC_SPECIAL,
234     OPC_TLT      = 0x32 | OPC_SPECIAL,
235     OPC_TLTU     = 0x33 | OPC_SPECIAL,
236     OPC_TEQ      = 0x34 | OPC_SPECIAL,
237     OPC_TNE      = 0x36 | OPC_SPECIAL,
238     /* HI / LO registers load & stores */
239     OPC_MFHI     = 0x10 | OPC_SPECIAL,
240     OPC_MTHI     = 0x11 | OPC_SPECIAL,
241     OPC_MFLO     = 0x12 | OPC_SPECIAL,
242     OPC_MTLO     = 0x13 | OPC_SPECIAL,
243     /* Conditional moves */
244     OPC_MOVZ     = 0x0A | OPC_SPECIAL,
245     OPC_MOVN     = 0x0B | OPC_SPECIAL,
246 
247     OPC_SELEQZ   = 0x35 | OPC_SPECIAL,
248     OPC_SELNEZ   = 0x37 | OPC_SPECIAL,
249 
250     OPC_MOVCI    = 0x01 | OPC_SPECIAL,
251 
252     /* Special */
253     OPC_PMON     = 0x05 | OPC_SPECIAL, /* unofficial */
254     OPC_SYSCALL  = 0x0C | OPC_SPECIAL,
255     OPC_BREAK    = 0x0D | OPC_SPECIAL,
256     OPC_SPIM     = 0x0E | OPC_SPECIAL, /* unofficial */
257     OPC_SYNC     = 0x0F | OPC_SPECIAL,
258 
259     OPC_SPECIAL28_RESERVED = 0x28 | OPC_SPECIAL,
260     OPC_SPECIAL29_RESERVED = 0x29 | OPC_SPECIAL,
261     OPC_SPECIAL39_RESERVED = 0x39 | OPC_SPECIAL,
262     OPC_SPECIAL3D_RESERVED = 0x3D | OPC_SPECIAL,
263 };
264 
265 /*
266  * R6 Multiply and Divide instructions have the same opcode
267  * and function field as legacy OPC_MULT[U]/OPC_DIV[U]
268  */
269 #define MASK_R6_MULDIV(op)          (MASK_SPECIAL(op) | (op & (0x7ff)))
270 
271 enum {
272     R6_OPC_MUL   = OPC_MULT  | (2 << 6),
273     R6_OPC_MUH   = OPC_MULT  | (3 << 6),
274     R6_OPC_MULU  = OPC_MULTU | (2 << 6),
275     R6_OPC_MUHU  = OPC_MULTU | (3 << 6),
276     R6_OPC_DIV   = OPC_DIV   | (2 << 6),
277     R6_OPC_MOD   = OPC_DIV   | (3 << 6),
278     R6_OPC_DIVU  = OPC_DIVU  | (2 << 6),
279     R6_OPC_MODU  = OPC_DIVU  | (3 << 6),
280 
281     R6_OPC_DMUL   = OPC_DMULT  | (2 << 6),
282     R6_OPC_DMUH   = OPC_DMULT  | (3 << 6),
283     R6_OPC_DMULU  = OPC_DMULTU | (2 << 6),
284     R6_OPC_DMUHU  = OPC_DMULTU | (3 << 6),
285     R6_OPC_DDIV   = OPC_DDIV   | (2 << 6),
286     R6_OPC_DMOD   = OPC_DDIV   | (3 << 6),
287     R6_OPC_DDIVU  = OPC_DDIVU  | (2 << 6),
288     R6_OPC_DMODU  = OPC_DDIVU  | (3 << 6),
289 
290     R6_OPC_CLZ      = 0x10 | OPC_SPECIAL,
291     R6_OPC_CLO      = 0x11 | OPC_SPECIAL,
292     R6_OPC_DCLZ     = 0x12 | OPC_SPECIAL,
293     R6_OPC_DCLO     = 0x13 | OPC_SPECIAL,
294     R6_OPC_SDBBP    = 0x0e | OPC_SPECIAL,
295 };
296 
297 /* REGIMM (rt field) opcodes */
298 #define MASK_REGIMM(op)             (MASK_OP_MAJOR(op) | (op & (0x1F << 16)))
299 
300 enum {
301     OPC_BLTZ     = (0x00 << 16) | OPC_REGIMM,
302     OPC_BLTZL    = (0x02 << 16) | OPC_REGIMM,
303     OPC_BGEZ     = (0x01 << 16) | OPC_REGIMM,
304     OPC_BGEZL    = (0x03 << 16) | OPC_REGIMM,
305     OPC_BLTZAL   = (0x10 << 16) | OPC_REGIMM,
306     OPC_BLTZALL  = (0x12 << 16) | OPC_REGIMM,
307     OPC_BGEZAL   = (0x11 << 16) | OPC_REGIMM,
308     OPC_BGEZALL  = (0x13 << 16) | OPC_REGIMM,
309     OPC_TGEI     = (0x08 << 16) | OPC_REGIMM,
310     OPC_TGEIU    = (0x09 << 16) | OPC_REGIMM,
311     OPC_TLTI     = (0x0A << 16) | OPC_REGIMM,
312     OPC_TLTIU    = (0x0B << 16) | OPC_REGIMM,
313     OPC_TEQI     = (0x0C << 16) | OPC_REGIMM,
314     OPC_TNEI     = (0x0E << 16) | OPC_REGIMM,
315     OPC_SIGRIE   = (0x17 << 16) | OPC_REGIMM,
316     OPC_SYNCI    = (0x1F << 16) | OPC_REGIMM,
317 
318     OPC_DAHI     = (0x06 << 16) | OPC_REGIMM,
319     OPC_DATI     = (0x1e << 16) | OPC_REGIMM,
320 };
321 
322 /* Special2 opcodes */
323 #define MASK_SPECIAL2(op)           (MASK_OP_MAJOR(op) | (op & 0x3F))
324 
325 enum {
326     /* Multiply & xxx operations */
327     OPC_MADD     = 0x00 | OPC_SPECIAL2,
328     OPC_MADDU    = 0x01 | OPC_SPECIAL2,
329     OPC_MUL      = 0x02 | OPC_SPECIAL2,
330     OPC_MSUB     = 0x04 | OPC_SPECIAL2,
331     OPC_MSUBU    = 0x05 | OPC_SPECIAL2,
332     /* Loongson 2F */
333     OPC_MULT_G_2F   = 0x10 | OPC_SPECIAL2,
334     OPC_DMULT_G_2F  = 0x11 | OPC_SPECIAL2,
335     OPC_MULTU_G_2F  = 0x12 | OPC_SPECIAL2,
336     OPC_DMULTU_G_2F = 0x13 | OPC_SPECIAL2,
337     OPC_DIV_G_2F    = 0x14 | OPC_SPECIAL2,
338     OPC_DDIV_G_2F   = 0x15 | OPC_SPECIAL2,
339     OPC_DIVU_G_2F   = 0x16 | OPC_SPECIAL2,
340     OPC_DDIVU_G_2F  = 0x17 | OPC_SPECIAL2,
341     OPC_MOD_G_2F    = 0x1c | OPC_SPECIAL2,
342     OPC_DMOD_G_2F   = 0x1d | OPC_SPECIAL2,
343     OPC_MODU_G_2F   = 0x1e | OPC_SPECIAL2,
344     OPC_DMODU_G_2F  = 0x1f | OPC_SPECIAL2,
345     /* Misc */
346     OPC_CLZ      = 0x20 | OPC_SPECIAL2,
347     OPC_CLO      = 0x21 | OPC_SPECIAL2,
348     OPC_DCLZ     = 0x24 | OPC_SPECIAL2,
349     OPC_DCLO     = 0x25 | OPC_SPECIAL2,
350     /* Special */
351     OPC_SDBBP    = 0x3F | OPC_SPECIAL2,
352 };
353 
354 /* Special3 opcodes */
355 #define MASK_SPECIAL3(op)           (MASK_OP_MAJOR(op) | (op & 0x3F))
356 
357 enum {
358     OPC_EXT      = 0x00 | OPC_SPECIAL3,
359     OPC_DEXTM    = 0x01 | OPC_SPECIAL3,
360     OPC_DEXTU    = 0x02 | OPC_SPECIAL3,
361     OPC_DEXT     = 0x03 | OPC_SPECIAL3,
362     OPC_INS      = 0x04 | OPC_SPECIAL3,
363     OPC_DINSM    = 0x05 | OPC_SPECIAL3,
364     OPC_DINSU    = 0x06 | OPC_SPECIAL3,
365     OPC_DINS     = 0x07 | OPC_SPECIAL3,
366     OPC_FORK     = 0x08 | OPC_SPECIAL3,
367     OPC_YIELD    = 0x09 | OPC_SPECIAL3,
368     OPC_BSHFL    = 0x20 | OPC_SPECIAL3,
369     OPC_DBSHFL   = 0x24 | OPC_SPECIAL3,
370     OPC_RDHWR    = 0x3B | OPC_SPECIAL3,
371     OPC_GINV     = 0x3D | OPC_SPECIAL3,
372 
373     /* Loongson 2E */
374     OPC_MULT_G_2E   = 0x18 | OPC_SPECIAL3,
375     OPC_MULTU_G_2E  = 0x19 | OPC_SPECIAL3,
376     OPC_DIV_G_2E    = 0x1A | OPC_SPECIAL3,
377     OPC_DIVU_G_2E   = 0x1B | OPC_SPECIAL3,
378     OPC_DMULT_G_2E  = 0x1C | OPC_SPECIAL3,
379     OPC_DMULTU_G_2E = 0x1D | OPC_SPECIAL3,
380     OPC_DDIV_G_2E   = 0x1E | OPC_SPECIAL3,
381     OPC_DDIVU_G_2E  = 0x1F | OPC_SPECIAL3,
382     OPC_MOD_G_2E    = 0x22 | OPC_SPECIAL3,
383     OPC_MODU_G_2E   = 0x23 | OPC_SPECIAL3,
384     OPC_DMOD_G_2E   = 0x26 | OPC_SPECIAL3,
385     OPC_DMODU_G_2E  = 0x27 | OPC_SPECIAL3,
386 
387     /* MIPS DSP Load */
388     OPC_LX_DSP         = 0x0A | OPC_SPECIAL3,
389     /* MIPS DSP Arithmetic */
390     OPC_ADDU_QB_DSP    = 0x10 | OPC_SPECIAL3,
391     OPC_ADDU_OB_DSP    = 0x14 | OPC_SPECIAL3,
392     OPC_ABSQ_S_PH_DSP  = 0x12 | OPC_SPECIAL3,
393     OPC_ABSQ_S_QH_DSP  = 0x16 | OPC_SPECIAL3,
394     /* OPC_ADDUH_QB_DSP is same as OPC_MULT_G_2E.  */
395     /* OPC_ADDUH_QB_DSP   = 0x18 | OPC_SPECIAL3,  */
396     OPC_CMPU_EQ_QB_DSP = 0x11 | OPC_SPECIAL3,
397     OPC_CMPU_EQ_OB_DSP = 0x15 | OPC_SPECIAL3,
398     /* MIPS DSP GPR-Based Shift Sub-class */
399     OPC_SHLL_QB_DSP    = 0x13 | OPC_SPECIAL3,
400     OPC_SHLL_OB_DSP    = 0x17 | OPC_SPECIAL3,
401     /* MIPS DSP Multiply Sub-class insns */
402     /* OPC_MUL_PH_DSP is same as OPC_ADDUH_QB_DSP.  */
403     /* OPC_MUL_PH_DSP     = 0x18 | OPC_SPECIAL3,  */
404     OPC_DPA_W_PH_DSP   = 0x30 | OPC_SPECIAL3,
405     OPC_DPAQ_W_QH_DSP  = 0x34 | OPC_SPECIAL3,
406     /* DSP Bit/Manipulation Sub-class */
407     OPC_INSV_DSP       = 0x0C | OPC_SPECIAL3,
408     OPC_DINSV_DSP      = 0x0D | OPC_SPECIAL3,
409     /* MIPS DSP Append Sub-class */
410     OPC_APPEND_DSP     = 0x31 | OPC_SPECIAL3,
411     OPC_DAPPEND_DSP    = 0x35 | OPC_SPECIAL3,
412     /* MIPS DSP Accumulator and DSPControl Access Sub-class */
413     OPC_EXTR_W_DSP     = 0x38 | OPC_SPECIAL3,
414     OPC_DEXTR_W_DSP    = 0x3C | OPC_SPECIAL3,
415 
416     /* EVA */
417     OPC_LWLE           = 0x19 | OPC_SPECIAL3,
418     OPC_LWRE           = 0x1A | OPC_SPECIAL3,
419     OPC_CACHEE         = 0x1B | OPC_SPECIAL3,
420     OPC_SBE            = 0x1C | OPC_SPECIAL3,
421     OPC_SHE            = 0x1D | OPC_SPECIAL3,
422     OPC_SCE            = 0x1E | OPC_SPECIAL3,
423     OPC_SWE            = 0x1F | OPC_SPECIAL3,
424     OPC_SWLE           = 0x21 | OPC_SPECIAL3,
425     OPC_SWRE           = 0x22 | OPC_SPECIAL3,
426     OPC_PREFE          = 0x23 | OPC_SPECIAL3,
427     OPC_LBUE           = 0x28 | OPC_SPECIAL3,
428     OPC_LHUE           = 0x29 | OPC_SPECIAL3,
429     OPC_LBE            = 0x2C | OPC_SPECIAL3,
430     OPC_LHE            = 0x2D | OPC_SPECIAL3,
431     OPC_LLE            = 0x2E | OPC_SPECIAL3,
432     OPC_LWE            = 0x2F | OPC_SPECIAL3,
433 
434     /* R6 */
435     R6_OPC_PREF        = 0x35 | OPC_SPECIAL3,
436     R6_OPC_CACHE       = 0x25 | OPC_SPECIAL3,
437     R6_OPC_LL          = 0x36 | OPC_SPECIAL3,
438     R6_OPC_SC          = 0x26 | OPC_SPECIAL3,
439     R6_OPC_LLD         = 0x37 | OPC_SPECIAL3,
440     R6_OPC_SCD         = 0x27 | OPC_SPECIAL3,
441 };
442 
443 /* Loongson EXT load/store quad word opcodes */
444 #define MASK_LOONGSON_GSLSQ(op)           (MASK_OP_MAJOR(op) | (op & 0x8020))
445 enum {
446     OPC_GSLQ        = 0x0020 | OPC_LWC2,
447     OPC_GSLQC1      = 0x8020 | OPC_LWC2,
448     OPC_GSSHFL      = OPC_LWC2,
449     OPC_GSSQ        = 0x0020 | OPC_SWC2,
450     OPC_GSSQC1      = 0x8020 | OPC_SWC2,
451     OPC_GSSHFS      = OPC_SWC2,
452 };
453 
454 /* Loongson EXT shifted load/store opcodes */
455 #define MASK_LOONGSON_GSSHFLS(op)         (MASK_OP_MAJOR(op) | (op & 0xc03f))
456 enum {
457     OPC_GSLWLC1     = 0x4 | OPC_GSSHFL,
458     OPC_GSLWRC1     = 0x5 | OPC_GSSHFL,
459     OPC_GSLDLC1     = 0x6 | OPC_GSSHFL,
460     OPC_GSLDRC1     = 0x7 | OPC_GSSHFL,
461     OPC_GSSWLC1     = 0x4 | OPC_GSSHFS,
462     OPC_GSSWRC1     = 0x5 | OPC_GSSHFS,
463     OPC_GSSDLC1     = 0x6 | OPC_GSSHFS,
464     OPC_GSSDRC1     = 0x7 | OPC_GSSHFS,
465 };
466 
467 /* Loongson EXT LDC2/SDC2 opcodes */
468 #define MASK_LOONGSON_LSDC2(op)           (MASK_OP_MAJOR(op) | (op & 0x7))
469 
470 enum {
471     OPC_GSLBX      = 0x0 | OPC_LDC2,
472     OPC_GSLHX      = 0x1 | OPC_LDC2,
473     OPC_GSLWX      = 0x2 | OPC_LDC2,
474     OPC_GSLDX      = 0x3 | OPC_LDC2,
475     OPC_GSLWXC1    = 0x6 | OPC_LDC2,
476     OPC_GSLDXC1    = 0x7 | OPC_LDC2,
477     OPC_GSSBX      = 0x0 | OPC_SDC2,
478     OPC_GSSHX      = 0x1 | OPC_SDC2,
479     OPC_GSSWX      = 0x2 | OPC_SDC2,
480     OPC_GSSDX      = 0x3 | OPC_SDC2,
481     OPC_GSSWXC1    = 0x6 | OPC_SDC2,
482     OPC_GSSDXC1    = 0x7 | OPC_SDC2,
483 };
484 
485 /* BSHFL opcodes */
486 #define MASK_BSHFL(op)              (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
487 
488 enum {
489     OPC_WSBH      = (0x02 << 6) | OPC_BSHFL,
490     OPC_SEB       = (0x10 << 6) | OPC_BSHFL,
491     OPC_SEH       = (0x18 << 6) | OPC_BSHFL,
492     OPC_ALIGN     = (0x08 << 6) | OPC_BSHFL, /* 010.bp (010.00 to 010.11) */
493     OPC_ALIGN_1   = (0x09 << 6) | OPC_BSHFL,
494     OPC_ALIGN_2   = (0x0A << 6) | OPC_BSHFL,
495     OPC_ALIGN_3   = (0x0B << 6) | OPC_BSHFL,
496     OPC_BITSWAP   = (0x00 << 6) | OPC_BSHFL  /* 00000 */
497 };
498 
499 /* DBSHFL opcodes */
500 #define MASK_DBSHFL(op)             (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
501 
502 enum {
503     OPC_DSBH       = (0x02 << 6) | OPC_DBSHFL,
504     OPC_DSHD       = (0x05 << 6) | OPC_DBSHFL,
505     OPC_DALIGN     = (0x08 << 6) | OPC_DBSHFL, /* 01.bp (01.000 to 01.111) */
506     OPC_DALIGN_1   = (0x09 << 6) | OPC_DBSHFL,
507     OPC_DALIGN_2   = (0x0A << 6) | OPC_DBSHFL,
508     OPC_DALIGN_3   = (0x0B << 6) | OPC_DBSHFL,
509     OPC_DALIGN_4   = (0x0C << 6) | OPC_DBSHFL,
510     OPC_DALIGN_5   = (0x0D << 6) | OPC_DBSHFL,
511     OPC_DALIGN_6   = (0x0E << 6) | OPC_DBSHFL,
512     OPC_DALIGN_7   = (0x0F << 6) | OPC_DBSHFL,
513     OPC_DBITSWAP   = (0x00 << 6) | OPC_DBSHFL, /* 00000 */
514 };
515 
516 /* MIPS DSP REGIMM opcodes */
517 enum {
518     OPC_BPOSGE32 = (0x1C << 16) | OPC_REGIMM,
519     OPC_BPOSGE64 = (0x1D << 16) | OPC_REGIMM,
520 };
521 
522 #define MASK_LX(op)                 (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
523 /* MIPS DSP Load */
524 enum {
525     OPC_LBUX = (0x06 << 6) | OPC_LX_DSP,
526     OPC_LHX  = (0x04 << 6) | OPC_LX_DSP,
527     OPC_LWX  = (0x00 << 6) | OPC_LX_DSP,
528     OPC_LDX = (0x08 << 6) | OPC_LX_DSP,
529 };
530 
531 #define MASK_ADDU_QB(op)            (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
532 enum {
533     /* MIPS DSP Arithmetic Sub-class */
534     OPC_ADDQ_PH        = (0x0A << 6) | OPC_ADDU_QB_DSP,
535     OPC_ADDQ_S_PH      = (0x0E << 6) | OPC_ADDU_QB_DSP,
536     OPC_ADDQ_S_W       = (0x16 << 6) | OPC_ADDU_QB_DSP,
537     OPC_ADDU_QB        = (0x00 << 6) | OPC_ADDU_QB_DSP,
538     OPC_ADDU_S_QB      = (0x04 << 6) | OPC_ADDU_QB_DSP,
539     OPC_ADDU_PH        = (0x08 << 6) | OPC_ADDU_QB_DSP,
540     OPC_ADDU_S_PH      = (0x0C << 6) | OPC_ADDU_QB_DSP,
541     OPC_SUBQ_PH        = (0x0B << 6) | OPC_ADDU_QB_DSP,
542     OPC_SUBQ_S_PH      = (0x0F << 6) | OPC_ADDU_QB_DSP,
543     OPC_SUBQ_S_W       = (0x17 << 6) | OPC_ADDU_QB_DSP,
544     OPC_SUBU_QB        = (0x01 << 6) | OPC_ADDU_QB_DSP,
545     OPC_SUBU_S_QB      = (0x05 << 6) | OPC_ADDU_QB_DSP,
546     OPC_SUBU_PH        = (0x09 << 6) | OPC_ADDU_QB_DSP,
547     OPC_SUBU_S_PH      = (0x0D << 6) | OPC_ADDU_QB_DSP,
548     OPC_ADDSC          = (0x10 << 6) | OPC_ADDU_QB_DSP,
549     OPC_ADDWC          = (0x11 << 6) | OPC_ADDU_QB_DSP,
550     OPC_MODSUB         = (0x12 << 6) | OPC_ADDU_QB_DSP,
551     OPC_RADDU_W_QB     = (0x14 << 6) | OPC_ADDU_QB_DSP,
552     /* MIPS DSP Multiply Sub-class insns */
553     OPC_MULEU_S_PH_QBL = (0x06 << 6) | OPC_ADDU_QB_DSP,
554     OPC_MULEU_S_PH_QBR = (0x07 << 6) | OPC_ADDU_QB_DSP,
555     OPC_MULQ_RS_PH     = (0x1F << 6) | OPC_ADDU_QB_DSP,
556     OPC_MULEQ_S_W_PHL  = (0x1C << 6) | OPC_ADDU_QB_DSP,
557     OPC_MULEQ_S_W_PHR  = (0x1D << 6) | OPC_ADDU_QB_DSP,
558     OPC_MULQ_S_PH      = (0x1E << 6) | OPC_ADDU_QB_DSP,
559 };
560 
561 #define OPC_ADDUH_QB_DSP OPC_MULT_G_2E
562 #define MASK_ADDUH_QB(op)           (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
563 enum {
564     /* MIPS DSP Arithmetic Sub-class */
565     OPC_ADDUH_QB   = (0x00 << 6) | OPC_ADDUH_QB_DSP,
566     OPC_ADDUH_R_QB = (0x02 << 6) | OPC_ADDUH_QB_DSP,
567     OPC_ADDQH_PH   = (0x08 << 6) | OPC_ADDUH_QB_DSP,
568     OPC_ADDQH_R_PH = (0x0A << 6) | OPC_ADDUH_QB_DSP,
569     OPC_ADDQH_W    = (0x10 << 6) | OPC_ADDUH_QB_DSP,
570     OPC_ADDQH_R_W  = (0x12 << 6) | OPC_ADDUH_QB_DSP,
571     OPC_SUBUH_QB   = (0x01 << 6) | OPC_ADDUH_QB_DSP,
572     OPC_SUBUH_R_QB = (0x03 << 6) | OPC_ADDUH_QB_DSP,
573     OPC_SUBQH_PH   = (0x09 << 6) | OPC_ADDUH_QB_DSP,
574     OPC_SUBQH_R_PH = (0x0B << 6) | OPC_ADDUH_QB_DSP,
575     OPC_SUBQH_W    = (0x11 << 6) | OPC_ADDUH_QB_DSP,
576     OPC_SUBQH_R_W  = (0x13 << 6) | OPC_ADDUH_QB_DSP,
577     /* MIPS DSP Multiply Sub-class insns */
578     OPC_MUL_PH     = (0x0C << 6) | OPC_ADDUH_QB_DSP,
579     OPC_MUL_S_PH   = (0x0E << 6) | OPC_ADDUH_QB_DSP,
580     OPC_MULQ_S_W   = (0x16 << 6) | OPC_ADDUH_QB_DSP,
581     OPC_MULQ_RS_W  = (0x17 << 6) | OPC_ADDUH_QB_DSP,
582 };
583 
584 #define MASK_ABSQ_S_PH(op)          (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
585 enum {
586     /* MIPS DSP Arithmetic Sub-class */
587     OPC_ABSQ_S_QB       = (0x01 << 6) | OPC_ABSQ_S_PH_DSP,
588     OPC_ABSQ_S_PH       = (0x09 << 6) | OPC_ABSQ_S_PH_DSP,
589     OPC_ABSQ_S_W        = (0x11 << 6) | OPC_ABSQ_S_PH_DSP,
590     OPC_PRECEQ_W_PHL    = (0x0C << 6) | OPC_ABSQ_S_PH_DSP,
591     OPC_PRECEQ_W_PHR    = (0x0D << 6) | OPC_ABSQ_S_PH_DSP,
592     OPC_PRECEQU_PH_QBL  = (0x04 << 6) | OPC_ABSQ_S_PH_DSP,
593     OPC_PRECEQU_PH_QBR  = (0x05 << 6) | OPC_ABSQ_S_PH_DSP,
594     OPC_PRECEQU_PH_QBLA = (0x06 << 6) | OPC_ABSQ_S_PH_DSP,
595     OPC_PRECEQU_PH_QBRA = (0x07 << 6) | OPC_ABSQ_S_PH_DSP,
596     OPC_PRECEU_PH_QBL   = (0x1C << 6) | OPC_ABSQ_S_PH_DSP,
597     OPC_PRECEU_PH_QBR   = (0x1D << 6) | OPC_ABSQ_S_PH_DSP,
598     OPC_PRECEU_PH_QBLA  = (0x1E << 6) | OPC_ABSQ_S_PH_DSP,
599     OPC_PRECEU_PH_QBRA  = (0x1F << 6) | OPC_ABSQ_S_PH_DSP,
600     /* DSP Bit/Manipulation Sub-class */
601     OPC_BITREV          = (0x1B << 6) | OPC_ABSQ_S_PH_DSP,
602     OPC_REPL_QB         = (0x02 << 6) | OPC_ABSQ_S_PH_DSP,
603     OPC_REPLV_QB        = (0x03 << 6) | OPC_ABSQ_S_PH_DSP,
604     OPC_REPL_PH         = (0x0A << 6) | OPC_ABSQ_S_PH_DSP,
605     OPC_REPLV_PH        = (0x0B << 6) | OPC_ABSQ_S_PH_DSP,
606 };
607 
608 #define MASK_CMPU_EQ_QB(op)         (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
609 enum {
610     /* MIPS DSP Arithmetic Sub-class */
611     OPC_PRECR_QB_PH      = (0x0D << 6) | OPC_CMPU_EQ_QB_DSP,
612     OPC_PRECRQ_QB_PH     = (0x0C << 6) | OPC_CMPU_EQ_QB_DSP,
613     OPC_PRECR_SRA_PH_W   = (0x1E << 6) | OPC_CMPU_EQ_QB_DSP,
614     OPC_PRECR_SRA_R_PH_W = (0x1F << 6) | OPC_CMPU_EQ_QB_DSP,
615     OPC_PRECRQ_PH_W      = (0x14 << 6) | OPC_CMPU_EQ_QB_DSP,
616     OPC_PRECRQ_RS_PH_W   = (0x15 << 6) | OPC_CMPU_EQ_QB_DSP,
617     OPC_PRECRQU_S_QB_PH  = (0x0F << 6) | OPC_CMPU_EQ_QB_DSP,
618     /* DSP Compare-Pick Sub-class */
619     OPC_CMPU_EQ_QB       = (0x00 << 6) | OPC_CMPU_EQ_QB_DSP,
620     OPC_CMPU_LT_QB       = (0x01 << 6) | OPC_CMPU_EQ_QB_DSP,
621     OPC_CMPU_LE_QB       = (0x02 << 6) | OPC_CMPU_EQ_QB_DSP,
622     OPC_CMPGU_EQ_QB      = (0x04 << 6) | OPC_CMPU_EQ_QB_DSP,
623     OPC_CMPGU_LT_QB      = (0x05 << 6) | OPC_CMPU_EQ_QB_DSP,
624     OPC_CMPGU_LE_QB      = (0x06 << 6) | OPC_CMPU_EQ_QB_DSP,
625     OPC_CMPGDU_EQ_QB     = (0x18 << 6) | OPC_CMPU_EQ_QB_DSP,
626     OPC_CMPGDU_LT_QB     = (0x19 << 6) | OPC_CMPU_EQ_QB_DSP,
627     OPC_CMPGDU_LE_QB     = (0x1A << 6) | OPC_CMPU_EQ_QB_DSP,
628     OPC_CMP_EQ_PH        = (0x08 << 6) | OPC_CMPU_EQ_QB_DSP,
629     OPC_CMP_LT_PH        = (0x09 << 6) | OPC_CMPU_EQ_QB_DSP,
630     OPC_CMP_LE_PH        = (0x0A << 6) | OPC_CMPU_EQ_QB_DSP,
631     OPC_PICK_QB          = (0x03 << 6) | OPC_CMPU_EQ_QB_DSP,
632     OPC_PICK_PH          = (0x0B << 6) | OPC_CMPU_EQ_QB_DSP,
633     OPC_PACKRL_PH        = (0x0E << 6) | OPC_CMPU_EQ_QB_DSP,
634 };
635 
636 #define MASK_SHLL_QB(op)            (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
637 enum {
638     /* MIPS DSP GPR-Based Shift Sub-class */
639     OPC_SHLL_QB    = (0x00 << 6) | OPC_SHLL_QB_DSP,
640     OPC_SHLLV_QB   = (0x02 << 6) | OPC_SHLL_QB_DSP,
641     OPC_SHLL_PH    = (0x08 << 6) | OPC_SHLL_QB_DSP,
642     OPC_SHLLV_PH   = (0x0A << 6) | OPC_SHLL_QB_DSP,
643     OPC_SHLL_S_PH  = (0x0C << 6) | OPC_SHLL_QB_DSP,
644     OPC_SHLLV_S_PH = (0x0E << 6) | OPC_SHLL_QB_DSP,
645     OPC_SHLL_S_W   = (0x14 << 6) | OPC_SHLL_QB_DSP,
646     OPC_SHLLV_S_W  = (0x16 << 6) | OPC_SHLL_QB_DSP,
647     OPC_SHRL_QB    = (0x01 << 6) | OPC_SHLL_QB_DSP,
648     OPC_SHRLV_QB   = (0x03 << 6) | OPC_SHLL_QB_DSP,
649     OPC_SHRL_PH    = (0x19 << 6) | OPC_SHLL_QB_DSP,
650     OPC_SHRLV_PH   = (0x1B << 6) | OPC_SHLL_QB_DSP,
651     OPC_SHRA_QB    = (0x04 << 6) | OPC_SHLL_QB_DSP,
652     OPC_SHRA_R_QB  = (0x05 << 6) | OPC_SHLL_QB_DSP,
653     OPC_SHRAV_QB   = (0x06 << 6) | OPC_SHLL_QB_DSP,
654     OPC_SHRAV_R_QB = (0x07 << 6) | OPC_SHLL_QB_DSP,
655     OPC_SHRA_PH    = (0x09 << 6) | OPC_SHLL_QB_DSP,
656     OPC_SHRAV_PH   = (0x0B << 6) | OPC_SHLL_QB_DSP,
657     OPC_SHRA_R_PH  = (0x0D << 6) | OPC_SHLL_QB_DSP,
658     OPC_SHRAV_R_PH = (0x0F << 6) | OPC_SHLL_QB_DSP,
659     OPC_SHRA_R_W   = (0x15 << 6) | OPC_SHLL_QB_DSP,
660     OPC_SHRAV_R_W  = (0x17 << 6) | OPC_SHLL_QB_DSP,
661 };
662 
663 #define MASK_DPA_W_PH(op)           (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
664 enum {
665     /* MIPS DSP Multiply Sub-class insns */
666     OPC_DPAU_H_QBL    = (0x03 << 6) | OPC_DPA_W_PH_DSP,
667     OPC_DPAU_H_QBR    = (0x07 << 6) | OPC_DPA_W_PH_DSP,
668     OPC_DPSU_H_QBL    = (0x0B << 6) | OPC_DPA_W_PH_DSP,
669     OPC_DPSU_H_QBR    = (0x0F << 6) | OPC_DPA_W_PH_DSP,
670     OPC_DPA_W_PH      = (0x00 << 6) | OPC_DPA_W_PH_DSP,
671     OPC_DPAX_W_PH     = (0x08 << 6) | OPC_DPA_W_PH_DSP,
672     OPC_DPAQ_S_W_PH   = (0x04 << 6) | OPC_DPA_W_PH_DSP,
673     OPC_DPAQX_S_W_PH  = (0x18 << 6) | OPC_DPA_W_PH_DSP,
674     OPC_DPAQX_SA_W_PH = (0x1A << 6) | OPC_DPA_W_PH_DSP,
675     OPC_DPS_W_PH      = (0x01 << 6) | OPC_DPA_W_PH_DSP,
676     OPC_DPSX_W_PH     = (0x09 << 6) | OPC_DPA_W_PH_DSP,
677     OPC_DPSQ_S_W_PH   = (0x05 << 6) | OPC_DPA_W_PH_DSP,
678     OPC_DPSQX_S_W_PH  = (0x19 << 6) | OPC_DPA_W_PH_DSP,
679     OPC_DPSQX_SA_W_PH = (0x1B << 6) | OPC_DPA_W_PH_DSP,
680     OPC_MULSAQ_S_W_PH = (0x06 << 6) | OPC_DPA_W_PH_DSP,
681     OPC_DPAQ_SA_L_W   = (0x0C << 6) | OPC_DPA_W_PH_DSP,
682     OPC_DPSQ_SA_L_W   = (0x0D << 6) | OPC_DPA_W_PH_DSP,
683     OPC_MAQ_S_W_PHL   = (0x14 << 6) | OPC_DPA_W_PH_DSP,
684     OPC_MAQ_S_W_PHR   = (0x16 << 6) | OPC_DPA_W_PH_DSP,
685     OPC_MAQ_SA_W_PHL  = (0x10 << 6) | OPC_DPA_W_PH_DSP,
686     OPC_MAQ_SA_W_PHR  = (0x12 << 6) | OPC_DPA_W_PH_DSP,
687     OPC_MULSA_W_PH    = (0x02 << 6) | OPC_DPA_W_PH_DSP,
688 };
689 
690 #define MASK_INSV(op)               (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
691 enum {
692     /* DSP Bit/Manipulation Sub-class */
693     OPC_INSV = (0x00 << 6) | OPC_INSV_DSP,
694 };
695 
696 #define MASK_APPEND(op)             (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
697 enum {
698     /* MIPS DSP Append Sub-class */
699     OPC_APPEND  = (0x00 << 6) | OPC_APPEND_DSP,
700     OPC_PREPEND = (0x01 << 6) | OPC_APPEND_DSP,
701     OPC_BALIGN  = (0x10 << 6) | OPC_APPEND_DSP,
702 };
703 
704 #define MASK_EXTR_W(op)             (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
705 enum {
706     /* MIPS DSP Accumulator and DSPControl Access Sub-class */
707     OPC_EXTR_W     = (0x00 << 6) | OPC_EXTR_W_DSP,
708     OPC_EXTR_R_W   = (0x04 << 6) | OPC_EXTR_W_DSP,
709     OPC_EXTR_RS_W  = (0x06 << 6) | OPC_EXTR_W_DSP,
710     OPC_EXTR_S_H   = (0x0E << 6) | OPC_EXTR_W_DSP,
711     OPC_EXTRV_S_H  = (0x0F << 6) | OPC_EXTR_W_DSP,
712     OPC_EXTRV_W    = (0x01 << 6) | OPC_EXTR_W_DSP,
713     OPC_EXTRV_R_W  = (0x05 << 6) | OPC_EXTR_W_DSP,
714     OPC_EXTRV_RS_W = (0x07 << 6) | OPC_EXTR_W_DSP,
715     OPC_EXTP       = (0x02 << 6) | OPC_EXTR_W_DSP,
716     OPC_EXTPV      = (0x03 << 6) | OPC_EXTR_W_DSP,
717     OPC_EXTPDP     = (0x0A << 6) | OPC_EXTR_W_DSP,
718     OPC_EXTPDPV    = (0x0B << 6) | OPC_EXTR_W_DSP,
719     OPC_SHILO      = (0x1A << 6) | OPC_EXTR_W_DSP,
720     OPC_SHILOV     = (0x1B << 6) | OPC_EXTR_W_DSP,
721     OPC_MTHLIP     = (0x1F << 6) | OPC_EXTR_W_DSP,
722     OPC_WRDSP      = (0x13 << 6) | OPC_EXTR_W_DSP,
723     OPC_RDDSP      = (0x12 << 6) | OPC_EXTR_W_DSP,
724 };
725 
726 #define MASK_ABSQ_S_QH(op)          (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
727 enum {
728     /* MIPS DSP Arithmetic Sub-class */
729     OPC_PRECEQ_L_PWL    = (0x14 << 6) | OPC_ABSQ_S_QH_DSP,
730     OPC_PRECEQ_L_PWR    = (0x15 << 6) | OPC_ABSQ_S_QH_DSP,
731     OPC_PRECEQ_PW_QHL   = (0x0C << 6) | OPC_ABSQ_S_QH_DSP,
732     OPC_PRECEQ_PW_QHR   = (0x0D << 6) | OPC_ABSQ_S_QH_DSP,
733     OPC_PRECEQ_PW_QHLA  = (0x0E << 6) | OPC_ABSQ_S_QH_DSP,
734     OPC_PRECEQ_PW_QHRA  = (0x0F << 6) | OPC_ABSQ_S_QH_DSP,
735     OPC_PRECEQU_QH_OBL  = (0x04 << 6) | OPC_ABSQ_S_QH_DSP,
736     OPC_PRECEQU_QH_OBR  = (0x05 << 6) | OPC_ABSQ_S_QH_DSP,
737     OPC_PRECEQU_QH_OBLA = (0x06 << 6) | OPC_ABSQ_S_QH_DSP,
738     OPC_PRECEQU_QH_OBRA = (0x07 << 6) | OPC_ABSQ_S_QH_DSP,
739     OPC_PRECEU_QH_OBL   = (0x1C << 6) | OPC_ABSQ_S_QH_DSP,
740     OPC_PRECEU_QH_OBR   = (0x1D << 6) | OPC_ABSQ_S_QH_DSP,
741     OPC_PRECEU_QH_OBLA  = (0x1E << 6) | OPC_ABSQ_S_QH_DSP,
742     OPC_PRECEU_QH_OBRA  = (0x1F << 6) | OPC_ABSQ_S_QH_DSP,
743     OPC_ABSQ_S_OB       = (0x01 << 6) | OPC_ABSQ_S_QH_DSP,
744     OPC_ABSQ_S_PW       = (0x11 << 6) | OPC_ABSQ_S_QH_DSP,
745     OPC_ABSQ_S_QH       = (0x09 << 6) | OPC_ABSQ_S_QH_DSP,
746     /* DSP Bit/Manipulation Sub-class */
747     OPC_REPL_OB         = (0x02 << 6) | OPC_ABSQ_S_QH_DSP,
748     OPC_REPL_PW         = (0x12 << 6) | OPC_ABSQ_S_QH_DSP,
749     OPC_REPL_QH         = (0x0A << 6) | OPC_ABSQ_S_QH_DSP,
750     OPC_REPLV_OB        = (0x03 << 6) | OPC_ABSQ_S_QH_DSP,
751     OPC_REPLV_PW        = (0x13 << 6) | OPC_ABSQ_S_QH_DSP,
752     OPC_REPLV_QH        = (0x0B << 6) | OPC_ABSQ_S_QH_DSP,
753 };
754 
755 #define MASK_ADDU_OB(op)            (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
756 enum {
757     /* MIPS DSP Multiply Sub-class insns */
758     OPC_MULEQ_S_PW_QHL = (0x1C << 6) | OPC_ADDU_OB_DSP,
759     OPC_MULEQ_S_PW_QHR = (0x1D << 6) | OPC_ADDU_OB_DSP,
760     OPC_MULEU_S_QH_OBL = (0x06 << 6) | OPC_ADDU_OB_DSP,
761     OPC_MULEU_S_QH_OBR = (0x07 << 6) | OPC_ADDU_OB_DSP,
762     OPC_MULQ_RS_QH     = (0x1F << 6) | OPC_ADDU_OB_DSP,
763     /* MIPS DSP Arithmetic Sub-class */
764     OPC_RADDU_L_OB     = (0x14 << 6) | OPC_ADDU_OB_DSP,
765     OPC_SUBQ_PW        = (0x13 << 6) | OPC_ADDU_OB_DSP,
766     OPC_SUBQ_S_PW      = (0x17 << 6) | OPC_ADDU_OB_DSP,
767     OPC_SUBQ_QH        = (0x0B << 6) | OPC_ADDU_OB_DSP,
768     OPC_SUBQ_S_QH      = (0x0F << 6) | OPC_ADDU_OB_DSP,
769     OPC_SUBU_OB        = (0x01 << 6) | OPC_ADDU_OB_DSP,
770     OPC_SUBU_S_OB      = (0x05 << 6) | OPC_ADDU_OB_DSP,
771     OPC_SUBU_QH        = (0x09 << 6) | OPC_ADDU_OB_DSP,
772     OPC_SUBU_S_QH      = (0x0D << 6) | OPC_ADDU_OB_DSP,
773     OPC_SUBUH_OB       = (0x19 << 6) | OPC_ADDU_OB_DSP,
774     OPC_SUBUH_R_OB     = (0x1B << 6) | OPC_ADDU_OB_DSP,
775     OPC_ADDQ_PW        = (0x12 << 6) | OPC_ADDU_OB_DSP,
776     OPC_ADDQ_S_PW      = (0x16 << 6) | OPC_ADDU_OB_DSP,
777     OPC_ADDQ_QH        = (0x0A << 6) | OPC_ADDU_OB_DSP,
778     OPC_ADDQ_S_QH      = (0x0E << 6) | OPC_ADDU_OB_DSP,
779     OPC_ADDU_OB        = (0x00 << 6) | OPC_ADDU_OB_DSP,
780     OPC_ADDU_S_OB      = (0x04 << 6) | OPC_ADDU_OB_DSP,
781     OPC_ADDU_QH        = (0x08 << 6) | OPC_ADDU_OB_DSP,
782     OPC_ADDU_S_QH      = (0x0C << 6) | OPC_ADDU_OB_DSP,
783     OPC_ADDUH_OB       = (0x18 << 6) | OPC_ADDU_OB_DSP,
784     OPC_ADDUH_R_OB     = (0x1A << 6) | OPC_ADDU_OB_DSP,
785 };
786 
787 #define MASK_CMPU_EQ_OB(op)         (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
788 enum {
789     /* DSP Compare-Pick Sub-class */
790     OPC_CMP_EQ_PW         = (0x10 << 6) | OPC_CMPU_EQ_OB_DSP,
791     OPC_CMP_LT_PW         = (0x11 << 6) | OPC_CMPU_EQ_OB_DSP,
792     OPC_CMP_LE_PW         = (0x12 << 6) | OPC_CMPU_EQ_OB_DSP,
793     OPC_CMP_EQ_QH         = (0x08 << 6) | OPC_CMPU_EQ_OB_DSP,
794     OPC_CMP_LT_QH         = (0x09 << 6) | OPC_CMPU_EQ_OB_DSP,
795     OPC_CMP_LE_QH         = (0x0A << 6) | OPC_CMPU_EQ_OB_DSP,
796     OPC_CMPGDU_EQ_OB      = (0x18 << 6) | OPC_CMPU_EQ_OB_DSP,
797     OPC_CMPGDU_LT_OB      = (0x19 << 6) | OPC_CMPU_EQ_OB_DSP,
798     OPC_CMPGDU_LE_OB      = (0x1A << 6) | OPC_CMPU_EQ_OB_DSP,
799     OPC_CMPGU_EQ_OB       = (0x04 << 6) | OPC_CMPU_EQ_OB_DSP,
800     OPC_CMPGU_LT_OB       = (0x05 << 6) | OPC_CMPU_EQ_OB_DSP,
801     OPC_CMPGU_LE_OB       = (0x06 << 6) | OPC_CMPU_EQ_OB_DSP,
802     OPC_CMPU_EQ_OB        = (0x00 << 6) | OPC_CMPU_EQ_OB_DSP,
803     OPC_CMPU_LT_OB        = (0x01 << 6) | OPC_CMPU_EQ_OB_DSP,
804     OPC_CMPU_LE_OB        = (0x02 << 6) | OPC_CMPU_EQ_OB_DSP,
805     OPC_PACKRL_PW         = (0x0E << 6) | OPC_CMPU_EQ_OB_DSP,
806     OPC_PICK_OB           = (0x03 << 6) | OPC_CMPU_EQ_OB_DSP,
807     OPC_PICK_PW           = (0x13 << 6) | OPC_CMPU_EQ_OB_DSP,
808     OPC_PICK_QH           = (0x0B << 6) | OPC_CMPU_EQ_OB_DSP,
809     /* MIPS DSP Arithmetic Sub-class */
810     OPC_PRECR_OB_QH       = (0x0D << 6) | OPC_CMPU_EQ_OB_DSP,
811     OPC_PRECR_SRA_QH_PW   = (0x1E << 6) | OPC_CMPU_EQ_OB_DSP,
812     OPC_PRECR_SRA_R_QH_PW = (0x1F << 6) | OPC_CMPU_EQ_OB_DSP,
813     OPC_PRECRQ_OB_QH      = (0x0C << 6) | OPC_CMPU_EQ_OB_DSP,
814     OPC_PRECRQ_PW_L       = (0x1C << 6) | OPC_CMPU_EQ_OB_DSP,
815     OPC_PRECRQ_QH_PW      = (0x14 << 6) | OPC_CMPU_EQ_OB_DSP,
816     OPC_PRECRQ_RS_QH_PW   = (0x15 << 6) | OPC_CMPU_EQ_OB_DSP,
817     OPC_PRECRQU_S_OB_QH   = (0x0F << 6) | OPC_CMPU_EQ_OB_DSP,
818 };
819 
820 #define MASK_DAPPEND(op)            (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
821 enum {
822     /* DSP Append Sub-class */
823     OPC_DAPPEND  = (0x00 << 6) | OPC_DAPPEND_DSP,
824     OPC_PREPENDD = (0x03 << 6) | OPC_DAPPEND_DSP,
825     OPC_PREPENDW = (0x01 << 6) | OPC_DAPPEND_DSP,
826     OPC_DBALIGN  = (0x10 << 6) | OPC_DAPPEND_DSP,
827 };
828 
829 #define MASK_DEXTR_W(op)            (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
830 enum {
831     /* MIPS DSP Accumulator and DSPControl Access Sub-class */
832     OPC_DMTHLIP     = (0x1F << 6) | OPC_DEXTR_W_DSP,
833     OPC_DSHILO      = (0x1A << 6) | OPC_DEXTR_W_DSP,
834     OPC_DEXTP       = (0x02 << 6) | OPC_DEXTR_W_DSP,
835     OPC_DEXTPDP     = (0x0A << 6) | OPC_DEXTR_W_DSP,
836     OPC_DEXTPDPV    = (0x0B << 6) | OPC_DEXTR_W_DSP,
837     OPC_DEXTPV      = (0x03 << 6) | OPC_DEXTR_W_DSP,
838     OPC_DEXTR_L     = (0x10 << 6) | OPC_DEXTR_W_DSP,
839     OPC_DEXTR_R_L   = (0x14 << 6) | OPC_DEXTR_W_DSP,
840     OPC_DEXTR_RS_L  = (0x16 << 6) | OPC_DEXTR_W_DSP,
841     OPC_DEXTR_W     = (0x00 << 6) | OPC_DEXTR_W_DSP,
842     OPC_DEXTR_R_W   = (0x04 << 6) | OPC_DEXTR_W_DSP,
843     OPC_DEXTR_RS_W  = (0x06 << 6) | OPC_DEXTR_W_DSP,
844     OPC_DEXTR_S_H   = (0x0E << 6) | OPC_DEXTR_W_DSP,
845     OPC_DEXTRV_L    = (0x11 << 6) | OPC_DEXTR_W_DSP,
846     OPC_DEXTRV_R_L  = (0x15 << 6) | OPC_DEXTR_W_DSP,
847     OPC_DEXTRV_RS_L = (0x17 << 6) | OPC_DEXTR_W_DSP,
848     OPC_DEXTRV_S_H  = (0x0F << 6) | OPC_DEXTR_W_DSP,
849     OPC_DEXTRV_W    = (0x01 << 6) | OPC_DEXTR_W_DSP,
850     OPC_DEXTRV_R_W  = (0x05 << 6) | OPC_DEXTR_W_DSP,
851     OPC_DEXTRV_RS_W = (0x07 << 6) | OPC_DEXTR_W_DSP,
852     OPC_DSHILOV     = (0x1B << 6) | OPC_DEXTR_W_DSP,
853 };
854 
855 #define MASK_DINSV(op)              (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
856 enum {
857     /* DSP Bit/Manipulation Sub-class */
858     OPC_DINSV = (0x00 << 6) | OPC_DINSV_DSP,
859 };
860 
861 #define MASK_DPAQ_W_QH(op)          (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
862 enum {
863     /* MIPS DSP Multiply Sub-class insns */
864     OPC_DMADD         = (0x19 << 6) | OPC_DPAQ_W_QH_DSP,
865     OPC_DMADDU        = (0x1D << 6) | OPC_DPAQ_W_QH_DSP,
866     OPC_DMSUB         = (0x1B << 6) | OPC_DPAQ_W_QH_DSP,
867     OPC_DMSUBU        = (0x1F << 6) | OPC_DPAQ_W_QH_DSP,
868     OPC_DPA_W_QH      = (0x00 << 6) | OPC_DPAQ_W_QH_DSP,
869     OPC_DPAQ_S_W_QH   = (0x04 << 6) | OPC_DPAQ_W_QH_DSP,
870     OPC_DPAQ_SA_L_PW  = (0x0C << 6) | OPC_DPAQ_W_QH_DSP,
871     OPC_DPAU_H_OBL    = (0x03 << 6) | OPC_DPAQ_W_QH_DSP,
872     OPC_DPAU_H_OBR    = (0x07 << 6) | OPC_DPAQ_W_QH_DSP,
873     OPC_DPS_W_QH      = (0x01 << 6) | OPC_DPAQ_W_QH_DSP,
874     OPC_DPSQ_S_W_QH   = (0x05 << 6) | OPC_DPAQ_W_QH_DSP,
875     OPC_DPSQ_SA_L_PW  = (0x0D << 6) | OPC_DPAQ_W_QH_DSP,
876     OPC_DPSU_H_OBL    = (0x0B << 6) | OPC_DPAQ_W_QH_DSP,
877     OPC_DPSU_H_OBR    = (0x0F << 6) | OPC_DPAQ_W_QH_DSP,
878     OPC_MAQ_S_L_PWL   = (0x1C << 6) | OPC_DPAQ_W_QH_DSP,
879     OPC_MAQ_S_L_PWR   = (0x1E << 6) | OPC_DPAQ_W_QH_DSP,
880     OPC_MAQ_S_W_QHLL  = (0x14 << 6) | OPC_DPAQ_W_QH_DSP,
881     OPC_MAQ_SA_W_QHLL = (0x10 << 6) | OPC_DPAQ_W_QH_DSP,
882     OPC_MAQ_S_W_QHLR  = (0x15 << 6) | OPC_DPAQ_W_QH_DSP,
883     OPC_MAQ_SA_W_QHLR = (0x11 << 6) | OPC_DPAQ_W_QH_DSP,
884     OPC_MAQ_S_W_QHRL  = (0x16 << 6) | OPC_DPAQ_W_QH_DSP,
885     OPC_MAQ_SA_W_QHRL = (0x12 << 6) | OPC_DPAQ_W_QH_DSP,
886     OPC_MAQ_S_W_QHRR  = (0x17 << 6) | OPC_DPAQ_W_QH_DSP,
887     OPC_MAQ_SA_W_QHRR = (0x13 << 6) | OPC_DPAQ_W_QH_DSP,
888     OPC_MULSAQ_S_L_PW = (0x0E << 6) | OPC_DPAQ_W_QH_DSP,
889     OPC_MULSAQ_S_W_QH = (0x06 << 6) | OPC_DPAQ_W_QH_DSP,
890 };
891 
892 #define MASK_SHLL_OB(op)            (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
893 enum {
894     /* MIPS DSP GPR-Based Shift Sub-class */
895     OPC_SHLL_PW    = (0x10 << 6) | OPC_SHLL_OB_DSP,
896     OPC_SHLL_S_PW  = (0x14 << 6) | OPC_SHLL_OB_DSP,
897     OPC_SHLLV_OB   = (0x02 << 6) | OPC_SHLL_OB_DSP,
898     OPC_SHLLV_PW   = (0x12 << 6) | OPC_SHLL_OB_DSP,
899     OPC_SHLLV_S_PW = (0x16 << 6) | OPC_SHLL_OB_DSP,
900     OPC_SHLLV_QH   = (0x0A << 6) | OPC_SHLL_OB_DSP,
901     OPC_SHLLV_S_QH = (0x0E << 6) | OPC_SHLL_OB_DSP,
902     OPC_SHRA_PW    = (0x11 << 6) | OPC_SHLL_OB_DSP,
903     OPC_SHRA_R_PW  = (0x15 << 6) | OPC_SHLL_OB_DSP,
904     OPC_SHRAV_OB   = (0x06 << 6) | OPC_SHLL_OB_DSP,
905     OPC_SHRAV_R_OB = (0x07 << 6) | OPC_SHLL_OB_DSP,
906     OPC_SHRAV_PW   = (0x13 << 6) | OPC_SHLL_OB_DSP,
907     OPC_SHRAV_R_PW = (0x17 << 6) | OPC_SHLL_OB_DSP,
908     OPC_SHRAV_QH   = (0x0B << 6) | OPC_SHLL_OB_DSP,
909     OPC_SHRAV_R_QH = (0x0F << 6) | OPC_SHLL_OB_DSP,
910     OPC_SHRLV_OB   = (0x03 << 6) | OPC_SHLL_OB_DSP,
911     OPC_SHRLV_QH   = (0x1B << 6) | OPC_SHLL_OB_DSP,
912     OPC_SHLL_OB    = (0x00 << 6) | OPC_SHLL_OB_DSP,
913     OPC_SHLL_QH    = (0x08 << 6) | OPC_SHLL_OB_DSP,
914     OPC_SHLL_S_QH  = (0x0C << 6) | OPC_SHLL_OB_DSP,
915     OPC_SHRA_OB    = (0x04 << 6) | OPC_SHLL_OB_DSP,
916     OPC_SHRA_R_OB  = (0x05 << 6) | OPC_SHLL_OB_DSP,
917     OPC_SHRA_QH    = (0x09 << 6) | OPC_SHLL_OB_DSP,
918     OPC_SHRA_R_QH  = (0x0D << 6) | OPC_SHLL_OB_DSP,
919     OPC_SHRL_OB    = (0x01 << 6) | OPC_SHLL_OB_DSP,
920     OPC_SHRL_QH    = (0x19 << 6) | OPC_SHLL_OB_DSP,
921 };
922 
923 /* Coprocessor 0 (rs field) */
924 #define MASK_CP0(op)                (MASK_OP_MAJOR(op) | (op & (0x1F << 21)))
925 
926 enum {
927     OPC_MFC0     = (0x00 << 21) | OPC_CP0,
928     OPC_DMFC0    = (0x01 << 21) | OPC_CP0,
929     OPC_MFHC0    = (0x02 << 21) | OPC_CP0,
930     OPC_MTC0     = (0x04 << 21) | OPC_CP0,
931     OPC_DMTC0    = (0x05 << 21) | OPC_CP0,
932     OPC_MTHC0    = (0x06 << 21) | OPC_CP0,
933     OPC_MFTR     = (0x08 << 21) | OPC_CP0,
934     OPC_RDPGPR   = (0x0A << 21) | OPC_CP0,
935     OPC_MFMC0    = (0x0B << 21) | OPC_CP0,
936     OPC_MTTR     = (0x0C << 21) | OPC_CP0,
937     OPC_WRPGPR   = (0x0E << 21) | OPC_CP0,
938     OPC_C0       = (0x10 << 21) | OPC_CP0,
939     OPC_C0_1     = (0x11 << 21) | OPC_CP0,
940     OPC_C0_2     = (0x12 << 21) | OPC_CP0,
941     OPC_C0_3     = (0x13 << 21) | OPC_CP0,
942     OPC_C0_4     = (0x14 << 21) | OPC_CP0,
943     OPC_C0_5     = (0x15 << 21) | OPC_CP0,
944     OPC_C0_6     = (0x16 << 21) | OPC_CP0,
945     OPC_C0_7     = (0x17 << 21) | OPC_CP0,
946     OPC_C0_8     = (0x18 << 21) | OPC_CP0,
947     OPC_C0_9     = (0x19 << 21) | OPC_CP0,
948     OPC_C0_A     = (0x1A << 21) | OPC_CP0,
949     OPC_C0_B     = (0x1B << 21) | OPC_CP0,
950     OPC_C0_C     = (0x1C << 21) | OPC_CP0,
951     OPC_C0_D     = (0x1D << 21) | OPC_CP0,
952     OPC_C0_E     = (0x1E << 21) | OPC_CP0,
953     OPC_C0_F     = (0x1F << 21) | OPC_CP0,
954 };
955 
956 /* MFMC0 opcodes */
957 #define MASK_MFMC0(op)              (MASK_CP0(op) | (op & 0xFFFF))
958 
959 enum {
960     OPC_DMT      = 0x01 | (0 << 5) | (0x0F << 6) | (0x01 << 11) | OPC_MFMC0,
961     OPC_EMT      = 0x01 | (1 << 5) | (0x0F << 6) | (0x01 << 11) | OPC_MFMC0,
962     OPC_DVPE     = 0x01 | (0 << 5) | OPC_MFMC0,
963     OPC_EVPE     = 0x01 | (1 << 5) | OPC_MFMC0,
964     OPC_DI       = (0 << 5) | (0x0C << 11) | OPC_MFMC0,
965     OPC_EI       = (1 << 5) | (0x0C << 11) | OPC_MFMC0,
966     OPC_DVP      = 0x04 | (0 << 3) | (1 << 5) | (0 << 11) | OPC_MFMC0,
967     OPC_EVP      = 0x04 | (0 << 3) | (0 << 5) | (0 << 11) | OPC_MFMC0,
968 };
969 
970 /* Coprocessor 0 (with rs == C0) */
971 #define MASK_C0(op)                 (MASK_CP0(op) | (op & 0x3F))
972 
973 enum {
974     OPC_TLBR     = 0x01 | OPC_C0,
975     OPC_TLBWI    = 0x02 | OPC_C0,
976     OPC_TLBINV   = 0x03 | OPC_C0,
977     OPC_TLBINVF  = 0x04 | OPC_C0,
978     OPC_TLBWR    = 0x06 | OPC_C0,
979     OPC_TLBP     = 0x08 | OPC_C0,
980     OPC_RFE      = 0x10 | OPC_C0,
981     OPC_ERET     = 0x18 | OPC_C0,
982     OPC_DERET    = 0x1F | OPC_C0,
983     OPC_WAIT     = 0x20 | OPC_C0,
984 };
985 
986 #define MASK_CP2(op)                (MASK_OP_MAJOR(op) | (op & (0x1F << 21)))
987 
988 enum {
989     OPC_MFC2    = (0x00 << 21) | OPC_CP2,
990     OPC_DMFC2   = (0x01 << 21) | OPC_CP2,
991     OPC_CFC2    = (0x02 << 21) | OPC_CP2,
992     OPC_MFHC2   = (0x03 << 21) | OPC_CP2,
993     OPC_MTC2    = (0x04 << 21) | OPC_CP2,
994     OPC_DMTC2   = (0x05 << 21) | OPC_CP2,
995     OPC_CTC2    = (0x06 << 21) | OPC_CP2,
996     OPC_MTHC2   = (0x07 << 21) | OPC_CP2,
997     OPC_BC2     = (0x08 << 21) | OPC_CP2,
998     OPC_BC2EQZ  = (0x09 << 21) | OPC_CP2,
999     OPC_BC2NEZ  = (0x0D << 21) | OPC_CP2,
1000 };
1001 
1002 #define MASK_LMMI(op)    (MASK_OP_MAJOR(op) | (op & (0x1F << 21)) | (op & 0x1F))
1003 
1004 enum {
1005     OPC_PADDSH      = (24 << 21) | (0x00) | OPC_CP2,
1006     OPC_PADDUSH     = (25 << 21) | (0x00) | OPC_CP2,
1007     OPC_PADDH       = (26 << 21) | (0x00) | OPC_CP2,
1008     OPC_PADDW       = (27 << 21) | (0x00) | OPC_CP2,
1009     OPC_PADDSB      = (28 << 21) | (0x00) | OPC_CP2,
1010     OPC_PADDUSB     = (29 << 21) | (0x00) | OPC_CP2,
1011     OPC_PADDB       = (30 << 21) | (0x00) | OPC_CP2,
1012     OPC_PADDD       = (31 << 21) | (0x00) | OPC_CP2,
1013 
1014     OPC_PSUBSH      = (24 << 21) | (0x01) | OPC_CP2,
1015     OPC_PSUBUSH     = (25 << 21) | (0x01) | OPC_CP2,
1016     OPC_PSUBH       = (26 << 21) | (0x01) | OPC_CP2,
1017     OPC_PSUBW       = (27 << 21) | (0x01) | OPC_CP2,
1018     OPC_PSUBSB      = (28 << 21) | (0x01) | OPC_CP2,
1019     OPC_PSUBUSB     = (29 << 21) | (0x01) | OPC_CP2,
1020     OPC_PSUBB       = (30 << 21) | (0x01) | OPC_CP2,
1021     OPC_PSUBD       = (31 << 21) | (0x01) | OPC_CP2,
1022 
1023     OPC_PSHUFH      = (24 << 21) | (0x02) | OPC_CP2,
1024     OPC_PACKSSWH    = (25 << 21) | (0x02) | OPC_CP2,
1025     OPC_PACKSSHB    = (26 << 21) | (0x02) | OPC_CP2,
1026     OPC_PACKUSHB    = (27 << 21) | (0x02) | OPC_CP2,
1027     OPC_XOR_CP2     = (28 << 21) | (0x02) | OPC_CP2,
1028     OPC_NOR_CP2     = (29 << 21) | (0x02) | OPC_CP2,
1029     OPC_AND_CP2     = (30 << 21) | (0x02) | OPC_CP2,
1030     OPC_PANDN       = (31 << 21) | (0x02) | OPC_CP2,
1031 
1032     OPC_PUNPCKLHW   = (24 << 21) | (0x03) | OPC_CP2,
1033     OPC_PUNPCKHHW   = (25 << 21) | (0x03) | OPC_CP2,
1034     OPC_PUNPCKLBH   = (26 << 21) | (0x03) | OPC_CP2,
1035     OPC_PUNPCKHBH   = (27 << 21) | (0x03) | OPC_CP2,
1036     OPC_PINSRH_0    = (28 << 21) | (0x03) | OPC_CP2,
1037     OPC_PINSRH_1    = (29 << 21) | (0x03) | OPC_CP2,
1038     OPC_PINSRH_2    = (30 << 21) | (0x03) | OPC_CP2,
1039     OPC_PINSRH_3    = (31 << 21) | (0x03) | OPC_CP2,
1040 
1041     OPC_PAVGH       = (24 << 21) | (0x08) | OPC_CP2,
1042     OPC_PAVGB       = (25 << 21) | (0x08) | OPC_CP2,
1043     OPC_PMAXSH      = (26 << 21) | (0x08) | OPC_CP2,
1044     OPC_PMINSH      = (27 << 21) | (0x08) | OPC_CP2,
1045     OPC_PMAXUB      = (28 << 21) | (0x08) | OPC_CP2,
1046     OPC_PMINUB      = (29 << 21) | (0x08) | OPC_CP2,
1047 
1048     OPC_PCMPEQW     = (24 << 21) | (0x09) | OPC_CP2,
1049     OPC_PCMPGTW     = (25 << 21) | (0x09) | OPC_CP2,
1050     OPC_PCMPEQH     = (26 << 21) | (0x09) | OPC_CP2,
1051     OPC_PCMPGTH     = (27 << 21) | (0x09) | OPC_CP2,
1052     OPC_PCMPEQB     = (28 << 21) | (0x09) | OPC_CP2,
1053     OPC_PCMPGTB     = (29 << 21) | (0x09) | OPC_CP2,
1054 
1055     OPC_PSLLW       = (24 << 21) | (0x0A) | OPC_CP2,
1056     OPC_PSLLH       = (25 << 21) | (0x0A) | OPC_CP2,
1057     OPC_PMULLH      = (26 << 21) | (0x0A) | OPC_CP2,
1058     OPC_PMULHH      = (27 << 21) | (0x0A) | OPC_CP2,
1059     OPC_PMULUW      = (28 << 21) | (0x0A) | OPC_CP2,
1060     OPC_PMULHUH     = (29 << 21) | (0x0A) | OPC_CP2,
1061 
1062     OPC_PSRLW       = (24 << 21) | (0x0B) | OPC_CP2,
1063     OPC_PSRLH       = (25 << 21) | (0x0B) | OPC_CP2,
1064     OPC_PSRAW       = (26 << 21) | (0x0B) | OPC_CP2,
1065     OPC_PSRAH       = (27 << 21) | (0x0B) | OPC_CP2,
1066     OPC_PUNPCKLWD   = (28 << 21) | (0x0B) | OPC_CP2,
1067     OPC_PUNPCKHWD   = (29 << 21) | (0x0B) | OPC_CP2,
1068 
1069     OPC_ADDU_CP2    = (24 << 21) | (0x0C) | OPC_CP2,
1070     OPC_OR_CP2      = (25 << 21) | (0x0C) | OPC_CP2,
1071     OPC_ADD_CP2     = (26 << 21) | (0x0C) | OPC_CP2,
1072     OPC_DADD_CP2    = (27 << 21) | (0x0C) | OPC_CP2,
1073     OPC_SEQU_CP2    = (28 << 21) | (0x0C) | OPC_CP2,
1074     OPC_SEQ_CP2     = (29 << 21) | (0x0C) | OPC_CP2,
1075 
1076     OPC_SUBU_CP2    = (24 << 21) | (0x0D) | OPC_CP2,
1077     OPC_PASUBUB     = (25 << 21) | (0x0D) | OPC_CP2,
1078     OPC_SUB_CP2     = (26 << 21) | (0x0D) | OPC_CP2,
1079     OPC_DSUB_CP2    = (27 << 21) | (0x0D) | OPC_CP2,
1080     OPC_SLTU_CP2    = (28 << 21) | (0x0D) | OPC_CP2,
1081     OPC_SLT_CP2     = (29 << 21) | (0x0D) | OPC_CP2,
1082 
1083     OPC_SLL_CP2     = (24 << 21) | (0x0E) | OPC_CP2,
1084     OPC_DSLL_CP2    = (25 << 21) | (0x0E) | OPC_CP2,
1085     OPC_PEXTRH      = (26 << 21) | (0x0E) | OPC_CP2,
1086     OPC_PMADDHW     = (27 << 21) | (0x0E) | OPC_CP2,
1087     OPC_SLEU_CP2    = (28 << 21) | (0x0E) | OPC_CP2,
1088     OPC_SLE_CP2     = (29 << 21) | (0x0E) | OPC_CP2,
1089 
1090     OPC_SRL_CP2     = (24 << 21) | (0x0F) | OPC_CP2,
1091     OPC_DSRL_CP2    = (25 << 21) | (0x0F) | OPC_CP2,
1092     OPC_SRA_CP2     = (26 << 21) | (0x0F) | OPC_CP2,
1093     OPC_DSRA_CP2    = (27 << 21) | (0x0F) | OPC_CP2,
1094     OPC_BIADD       = (28 << 21) | (0x0F) | OPC_CP2,
1095     OPC_PMOVMSKB    = (29 << 21) | (0x0F) | OPC_CP2,
1096 };
1097 
1098 
1099 #define MASK_CP3(op)                (MASK_OP_MAJOR(op) | (op & 0x3F))
1100 
1101 enum {
1102     OPC_LWXC1       = 0x00 | OPC_CP3,
1103     OPC_LDXC1       = 0x01 | OPC_CP3,
1104     OPC_LUXC1       = 0x05 | OPC_CP3,
1105     OPC_SWXC1       = 0x08 | OPC_CP3,
1106     OPC_SDXC1       = 0x09 | OPC_CP3,
1107     OPC_SUXC1       = 0x0D | OPC_CP3,
1108     OPC_PREFX       = 0x0F | OPC_CP3,
1109     OPC_ALNV_PS     = 0x1E | OPC_CP3,
1110     OPC_MADD_S      = 0x20 | OPC_CP3,
1111     OPC_MADD_D      = 0x21 | OPC_CP3,
1112     OPC_MADD_PS     = 0x26 | OPC_CP3,
1113     OPC_MSUB_S      = 0x28 | OPC_CP3,
1114     OPC_MSUB_D      = 0x29 | OPC_CP3,
1115     OPC_MSUB_PS     = 0x2E | OPC_CP3,
1116     OPC_NMADD_S     = 0x30 | OPC_CP3,
1117     OPC_NMADD_D     = 0x31 | OPC_CP3,
1118     OPC_NMADD_PS    = 0x36 | OPC_CP3,
1119     OPC_NMSUB_S     = 0x38 | OPC_CP3,
1120     OPC_NMSUB_D     = 0x39 | OPC_CP3,
1121     OPC_NMSUB_PS    = 0x3E | OPC_CP3,
1122 };
1123 
1124 /*
1125  *     MMI (MultiMedia Instruction) encodings
1126  *     ======================================
1127  *
1128  * MMI instructions encoding table keys:
1129  *
1130  *     *   This code is reserved for future use. An attempt to execute it
1131  *         causes a Reserved Instruction exception.
1132  *     %   This code indicates an instruction class. The instruction word
1133  *         must be further decoded by examining additional tables that show
1134  *         the values for other instruction fields.
1135  *     #   This code is reserved for the unsupported instructions DMULT,
1136  *         DMULTU, DDIV, DDIVU, LL, LLD, SC, SCD, LWC2 and SWC2. An attempt
1137  *         to execute it causes a Reserved Instruction exception.
1138  *
1139  * MMI instructions encoded by opcode field (MMI, LQ, SQ):
1140  *
1141  *  31    26                                        0
1142  * +--------+----------------------------------------+
1143  * | opcode |                                        |
1144  * +--------+----------------------------------------+
1145  *
1146  *   opcode  bits 28..26
1147  *     bits |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7
1148  *   31..29 |  000  |  001  |  010  |  011  |  100  |  101  |  110  |  111
1149  *   -------+-------+-------+-------+-------+-------+-------+-------+-------
1150  *    0 000 |SPECIAL| REGIMM|   J   |  JAL  |  BEQ  |  BNE  |  BLEZ |  BGTZ
1151  *    1 001 |  ADDI | ADDIU |  SLTI | SLTIU |  ANDI |  ORI  |  XORI |  LUI
1152  *    2 010 |  COP0 |  COP1 |   *   |   *   |  BEQL |  BNEL | BLEZL | BGTZL
1153  *    3 011 | DADDI | DADDIU|  LDL  |  LDR  |  MMI% |   *   |   LQ  |   SQ
1154  *    4 100 |   LB  |   LH  |  LWL  |   LW  |  LBU  |  LHU  |  LWR  |  LWU
1155  *    5 101 |   SB  |   SH  |  SWL  |   SW  |  SDL  |  SDR  |  SWR  | CACHE
1156  *    6 110 |   #   |  LWC1 |   #   |  PREF |   #   |  LDC1 |   #   |   LD
1157  *    7 111 |   #   |  SWC1 |   #   |   *   |   #   |  SDC1 |   #   |   SD
1158  */
1159 
1160 enum {
1161     MMI_OPC_CLASS_MMI = 0x1C << 26,    /* Same as OPC_SPECIAL2 */
1162     MMI_OPC_SQ        = 0x1F << 26,    /* Same as OPC_SPECIAL3 */
1163 };
1164 
1165 /*
1166  * MMI instructions with opcode field = MMI:
1167  *
1168  *  31    26                                 5      0
1169  * +--------+-------------------------------+--------+
1170  * |   MMI  |                               |function|
1171  * +--------+-------------------------------+--------+
1172  *
1173  * function  bits 2..0
1174  *     bits |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7
1175  *     5..3 |  000  |  001  |  010  |  011  |  100  |  101  |  110  |  111
1176  *   -------+-------+-------+-------+-------+-------+-------+-------+-------
1177  *    0 000 |  MADD | MADDU |   *   |   *   | PLZCW |   *   |   *   |   *
1178  *    1 001 | MMI0% | MMI2% |   *   |   *   |   *   |   *   |   *   |   *
1179  *    2 010 | MFHI1 | MTHI1 | MFLO1 | MTLO1 |   *   |   *   |   *   |   *
1180  *    3 011 | MULT1 | MULTU1|  DIV1 | DIVU1 |   *   |   *   |   *   |   *
1181  *    4 100 | MADD1 | MADDU1|   *   |   *   |   *   |   *   |   *   |   *
1182  *    5 101 | MMI1% | MMI3% |   *   |   *   |   *   |   *   |   *   |   *
1183  *    6 110 | PMFHL | PMTHL |   *   |   *   | PSLLH |   *   | PSRLH | PSRAH
1184  *    7 111 |   *   |   *   |   *   |   *   | PSLLW |   *   | PSRLW | PSRAW
1185  */
1186 
1187 #define MASK_MMI(op) (MASK_OP_MAJOR(op) | ((op) & 0x3F))
1188 enum {
1189     MMI_OPC_MADD       = 0x00 | MMI_OPC_CLASS_MMI, /* Same as OPC_MADD */
1190     MMI_OPC_MADDU      = 0x01 | MMI_OPC_CLASS_MMI, /* Same as OPC_MADDU */
1191     MMI_OPC_MULT1      = 0x18 | MMI_OPC_CLASS_MMI, /* Same minor as OPC_MULT */
1192     MMI_OPC_MULTU1     = 0x19 | MMI_OPC_CLASS_MMI, /* Same min. as OPC_MULTU */
1193     MMI_OPC_DIV1       = 0x1A | MMI_OPC_CLASS_MMI, /* Same minor as OPC_DIV  */
1194     MMI_OPC_DIVU1      = 0x1B | MMI_OPC_CLASS_MMI, /* Same minor as OPC_DIVU */
1195     MMI_OPC_MADD1      = 0x20 | MMI_OPC_CLASS_MMI,
1196     MMI_OPC_MADDU1     = 0x21 | MMI_OPC_CLASS_MMI,
1197 };
1198 
1199 /* global register indices */
1200 TCGv cpu_gpr[32], cpu_PC;
1201 /*
1202  * For CPUs using 128-bit GPR registers, we put the lower halves in cpu_gpr[])
1203  * and the upper halves in cpu_gpr_hi[].
1204  */
1205 TCGv_i64 cpu_gpr_hi[32];
1206 TCGv cpu_HI[MIPS_DSP_ACC], cpu_LO[MIPS_DSP_ACC];
1207 static TCGv cpu_dspctrl, btarget;
1208 TCGv bcond;
1209 static TCGv cpu_lladdr, cpu_llval;
1210 static TCGv_i32 hflags;
1211 TCGv_i32 fpu_fcr0, fpu_fcr31;
1212 TCGv_i64 fpu_f64[32];
1213 
1214 #include "exec/gen-icount.h"
1215 
1216 #define DISAS_STOP       DISAS_TARGET_0
1217 #define DISAS_EXIT       DISAS_TARGET_1
1218 
1219 static const char regnames_HI[][4] = {
1220     "HI0", "HI1", "HI2", "HI3",
1221 };
1222 
1223 static const char regnames_LO[][4] = {
1224     "LO0", "LO1", "LO2", "LO3",
1225 };
1226 
1227 /* General purpose registers moves. */
1228 void gen_load_gpr(TCGv t, int reg)
1229 {
1230     if (reg == 0) {
1231         tcg_gen_movi_tl(t, 0);
1232     } else {
1233         tcg_gen_mov_tl(t, cpu_gpr[reg]);
1234     }
1235 }
1236 
1237 void gen_store_gpr(TCGv t, int reg)
1238 {
1239     if (reg != 0) {
1240         tcg_gen_mov_tl(cpu_gpr[reg], t);
1241     }
1242 }
1243 
1244 #if defined(TARGET_MIPS64)
1245 void gen_load_gpr_hi(TCGv_i64 t, int reg)
1246 {
1247     if (reg == 0) {
1248         tcg_gen_movi_i64(t, 0);
1249     } else {
1250         tcg_gen_mov_i64(t, cpu_gpr_hi[reg]);
1251     }
1252 }
1253 
1254 void gen_store_gpr_hi(TCGv_i64 t, int reg)
1255 {
1256     if (reg != 0) {
1257         tcg_gen_mov_i64(cpu_gpr_hi[reg], t);
1258     }
1259 }
1260 #endif /* TARGET_MIPS64 */
1261 
1262 /* Moves to/from shadow registers. */
1263 static inline void gen_load_srsgpr(int from, int to)
1264 {
1265     TCGv t0 = tcg_temp_new();
1266 
1267     if (from == 0) {
1268         tcg_gen_movi_tl(t0, 0);
1269     } else {
1270         TCGv_i32 t2 = tcg_temp_new_i32();
1271         TCGv_ptr addr = tcg_temp_new_ptr();
1272 
1273         tcg_gen_ld_i32(t2, cpu_env, offsetof(CPUMIPSState, CP0_SRSCtl));
1274         tcg_gen_shri_i32(t2, t2, CP0SRSCtl_PSS);
1275         tcg_gen_andi_i32(t2, t2, 0xf);
1276         tcg_gen_muli_i32(t2, t2, sizeof(target_ulong) * 32);
1277         tcg_gen_ext_i32_ptr(addr, t2);
1278         tcg_gen_add_ptr(addr, cpu_env, addr);
1279 
1280         tcg_gen_ld_tl(t0, addr, sizeof(target_ulong) * from);
1281         tcg_temp_free_ptr(addr);
1282         tcg_temp_free_i32(t2);
1283     }
1284     gen_store_gpr(t0, to);
1285     tcg_temp_free(t0);
1286 }
1287 
1288 static inline void gen_store_srsgpr(int from, int to)
1289 {
1290     if (to != 0) {
1291         TCGv t0 = tcg_temp_new();
1292         TCGv_i32 t2 = tcg_temp_new_i32();
1293         TCGv_ptr addr = tcg_temp_new_ptr();
1294 
1295         gen_load_gpr(t0, from);
1296         tcg_gen_ld_i32(t2, cpu_env, offsetof(CPUMIPSState, CP0_SRSCtl));
1297         tcg_gen_shri_i32(t2, t2, CP0SRSCtl_PSS);
1298         tcg_gen_andi_i32(t2, t2, 0xf);
1299         tcg_gen_muli_i32(t2, t2, sizeof(target_ulong) * 32);
1300         tcg_gen_ext_i32_ptr(addr, t2);
1301         tcg_gen_add_ptr(addr, cpu_env, addr);
1302 
1303         tcg_gen_st_tl(t0, addr, sizeof(target_ulong) * to);
1304         tcg_temp_free_ptr(addr);
1305         tcg_temp_free_i32(t2);
1306         tcg_temp_free(t0);
1307     }
1308 }
1309 
1310 /* Tests */
1311 static inline void gen_save_pc(target_ulong pc)
1312 {
1313     tcg_gen_movi_tl(cpu_PC, pc);
1314 }
1315 
1316 static inline void save_cpu_state(DisasContext *ctx, int do_save_pc)
1317 {
1318     LOG_DISAS("hflags %08x saved %08x\n", ctx->hflags, ctx->saved_hflags);
1319     if (do_save_pc && ctx->base.pc_next != ctx->saved_pc) {
1320         gen_save_pc(ctx->base.pc_next);
1321         ctx->saved_pc = ctx->base.pc_next;
1322     }
1323     if (ctx->hflags != ctx->saved_hflags) {
1324         tcg_gen_movi_i32(hflags, ctx->hflags);
1325         ctx->saved_hflags = ctx->hflags;
1326         switch (ctx->hflags & MIPS_HFLAG_BMASK_BASE) {
1327         case MIPS_HFLAG_BR:
1328             break;
1329         case MIPS_HFLAG_BC:
1330         case MIPS_HFLAG_BL:
1331         case MIPS_HFLAG_B:
1332             tcg_gen_movi_tl(btarget, ctx->btarget);
1333             break;
1334         }
1335     }
1336 }
1337 
1338 static inline void restore_cpu_state(CPUMIPSState *env, DisasContext *ctx)
1339 {
1340     ctx->saved_hflags = ctx->hflags;
1341     switch (ctx->hflags & MIPS_HFLAG_BMASK_BASE) {
1342     case MIPS_HFLAG_BR:
1343         break;
1344     case MIPS_HFLAG_BC:
1345     case MIPS_HFLAG_BL:
1346     case MIPS_HFLAG_B:
1347         ctx->btarget = env->btarget;
1348         break;
1349     }
1350 }
1351 
1352 void generate_exception_err(DisasContext *ctx, int excp, int err)
1353 {
1354     save_cpu_state(ctx, 1);
1355     gen_helper_raise_exception_err(cpu_env, tcg_constant_i32(excp),
1356                                    tcg_constant_i32(err));
1357     ctx->base.is_jmp = DISAS_NORETURN;
1358 }
1359 
1360 void generate_exception(DisasContext *ctx, int excp)
1361 {
1362     gen_helper_raise_exception(cpu_env, tcg_constant_i32(excp));
1363 }
1364 
1365 void generate_exception_end(DisasContext *ctx, int excp)
1366 {
1367     generate_exception_err(ctx, excp, 0);
1368 }
1369 
1370 void gen_reserved_instruction(DisasContext *ctx)
1371 {
1372     generate_exception_end(ctx, EXCP_RI);
1373 }
1374 
1375 /* Floating point register moves. */
1376 void gen_load_fpr32(DisasContext *ctx, TCGv_i32 t, int reg)
1377 {
1378     if (ctx->hflags & MIPS_HFLAG_FRE) {
1379         generate_exception(ctx, EXCP_RI);
1380     }
1381     tcg_gen_extrl_i64_i32(t, fpu_f64[reg]);
1382 }
1383 
1384 void gen_store_fpr32(DisasContext *ctx, TCGv_i32 t, int reg)
1385 {
1386     TCGv_i64 t64;
1387     if (ctx->hflags & MIPS_HFLAG_FRE) {
1388         generate_exception(ctx, EXCP_RI);
1389     }
1390     t64 = tcg_temp_new_i64();
1391     tcg_gen_extu_i32_i64(t64, t);
1392     tcg_gen_deposit_i64(fpu_f64[reg], fpu_f64[reg], t64, 0, 32);
1393     tcg_temp_free_i64(t64);
1394 }
1395 
1396 static void gen_load_fpr32h(DisasContext *ctx, TCGv_i32 t, int reg)
1397 {
1398     if (ctx->hflags & MIPS_HFLAG_F64) {
1399         tcg_gen_extrh_i64_i32(t, fpu_f64[reg]);
1400     } else {
1401         gen_load_fpr32(ctx, t, reg | 1);
1402     }
1403 }
1404 
1405 static void gen_store_fpr32h(DisasContext *ctx, TCGv_i32 t, int reg)
1406 {
1407     if (ctx->hflags & MIPS_HFLAG_F64) {
1408         TCGv_i64 t64 = tcg_temp_new_i64();
1409         tcg_gen_extu_i32_i64(t64, t);
1410         tcg_gen_deposit_i64(fpu_f64[reg], fpu_f64[reg], t64, 32, 32);
1411         tcg_temp_free_i64(t64);
1412     } else {
1413         gen_store_fpr32(ctx, t, reg | 1);
1414     }
1415 }
1416 
1417 void gen_load_fpr64(DisasContext *ctx, TCGv_i64 t, int reg)
1418 {
1419     if (ctx->hflags & MIPS_HFLAG_F64) {
1420         tcg_gen_mov_i64(t, fpu_f64[reg]);
1421     } else {
1422         tcg_gen_concat32_i64(t, fpu_f64[reg & ~1], fpu_f64[reg | 1]);
1423     }
1424 }
1425 
1426 void gen_store_fpr64(DisasContext *ctx, TCGv_i64 t, int reg)
1427 {
1428     if (ctx->hflags & MIPS_HFLAG_F64) {
1429         tcg_gen_mov_i64(fpu_f64[reg], t);
1430     } else {
1431         TCGv_i64 t0;
1432         tcg_gen_deposit_i64(fpu_f64[reg & ~1], fpu_f64[reg & ~1], t, 0, 32);
1433         t0 = tcg_temp_new_i64();
1434         tcg_gen_shri_i64(t0, t, 32);
1435         tcg_gen_deposit_i64(fpu_f64[reg | 1], fpu_f64[reg | 1], t0, 0, 32);
1436         tcg_temp_free_i64(t0);
1437     }
1438 }
1439 
1440 int get_fp_bit(int cc)
1441 {
1442     if (cc) {
1443         return 24 + cc;
1444     } else {
1445         return 23;
1446     }
1447 }
1448 
1449 /* Addresses computation */
1450 void gen_op_addr_add(DisasContext *ctx, TCGv ret, TCGv arg0, TCGv arg1)
1451 {
1452     tcg_gen_add_tl(ret, arg0, arg1);
1453 
1454 #if defined(TARGET_MIPS64)
1455     if (ctx->hflags & MIPS_HFLAG_AWRAP) {
1456         tcg_gen_ext32s_i64(ret, ret);
1457     }
1458 #endif
1459 }
1460 
1461 static inline void gen_op_addr_addi(DisasContext *ctx, TCGv ret, TCGv base,
1462                                     target_long ofs)
1463 {
1464     tcg_gen_addi_tl(ret, base, ofs);
1465 
1466 #if defined(TARGET_MIPS64)
1467     if (ctx->hflags & MIPS_HFLAG_AWRAP) {
1468         tcg_gen_ext32s_i64(ret, ret);
1469     }
1470 #endif
1471 }
1472 
1473 /* Addresses computation (translation time) */
1474 static target_long addr_add(DisasContext *ctx, target_long base,
1475                             target_long offset)
1476 {
1477     target_long sum = base + offset;
1478 
1479 #if defined(TARGET_MIPS64)
1480     if (ctx->hflags & MIPS_HFLAG_AWRAP) {
1481         sum = (int32_t)sum;
1482     }
1483 #endif
1484     return sum;
1485 }
1486 
1487 /* Sign-extract the low 32-bits to a target_long.  */
1488 void gen_move_low32(TCGv ret, TCGv_i64 arg)
1489 {
1490 #if defined(TARGET_MIPS64)
1491     tcg_gen_ext32s_i64(ret, arg);
1492 #else
1493     tcg_gen_extrl_i64_i32(ret, arg);
1494 #endif
1495 }
1496 
1497 /* Sign-extract the high 32-bits to a target_long.  */
1498 void gen_move_high32(TCGv ret, TCGv_i64 arg)
1499 {
1500 #if defined(TARGET_MIPS64)
1501     tcg_gen_sari_i64(ret, arg, 32);
1502 #else
1503     tcg_gen_extrh_i64_i32(ret, arg);
1504 #endif
1505 }
1506 
1507 bool check_cp0_enabled(DisasContext *ctx)
1508 {
1509     if (unlikely(!(ctx->hflags & MIPS_HFLAG_CP0))) {
1510         generate_exception_end(ctx, EXCP_CpU);
1511         return false;
1512     }
1513     return true;
1514 }
1515 
1516 void check_cp1_enabled(DisasContext *ctx)
1517 {
1518     if (unlikely(!(ctx->hflags & MIPS_HFLAG_FPU))) {
1519         generate_exception_err(ctx, EXCP_CpU, 1);
1520     }
1521 }
1522 
1523 /*
1524  * Verify that the processor is running with COP1X instructions enabled.
1525  * This is associated with the nabla symbol in the MIPS32 and MIPS64
1526  * opcode tables.
1527  */
1528 void check_cop1x(DisasContext *ctx)
1529 {
1530     if (unlikely(!(ctx->hflags & MIPS_HFLAG_COP1X))) {
1531         gen_reserved_instruction(ctx);
1532     }
1533 }
1534 
1535 /*
1536  * Verify that the processor is running with 64-bit floating-point
1537  * operations enabled.
1538  */
1539 void check_cp1_64bitmode(DisasContext *ctx)
1540 {
1541     if (unlikely(~ctx->hflags & (MIPS_HFLAG_F64 | MIPS_HFLAG_COP1X))) {
1542         gen_reserved_instruction(ctx);
1543     }
1544 }
1545 
1546 /*
1547  * Verify if floating point register is valid; an operation is not defined
1548  * if bit 0 of any register specification is set and the FR bit in the
1549  * Status register equals zero, since the register numbers specify an
1550  * even-odd pair of adjacent coprocessor general registers. When the FR bit
1551  * in the Status register equals one, both even and odd register numbers
1552  * are valid. This limitation exists only for 64 bit wide (d,l,ps) registers.
1553  *
1554  * Multiple 64 bit wide registers can be checked by calling
1555  * gen_op_cp1_registers(freg1 | freg2 | ... | fregN);
1556  */
1557 void check_cp1_registers(DisasContext *ctx, int regs)
1558 {
1559     if (unlikely(!(ctx->hflags & MIPS_HFLAG_F64) && (regs & 1))) {
1560         gen_reserved_instruction(ctx);
1561     }
1562 }
1563 
1564 /*
1565  * Verify that the processor is running with DSP instructions enabled.
1566  * This is enabled by CP0 Status register MX(24) bit.
1567  */
1568 static inline void check_dsp(DisasContext *ctx)
1569 {
1570     if (unlikely(!(ctx->hflags & MIPS_HFLAG_DSP))) {
1571         if (ctx->insn_flags & ASE_DSP) {
1572             generate_exception_end(ctx, EXCP_DSPDIS);
1573         } else {
1574             gen_reserved_instruction(ctx);
1575         }
1576     }
1577 }
1578 
1579 static inline void check_dsp_r2(DisasContext *ctx)
1580 {
1581     if (unlikely(!(ctx->hflags & MIPS_HFLAG_DSP_R2))) {
1582         if (ctx->insn_flags & ASE_DSP) {
1583             generate_exception_end(ctx, EXCP_DSPDIS);
1584         } else {
1585             gen_reserved_instruction(ctx);
1586         }
1587     }
1588 }
1589 
1590 static inline void check_dsp_r3(DisasContext *ctx)
1591 {
1592     if (unlikely(!(ctx->hflags & MIPS_HFLAG_DSP_R3))) {
1593         if (ctx->insn_flags & ASE_DSP) {
1594             generate_exception_end(ctx, EXCP_DSPDIS);
1595         } else {
1596             gen_reserved_instruction(ctx);
1597         }
1598     }
1599 }
1600 
1601 /*
1602  * This code generates a "reserved instruction" exception if the
1603  * CPU does not support the instruction set corresponding to flags.
1604  */
1605 void check_insn(DisasContext *ctx, uint64_t flags)
1606 {
1607     if (unlikely(!(ctx->insn_flags & flags))) {
1608         gen_reserved_instruction(ctx);
1609     }
1610 }
1611 
1612 /*
1613  * This code generates a "reserved instruction" exception if the
1614  * CPU has corresponding flag set which indicates that the instruction
1615  * has been removed.
1616  */
1617 static inline void check_insn_opc_removed(DisasContext *ctx, uint64_t flags)
1618 {
1619     if (unlikely(ctx->insn_flags & flags)) {
1620         gen_reserved_instruction(ctx);
1621     }
1622 }
1623 
1624 /*
1625  * The Linux kernel traps certain reserved instruction exceptions to
1626  * emulate the corresponding instructions. QEMU is the kernel in user
1627  * mode, so those traps are emulated by accepting the instructions.
1628  *
1629  * A reserved instruction exception is generated for flagged CPUs if
1630  * QEMU runs in system mode.
1631  */
1632 static inline void check_insn_opc_user_only(DisasContext *ctx, uint64_t flags)
1633 {
1634 #ifndef CONFIG_USER_ONLY
1635     check_insn_opc_removed(ctx, flags);
1636 #endif
1637 }
1638 
1639 /*
1640  * This code generates a "reserved instruction" exception if the
1641  * CPU does not support 64-bit paired-single (PS) floating point data type.
1642  */
1643 static inline void check_ps(DisasContext *ctx)
1644 {
1645     if (unlikely(!ctx->ps)) {
1646         generate_exception(ctx, EXCP_RI);
1647     }
1648     check_cp1_64bitmode(ctx);
1649 }
1650 
1651 /*
1652  * This code generates a "reserved instruction" exception if cpu is not
1653  * 64-bit or 64-bit instructions are not enabled.
1654  */
1655 void check_mips_64(DisasContext *ctx)
1656 {
1657     if (unlikely((TARGET_LONG_BITS != 64) || !(ctx->hflags & MIPS_HFLAG_64))) {
1658         gen_reserved_instruction(ctx);
1659     }
1660 }
1661 
1662 #ifndef CONFIG_USER_ONLY
1663 static inline void check_mvh(DisasContext *ctx)
1664 {
1665     if (unlikely(!ctx->mvh)) {
1666         generate_exception(ctx, EXCP_RI);
1667     }
1668 }
1669 #endif
1670 
1671 /*
1672  * This code generates a "reserved instruction" exception if the
1673  * Config5 XNP bit is set.
1674  */
1675 static inline void check_xnp(DisasContext *ctx)
1676 {
1677     if (unlikely(ctx->CP0_Config5 & (1 << CP0C5_XNP))) {
1678         gen_reserved_instruction(ctx);
1679     }
1680 }
1681 
1682 #ifndef CONFIG_USER_ONLY
1683 /*
1684  * This code generates a "reserved instruction" exception if the
1685  * Config3 PW bit is NOT set.
1686  */
1687 static inline void check_pw(DisasContext *ctx)
1688 {
1689     if (unlikely(!(ctx->CP0_Config3 & (1 << CP0C3_PW)))) {
1690         gen_reserved_instruction(ctx);
1691     }
1692 }
1693 #endif
1694 
1695 /*
1696  * This code generates a "reserved instruction" exception if the
1697  * Config3 MT bit is NOT set.
1698  */
1699 static inline void check_mt(DisasContext *ctx)
1700 {
1701     if (unlikely(!(ctx->CP0_Config3 & (1 << CP0C3_MT)))) {
1702         gen_reserved_instruction(ctx);
1703     }
1704 }
1705 
1706 #ifndef CONFIG_USER_ONLY
1707 /*
1708  * This code generates a "coprocessor unusable" exception if CP0 is not
1709  * available, and, if that is not the case, generates a "reserved instruction"
1710  * exception if the Config5 MT bit is NOT set. This is needed for availability
1711  * control of some of MT ASE instructions.
1712  */
1713 static inline void check_cp0_mt(DisasContext *ctx)
1714 {
1715     if (unlikely(!(ctx->hflags & MIPS_HFLAG_CP0))) {
1716         generate_exception_end(ctx, EXCP_CpU);
1717     } else {
1718         if (unlikely(!(ctx->CP0_Config3 & (1 << CP0C3_MT)))) {
1719             gen_reserved_instruction(ctx);
1720         }
1721     }
1722 }
1723 #endif
1724 
1725 /*
1726  * This code generates a "reserved instruction" exception if the
1727  * Config5 NMS bit is set.
1728  */
1729 static inline void check_nms(DisasContext *ctx)
1730 {
1731     if (unlikely(ctx->CP0_Config5 & (1 << CP0C5_NMS))) {
1732         gen_reserved_instruction(ctx);
1733     }
1734 }
1735 
1736 /*
1737  * This code generates a "reserved instruction" exception if the
1738  * Config5 NMS bit is set, and Config1 DL, Config1 IL, Config2 SL,
1739  * Config2 TL, and Config5 L2C are unset.
1740  */
1741 static inline void check_nms_dl_il_sl_tl_l2c(DisasContext *ctx)
1742 {
1743     if (unlikely((ctx->CP0_Config5 & (1 << CP0C5_NMS)) &&
1744                  !(ctx->CP0_Config1 & (1 << CP0C1_DL)) &&
1745                  !(ctx->CP0_Config1 & (1 << CP0C1_IL)) &&
1746                  !(ctx->CP0_Config2 & (1 << CP0C2_SL)) &&
1747                  !(ctx->CP0_Config2 & (1 << CP0C2_TL)) &&
1748                  !(ctx->CP0_Config5 & (1 << CP0C5_L2C)))) {
1749         gen_reserved_instruction(ctx);
1750     }
1751 }
1752 
1753 /*
1754  * This code generates a "reserved instruction" exception if the
1755  * Config5 EVA bit is NOT set.
1756  */
1757 static inline void check_eva(DisasContext *ctx)
1758 {
1759     if (unlikely(!(ctx->CP0_Config5 & (1 << CP0C5_EVA)))) {
1760         gen_reserved_instruction(ctx);
1761     }
1762 }
1763 
1764 
1765 /*
1766  * Define small wrappers for gen_load_fpr* so that we have a uniform
1767  * calling interface for 32 and 64-bit FPRs.  No sense in changing
1768  * all callers for gen_load_fpr32 when we need the CTX parameter for
1769  * this one use.
1770  */
1771 #define gen_ldcmp_fpr32(ctx, x, y) gen_load_fpr32(ctx, x, y)
1772 #define gen_ldcmp_fpr64(ctx, x, y) gen_load_fpr64(ctx, x, y)
1773 #define FOP_CONDS(type, abs, fmt, ifmt, bits)                                 \
1774 static inline void gen_cmp ## type ## _ ## fmt(DisasContext *ctx, int n,      \
1775                                                int ft, int fs, int cc)        \
1776 {                                                                             \
1777     TCGv_i##bits fp0 = tcg_temp_new_i##bits();                                \
1778     TCGv_i##bits fp1 = tcg_temp_new_i##bits();                                \
1779     switch (ifmt) {                                                           \
1780     case FMT_PS:                                                              \
1781         check_ps(ctx);                                                        \
1782         break;                                                                \
1783     case FMT_D:                                                               \
1784         if (abs) {                                                            \
1785             check_cop1x(ctx);                                                 \
1786         }                                                                     \
1787         check_cp1_registers(ctx, fs | ft);                                    \
1788         break;                                                                \
1789     case FMT_S:                                                               \
1790         if (abs) {                                                            \
1791             check_cop1x(ctx);                                                 \
1792         }                                                                     \
1793         break;                                                                \
1794     }                                                                         \
1795     gen_ldcmp_fpr##bits(ctx, fp0, fs);                                        \
1796     gen_ldcmp_fpr##bits(ctx, fp1, ft);                                        \
1797     switch (n) {                                                              \
1798     case  0:                                                                  \
1799         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _f, fp0, fp1, cc);         \
1800     break;                                                                    \
1801     case  1:                                                                  \
1802         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _un, fp0, fp1, cc);        \
1803     break;                                                                    \
1804     case  2:                                                                  \
1805         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _eq, fp0, fp1, cc);        \
1806     break;                                                                    \
1807     case  3:                                                                  \
1808         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ueq, fp0, fp1, cc);       \
1809     break;                                                                    \
1810     case  4:                                                                  \
1811         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _olt, fp0, fp1, cc);       \
1812     break;                                                                    \
1813     case  5:                                                                  \
1814         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ult, fp0, fp1, cc);       \
1815     break;                                                                    \
1816     case  6:                                                                  \
1817         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ole, fp0, fp1, cc);       \
1818     break;                                                                    \
1819     case  7:                                                                  \
1820         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ule, fp0, fp1, cc);       \
1821     break;                                                                    \
1822     case  8:                                                                  \
1823         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _sf, fp0, fp1, cc);        \
1824     break;                                                                    \
1825     case  9:                                                                  \
1826         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngle, fp0, fp1, cc);      \
1827     break;                                                                    \
1828     case 10:                                                                  \
1829         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _seq, fp0, fp1, cc);       \
1830     break;                                                                    \
1831     case 11:                                                                  \
1832         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngl, fp0, fp1, cc);       \
1833     break;                                                                    \
1834     case 12:                                                                  \
1835         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _lt, fp0, fp1, cc);        \
1836     break;                                                                    \
1837     case 13:                                                                  \
1838         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _nge, fp0, fp1, cc);       \
1839     break;                                                                    \
1840     case 14:                                                                  \
1841         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _le, fp0, fp1, cc);        \
1842     break;                                                                    \
1843     case 15:                                                                  \
1844         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngt, fp0, fp1, cc);       \
1845     break;                                                                    \
1846     default:                                                                  \
1847         abort();                                                              \
1848     }                                                                         \
1849     tcg_temp_free_i##bits(fp0);                                               \
1850     tcg_temp_free_i##bits(fp1);                                               \
1851 }
1852 
1853 FOP_CONDS(, 0, d, FMT_D, 64)
1854 FOP_CONDS(abs, 1, d, FMT_D, 64)
1855 FOP_CONDS(, 0, s, FMT_S, 32)
1856 FOP_CONDS(abs, 1, s, FMT_S, 32)
1857 FOP_CONDS(, 0, ps, FMT_PS, 64)
1858 FOP_CONDS(abs, 1, ps, FMT_PS, 64)
1859 #undef FOP_CONDS
1860 
1861 #define FOP_CONDNS(fmt, ifmt, bits, STORE)                              \
1862 static inline void gen_r6_cmp_ ## fmt(DisasContext *ctx, int n,         \
1863                                       int ft, int fs, int fd)           \
1864 {                                                                       \
1865     TCGv_i ## bits fp0 = tcg_temp_new_i ## bits();                      \
1866     TCGv_i ## bits fp1 = tcg_temp_new_i ## bits();                      \
1867     if (ifmt == FMT_D) {                                                \
1868         check_cp1_registers(ctx, fs | ft | fd);                         \
1869     }                                                                   \
1870     gen_ldcmp_fpr ## bits(ctx, fp0, fs);                                \
1871     gen_ldcmp_fpr ## bits(ctx, fp1, ft);                                \
1872     switch (n) {                                                        \
1873     case  0:                                                            \
1874         gen_helper_r6_cmp_ ## fmt ## _af(fp0, cpu_env, fp0, fp1);       \
1875         break;                                                          \
1876     case  1:                                                            \
1877         gen_helper_r6_cmp_ ## fmt ## _un(fp0, cpu_env, fp0, fp1);       \
1878         break;                                                          \
1879     case  2:                                                            \
1880         gen_helper_r6_cmp_ ## fmt ## _eq(fp0, cpu_env, fp0, fp1);       \
1881         break;                                                          \
1882     case  3:                                                            \
1883         gen_helper_r6_cmp_ ## fmt ## _ueq(fp0, cpu_env, fp0, fp1);      \
1884         break;                                                          \
1885     case  4:                                                            \
1886         gen_helper_r6_cmp_ ## fmt ## _lt(fp0, cpu_env, fp0, fp1);       \
1887         break;                                                          \
1888     case  5:                                                            \
1889         gen_helper_r6_cmp_ ## fmt ## _ult(fp0, cpu_env, fp0, fp1);      \
1890         break;                                                          \
1891     case  6:                                                            \
1892         gen_helper_r6_cmp_ ## fmt ## _le(fp0, cpu_env, fp0, fp1);       \
1893         break;                                                          \
1894     case  7:                                                            \
1895         gen_helper_r6_cmp_ ## fmt ## _ule(fp0, cpu_env, fp0, fp1);      \
1896         break;                                                          \
1897     case  8:                                                            \
1898         gen_helper_r6_cmp_ ## fmt ## _saf(fp0, cpu_env, fp0, fp1);      \
1899         break;                                                          \
1900     case  9:                                                            \
1901         gen_helper_r6_cmp_ ## fmt ## _sun(fp0, cpu_env, fp0, fp1);      \
1902         break;                                                          \
1903     case 10:                                                            \
1904         gen_helper_r6_cmp_ ## fmt ## _seq(fp0, cpu_env, fp0, fp1);      \
1905         break;                                                          \
1906     case 11:                                                            \
1907         gen_helper_r6_cmp_ ## fmt ## _sueq(fp0, cpu_env, fp0, fp1);     \
1908         break;                                                          \
1909     case 12:                                                            \
1910         gen_helper_r6_cmp_ ## fmt ## _slt(fp0, cpu_env, fp0, fp1);      \
1911         break;                                                          \
1912     case 13:                                                            \
1913         gen_helper_r6_cmp_ ## fmt ## _sult(fp0, cpu_env, fp0, fp1);     \
1914         break;                                                          \
1915     case 14:                                                            \
1916         gen_helper_r6_cmp_ ## fmt ## _sle(fp0, cpu_env, fp0, fp1);      \
1917         break;                                                          \
1918     case 15:                                                            \
1919         gen_helper_r6_cmp_ ## fmt ## _sule(fp0, cpu_env, fp0, fp1);     \
1920         break;                                                          \
1921     case 17:                                                            \
1922         gen_helper_r6_cmp_ ## fmt ## _or(fp0, cpu_env, fp0, fp1);       \
1923         break;                                                          \
1924     case 18:                                                            \
1925         gen_helper_r6_cmp_ ## fmt ## _une(fp0, cpu_env, fp0, fp1);      \
1926         break;                                                          \
1927     case 19:                                                            \
1928         gen_helper_r6_cmp_ ## fmt ## _ne(fp0, cpu_env, fp0, fp1);       \
1929         break;                                                          \
1930     case 25:                                                            \
1931         gen_helper_r6_cmp_ ## fmt ## _sor(fp0, cpu_env, fp0, fp1);      \
1932         break;                                                          \
1933     case 26:                                                            \
1934         gen_helper_r6_cmp_ ## fmt ## _sune(fp0, cpu_env, fp0, fp1);     \
1935         break;                                                          \
1936     case 27:                                                            \
1937         gen_helper_r6_cmp_ ## fmt ## _sne(fp0, cpu_env, fp0, fp1);      \
1938         break;                                                          \
1939     default:                                                            \
1940         abort();                                                        \
1941     }                                                                   \
1942     STORE;                                                              \
1943     tcg_temp_free_i ## bits(fp0);                                       \
1944     tcg_temp_free_i ## bits(fp1);                                       \
1945 }
1946 
1947 FOP_CONDNS(d, FMT_D, 64, gen_store_fpr64(ctx, fp0, fd))
1948 FOP_CONDNS(s, FMT_S, 32, gen_store_fpr32(ctx, fp0, fd))
1949 #undef FOP_CONDNS
1950 #undef gen_ldcmp_fpr32
1951 #undef gen_ldcmp_fpr64
1952 
1953 /* load/store instructions. */
1954 #ifdef CONFIG_USER_ONLY
1955 #define OP_LD_ATOMIC(insn, fname)                                          \
1956 static inline void op_ld_##insn(TCGv ret, TCGv arg1, int mem_idx,          \
1957                                 DisasContext *ctx)                         \
1958 {                                                                          \
1959     TCGv t0 = tcg_temp_new();                                              \
1960     tcg_gen_mov_tl(t0, arg1);                                              \
1961     tcg_gen_qemu_##fname(ret, arg1, ctx->mem_idx);                         \
1962     tcg_gen_st_tl(t0, cpu_env, offsetof(CPUMIPSState, lladdr));            \
1963     tcg_gen_st_tl(ret, cpu_env, offsetof(CPUMIPSState, llval));            \
1964     tcg_temp_free(t0);                                                     \
1965 }
1966 #else
1967 #define OP_LD_ATOMIC(insn, fname)                                          \
1968 static inline void op_ld_##insn(TCGv ret, TCGv arg1, int mem_idx,          \
1969                                 DisasContext *ctx)                         \
1970 {                                                                          \
1971     gen_helper_##insn(ret, cpu_env, arg1, tcg_constant_i32(mem_idx));      \
1972 }
1973 #endif
1974 OP_LD_ATOMIC(ll, ld32s);
1975 #if defined(TARGET_MIPS64)
1976 OP_LD_ATOMIC(lld, ld64);
1977 #endif
1978 #undef OP_LD_ATOMIC
1979 
1980 void gen_base_offset_addr(DisasContext *ctx, TCGv addr, int base, int offset)
1981 {
1982     if (base == 0) {
1983         tcg_gen_movi_tl(addr, offset);
1984     } else if (offset == 0) {
1985         gen_load_gpr(addr, base);
1986     } else {
1987         tcg_gen_movi_tl(addr, offset);
1988         gen_op_addr_add(ctx, addr, cpu_gpr[base], addr);
1989     }
1990 }
1991 
1992 static target_ulong pc_relative_pc(DisasContext *ctx)
1993 {
1994     target_ulong pc = ctx->base.pc_next;
1995 
1996     if (ctx->hflags & MIPS_HFLAG_BMASK) {
1997         int branch_bytes = ctx->hflags & MIPS_HFLAG_BDS16 ? 2 : 4;
1998 
1999         pc -= branch_bytes;
2000     }
2001 
2002     pc &= ~(target_ulong)3;
2003     return pc;
2004 }
2005 
2006 /* Load */
2007 static void gen_ld(DisasContext *ctx, uint32_t opc,
2008                    int rt, int base, int offset)
2009 {
2010     TCGv t0, t1, t2;
2011     int mem_idx = ctx->mem_idx;
2012 
2013     if (rt == 0 && ctx->insn_flags & (INSN_LOONGSON2E | INSN_LOONGSON2F |
2014                                       INSN_LOONGSON3A)) {
2015         /*
2016          * Loongson CPU uses a load to zero register for prefetch.
2017          * We emulate it as a NOP. On other CPU we must perform the
2018          * actual memory access.
2019          */
2020         return;
2021     }
2022 
2023     t0 = tcg_temp_new();
2024     gen_base_offset_addr(ctx, t0, base, offset);
2025 
2026     switch (opc) {
2027 #if defined(TARGET_MIPS64)
2028     case OPC_LWU:
2029         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEUL |
2030                            ctx->default_tcg_memop_mask);
2031         gen_store_gpr(t0, rt);
2032         break;
2033     case OPC_LD:
2034         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEQ |
2035                            ctx->default_tcg_memop_mask);
2036         gen_store_gpr(t0, rt);
2037         break;
2038     case OPC_LLD:
2039     case R6_OPC_LLD:
2040         op_ld_lld(t0, t0, mem_idx, ctx);
2041         gen_store_gpr(t0, rt);
2042         break;
2043     case OPC_LDL:
2044         t1 = tcg_temp_new();
2045         /*
2046          * Do a byte access to possibly trigger a page
2047          * fault with the unaligned address.
2048          */
2049         tcg_gen_qemu_ld_tl(t1, t0, mem_idx, MO_UB);
2050         tcg_gen_andi_tl(t1, t0, 7);
2051         if (!cpu_is_bigendian(ctx)) {
2052             tcg_gen_xori_tl(t1, t1, 7);
2053         }
2054         tcg_gen_shli_tl(t1, t1, 3);
2055         tcg_gen_andi_tl(t0, t0, ~7);
2056         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEQ);
2057         tcg_gen_shl_tl(t0, t0, t1);
2058         t2 = tcg_const_tl(-1);
2059         tcg_gen_shl_tl(t2, t2, t1);
2060         gen_load_gpr(t1, rt);
2061         tcg_gen_andc_tl(t1, t1, t2);
2062         tcg_temp_free(t2);
2063         tcg_gen_or_tl(t0, t0, t1);
2064         tcg_temp_free(t1);
2065         gen_store_gpr(t0, rt);
2066         break;
2067     case OPC_LDR:
2068         t1 = tcg_temp_new();
2069         /*
2070          * Do a byte access to possibly trigger a page
2071          * fault with the unaligned address.
2072          */
2073         tcg_gen_qemu_ld_tl(t1, t0, mem_idx, MO_UB);
2074         tcg_gen_andi_tl(t1, t0, 7);
2075         if (cpu_is_bigendian(ctx)) {
2076             tcg_gen_xori_tl(t1, t1, 7);
2077         }
2078         tcg_gen_shli_tl(t1, t1, 3);
2079         tcg_gen_andi_tl(t0, t0, ~7);
2080         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEQ);
2081         tcg_gen_shr_tl(t0, t0, t1);
2082         tcg_gen_xori_tl(t1, t1, 63);
2083         t2 = tcg_const_tl(0xfffffffffffffffeull);
2084         tcg_gen_shl_tl(t2, t2, t1);
2085         gen_load_gpr(t1, rt);
2086         tcg_gen_and_tl(t1, t1, t2);
2087         tcg_temp_free(t2);
2088         tcg_gen_or_tl(t0, t0, t1);
2089         tcg_temp_free(t1);
2090         gen_store_gpr(t0, rt);
2091         break;
2092     case OPC_LDPC:
2093         t1 = tcg_const_tl(pc_relative_pc(ctx));
2094         gen_op_addr_add(ctx, t0, t0, t1);
2095         tcg_temp_free(t1);
2096         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEQ);
2097         gen_store_gpr(t0, rt);
2098         break;
2099 #endif
2100     case OPC_LWPC:
2101         t1 = tcg_const_tl(pc_relative_pc(ctx));
2102         gen_op_addr_add(ctx, t0, t0, t1);
2103         tcg_temp_free(t1);
2104         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TESL);
2105         gen_store_gpr(t0, rt);
2106         break;
2107     case OPC_LWE:
2108         mem_idx = MIPS_HFLAG_UM;
2109         /* fall through */
2110     case OPC_LW:
2111         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TESL |
2112                            ctx->default_tcg_memop_mask);
2113         gen_store_gpr(t0, rt);
2114         break;
2115     case OPC_LHE:
2116         mem_idx = MIPS_HFLAG_UM;
2117         /* fall through */
2118     case OPC_LH:
2119         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TESW |
2120                            ctx->default_tcg_memop_mask);
2121         gen_store_gpr(t0, rt);
2122         break;
2123     case OPC_LHUE:
2124         mem_idx = MIPS_HFLAG_UM;
2125         /* fall through */
2126     case OPC_LHU:
2127         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEUW |
2128                            ctx->default_tcg_memop_mask);
2129         gen_store_gpr(t0, rt);
2130         break;
2131     case OPC_LBE:
2132         mem_idx = MIPS_HFLAG_UM;
2133         /* fall through */
2134     case OPC_LB:
2135         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_SB);
2136         gen_store_gpr(t0, rt);
2137         break;
2138     case OPC_LBUE:
2139         mem_idx = MIPS_HFLAG_UM;
2140         /* fall through */
2141     case OPC_LBU:
2142         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_UB);
2143         gen_store_gpr(t0, rt);
2144         break;
2145     case OPC_LWLE:
2146         mem_idx = MIPS_HFLAG_UM;
2147         /* fall through */
2148     case OPC_LWL:
2149         t1 = tcg_temp_new();
2150         /*
2151          * Do a byte access to possibly trigger a page
2152          * fault with the unaligned address.
2153          */
2154         tcg_gen_qemu_ld_tl(t1, t0, mem_idx, MO_UB);
2155         tcg_gen_andi_tl(t1, t0, 3);
2156         if (!cpu_is_bigendian(ctx)) {
2157             tcg_gen_xori_tl(t1, t1, 3);
2158         }
2159         tcg_gen_shli_tl(t1, t1, 3);
2160         tcg_gen_andi_tl(t0, t0, ~3);
2161         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEUL);
2162         tcg_gen_shl_tl(t0, t0, t1);
2163         t2 = tcg_const_tl(-1);
2164         tcg_gen_shl_tl(t2, t2, t1);
2165         gen_load_gpr(t1, rt);
2166         tcg_gen_andc_tl(t1, t1, t2);
2167         tcg_temp_free(t2);
2168         tcg_gen_or_tl(t0, t0, t1);
2169         tcg_temp_free(t1);
2170         tcg_gen_ext32s_tl(t0, t0);
2171         gen_store_gpr(t0, rt);
2172         break;
2173     case OPC_LWRE:
2174         mem_idx = MIPS_HFLAG_UM;
2175         /* fall through */
2176     case OPC_LWR:
2177         t1 = tcg_temp_new();
2178         /*
2179          * Do a byte access to possibly trigger a page
2180          * fault with the unaligned address.
2181          */
2182         tcg_gen_qemu_ld_tl(t1, t0, mem_idx, MO_UB);
2183         tcg_gen_andi_tl(t1, t0, 3);
2184         if (cpu_is_bigendian(ctx)) {
2185             tcg_gen_xori_tl(t1, t1, 3);
2186         }
2187         tcg_gen_shli_tl(t1, t1, 3);
2188         tcg_gen_andi_tl(t0, t0, ~3);
2189         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEUL);
2190         tcg_gen_shr_tl(t0, t0, t1);
2191         tcg_gen_xori_tl(t1, t1, 31);
2192         t2 = tcg_const_tl(0xfffffffeull);
2193         tcg_gen_shl_tl(t2, t2, t1);
2194         gen_load_gpr(t1, rt);
2195         tcg_gen_and_tl(t1, t1, t2);
2196         tcg_temp_free(t2);
2197         tcg_gen_or_tl(t0, t0, t1);
2198         tcg_temp_free(t1);
2199         tcg_gen_ext32s_tl(t0, t0);
2200         gen_store_gpr(t0, rt);
2201         break;
2202     case OPC_LLE:
2203         mem_idx = MIPS_HFLAG_UM;
2204         /* fall through */
2205     case OPC_LL:
2206     case R6_OPC_LL:
2207         op_ld_ll(t0, t0, mem_idx, ctx);
2208         gen_store_gpr(t0, rt);
2209         break;
2210     }
2211     tcg_temp_free(t0);
2212 }
2213 
2214 /* Store */
2215 static void gen_st(DisasContext *ctx, uint32_t opc, int rt,
2216                    int base, int offset)
2217 {
2218     TCGv t0 = tcg_temp_new();
2219     TCGv t1 = tcg_temp_new();
2220     int mem_idx = ctx->mem_idx;
2221 
2222     gen_base_offset_addr(ctx, t0, base, offset);
2223     gen_load_gpr(t1, rt);
2224     switch (opc) {
2225 #if defined(TARGET_MIPS64)
2226     case OPC_SD:
2227         tcg_gen_qemu_st_tl(t1, t0, mem_idx, MO_TEQ |
2228                            ctx->default_tcg_memop_mask);
2229         break;
2230     case OPC_SDL:
2231         gen_helper_0e2i(sdl, t1, t0, mem_idx);
2232         break;
2233     case OPC_SDR:
2234         gen_helper_0e2i(sdr, t1, t0, mem_idx);
2235         break;
2236 #endif
2237     case OPC_SWE:
2238         mem_idx = MIPS_HFLAG_UM;
2239         /* fall through */
2240     case OPC_SW:
2241         tcg_gen_qemu_st_tl(t1, t0, mem_idx, MO_TEUL |
2242                            ctx->default_tcg_memop_mask);
2243         break;
2244     case OPC_SHE:
2245         mem_idx = MIPS_HFLAG_UM;
2246         /* fall through */
2247     case OPC_SH:
2248         tcg_gen_qemu_st_tl(t1, t0, mem_idx, MO_TEUW |
2249                            ctx->default_tcg_memop_mask);
2250         break;
2251     case OPC_SBE:
2252         mem_idx = MIPS_HFLAG_UM;
2253         /* fall through */
2254     case OPC_SB:
2255         tcg_gen_qemu_st_tl(t1, t0, mem_idx, MO_8);
2256         break;
2257     case OPC_SWLE:
2258         mem_idx = MIPS_HFLAG_UM;
2259         /* fall through */
2260     case OPC_SWL:
2261         gen_helper_0e2i(swl, t1, t0, mem_idx);
2262         break;
2263     case OPC_SWRE:
2264         mem_idx = MIPS_HFLAG_UM;
2265         /* fall through */
2266     case OPC_SWR:
2267         gen_helper_0e2i(swr, t1, t0, mem_idx);
2268         break;
2269     }
2270     tcg_temp_free(t0);
2271     tcg_temp_free(t1);
2272 }
2273 
2274 
2275 /* Store conditional */
2276 static void gen_st_cond(DisasContext *ctx, int rt, int base, int offset,
2277                         MemOp tcg_mo, bool eva)
2278 {
2279     TCGv addr, t0, val;
2280     TCGLabel *l1 = gen_new_label();
2281     TCGLabel *done = gen_new_label();
2282 
2283     t0 = tcg_temp_new();
2284     addr = tcg_temp_new();
2285     /* compare the address against that of the preceding LL */
2286     gen_base_offset_addr(ctx, addr, base, offset);
2287     tcg_gen_brcond_tl(TCG_COND_EQ, addr, cpu_lladdr, l1);
2288     tcg_temp_free(addr);
2289     tcg_gen_movi_tl(t0, 0);
2290     gen_store_gpr(t0, rt);
2291     tcg_gen_br(done);
2292 
2293     gen_set_label(l1);
2294     /* generate cmpxchg */
2295     val = tcg_temp_new();
2296     gen_load_gpr(val, rt);
2297     tcg_gen_atomic_cmpxchg_tl(t0, cpu_lladdr, cpu_llval, val,
2298                               eva ? MIPS_HFLAG_UM : ctx->mem_idx, tcg_mo);
2299     tcg_gen_setcond_tl(TCG_COND_EQ, t0, t0, cpu_llval);
2300     gen_store_gpr(t0, rt);
2301     tcg_temp_free(val);
2302 
2303     gen_set_label(done);
2304     tcg_temp_free(t0);
2305 }
2306 
2307 /* Load and store */
2308 static void gen_flt_ldst(DisasContext *ctx, uint32_t opc, int ft,
2309                          TCGv t0)
2310 {
2311     /*
2312      * Don't do NOP if destination is zero: we must perform the actual
2313      * memory access.
2314      */
2315     switch (opc) {
2316     case OPC_LWC1:
2317         {
2318             TCGv_i32 fp0 = tcg_temp_new_i32();
2319             tcg_gen_qemu_ld_i32(fp0, t0, ctx->mem_idx, MO_TESL |
2320                                 ctx->default_tcg_memop_mask);
2321             gen_store_fpr32(ctx, fp0, ft);
2322             tcg_temp_free_i32(fp0);
2323         }
2324         break;
2325     case OPC_SWC1:
2326         {
2327             TCGv_i32 fp0 = tcg_temp_new_i32();
2328             gen_load_fpr32(ctx, fp0, ft);
2329             tcg_gen_qemu_st_i32(fp0, t0, ctx->mem_idx, MO_TEUL |
2330                                 ctx->default_tcg_memop_mask);
2331             tcg_temp_free_i32(fp0);
2332         }
2333         break;
2334     case OPC_LDC1:
2335         {
2336             TCGv_i64 fp0 = tcg_temp_new_i64();
2337             tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ |
2338                                 ctx->default_tcg_memop_mask);
2339             gen_store_fpr64(ctx, fp0, ft);
2340             tcg_temp_free_i64(fp0);
2341         }
2342         break;
2343     case OPC_SDC1:
2344         {
2345             TCGv_i64 fp0 = tcg_temp_new_i64();
2346             gen_load_fpr64(ctx, fp0, ft);
2347             tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ |
2348                                 ctx->default_tcg_memop_mask);
2349             tcg_temp_free_i64(fp0);
2350         }
2351         break;
2352     default:
2353         MIPS_INVAL("flt_ldst");
2354         gen_reserved_instruction(ctx);
2355         break;
2356     }
2357 }
2358 
2359 static void gen_cop1_ldst(DisasContext *ctx, uint32_t op, int rt,
2360                           int rs, int16_t imm)
2361 {
2362     TCGv t0 = tcg_temp_new();
2363 
2364     if (ctx->CP0_Config1 & (1 << CP0C1_FP)) {
2365         check_cp1_enabled(ctx);
2366         switch (op) {
2367         case OPC_LDC1:
2368         case OPC_SDC1:
2369             check_insn(ctx, ISA_MIPS2);
2370             /* Fallthrough */
2371         default:
2372             gen_base_offset_addr(ctx, t0, rs, imm);
2373             gen_flt_ldst(ctx, op, rt, t0);
2374         }
2375     } else {
2376         generate_exception_err(ctx, EXCP_CpU, 1);
2377     }
2378     tcg_temp_free(t0);
2379 }
2380 
2381 /* Arithmetic with immediate operand */
2382 static void gen_arith_imm(DisasContext *ctx, uint32_t opc,
2383                           int rt, int rs, int imm)
2384 {
2385     target_ulong uimm = (target_long)imm; /* Sign extend to 32/64 bits */
2386 
2387     if (rt == 0 && opc != OPC_ADDI && opc != OPC_DADDI) {
2388         /*
2389          * If no destination, treat it as a NOP.
2390          * For addi, we must generate the overflow exception when needed.
2391          */
2392         return;
2393     }
2394     switch (opc) {
2395     case OPC_ADDI:
2396         {
2397             TCGv t0 = tcg_temp_local_new();
2398             TCGv t1 = tcg_temp_new();
2399             TCGv t2 = tcg_temp_new();
2400             TCGLabel *l1 = gen_new_label();
2401 
2402             gen_load_gpr(t1, rs);
2403             tcg_gen_addi_tl(t0, t1, uimm);
2404             tcg_gen_ext32s_tl(t0, t0);
2405 
2406             tcg_gen_xori_tl(t1, t1, ~uimm);
2407             tcg_gen_xori_tl(t2, t0, uimm);
2408             tcg_gen_and_tl(t1, t1, t2);
2409             tcg_temp_free(t2);
2410             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2411             tcg_temp_free(t1);
2412             /* operands of same sign, result different sign */
2413             generate_exception(ctx, EXCP_OVERFLOW);
2414             gen_set_label(l1);
2415             tcg_gen_ext32s_tl(t0, t0);
2416             gen_store_gpr(t0, rt);
2417             tcg_temp_free(t0);
2418         }
2419         break;
2420     case OPC_ADDIU:
2421         if (rs != 0) {
2422             tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2423             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
2424         } else {
2425             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
2426         }
2427         break;
2428 #if defined(TARGET_MIPS64)
2429     case OPC_DADDI:
2430         {
2431             TCGv t0 = tcg_temp_local_new();
2432             TCGv t1 = tcg_temp_new();
2433             TCGv t2 = tcg_temp_new();
2434             TCGLabel *l1 = gen_new_label();
2435 
2436             gen_load_gpr(t1, rs);
2437             tcg_gen_addi_tl(t0, t1, uimm);
2438 
2439             tcg_gen_xori_tl(t1, t1, ~uimm);
2440             tcg_gen_xori_tl(t2, t0, uimm);
2441             tcg_gen_and_tl(t1, t1, t2);
2442             tcg_temp_free(t2);
2443             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2444             tcg_temp_free(t1);
2445             /* operands of same sign, result different sign */
2446             generate_exception(ctx, EXCP_OVERFLOW);
2447             gen_set_label(l1);
2448             gen_store_gpr(t0, rt);
2449             tcg_temp_free(t0);
2450         }
2451         break;
2452     case OPC_DADDIU:
2453         if (rs != 0) {
2454             tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2455         } else {
2456             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
2457         }
2458         break;
2459 #endif
2460     }
2461 }
2462 
2463 /* Logic with immediate operand */
2464 static void gen_logic_imm(DisasContext *ctx, uint32_t opc,
2465                           int rt, int rs, int16_t imm)
2466 {
2467     target_ulong uimm;
2468 
2469     if (rt == 0) {
2470         /* If no destination, treat it as a NOP. */
2471         return;
2472     }
2473     uimm = (uint16_t)imm;
2474     switch (opc) {
2475     case OPC_ANDI:
2476         if (likely(rs != 0)) {
2477             tcg_gen_andi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2478         } else {
2479             tcg_gen_movi_tl(cpu_gpr[rt], 0);
2480         }
2481         break;
2482     case OPC_ORI:
2483         if (rs != 0) {
2484             tcg_gen_ori_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2485         } else {
2486             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
2487         }
2488         break;
2489     case OPC_XORI:
2490         if (likely(rs != 0)) {
2491             tcg_gen_xori_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2492         } else {
2493             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
2494         }
2495         break;
2496     case OPC_LUI:
2497         if (rs != 0 && (ctx->insn_flags & ISA_MIPS_R6)) {
2498             /* OPC_AUI */
2499             tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], imm << 16);
2500             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
2501         } else {
2502             tcg_gen_movi_tl(cpu_gpr[rt], imm << 16);
2503         }
2504         break;
2505 
2506     default:
2507         break;
2508     }
2509 }
2510 
2511 /* Set on less than with immediate operand */
2512 static void gen_slt_imm(DisasContext *ctx, uint32_t opc,
2513                         int rt, int rs, int16_t imm)
2514 {
2515     target_ulong uimm = (target_long)imm; /* Sign extend to 32/64 bits */
2516     TCGv t0;
2517 
2518     if (rt == 0) {
2519         /* If no destination, treat it as a NOP. */
2520         return;
2521     }
2522     t0 = tcg_temp_new();
2523     gen_load_gpr(t0, rs);
2524     switch (opc) {
2525     case OPC_SLTI:
2526         tcg_gen_setcondi_tl(TCG_COND_LT, cpu_gpr[rt], t0, uimm);
2527         break;
2528     case OPC_SLTIU:
2529         tcg_gen_setcondi_tl(TCG_COND_LTU, cpu_gpr[rt], t0, uimm);
2530         break;
2531     }
2532     tcg_temp_free(t0);
2533 }
2534 
2535 /* Shifts with immediate operand */
2536 static void gen_shift_imm(DisasContext *ctx, uint32_t opc,
2537                           int rt, int rs, int16_t imm)
2538 {
2539     target_ulong uimm = ((uint16_t)imm) & 0x1f;
2540     TCGv t0;
2541 
2542     if (rt == 0) {
2543         /* If no destination, treat it as a NOP. */
2544         return;
2545     }
2546 
2547     t0 = tcg_temp_new();
2548     gen_load_gpr(t0, rs);
2549     switch (opc) {
2550     case OPC_SLL:
2551         tcg_gen_shli_tl(t0, t0, uimm);
2552         tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
2553         break;
2554     case OPC_SRA:
2555         tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm);
2556         break;
2557     case OPC_SRL:
2558         if (uimm != 0) {
2559             tcg_gen_ext32u_tl(t0, t0);
2560             tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm);
2561         } else {
2562             tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
2563         }
2564         break;
2565     case OPC_ROTR:
2566         if (uimm != 0) {
2567             TCGv_i32 t1 = tcg_temp_new_i32();
2568 
2569             tcg_gen_trunc_tl_i32(t1, t0);
2570             tcg_gen_rotri_i32(t1, t1, uimm);
2571             tcg_gen_ext_i32_tl(cpu_gpr[rt], t1);
2572             tcg_temp_free_i32(t1);
2573         } else {
2574             tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
2575         }
2576         break;
2577 #if defined(TARGET_MIPS64)
2578     case OPC_DSLL:
2579         tcg_gen_shli_tl(cpu_gpr[rt], t0, uimm);
2580         break;
2581     case OPC_DSRA:
2582         tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm);
2583         break;
2584     case OPC_DSRL:
2585         tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm);
2586         break;
2587     case OPC_DROTR:
2588         if (uimm != 0) {
2589             tcg_gen_rotri_tl(cpu_gpr[rt], t0, uimm);
2590         } else {
2591             tcg_gen_mov_tl(cpu_gpr[rt], t0);
2592         }
2593         break;
2594     case OPC_DSLL32:
2595         tcg_gen_shli_tl(cpu_gpr[rt], t0, uimm + 32);
2596         break;
2597     case OPC_DSRA32:
2598         tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm + 32);
2599         break;
2600     case OPC_DSRL32:
2601         tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm + 32);
2602         break;
2603     case OPC_DROTR32:
2604         tcg_gen_rotri_tl(cpu_gpr[rt], t0, uimm + 32);
2605         break;
2606 #endif
2607     }
2608     tcg_temp_free(t0);
2609 }
2610 
2611 /* Arithmetic */
2612 static void gen_arith(DisasContext *ctx, uint32_t opc,
2613                       int rd, int rs, int rt)
2614 {
2615     if (rd == 0 && opc != OPC_ADD && opc != OPC_SUB
2616        && opc != OPC_DADD && opc != OPC_DSUB) {
2617         /*
2618          * If no destination, treat it as a NOP.
2619          * For add & sub, we must generate the overflow exception when needed.
2620          */
2621         return;
2622     }
2623 
2624     switch (opc) {
2625     case OPC_ADD:
2626         {
2627             TCGv t0 = tcg_temp_local_new();
2628             TCGv t1 = tcg_temp_new();
2629             TCGv t2 = tcg_temp_new();
2630             TCGLabel *l1 = gen_new_label();
2631 
2632             gen_load_gpr(t1, rs);
2633             gen_load_gpr(t2, rt);
2634             tcg_gen_add_tl(t0, t1, t2);
2635             tcg_gen_ext32s_tl(t0, t0);
2636             tcg_gen_xor_tl(t1, t1, t2);
2637             tcg_gen_xor_tl(t2, t0, t2);
2638             tcg_gen_andc_tl(t1, t2, t1);
2639             tcg_temp_free(t2);
2640             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2641             tcg_temp_free(t1);
2642             /* operands of same sign, result different sign */
2643             generate_exception(ctx, EXCP_OVERFLOW);
2644             gen_set_label(l1);
2645             gen_store_gpr(t0, rd);
2646             tcg_temp_free(t0);
2647         }
2648         break;
2649     case OPC_ADDU:
2650         if (rs != 0 && rt != 0) {
2651             tcg_gen_add_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2652             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2653         } else if (rs == 0 && rt != 0) {
2654             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
2655         } else if (rs != 0 && rt == 0) {
2656             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2657         } else {
2658             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2659         }
2660         break;
2661     case OPC_SUB:
2662         {
2663             TCGv t0 = tcg_temp_local_new();
2664             TCGv t1 = tcg_temp_new();
2665             TCGv t2 = tcg_temp_new();
2666             TCGLabel *l1 = gen_new_label();
2667 
2668             gen_load_gpr(t1, rs);
2669             gen_load_gpr(t2, rt);
2670             tcg_gen_sub_tl(t0, t1, t2);
2671             tcg_gen_ext32s_tl(t0, t0);
2672             tcg_gen_xor_tl(t2, t1, t2);
2673             tcg_gen_xor_tl(t1, t0, t1);
2674             tcg_gen_and_tl(t1, t1, t2);
2675             tcg_temp_free(t2);
2676             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2677             tcg_temp_free(t1);
2678             /*
2679              * operands of different sign, first operand and the result
2680              * of different sign
2681              */
2682             generate_exception(ctx, EXCP_OVERFLOW);
2683             gen_set_label(l1);
2684             gen_store_gpr(t0, rd);
2685             tcg_temp_free(t0);
2686         }
2687         break;
2688     case OPC_SUBU:
2689         if (rs != 0 && rt != 0) {
2690             tcg_gen_sub_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2691             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2692         } else if (rs == 0 && rt != 0) {
2693             tcg_gen_neg_tl(cpu_gpr[rd], cpu_gpr[rt]);
2694             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2695         } else if (rs != 0 && rt == 0) {
2696             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2697         } else {
2698             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2699         }
2700         break;
2701 #if defined(TARGET_MIPS64)
2702     case OPC_DADD:
2703         {
2704             TCGv t0 = tcg_temp_local_new();
2705             TCGv t1 = tcg_temp_new();
2706             TCGv t2 = tcg_temp_new();
2707             TCGLabel *l1 = gen_new_label();
2708 
2709             gen_load_gpr(t1, rs);
2710             gen_load_gpr(t2, rt);
2711             tcg_gen_add_tl(t0, t1, t2);
2712             tcg_gen_xor_tl(t1, t1, t2);
2713             tcg_gen_xor_tl(t2, t0, t2);
2714             tcg_gen_andc_tl(t1, t2, t1);
2715             tcg_temp_free(t2);
2716             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2717             tcg_temp_free(t1);
2718             /* operands of same sign, result different sign */
2719             generate_exception(ctx, EXCP_OVERFLOW);
2720             gen_set_label(l1);
2721             gen_store_gpr(t0, rd);
2722             tcg_temp_free(t0);
2723         }
2724         break;
2725     case OPC_DADDU:
2726         if (rs != 0 && rt != 0) {
2727             tcg_gen_add_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2728         } else if (rs == 0 && rt != 0) {
2729             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
2730         } else if (rs != 0 && rt == 0) {
2731             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2732         } else {
2733             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2734         }
2735         break;
2736     case OPC_DSUB:
2737         {
2738             TCGv t0 = tcg_temp_local_new();
2739             TCGv t1 = tcg_temp_new();
2740             TCGv t2 = tcg_temp_new();
2741             TCGLabel *l1 = gen_new_label();
2742 
2743             gen_load_gpr(t1, rs);
2744             gen_load_gpr(t2, rt);
2745             tcg_gen_sub_tl(t0, t1, t2);
2746             tcg_gen_xor_tl(t2, t1, t2);
2747             tcg_gen_xor_tl(t1, t0, t1);
2748             tcg_gen_and_tl(t1, t1, t2);
2749             tcg_temp_free(t2);
2750             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2751             tcg_temp_free(t1);
2752             /*
2753              * Operands of different sign, first operand and result different
2754              * sign.
2755              */
2756             generate_exception(ctx, EXCP_OVERFLOW);
2757             gen_set_label(l1);
2758             gen_store_gpr(t0, rd);
2759             tcg_temp_free(t0);
2760         }
2761         break;
2762     case OPC_DSUBU:
2763         if (rs != 0 && rt != 0) {
2764             tcg_gen_sub_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2765         } else if (rs == 0 && rt != 0) {
2766             tcg_gen_neg_tl(cpu_gpr[rd], cpu_gpr[rt]);
2767         } else if (rs != 0 && rt == 0) {
2768             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2769         } else {
2770             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2771         }
2772         break;
2773 #endif
2774     case OPC_MUL:
2775         if (likely(rs != 0 && rt != 0)) {
2776             tcg_gen_mul_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2777             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2778         } else {
2779             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2780         }
2781         break;
2782     }
2783 }
2784 
2785 /* Conditional move */
2786 static void gen_cond_move(DisasContext *ctx, uint32_t opc,
2787                           int rd, int rs, int rt)
2788 {
2789     TCGv t0, t1, t2;
2790 
2791     if (rd == 0) {
2792         /* If no destination, treat it as a NOP. */
2793         return;
2794     }
2795 
2796     t0 = tcg_temp_new();
2797     gen_load_gpr(t0, rt);
2798     t1 = tcg_const_tl(0);
2799     t2 = tcg_temp_new();
2800     gen_load_gpr(t2, rs);
2801     switch (opc) {
2802     case OPC_MOVN:
2803         tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr[rd], t0, t1, t2, cpu_gpr[rd]);
2804         break;
2805     case OPC_MOVZ:
2806         tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr[rd], t0, t1, t2, cpu_gpr[rd]);
2807         break;
2808     case OPC_SELNEZ:
2809         tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr[rd], t0, t1, t2, t1);
2810         break;
2811     case OPC_SELEQZ:
2812         tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr[rd], t0, t1, t2, t1);
2813         break;
2814     }
2815     tcg_temp_free(t2);
2816     tcg_temp_free(t1);
2817     tcg_temp_free(t0);
2818 }
2819 
2820 /* Logic */
2821 static void gen_logic(DisasContext *ctx, uint32_t opc,
2822                       int rd, int rs, int rt)
2823 {
2824     if (rd == 0) {
2825         /* If no destination, treat it as a NOP. */
2826         return;
2827     }
2828 
2829     switch (opc) {
2830     case OPC_AND:
2831         if (likely(rs != 0 && rt != 0)) {
2832             tcg_gen_and_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2833         } else {
2834             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2835         }
2836         break;
2837     case OPC_NOR:
2838         if (rs != 0 && rt != 0) {
2839             tcg_gen_nor_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2840         } else if (rs == 0 && rt != 0) {
2841             tcg_gen_not_tl(cpu_gpr[rd], cpu_gpr[rt]);
2842         } else if (rs != 0 && rt == 0) {
2843             tcg_gen_not_tl(cpu_gpr[rd], cpu_gpr[rs]);
2844         } else {
2845             tcg_gen_movi_tl(cpu_gpr[rd], ~((target_ulong)0));
2846         }
2847         break;
2848     case OPC_OR:
2849         if (likely(rs != 0 && rt != 0)) {
2850             tcg_gen_or_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2851         } else if (rs == 0 && rt != 0) {
2852             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
2853         } else if (rs != 0 && rt == 0) {
2854             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2855         } else {
2856             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2857         }
2858         break;
2859     case OPC_XOR:
2860         if (likely(rs != 0 && rt != 0)) {
2861             tcg_gen_xor_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2862         } else if (rs == 0 && rt != 0) {
2863             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
2864         } else if (rs != 0 && rt == 0) {
2865             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2866         } else {
2867             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2868         }
2869         break;
2870     }
2871 }
2872 
2873 /* Set on lower than */
2874 static void gen_slt(DisasContext *ctx, uint32_t opc,
2875                     int rd, int rs, int rt)
2876 {
2877     TCGv t0, t1;
2878 
2879     if (rd == 0) {
2880         /* If no destination, treat it as a NOP. */
2881         return;
2882     }
2883 
2884     t0 = tcg_temp_new();
2885     t1 = tcg_temp_new();
2886     gen_load_gpr(t0, rs);
2887     gen_load_gpr(t1, rt);
2888     switch (opc) {
2889     case OPC_SLT:
2890         tcg_gen_setcond_tl(TCG_COND_LT, cpu_gpr[rd], t0, t1);
2891         break;
2892     case OPC_SLTU:
2893         tcg_gen_setcond_tl(TCG_COND_LTU, cpu_gpr[rd], t0, t1);
2894         break;
2895     }
2896     tcg_temp_free(t0);
2897     tcg_temp_free(t1);
2898 }
2899 
2900 /* Shifts */
2901 static void gen_shift(DisasContext *ctx, uint32_t opc,
2902                       int rd, int rs, int rt)
2903 {
2904     TCGv t0, t1;
2905 
2906     if (rd == 0) {
2907         /*
2908          * If no destination, treat it as a NOP.
2909          * For add & sub, we must generate the overflow exception when needed.
2910          */
2911         return;
2912     }
2913 
2914     t0 = tcg_temp_new();
2915     t1 = tcg_temp_new();
2916     gen_load_gpr(t0, rs);
2917     gen_load_gpr(t1, rt);
2918     switch (opc) {
2919     case OPC_SLLV:
2920         tcg_gen_andi_tl(t0, t0, 0x1f);
2921         tcg_gen_shl_tl(t0, t1, t0);
2922         tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
2923         break;
2924     case OPC_SRAV:
2925         tcg_gen_andi_tl(t0, t0, 0x1f);
2926         tcg_gen_sar_tl(cpu_gpr[rd], t1, t0);
2927         break;
2928     case OPC_SRLV:
2929         tcg_gen_ext32u_tl(t1, t1);
2930         tcg_gen_andi_tl(t0, t0, 0x1f);
2931         tcg_gen_shr_tl(t0, t1, t0);
2932         tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
2933         break;
2934     case OPC_ROTRV:
2935         {
2936             TCGv_i32 t2 = tcg_temp_new_i32();
2937             TCGv_i32 t3 = tcg_temp_new_i32();
2938 
2939             tcg_gen_trunc_tl_i32(t2, t0);
2940             tcg_gen_trunc_tl_i32(t3, t1);
2941             tcg_gen_andi_i32(t2, t2, 0x1f);
2942             tcg_gen_rotr_i32(t2, t3, t2);
2943             tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
2944             tcg_temp_free_i32(t2);
2945             tcg_temp_free_i32(t3);
2946         }
2947         break;
2948 #if defined(TARGET_MIPS64)
2949     case OPC_DSLLV:
2950         tcg_gen_andi_tl(t0, t0, 0x3f);
2951         tcg_gen_shl_tl(cpu_gpr[rd], t1, t0);
2952         break;
2953     case OPC_DSRAV:
2954         tcg_gen_andi_tl(t0, t0, 0x3f);
2955         tcg_gen_sar_tl(cpu_gpr[rd], t1, t0);
2956         break;
2957     case OPC_DSRLV:
2958         tcg_gen_andi_tl(t0, t0, 0x3f);
2959         tcg_gen_shr_tl(cpu_gpr[rd], t1, t0);
2960         break;
2961     case OPC_DROTRV:
2962         tcg_gen_andi_tl(t0, t0, 0x3f);
2963         tcg_gen_rotr_tl(cpu_gpr[rd], t1, t0);
2964         break;
2965 #endif
2966     }
2967     tcg_temp_free(t0);
2968     tcg_temp_free(t1);
2969 }
2970 
2971 /* Arithmetic on HI/LO registers */
2972 static void gen_HILO(DisasContext *ctx, uint32_t opc, int acc, int reg)
2973 {
2974     if (reg == 0 && (opc == OPC_MFHI || opc == OPC_MFLO)) {
2975         /* Treat as NOP. */
2976         return;
2977     }
2978 
2979     if (acc != 0) {
2980         check_dsp(ctx);
2981     }
2982 
2983     switch (opc) {
2984     case OPC_MFHI:
2985 #if defined(TARGET_MIPS64)
2986         if (acc != 0) {
2987             tcg_gen_ext32s_tl(cpu_gpr[reg], cpu_HI[acc]);
2988         } else
2989 #endif
2990         {
2991             tcg_gen_mov_tl(cpu_gpr[reg], cpu_HI[acc]);
2992         }
2993         break;
2994     case OPC_MFLO:
2995 #if defined(TARGET_MIPS64)
2996         if (acc != 0) {
2997             tcg_gen_ext32s_tl(cpu_gpr[reg], cpu_LO[acc]);
2998         } else
2999 #endif
3000         {
3001             tcg_gen_mov_tl(cpu_gpr[reg], cpu_LO[acc]);
3002         }
3003         break;
3004     case OPC_MTHI:
3005         if (reg != 0) {
3006 #if defined(TARGET_MIPS64)
3007             if (acc != 0) {
3008                 tcg_gen_ext32s_tl(cpu_HI[acc], cpu_gpr[reg]);
3009             } else
3010 #endif
3011             {
3012                 tcg_gen_mov_tl(cpu_HI[acc], cpu_gpr[reg]);
3013             }
3014         } else {
3015             tcg_gen_movi_tl(cpu_HI[acc], 0);
3016         }
3017         break;
3018     case OPC_MTLO:
3019         if (reg != 0) {
3020 #if defined(TARGET_MIPS64)
3021             if (acc != 0) {
3022                 tcg_gen_ext32s_tl(cpu_LO[acc], cpu_gpr[reg]);
3023             } else
3024 #endif
3025             {
3026                 tcg_gen_mov_tl(cpu_LO[acc], cpu_gpr[reg]);
3027             }
3028         } else {
3029             tcg_gen_movi_tl(cpu_LO[acc], 0);
3030         }
3031         break;
3032     }
3033 }
3034 
3035 static inline void gen_r6_ld(target_long addr, int reg, int memidx,
3036                              MemOp memop)
3037 {
3038     TCGv t0 = tcg_const_tl(addr);
3039     tcg_gen_qemu_ld_tl(t0, t0, memidx, memop);
3040     gen_store_gpr(t0, reg);
3041     tcg_temp_free(t0);
3042 }
3043 
3044 static inline void gen_pcrel(DisasContext *ctx, int opc, target_ulong pc,
3045                              int rs)
3046 {
3047     target_long offset;
3048     target_long addr;
3049 
3050     switch (MASK_OPC_PCREL_TOP2BITS(opc)) {
3051     case OPC_ADDIUPC:
3052         if (rs != 0) {
3053             offset = sextract32(ctx->opcode << 2, 0, 21);
3054             addr = addr_add(ctx, pc, offset);
3055             tcg_gen_movi_tl(cpu_gpr[rs], addr);
3056         }
3057         break;
3058     case R6_OPC_LWPC:
3059         offset = sextract32(ctx->opcode << 2, 0, 21);
3060         addr = addr_add(ctx, pc, offset);
3061         gen_r6_ld(addr, rs, ctx->mem_idx, MO_TESL);
3062         break;
3063 #if defined(TARGET_MIPS64)
3064     case OPC_LWUPC:
3065         check_mips_64(ctx);
3066         offset = sextract32(ctx->opcode << 2, 0, 21);
3067         addr = addr_add(ctx, pc, offset);
3068         gen_r6_ld(addr, rs, ctx->mem_idx, MO_TEUL);
3069         break;
3070 #endif
3071     default:
3072         switch (MASK_OPC_PCREL_TOP5BITS(opc)) {
3073         case OPC_AUIPC:
3074             if (rs != 0) {
3075                 offset = sextract32(ctx->opcode, 0, 16) << 16;
3076                 addr = addr_add(ctx, pc, offset);
3077                 tcg_gen_movi_tl(cpu_gpr[rs], addr);
3078             }
3079             break;
3080         case OPC_ALUIPC:
3081             if (rs != 0) {
3082                 offset = sextract32(ctx->opcode, 0, 16) << 16;
3083                 addr = ~0xFFFF & addr_add(ctx, pc, offset);
3084                 tcg_gen_movi_tl(cpu_gpr[rs], addr);
3085             }
3086             break;
3087 #if defined(TARGET_MIPS64)
3088         case R6_OPC_LDPC: /* bits 16 and 17 are part of immediate */
3089         case R6_OPC_LDPC + (1 << 16):
3090         case R6_OPC_LDPC + (2 << 16):
3091         case R6_OPC_LDPC + (3 << 16):
3092             check_mips_64(ctx);
3093             offset = sextract32(ctx->opcode << 3, 0, 21);
3094             addr = addr_add(ctx, (pc & ~0x7), offset);
3095             gen_r6_ld(addr, rs, ctx->mem_idx, MO_TEQ);
3096             break;
3097 #endif
3098         default:
3099             MIPS_INVAL("OPC_PCREL");
3100             gen_reserved_instruction(ctx);
3101             break;
3102         }
3103         break;
3104     }
3105 }
3106 
3107 static void gen_r6_muldiv(DisasContext *ctx, int opc, int rd, int rs, int rt)
3108 {
3109     TCGv t0, t1;
3110 
3111     if (rd == 0) {
3112         /* Treat as NOP. */
3113         return;
3114     }
3115 
3116     t0 = tcg_temp_new();
3117     t1 = tcg_temp_new();
3118 
3119     gen_load_gpr(t0, rs);
3120     gen_load_gpr(t1, rt);
3121 
3122     switch (opc) {
3123     case R6_OPC_DIV:
3124         {
3125             TCGv t2 = tcg_temp_new();
3126             TCGv t3 = tcg_temp_new();
3127             tcg_gen_ext32s_tl(t0, t0);
3128             tcg_gen_ext32s_tl(t1, t1);
3129             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, INT_MIN);
3130             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1);
3131             tcg_gen_and_tl(t2, t2, t3);
3132             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3133             tcg_gen_or_tl(t2, t2, t3);
3134             tcg_gen_movi_tl(t3, 0);
3135             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3136             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
3137             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3138             tcg_temp_free(t3);
3139             tcg_temp_free(t2);
3140         }
3141         break;
3142     case R6_OPC_MOD:
3143         {
3144             TCGv t2 = tcg_temp_new();
3145             TCGv t3 = tcg_temp_new();
3146             tcg_gen_ext32s_tl(t0, t0);
3147             tcg_gen_ext32s_tl(t1, t1);
3148             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, INT_MIN);
3149             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1);
3150             tcg_gen_and_tl(t2, t2, t3);
3151             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3152             tcg_gen_or_tl(t2, t2, t3);
3153             tcg_gen_movi_tl(t3, 0);
3154             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3155             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
3156             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3157             tcg_temp_free(t3);
3158             tcg_temp_free(t2);
3159         }
3160         break;
3161     case R6_OPC_DIVU:
3162         {
3163             TCGv t2 = tcg_const_tl(0);
3164             TCGv t3 = tcg_const_tl(1);
3165             tcg_gen_ext32u_tl(t0, t0);
3166             tcg_gen_ext32u_tl(t1, t1);
3167             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3168             tcg_gen_divu_tl(cpu_gpr[rd], t0, t1);
3169             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3170             tcg_temp_free(t3);
3171             tcg_temp_free(t2);
3172         }
3173         break;
3174     case R6_OPC_MODU:
3175         {
3176             TCGv t2 = tcg_const_tl(0);
3177             TCGv t3 = tcg_const_tl(1);
3178             tcg_gen_ext32u_tl(t0, t0);
3179             tcg_gen_ext32u_tl(t1, t1);
3180             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3181             tcg_gen_remu_tl(cpu_gpr[rd], t0, t1);
3182             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3183             tcg_temp_free(t3);
3184             tcg_temp_free(t2);
3185         }
3186         break;
3187     case R6_OPC_MUL:
3188         {
3189             TCGv_i32 t2 = tcg_temp_new_i32();
3190             TCGv_i32 t3 = tcg_temp_new_i32();
3191             tcg_gen_trunc_tl_i32(t2, t0);
3192             tcg_gen_trunc_tl_i32(t3, t1);
3193             tcg_gen_mul_i32(t2, t2, t3);
3194             tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
3195             tcg_temp_free_i32(t2);
3196             tcg_temp_free_i32(t3);
3197         }
3198         break;
3199     case R6_OPC_MUH:
3200         {
3201             TCGv_i32 t2 = tcg_temp_new_i32();
3202             TCGv_i32 t3 = tcg_temp_new_i32();
3203             tcg_gen_trunc_tl_i32(t2, t0);
3204             tcg_gen_trunc_tl_i32(t3, t1);
3205             tcg_gen_muls2_i32(t2, t3, t2, t3);
3206             tcg_gen_ext_i32_tl(cpu_gpr[rd], t3);
3207             tcg_temp_free_i32(t2);
3208             tcg_temp_free_i32(t3);
3209         }
3210         break;
3211     case R6_OPC_MULU:
3212         {
3213             TCGv_i32 t2 = tcg_temp_new_i32();
3214             TCGv_i32 t3 = tcg_temp_new_i32();
3215             tcg_gen_trunc_tl_i32(t2, t0);
3216             tcg_gen_trunc_tl_i32(t3, t1);
3217             tcg_gen_mul_i32(t2, t2, t3);
3218             tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
3219             tcg_temp_free_i32(t2);
3220             tcg_temp_free_i32(t3);
3221         }
3222         break;
3223     case R6_OPC_MUHU:
3224         {
3225             TCGv_i32 t2 = tcg_temp_new_i32();
3226             TCGv_i32 t3 = tcg_temp_new_i32();
3227             tcg_gen_trunc_tl_i32(t2, t0);
3228             tcg_gen_trunc_tl_i32(t3, t1);
3229             tcg_gen_mulu2_i32(t2, t3, t2, t3);
3230             tcg_gen_ext_i32_tl(cpu_gpr[rd], t3);
3231             tcg_temp_free_i32(t2);
3232             tcg_temp_free_i32(t3);
3233         }
3234         break;
3235 #if defined(TARGET_MIPS64)
3236     case R6_OPC_DDIV:
3237         {
3238             TCGv t2 = tcg_temp_new();
3239             TCGv t3 = tcg_temp_new();
3240             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, -1LL << 63);
3241             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1LL);
3242             tcg_gen_and_tl(t2, t2, t3);
3243             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3244             tcg_gen_or_tl(t2, t2, t3);
3245             tcg_gen_movi_tl(t3, 0);
3246             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3247             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
3248             tcg_temp_free(t3);
3249             tcg_temp_free(t2);
3250         }
3251         break;
3252     case R6_OPC_DMOD:
3253         {
3254             TCGv t2 = tcg_temp_new();
3255             TCGv t3 = tcg_temp_new();
3256             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, -1LL << 63);
3257             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1LL);
3258             tcg_gen_and_tl(t2, t2, t3);
3259             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3260             tcg_gen_or_tl(t2, t2, t3);
3261             tcg_gen_movi_tl(t3, 0);
3262             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3263             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
3264             tcg_temp_free(t3);
3265             tcg_temp_free(t2);
3266         }
3267         break;
3268     case R6_OPC_DDIVU:
3269         {
3270             TCGv t2 = tcg_const_tl(0);
3271             TCGv t3 = tcg_const_tl(1);
3272             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3273             tcg_gen_divu_i64(cpu_gpr[rd], t0, t1);
3274             tcg_temp_free(t3);
3275             tcg_temp_free(t2);
3276         }
3277         break;
3278     case R6_OPC_DMODU:
3279         {
3280             TCGv t2 = tcg_const_tl(0);
3281             TCGv t3 = tcg_const_tl(1);
3282             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3283             tcg_gen_remu_i64(cpu_gpr[rd], t0, t1);
3284             tcg_temp_free(t3);
3285             tcg_temp_free(t2);
3286         }
3287         break;
3288     case R6_OPC_DMUL:
3289         tcg_gen_mul_i64(cpu_gpr[rd], t0, t1);
3290         break;
3291     case R6_OPC_DMUH:
3292         {
3293             TCGv t2 = tcg_temp_new();
3294             tcg_gen_muls2_i64(t2, cpu_gpr[rd], t0, t1);
3295             tcg_temp_free(t2);
3296         }
3297         break;
3298     case R6_OPC_DMULU:
3299         tcg_gen_mul_i64(cpu_gpr[rd], t0, t1);
3300         break;
3301     case R6_OPC_DMUHU:
3302         {
3303             TCGv t2 = tcg_temp_new();
3304             tcg_gen_mulu2_i64(t2, cpu_gpr[rd], t0, t1);
3305             tcg_temp_free(t2);
3306         }
3307         break;
3308 #endif
3309     default:
3310         MIPS_INVAL("r6 mul/div");
3311         gen_reserved_instruction(ctx);
3312         goto out;
3313     }
3314  out:
3315     tcg_temp_free(t0);
3316     tcg_temp_free(t1);
3317 }
3318 
3319 #if defined(TARGET_MIPS64)
3320 static void gen_div1_tx79(DisasContext *ctx, uint32_t opc, int rs, int rt)
3321 {
3322     TCGv t0, t1;
3323 
3324     t0 = tcg_temp_new();
3325     t1 = tcg_temp_new();
3326 
3327     gen_load_gpr(t0, rs);
3328     gen_load_gpr(t1, rt);
3329 
3330     switch (opc) {
3331     case MMI_OPC_DIV1:
3332         {
3333             TCGv t2 = tcg_temp_new();
3334             TCGv t3 = tcg_temp_new();
3335             tcg_gen_ext32s_tl(t0, t0);
3336             tcg_gen_ext32s_tl(t1, t1);
3337             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, INT_MIN);
3338             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1);
3339             tcg_gen_and_tl(t2, t2, t3);
3340             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3341             tcg_gen_or_tl(t2, t2, t3);
3342             tcg_gen_movi_tl(t3, 0);
3343             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3344             tcg_gen_div_tl(cpu_LO[1], t0, t1);
3345             tcg_gen_rem_tl(cpu_HI[1], t0, t1);
3346             tcg_gen_ext32s_tl(cpu_LO[1], cpu_LO[1]);
3347             tcg_gen_ext32s_tl(cpu_HI[1], cpu_HI[1]);
3348             tcg_temp_free(t3);
3349             tcg_temp_free(t2);
3350         }
3351         break;
3352     case MMI_OPC_DIVU1:
3353         {
3354             TCGv t2 = tcg_const_tl(0);
3355             TCGv t3 = tcg_const_tl(1);
3356             tcg_gen_ext32u_tl(t0, t0);
3357             tcg_gen_ext32u_tl(t1, t1);
3358             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3359             tcg_gen_divu_tl(cpu_LO[1], t0, t1);
3360             tcg_gen_remu_tl(cpu_HI[1], t0, t1);
3361             tcg_gen_ext32s_tl(cpu_LO[1], cpu_LO[1]);
3362             tcg_gen_ext32s_tl(cpu_HI[1], cpu_HI[1]);
3363             tcg_temp_free(t3);
3364             tcg_temp_free(t2);
3365         }
3366         break;
3367     default:
3368         MIPS_INVAL("div1 TX79");
3369         gen_reserved_instruction(ctx);
3370         goto out;
3371     }
3372  out:
3373     tcg_temp_free(t0);
3374     tcg_temp_free(t1);
3375 }
3376 #endif
3377 
3378 static void gen_muldiv(DisasContext *ctx, uint32_t opc,
3379                        int acc, int rs, int rt)
3380 {
3381     TCGv t0, t1;
3382 
3383     t0 = tcg_temp_new();
3384     t1 = tcg_temp_new();
3385 
3386     gen_load_gpr(t0, rs);
3387     gen_load_gpr(t1, rt);
3388 
3389     if (acc != 0) {
3390         check_dsp(ctx);
3391     }
3392 
3393     switch (opc) {
3394     case OPC_DIV:
3395         {
3396             TCGv t2 = tcg_temp_new();
3397             TCGv t3 = tcg_temp_new();
3398             tcg_gen_ext32s_tl(t0, t0);
3399             tcg_gen_ext32s_tl(t1, t1);
3400             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, INT_MIN);
3401             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1);
3402             tcg_gen_and_tl(t2, t2, t3);
3403             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3404             tcg_gen_or_tl(t2, t2, t3);
3405             tcg_gen_movi_tl(t3, 0);
3406             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3407             tcg_gen_div_tl(cpu_LO[acc], t0, t1);
3408             tcg_gen_rem_tl(cpu_HI[acc], t0, t1);
3409             tcg_gen_ext32s_tl(cpu_LO[acc], cpu_LO[acc]);
3410             tcg_gen_ext32s_tl(cpu_HI[acc], cpu_HI[acc]);
3411             tcg_temp_free(t3);
3412             tcg_temp_free(t2);
3413         }
3414         break;
3415     case OPC_DIVU:
3416         {
3417             TCGv t2 = tcg_const_tl(0);
3418             TCGv t3 = tcg_const_tl(1);
3419             tcg_gen_ext32u_tl(t0, t0);
3420             tcg_gen_ext32u_tl(t1, t1);
3421             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3422             tcg_gen_divu_tl(cpu_LO[acc], t0, t1);
3423             tcg_gen_remu_tl(cpu_HI[acc], t0, t1);
3424             tcg_gen_ext32s_tl(cpu_LO[acc], cpu_LO[acc]);
3425             tcg_gen_ext32s_tl(cpu_HI[acc], cpu_HI[acc]);
3426             tcg_temp_free(t3);
3427             tcg_temp_free(t2);
3428         }
3429         break;
3430     case OPC_MULT:
3431         {
3432             TCGv_i32 t2 = tcg_temp_new_i32();
3433             TCGv_i32 t3 = tcg_temp_new_i32();
3434             tcg_gen_trunc_tl_i32(t2, t0);
3435             tcg_gen_trunc_tl_i32(t3, t1);
3436             tcg_gen_muls2_i32(t2, t3, t2, t3);
3437             tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
3438             tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
3439             tcg_temp_free_i32(t2);
3440             tcg_temp_free_i32(t3);
3441         }
3442         break;
3443     case OPC_MULTU:
3444         {
3445             TCGv_i32 t2 = tcg_temp_new_i32();
3446             TCGv_i32 t3 = tcg_temp_new_i32();
3447             tcg_gen_trunc_tl_i32(t2, t0);
3448             tcg_gen_trunc_tl_i32(t3, t1);
3449             tcg_gen_mulu2_i32(t2, t3, t2, t3);
3450             tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
3451             tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
3452             tcg_temp_free_i32(t2);
3453             tcg_temp_free_i32(t3);
3454         }
3455         break;
3456 #if defined(TARGET_MIPS64)
3457     case OPC_DDIV:
3458         {
3459             TCGv t2 = tcg_temp_new();
3460             TCGv t3 = tcg_temp_new();
3461             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, -1LL << 63);
3462             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1LL);
3463             tcg_gen_and_tl(t2, t2, t3);
3464             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3465             tcg_gen_or_tl(t2, t2, t3);
3466             tcg_gen_movi_tl(t3, 0);
3467             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3468             tcg_gen_div_tl(cpu_LO[acc], t0, t1);
3469             tcg_gen_rem_tl(cpu_HI[acc], t0, t1);
3470             tcg_temp_free(t3);
3471             tcg_temp_free(t2);
3472         }
3473         break;
3474     case OPC_DDIVU:
3475         {
3476             TCGv t2 = tcg_const_tl(0);
3477             TCGv t3 = tcg_const_tl(1);
3478             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3479             tcg_gen_divu_i64(cpu_LO[acc], t0, t1);
3480             tcg_gen_remu_i64(cpu_HI[acc], t0, t1);
3481             tcg_temp_free(t3);
3482             tcg_temp_free(t2);
3483         }
3484         break;
3485     case OPC_DMULT:
3486         tcg_gen_muls2_i64(cpu_LO[acc], cpu_HI[acc], t0, t1);
3487         break;
3488     case OPC_DMULTU:
3489         tcg_gen_mulu2_i64(cpu_LO[acc], cpu_HI[acc], t0, t1);
3490         break;
3491 #endif
3492     case OPC_MADD:
3493         {
3494             TCGv_i64 t2 = tcg_temp_new_i64();
3495             TCGv_i64 t3 = tcg_temp_new_i64();
3496 
3497             tcg_gen_ext_tl_i64(t2, t0);
3498             tcg_gen_ext_tl_i64(t3, t1);
3499             tcg_gen_mul_i64(t2, t2, t3);
3500             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
3501             tcg_gen_add_i64(t2, t2, t3);
3502             tcg_temp_free_i64(t3);
3503             gen_move_low32(cpu_LO[acc], t2);
3504             gen_move_high32(cpu_HI[acc], t2);
3505             tcg_temp_free_i64(t2);
3506         }
3507         break;
3508     case OPC_MADDU:
3509         {
3510             TCGv_i64 t2 = tcg_temp_new_i64();
3511             TCGv_i64 t3 = tcg_temp_new_i64();
3512 
3513             tcg_gen_ext32u_tl(t0, t0);
3514             tcg_gen_ext32u_tl(t1, t1);
3515             tcg_gen_extu_tl_i64(t2, t0);
3516             tcg_gen_extu_tl_i64(t3, t1);
3517             tcg_gen_mul_i64(t2, t2, t3);
3518             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
3519             tcg_gen_add_i64(t2, t2, t3);
3520             tcg_temp_free_i64(t3);
3521             gen_move_low32(cpu_LO[acc], t2);
3522             gen_move_high32(cpu_HI[acc], t2);
3523             tcg_temp_free_i64(t2);
3524         }
3525         break;
3526     case OPC_MSUB:
3527         {
3528             TCGv_i64 t2 = tcg_temp_new_i64();
3529             TCGv_i64 t3 = tcg_temp_new_i64();
3530 
3531             tcg_gen_ext_tl_i64(t2, t0);
3532             tcg_gen_ext_tl_i64(t3, t1);
3533             tcg_gen_mul_i64(t2, t2, t3);
3534             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
3535             tcg_gen_sub_i64(t2, t3, t2);
3536             tcg_temp_free_i64(t3);
3537             gen_move_low32(cpu_LO[acc], t2);
3538             gen_move_high32(cpu_HI[acc], t2);
3539             tcg_temp_free_i64(t2);
3540         }
3541         break;
3542     case OPC_MSUBU:
3543         {
3544             TCGv_i64 t2 = tcg_temp_new_i64();
3545             TCGv_i64 t3 = tcg_temp_new_i64();
3546 
3547             tcg_gen_ext32u_tl(t0, t0);
3548             tcg_gen_ext32u_tl(t1, t1);
3549             tcg_gen_extu_tl_i64(t2, t0);
3550             tcg_gen_extu_tl_i64(t3, t1);
3551             tcg_gen_mul_i64(t2, t2, t3);
3552             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
3553             tcg_gen_sub_i64(t2, t3, t2);
3554             tcg_temp_free_i64(t3);
3555             gen_move_low32(cpu_LO[acc], t2);
3556             gen_move_high32(cpu_HI[acc], t2);
3557             tcg_temp_free_i64(t2);
3558         }
3559         break;
3560     default:
3561         MIPS_INVAL("mul/div");
3562         gen_reserved_instruction(ctx);
3563         goto out;
3564     }
3565  out:
3566     tcg_temp_free(t0);
3567     tcg_temp_free(t1);
3568 }
3569 
3570 /*
3571  * These MULT[U] and MADD[U] instructions implemented in for example
3572  * the Toshiba/Sony R5900 and the Toshiba TX19, TX39 and TX79 core
3573  * architectures are special three-operand variants with the syntax
3574  *
3575  *     MULT[U][1] rd, rs, rt
3576  *
3577  * such that
3578  *
3579  *     (rd, LO, HI) <- rs * rt
3580  *
3581  * and
3582  *
3583  *     MADD[U][1] rd, rs, rt
3584  *
3585  * such that
3586  *
3587  *     (rd, LO, HI) <- (LO, HI) + rs * rt
3588  *
3589  * where the low-order 32-bits of the result is placed into both the
3590  * GPR rd and the special register LO. The high-order 32-bits of the
3591  * result is placed into the special register HI.
3592  *
3593  * If the GPR rd is omitted in assembly language, it is taken to be 0,
3594  * which is the zero register that always reads as 0.
3595  */
3596 static void gen_mul_txx9(DisasContext *ctx, uint32_t opc,
3597                          int rd, int rs, int rt)
3598 {
3599     TCGv t0 = tcg_temp_new();
3600     TCGv t1 = tcg_temp_new();
3601     int acc = 0;
3602 
3603     gen_load_gpr(t0, rs);
3604     gen_load_gpr(t1, rt);
3605 
3606     switch (opc) {
3607     case MMI_OPC_MULT1:
3608         acc = 1;
3609         /* Fall through */
3610     case OPC_MULT:
3611         {
3612             TCGv_i32 t2 = tcg_temp_new_i32();
3613             TCGv_i32 t3 = tcg_temp_new_i32();
3614             tcg_gen_trunc_tl_i32(t2, t0);
3615             tcg_gen_trunc_tl_i32(t3, t1);
3616             tcg_gen_muls2_i32(t2, t3, t2, t3);
3617             if (rd) {
3618                 tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
3619             }
3620             tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
3621             tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
3622             tcg_temp_free_i32(t2);
3623             tcg_temp_free_i32(t3);
3624         }
3625         break;
3626     case MMI_OPC_MULTU1:
3627         acc = 1;
3628         /* Fall through */
3629     case OPC_MULTU:
3630         {
3631             TCGv_i32 t2 = tcg_temp_new_i32();
3632             TCGv_i32 t3 = tcg_temp_new_i32();
3633             tcg_gen_trunc_tl_i32(t2, t0);
3634             tcg_gen_trunc_tl_i32(t3, t1);
3635             tcg_gen_mulu2_i32(t2, t3, t2, t3);
3636             if (rd) {
3637                 tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
3638             }
3639             tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
3640             tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
3641             tcg_temp_free_i32(t2);
3642             tcg_temp_free_i32(t3);
3643         }
3644         break;
3645     case MMI_OPC_MADD1:
3646         acc = 1;
3647         /* Fall through */
3648     case MMI_OPC_MADD:
3649         {
3650             TCGv_i64 t2 = tcg_temp_new_i64();
3651             TCGv_i64 t3 = tcg_temp_new_i64();
3652 
3653             tcg_gen_ext_tl_i64(t2, t0);
3654             tcg_gen_ext_tl_i64(t3, t1);
3655             tcg_gen_mul_i64(t2, t2, t3);
3656             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
3657             tcg_gen_add_i64(t2, t2, t3);
3658             tcg_temp_free_i64(t3);
3659             gen_move_low32(cpu_LO[acc], t2);
3660             gen_move_high32(cpu_HI[acc], t2);
3661             if (rd) {
3662                 gen_move_low32(cpu_gpr[rd], t2);
3663             }
3664             tcg_temp_free_i64(t2);
3665         }
3666         break;
3667     case MMI_OPC_MADDU1:
3668         acc = 1;
3669         /* Fall through */
3670     case MMI_OPC_MADDU:
3671         {
3672             TCGv_i64 t2 = tcg_temp_new_i64();
3673             TCGv_i64 t3 = tcg_temp_new_i64();
3674 
3675             tcg_gen_ext32u_tl(t0, t0);
3676             tcg_gen_ext32u_tl(t1, t1);
3677             tcg_gen_extu_tl_i64(t2, t0);
3678             tcg_gen_extu_tl_i64(t3, t1);
3679             tcg_gen_mul_i64(t2, t2, t3);
3680             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
3681             tcg_gen_add_i64(t2, t2, t3);
3682             tcg_temp_free_i64(t3);
3683             gen_move_low32(cpu_LO[acc], t2);
3684             gen_move_high32(cpu_HI[acc], t2);
3685             if (rd) {
3686                 gen_move_low32(cpu_gpr[rd], t2);
3687             }
3688             tcg_temp_free_i64(t2);
3689         }
3690         break;
3691     default:
3692         MIPS_INVAL("mul/madd TXx9");
3693         gen_reserved_instruction(ctx);
3694         goto out;
3695     }
3696 
3697  out:
3698     tcg_temp_free(t0);
3699     tcg_temp_free(t1);
3700 }
3701 
3702 static void gen_cl(DisasContext *ctx, uint32_t opc,
3703                    int rd, int rs)
3704 {
3705     TCGv t0;
3706 
3707     if (rd == 0) {
3708         /* Treat as NOP. */
3709         return;
3710     }
3711     t0 = cpu_gpr[rd];
3712     gen_load_gpr(t0, rs);
3713 
3714     switch (opc) {
3715     case OPC_CLO:
3716     case R6_OPC_CLO:
3717 #if defined(TARGET_MIPS64)
3718     case OPC_DCLO:
3719     case R6_OPC_DCLO:
3720 #endif
3721         tcg_gen_not_tl(t0, t0);
3722         break;
3723     }
3724 
3725     switch (opc) {
3726     case OPC_CLO:
3727     case R6_OPC_CLO:
3728     case OPC_CLZ:
3729     case R6_OPC_CLZ:
3730         tcg_gen_ext32u_tl(t0, t0);
3731         tcg_gen_clzi_tl(t0, t0, TARGET_LONG_BITS);
3732         tcg_gen_subi_tl(t0, t0, TARGET_LONG_BITS - 32);
3733         break;
3734 #if defined(TARGET_MIPS64)
3735     case OPC_DCLO:
3736     case R6_OPC_DCLO:
3737     case OPC_DCLZ:
3738     case R6_OPC_DCLZ:
3739         tcg_gen_clzi_i64(t0, t0, 64);
3740         break;
3741 #endif
3742     }
3743 }
3744 
3745 /* Godson integer instructions */
3746 static void gen_loongson_integer(DisasContext *ctx, uint32_t opc,
3747                                  int rd, int rs, int rt)
3748 {
3749     TCGv t0, t1;
3750 
3751     if (rd == 0) {
3752         /* Treat as NOP. */
3753         return;
3754     }
3755 
3756     switch (opc) {
3757     case OPC_MULT_G_2E:
3758     case OPC_MULT_G_2F:
3759     case OPC_MULTU_G_2E:
3760     case OPC_MULTU_G_2F:
3761 #if defined(TARGET_MIPS64)
3762     case OPC_DMULT_G_2E:
3763     case OPC_DMULT_G_2F:
3764     case OPC_DMULTU_G_2E:
3765     case OPC_DMULTU_G_2F:
3766 #endif
3767         t0 = tcg_temp_new();
3768         t1 = tcg_temp_new();
3769         break;
3770     default:
3771         t0 = tcg_temp_local_new();
3772         t1 = tcg_temp_local_new();
3773         break;
3774     }
3775 
3776     gen_load_gpr(t0, rs);
3777     gen_load_gpr(t1, rt);
3778 
3779     switch (opc) {
3780     case OPC_MULT_G_2E:
3781     case OPC_MULT_G_2F:
3782         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3783         tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3784         break;
3785     case OPC_MULTU_G_2E:
3786     case OPC_MULTU_G_2F:
3787         tcg_gen_ext32u_tl(t0, t0);
3788         tcg_gen_ext32u_tl(t1, t1);
3789         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3790         tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3791         break;
3792     case OPC_DIV_G_2E:
3793     case OPC_DIV_G_2F:
3794         {
3795             TCGLabel *l1 = gen_new_label();
3796             TCGLabel *l2 = gen_new_label();
3797             TCGLabel *l3 = gen_new_label();
3798             tcg_gen_ext32s_tl(t0, t0);
3799             tcg_gen_ext32s_tl(t1, t1);
3800             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3801             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3802             tcg_gen_br(l3);
3803             gen_set_label(l1);
3804             tcg_gen_brcondi_tl(TCG_COND_NE, t0, INT_MIN, l2);
3805             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1, l2);
3806             tcg_gen_mov_tl(cpu_gpr[rd], t0);
3807             tcg_gen_br(l3);
3808             gen_set_label(l2);
3809             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
3810             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3811             gen_set_label(l3);
3812         }
3813         break;
3814     case OPC_DIVU_G_2E:
3815     case OPC_DIVU_G_2F:
3816         {
3817             TCGLabel *l1 = gen_new_label();
3818             TCGLabel *l2 = gen_new_label();
3819             tcg_gen_ext32u_tl(t0, t0);
3820             tcg_gen_ext32u_tl(t1, t1);
3821             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3822             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3823             tcg_gen_br(l2);
3824             gen_set_label(l1);
3825             tcg_gen_divu_tl(cpu_gpr[rd], t0, t1);
3826             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3827             gen_set_label(l2);
3828         }
3829         break;
3830     case OPC_MOD_G_2E:
3831     case OPC_MOD_G_2F:
3832         {
3833             TCGLabel *l1 = gen_new_label();
3834             TCGLabel *l2 = gen_new_label();
3835             TCGLabel *l3 = gen_new_label();
3836             tcg_gen_ext32u_tl(t0, t0);
3837             tcg_gen_ext32u_tl(t1, t1);
3838             tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
3839             tcg_gen_brcondi_tl(TCG_COND_NE, t0, INT_MIN, l2);
3840             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1, l2);
3841             gen_set_label(l1);
3842             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3843             tcg_gen_br(l3);
3844             gen_set_label(l2);
3845             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
3846             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3847             gen_set_label(l3);
3848         }
3849         break;
3850     case OPC_MODU_G_2E:
3851     case OPC_MODU_G_2F:
3852         {
3853             TCGLabel *l1 = gen_new_label();
3854             TCGLabel *l2 = gen_new_label();
3855             tcg_gen_ext32u_tl(t0, t0);
3856             tcg_gen_ext32u_tl(t1, t1);
3857             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3858             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3859             tcg_gen_br(l2);
3860             gen_set_label(l1);
3861             tcg_gen_remu_tl(cpu_gpr[rd], t0, t1);
3862             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3863             gen_set_label(l2);
3864         }
3865         break;
3866 #if defined(TARGET_MIPS64)
3867     case OPC_DMULT_G_2E:
3868     case OPC_DMULT_G_2F:
3869         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3870         break;
3871     case OPC_DMULTU_G_2E:
3872     case OPC_DMULTU_G_2F:
3873         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3874         break;
3875     case OPC_DDIV_G_2E:
3876     case OPC_DDIV_G_2F:
3877         {
3878             TCGLabel *l1 = gen_new_label();
3879             TCGLabel *l2 = gen_new_label();
3880             TCGLabel *l3 = gen_new_label();
3881             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3882             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3883             tcg_gen_br(l3);
3884             gen_set_label(l1);
3885             tcg_gen_brcondi_tl(TCG_COND_NE, t0, -1LL << 63, l2);
3886             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1LL, l2);
3887             tcg_gen_mov_tl(cpu_gpr[rd], t0);
3888             tcg_gen_br(l3);
3889             gen_set_label(l2);
3890             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
3891             gen_set_label(l3);
3892         }
3893         break;
3894     case OPC_DDIVU_G_2E:
3895     case OPC_DDIVU_G_2F:
3896         {
3897             TCGLabel *l1 = gen_new_label();
3898             TCGLabel *l2 = gen_new_label();
3899             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3900             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3901             tcg_gen_br(l2);
3902             gen_set_label(l1);
3903             tcg_gen_divu_tl(cpu_gpr[rd], t0, t1);
3904             gen_set_label(l2);
3905         }
3906         break;
3907     case OPC_DMOD_G_2E:
3908     case OPC_DMOD_G_2F:
3909         {
3910             TCGLabel *l1 = gen_new_label();
3911             TCGLabel *l2 = gen_new_label();
3912             TCGLabel *l3 = gen_new_label();
3913             tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
3914             tcg_gen_brcondi_tl(TCG_COND_NE, t0, -1LL << 63, l2);
3915             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1LL, l2);
3916             gen_set_label(l1);
3917             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3918             tcg_gen_br(l3);
3919             gen_set_label(l2);
3920             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
3921             gen_set_label(l3);
3922         }
3923         break;
3924     case OPC_DMODU_G_2E:
3925     case OPC_DMODU_G_2F:
3926         {
3927             TCGLabel *l1 = gen_new_label();
3928             TCGLabel *l2 = gen_new_label();
3929             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3930             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3931             tcg_gen_br(l2);
3932             gen_set_label(l1);
3933             tcg_gen_remu_tl(cpu_gpr[rd], t0, t1);
3934             gen_set_label(l2);
3935         }
3936         break;
3937 #endif
3938     }
3939 
3940     tcg_temp_free(t0);
3941     tcg_temp_free(t1);
3942 }
3943 
3944 /* Loongson multimedia instructions */
3945 static void gen_loongson_multimedia(DisasContext *ctx, int rd, int rs, int rt)
3946 {
3947     uint32_t opc, shift_max;
3948     TCGv_i64 t0, t1;
3949     TCGCond cond;
3950 
3951     opc = MASK_LMMI(ctx->opcode);
3952     switch (opc) {
3953     case OPC_ADD_CP2:
3954     case OPC_SUB_CP2:
3955     case OPC_DADD_CP2:
3956     case OPC_DSUB_CP2:
3957         t0 = tcg_temp_local_new_i64();
3958         t1 = tcg_temp_local_new_i64();
3959         break;
3960     default:
3961         t0 = tcg_temp_new_i64();
3962         t1 = tcg_temp_new_i64();
3963         break;
3964     }
3965 
3966     check_cp1_enabled(ctx);
3967     gen_load_fpr64(ctx, t0, rs);
3968     gen_load_fpr64(ctx, t1, rt);
3969 
3970     switch (opc) {
3971     case OPC_PADDSH:
3972         gen_helper_paddsh(t0, t0, t1);
3973         break;
3974     case OPC_PADDUSH:
3975         gen_helper_paddush(t0, t0, t1);
3976         break;
3977     case OPC_PADDH:
3978         gen_helper_paddh(t0, t0, t1);
3979         break;
3980     case OPC_PADDW:
3981         gen_helper_paddw(t0, t0, t1);
3982         break;
3983     case OPC_PADDSB:
3984         gen_helper_paddsb(t0, t0, t1);
3985         break;
3986     case OPC_PADDUSB:
3987         gen_helper_paddusb(t0, t0, t1);
3988         break;
3989     case OPC_PADDB:
3990         gen_helper_paddb(t0, t0, t1);
3991         break;
3992 
3993     case OPC_PSUBSH:
3994         gen_helper_psubsh(t0, t0, t1);
3995         break;
3996     case OPC_PSUBUSH:
3997         gen_helper_psubush(t0, t0, t1);
3998         break;
3999     case OPC_PSUBH:
4000         gen_helper_psubh(t0, t0, t1);
4001         break;
4002     case OPC_PSUBW:
4003         gen_helper_psubw(t0, t0, t1);
4004         break;
4005     case OPC_PSUBSB:
4006         gen_helper_psubsb(t0, t0, t1);
4007         break;
4008     case OPC_PSUBUSB:
4009         gen_helper_psubusb(t0, t0, t1);
4010         break;
4011     case OPC_PSUBB:
4012         gen_helper_psubb(t0, t0, t1);
4013         break;
4014 
4015     case OPC_PSHUFH:
4016         gen_helper_pshufh(t0, t0, t1);
4017         break;
4018     case OPC_PACKSSWH:
4019         gen_helper_packsswh(t0, t0, t1);
4020         break;
4021     case OPC_PACKSSHB:
4022         gen_helper_packsshb(t0, t0, t1);
4023         break;
4024     case OPC_PACKUSHB:
4025         gen_helper_packushb(t0, t0, t1);
4026         break;
4027 
4028     case OPC_PUNPCKLHW:
4029         gen_helper_punpcklhw(t0, t0, t1);
4030         break;
4031     case OPC_PUNPCKHHW:
4032         gen_helper_punpckhhw(t0, t0, t1);
4033         break;
4034     case OPC_PUNPCKLBH:
4035         gen_helper_punpcklbh(t0, t0, t1);
4036         break;
4037     case OPC_PUNPCKHBH:
4038         gen_helper_punpckhbh(t0, t0, t1);
4039         break;
4040     case OPC_PUNPCKLWD:
4041         gen_helper_punpcklwd(t0, t0, t1);
4042         break;
4043     case OPC_PUNPCKHWD:
4044         gen_helper_punpckhwd(t0, t0, t1);
4045         break;
4046 
4047     case OPC_PAVGH:
4048         gen_helper_pavgh(t0, t0, t1);
4049         break;
4050     case OPC_PAVGB:
4051         gen_helper_pavgb(t0, t0, t1);
4052         break;
4053     case OPC_PMAXSH:
4054         gen_helper_pmaxsh(t0, t0, t1);
4055         break;
4056     case OPC_PMINSH:
4057         gen_helper_pminsh(t0, t0, t1);
4058         break;
4059     case OPC_PMAXUB:
4060         gen_helper_pmaxub(t0, t0, t1);
4061         break;
4062     case OPC_PMINUB:
4063         gen_helper_pminub(t0, t0, t1);
4064         break;
4065 
4066     case OPC_PCMPEQW:
4067         gen_helper_pcmpeqw(t0, t0, t1);
4068         break;
4069     case OPC_PCMPGTW:
4070         gen_helper_pcmpgtw(t0, t0, t1);
4071         break;
4072     case OPC_PCMPEQH:
4073         gen_helper_pcmpeqh(t0, t0, t1);
4074         break;
4075     case OPC_PCMPGTH:
4076         gen_helper_pcmpgth(t0, t0, t1);
4077         break;
4078     case OPC_PCMPEQB:
4079         gen_helper_pcmpeqb(t0, t0, t1);
4080         break;
4081     case OPC_PCMPGTB:
4082         gen_helper_pcmpgtb(t0, t0, t1);
4083         break;
4084 
4085     case OPC_PSLLW:
4086         gen_helper_psllw(t0, t0, t1);
4087         break;
4088     case OPC_PSLLH:
4089         gen_helper_psllh(t0, t0, t1);
4090         break;
4091     case OPC_PSRLW:
4092         gen_helper_psrlw(t0, t0, t1);
4093         break;
4094     case OPC_PSRLH:
4095         gen_helper_psrlh(t0, t0, t1);
4096         break;
4097     case OPC_PSRAW:
4098         gen_helper_psraw(t0, t0, t1);
4099         break;
4100     case OPC_PSRAH:
4101         gen_helper_psrah(t0, t0, t1);
4102         break;
4103 
4104     case OPC_PMULLH:
4105         gen_helper_pmullh(t0, t0, t1);
4106         break;
4107     case OPC_PMULHH:
4108         gen_helper_pmulhh(t0, t0, t1);
4109         break;
4110     case OPC_PMULHUH:
4111         gen_helper_pmulhuh(t0, t0, t1);
4112         break;
4113     case OPC_PMADDHW:
4114         gen_helper_pmaddhw(t0, t0, t1);
4115         break;
4116 
4117     case OPC_PASUBUB:
4118         gen_helper_pasubub(t0, t0, t1);
4119         break;
4120     case OPC_BIADD:
4121         gen_helper_biadd(t0, t0);
4122         break;
4123     case OPC_PMOVMSKB:
4124         gen_helper_pmovmskb(t0, t0);
4125         break;
4126 
4127     case OPC_PADDD:
4128         tcg_gen_add_i64(t0, t0, t1);
4129         break;
4130     case OPC_PSUBD:
4131         tcg_gen_sub_i64(t0, t0, t1);
4132         break;
4133     case OPC_XOR_CP2:
4134         tcg_gen_xor_i64(t0, t0, t1);
4135         break;
4136     case OPC_NOR_CP2:
4137         tcg_gen_nor_i64(t0, t0, t1);
4138         break;
4139     case OPC_AND_CP2:
4140         tcg_gen_and_i64(t0, t0, t1);
4141         break;
4142     case OPC_OR_CP2:
4143         tcg_gen_or_i64(t0, t0, t1);
4144         break;
4145 
4146     case OPC_PANDN:
4147         tcg_gen_andc_i64(t0, t1, t0);
4148         break;
4149 
4150     case OPC_PINSRH_0:
4151         tcg_gen_deposit_i64(t0, t0, t1, 0, 16);
4152         break;
4153     case OPC_PINSRH_1:
4154         tcg_gen_deposit_i64(t0, t0, t1, 16, 16);
4155         break;
4156     case OPC_PINSRH_2:
4157         tcg_gen_deposit_i64(t0, t0, t1, 32, 16);
4158         break;
4159     case OPC_PINSRH_3:
4160         tcg_gen_deposit_i64(t0, t0, t1, 48, 16);
4161         break;
4162 
4163     case OPC_PEXTRH:
4164         tcg_gen_andi_i64(t1, t1, 3);
4165         tcg_gen_shli_i64(t1, t1, 4);
4166         tcg_gen_shr_i64(t0, t0, t1);
4167         tcg_gen_ext16u_i64(t0, t0);
4168         break;
4169 
4170     case OPC_ADDU_CP2:
4171         tcg_gen_add_i64(t0, t0, t1);
4172         tcg_gen_ext32s_i64(t0, t0);
4173         break;
4174     case OPC_SUBU_CP2:
4175         tcg_gen_sub_i64(t0, t0, t1);
4176         tcg_gen_ext32s_i64(t0, t0);
4177         break;
4178 
4179     case OPC_SLL_CP2:
4180         shift_max = 32;
4181         goto do_shift;
4182     case OPC_SRL_CP2:
4183         shift_max = 32;
4184         goto do_shift;
4185     case OPC_SRA_CP2:
4186         shift_max = 32;
4187         goto do_shift;
4188     case OPC_DSLL_CP2:
4189         shift_max = 64;
4190         goto do_shift;
4191     case OPC_DSRL_CP2:
4192         shift_max = 64;
4193         goto do_shift;
4194     case OPC_DSRA_CP2:
4195         shift_max = 64;
4196         goto do_shift;
4197     do_shift:
4198         /* Make sure shift count isn't TCG undefined behaviour.  */
4199         tcg_gen_andi_i64(t1, t1, shift_max - 1);
4200 
4201         switch (opc) {
4202         case OPC_SLL_CP2:
4203         case OPC_DSLL_CP2:
4204             tcg_gen_shl_i64(t0, t0, t1);
4205             break;
4206         case OPC_SRA_CP2:
4207         case OPC_DSRA_CP2:
4208             /*
4209              * Since SRA is UndefinedResult without sign-extended inputs,
4210              * we can treat SRA and DSRA the same.
4211              */
4212             tcg_gen_sar_i64(t0, t0, t1);
4213             break;
4214         case OPC_SRL_CP2:
4215             /* We want to shift in zeros for SRL; zero-extend first.  */
4216             tcg_gen_ext32u_i64(t0, t0);
4217             /* FALLTHRU */
4218         case OPC_DSRL_CP2:
4219             tcg_gen_shr_i64(t0, t0, t1);
4220             break;
4221         }
4222 
4223         if (shift_max == 32) {
4224             tcg_gen_ext32s_i64(t0, t0);
4225         }
4226 
4227         /* Shifts larger than MAX produce zero.  */
4228         tcg_gen_setcondi_i64(TCG_COND_LTU, t1, t1, shift_max);
4229         tcg_gen_neg_i64(t1, t1);
4230         tcg_gen_and_i64(t0, t0, t1);
4231         break;
4232 
4233     case OPC_ADD_CP2:
4234     case OPC_DADD_CP2:
4235         {
4236             TCGv_i64 t2 = tcg_temp_new_i64();
4237             TCGLabel *lab = gen_new_label();
4238 
4239             tcg_gen_mov_i64(t2, t0);
4240             tcg_gen_add_i64(t0, t1, t2);
4241             if (opc == OPC_ADD_CP2) {
4242                 tcg_gen_ext32s_i64(t0, t0);
4243             }
4244             tcg_gen_xor_i64(t1, t1, t2);
4245             tcg_gen_xor_i64(t2, t2, t0);
4246             tcg_gen_andc_i64(t1, t2, t1);
4247             tcg_temp_free_i64(t2);
4248             tcg_gen_brcondi_i64(TCG_COND_GE, t1, 0, lab);
4249             generate_exception(ctx, EXCP_OVERFLOW);
4250             gen_set_label(lab);
4251             break;
4252         }
4253 
4254     case OPC_SUB_CP2:
4255     case OPC_DSUB_CP2:
4256         {
4257             TCGv_i64 t2 = tcg_temp_new_i64();
4258             TCGLabel *lab = gen_new_label();
4259 
4260             tcg_gen_mov_i64(t2, t0);
4261             tcg_gen_sub_i64(t0, t1, t2);
4262             if (opc == OPC_SUB_CP2) {
4263                 tcg_gen_ext32s_i64(t0, t0);
4264             }
4265             tcg_gen_xor_i64(t1, t1, t2);
4266             tcg_gen_xor_i64(t2, t2, t0);
4267             tcg_gen_and_i64(t1, t1, t2);
4268             tcg_temp_free_i64(t2);
4269             tcg_gen_brcondi_i64(TCG_COND_GE, t1, 0, lab);
4270             generate_exception(ctx, EXCP_OVERFLOW);
4271             gen_set_label(lab);
4272             break;
4273         }
4274 
4275     case OPC_PMULUW:
4276         tcg_gen_ext32u_i64(t0, t0);
4277         tcg_gen_ext32u_i64(t1, t1);
4278         tcg_gen_mul_i64(t0, t0, t1);
4279         break;
4280 
4281     case OPC_SEQU_CP2:
4282     case OPC_SEQ_CP2:
4283         cond = TCG_COND_EQ;
4284         goto do_cc_cond;
4285         break;
4286     case OPC_SLTU_CP2:
4287         cond = TCG_COND_LTU;
4288         goto do_cc_cond;
4289         break;
4290     case OPC_SLT_CP2:
4291         cond = TCG_COND_LT;
4292         goto do_cc_cond;
4293         break;
4294     case OPC_SLEU_CP2:
4295         cond = TCG_COND_LEU;
4296         goto do_cc_cond;
4297         break;
4298     case OPC_SLE_CP2:
4299         cond = TCG_COND_LE;
4300     do_cc_cond:
4301         {
4302             int cc = (ctx->opcode >> 8) & 0x7;
4303             TCGv_i64 t64 = tcg_temp_new_i64();
4304             TCGv_i32 t32 = tcg_temp_new_i32();
4305 
4306             tcg_gen_setcond_i64(cond, t64, t0, t1);
4307             tcg_gen_extrl_i64_i32(t32, t64);
4308             tcg_gen_deposit_i32(fpu_fcr31, fpu_fcr31, t32,
4309                                 get_fp_bit(cc), 1);
4310 
4311             tcg_temp_free_i32(t32);
4312             tcg_temp_free_i64(t64);
4313         }
4314         goto no_rd;
4315         break;
4316     default:
4317         MIPS_INVAL("loongson_cp2");
4318         gen_reserved_instruction(ctx);
4319         return;
4320     }
4321 
4322     gen_store_fpr64(ctx, t0, rd);
4323 
4324 no_rd:
4325     tcg_temp_free_i64(t0);
4326     tcg_temp_free_i64(t1);
4327 }
4328 
4329 static void gen_loongson_lswc2(DisasContext *ctx, int rt,
4330                                int rs, int rd)
4331 {
4332     TCGv t0, t1, t2;
4333     TCGv_i32 fp0;
4334 #if defined(TARGET_MIPS64)
4335     int lsq_rt1 = ctx->opcode & 0x1f;
4336     int lsq_offset = sextract32(ctx->opcode, 6, 9) << 4;
4337 #endif
4338     int shf_offset = sextract32(ctx->opcode, 6, 8);
4339 
4340     t0 = tcg_temp_new();
4341 
4342     switch (MASK_LOONGSON_GSLSQ(ctx->opcode)) {
4343 #if defined(TARGET_MIPS64)
4344     case OPC_GSLQ:
4345         t1 = tcg_temp_new();
4346         gen_base_offset_addr(ctx, t0, rs, lsq_offset);
4347         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TEQ |
4348                            ctx->default_tcg_memop_mask);
4349         gen_base_offset_addr(ctx, t0, rs, lsq_offset + 8);
4350         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ |
4351                            ctx->default_tcg_memop_mask);
4352         gen_store_gpr(t1, rt);
4353         gen_store_gpr(t0, lsq_rt1);
4354         tcg_temp_free(t1);
4355         break;
4356     case OPC_GSLQC1:
4357         check_cp1_enabled(ctx);
4358         t1 = tcg_temp_new();
4359         gen_base_offset_addr(ctx, t0, rs, lsq_offset);
4360         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TEQ |
4361                            ctx->default_tcg_memop_mask);
4362         gen_base_offset_addr(ctx, t0, rs, lsq_offset + 8);
4363         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ |
4364                            ctx->default_tcg_memop_mask);
4365         gen_store_fpr64(ctx, t1, rt);
4366         gen_store_fpr64(ctx, t0, lsq_rt1);
4367         tcg_temp_free(t1);
4368         break;
4369     case OPC_GSSQ:
4370         t1 = tcg_temp_new();
4371         gen_base_offset_addr(ctx, t0, rs, lsq_offset);
4372         gen_load_gpr(t1, rt);
4373         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ |
4374                            ctx->default_tcg_memop_mask);
4375         gen_base_offset_addr(ctx, t0, rs, lsq_offset + 8);
4376         gen_load_gpr(t1, lsq_rt1);
4377         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ |
4378                            ctx->default_tcg_memop_mask);
4379         tcg_temp_free(t1);
4380         break;
4381     case OPC_GSSQC1:
4382         check_cp1_enabled(ctx);
4383         t1 = tcg_temp_new();
4384         gen_base_offset_addr(ctx, t0, rs, lsq_offset);
4385         gen_load_fpr64(ctx, t1, rt);
4386         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ |
4387                            ctx->default_tcg_memop_mask);
4388         gen_base_offset_addr(ctx, t0, rs, lsq_offset + 8);
4389         gen_load_fpr64(ctx, t1, lsq_rt1);
4390         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ |
4391                            ctx->default_tcg_memop_mask);
4392         tcg_temp_free(t1);
4393         break;
4394 #endif
4395     case OPC_GSSHFL:
4396         switch (MASK_LOONGSON_GSSHFLS(ctx->opcode)) {
4397         case OPC_GSLWLC1:
4398             check_cp1_enabled(ctx);
4399             gen_base_offset_addr(ctx, t0, rs, shf_offset);
4400             t1 = tcg_temp_new();
4401             tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_UB);
4402             tcg_gen_andi_tl(t1, t0, 3);
4403             if (!cpu_is_bigendian(ctx)) {
4404                 tcg_gen_xori_tl(t1, t1, 3);
4405             }
4406             tcg_gen_shli_tl(t1, t1, 3);
4407             tcg_gen_andi_tl(t0, t0, ~3);
4408             tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEUL);
4409             tcg_gen_shl_tl(t0, t0, t1);
4410             t2 = tcg_const_tl(-1);
4411             tcg_gen_shl_tl(t2, t2, t1);
4412             fp0 = tcg_temp_new_i32();
4413             gen_load_fpr32(ctx, fp0, rt);
4414             tcg_gen_ext_i32_tl(t1, fp0);
4415             tcg_gen_andc_tl(t1, t1, t2);
4416             tcg_temp_free(t2);
4417             tcg_gen_or_tl(t0, t0, t1);
4418             tcg_temp_free(t1);
4419 #if defined(TARGET_MIPS64)
4420             tcg_gen_extrl_i64_i32(fp0, t0);
4421 #else
4422             tcg_gen_ext32s_tl(fp0, t0);
4423 #endif
4424             gen_store_fpr32(ctx, fp0, rt);
4425             tcg_temp_free_i32(fp0);
4426             break;
4427         case OPC_GSLWRC1:
4428             check_cp1_enabled(ctx);
4429             gen_base_offset_addr(ctx, t0, rs, shf_offset);
4430             t1 = tcg_temp_new();
4431             tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_UB);
4432             tcg_gen_andi_tl(t1, t0, 3);
4433             if (cpu_is_bigendian(ctx)) {
4434                 tcg_gen_xori_tl(t1, t1, 3);
4435             }
4436             tcg_gen_shli_tl(t1, t1, 3);
4437             tcg_gen_andi_tl(t0, t0, ~3);
4438             tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEUL);
4439             tcg_gen_shr_tl(t0, t0, t1);
4440             tcg_gen_xori_tl(t1, t1, 31);
4441             t2 = tcg_const_tl(0xfffffffeull);
4442             tcg_gen_shl_tl(t2, t2, t1);
4443             fp0 = tcg_temp_new_i32();
4444             gen_load_fpr32(ctx, fp0, rt);
4445             tcg_gen_ext_i32_tl(t1, fp0);
4446             tcg_gen_and_tl(t1, t1, t2);
4447             tcg_temp_free(t2);
4448             tcg_gen_or_tl(t0, t0, t1);
4449             tcg_temp_free(t1);
4450 #if defined(TARGET_MIPS64)
4451             tcg_gen_extrl_i64_i32(fp0, t0);
4452 #else
4453             tcg_gen_ext32s_tl(fp0, t0);
4454 #endif
4455             gen_store_fpr32(ctx, fp0, rt);
4456             tcg_temp_free_i32(fp0);
4457             break;
4458 #if defined(TARGET_MIPS64)
4459         case OPC_GSLDLC1:
4460             check_cp1_enabled(ctx);
4461             gen_base_offset_addr(ctx, t0, rs, shf_offset);
4462             t1 = tcg_temp_new();
4463             tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_UB);
4464             tcg_gen_andi_tl(t1, t0, 7);
4465             if (!cpu_is_bigendian(ctx)) {
4466                 tcg_gen_xori_tl(t1, t1, 7);
4467             }
4468             tcg_gen_shli_tl(t1, t1, 3);
4469             tcg_gen_andi_tl(t0, t0, ~7);
4470             tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ);
4471             tcg_gen_shl_tl(t0, t0, t1);
4472             t2 = tcg_const_tl(-1);
4473             tcg_gen_shl_tl(t2, t2, t1);
4474             gen_load_fpr64(ctx, t1, rt);
4475             tcg_gen_andc_tl(t1, t1, t2);
4476             tcg_temp_free(t2);
4477             tcg_gen_or_tl(t0, t0, t1);
4478             tcg_temp_free(t1);
4479             gen_store_fpr64(ctx, t0, rt);
4480             break;
4481         case OPC_GSLDRC1:
4482             check_cp1_enabled(ctx);
4483             gen_base_offset_addr(ctx, t0, rs, shf_offset);
4484             t1 = tcg_temp_new();
4485             tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_UB);
4486             tcg_gen_andi_tl(t1, t0, 7);
4487             if (cpu_is_bigendian(ctx)) {
4488                 tcg_gen_xori_tl(t1, t1, 7);
4489             }
4490             tcg_gen_shli_tl(t1, t1, 3);
4491             tcg_gen_andi_tl(t0, t0, ~7);
4492             tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ);
4493             tcg_gen_shr_tl(t0, t0, t1);
4494             tcg_gen_xori_tl(t1, t1, 63);
4495             t2 = tcg_const_tl(0xfffffffffffffffeull);
4496             tcg_gen_shl_tl(t2, t2, t1);
4497             gen_load_fpr64(ctx, t1, rt);
4498             tcg_gen_and_tl(t1, t1, t2);
4499             tcg_temp_free(t2);
4500             tcg_gen_or_tl(t0, t0, t1);
4501             tcg_temp_free(t1);
4502             gen_store_fpr64(ctx, t0, rt);
4503             break;
4504 #endif
4505         default:
4506             MIPS_INVAL("loongson_gsshfl");
4507             gen_reserved_instruction(ctx);
4508             break;
4509         }
4510         break;
4511     case OPC_GSSHFS:
4512         switch (MASK_LOONGSON_GSSHFLS(ctx->opcode)) {
4513         case OPC_GSSWLC1:
4514             check_cp1_enabled(ctx);
4515             t1 = tcg_temp_new();
4516             gen_base_offset_addr(ctx, t0, rs, shf_offset);
4517             fp0 = tcg_temp_new_i32();
4518             gen_load_fpr32(ctx, fp0, rt);
4519             tcg_gen_ext_i32_tl(t1, fp0);
4520             gen_helper_0e2i(swl, t1, t0, ctx->mem_idx);
4521             tcg_temp_free_i32(fp0);
4522             tcg_temp_free(t1);
4523             break;
4524         case OPC_GSSWRC1:
4525             check_cp1_enabled(ctx);
4526             t1 = tcg_temp_new();
4527             gen_base_offset_addr(ctx, t0, rs, shf_offset);
4528             fp0 = tcg_temp_new_i32();
4529             gen_load_fpr32(ctx, fp0, rt);
4530             tcg_gen_ext_i32_tl(t1, fp0);
4531             gen_helper_0e2i(swr, t1, t0, ctx->mem_idx);
4532             tcg_temp_free_i32(fp0);
4533             tcg_temp_free(t1);
4534             break;
4535 #if defined(TARGET_MIPS64)
4536         case OPC_GSSDLC1:
4537             check_cp1_enabled(ctx);
4538             t1 = tcg_temp_new();
4539             gen_base_offset_addr(ctx, t0, rs, shf_offset);
4540             gen_load_fpr64(ctx, t1, rt);
4541             gen_helper_0e2i(sdl, t1, t0, ctx->mem_idx);
4542             tcg_temp_free(t1);
4543             break;
4544         case OPC_GSSDRC1:
4545             check_cp1_enabled(ctx);
4546             t1 = tcg_temp_new();
4547             gen_base_offset_addr(ctx, t0, rs, shf_offset);
4548             gen_load_fpr64(ctx, t1, rt);
4549             gen_helper_0e2i(sdr, t1, t0, ctx->mem_idx);
4550             tcg_temp_free(t1);
4551             break;
4552 #endif
4553         default:
4554             MIPS_INVAL("loongson_gsshfs");
4555             gen_reserved_instruction(ctx);
4556             break;
4557         }
4558         break;
4559     default:
4560         MIPS_INVAL("loongson_gslsq");
4561         gen_reserved_instruction(ctx);
4562         break;
4563     }
4564     tcg_temp_free(t0);
4565 }
4566 
4567 /* Loongson EXT LDC2/SDC2 */
4568 static void gen_loongson_lsdc2(DisasContext *ctx, int rt,
4569                                int rs, int rd)
4570 {
4571     int offset = sextract32(ctx->opcode, 3, 8);
4572     uint32_t opc = MASK_LOONGSON_LSDC2(ctx->opcode);
4573     TCGv t0, t1;
4574     TCGv_i32 fp0;
4575 
4576     /* Pre-conditions */
4577     switch (opc) {
4578     case OPC_GSLBX:
4579     case OPC_GSLHX:
4580     case OPC_GSLWX:
4581     case OPC_GSLDX:
4582         /* prefetch, implement as NOP */
4583         if (rt == 0) {
4584             return;
4585         }
4586         break;
4587     case OPC_GSSBX:
4588     case OPC_GSSHX:
4589     case OPC_GSSWX:
4590     case OPC_GSSDX:
4591         break;
4592     case OPC_GSLWXC1:
4593 #if defined(TARGET_MIPS64)
4594     case OPC_GSLDXC1:
4595 #endif
4596         check_cp1_enabled(ctx);
4597         /* prefetch, implement as NOP */
4598         if (rt == 0) {
4599             return;
4600         }
4601         break;
4602     case OPC_GSSWXC1:
4603 #if defined(TARGET_MIPS64)
4604     case OPC_GSSDXC1:
4605 #endif
4606         check_cp1_enabled(ctx);
4607         break;
4608     default:
4609         MIPS_INVAL("loongson_lsdc2");
4610         gen_reserved_instruction(ctx);
4611         return;
4612         break;
4613     }
4614 
4615     t0 = tcg_temp_new();
4616 
4617     gen_base_offset_addr(ctx, t0, rs, offset);
4618     gen_op_addr_add(ctx, t0, cpu_gpr[rd], t0);
4619 
4620     switch (opc) {
4621     case OPC_GSLBX:
4622         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_SB);
4623         gen_store_gpr(t0, rt);
4624         break;
4625     case OPC_GSLHX:
4626         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESW |
4627                            ctx->default_tcg_memop_mask);
4628         gen_store_gpr(t0, rt);
4629         break;
4630     case OPC_GSLWX:
4631         gen_base_offset_addr(ctx, t0, rs, offset);
4632         if (rd) {
4633             gen_op_addr_add(ctx, t0, cpu_gpr[rd], t0);
4634         }
4635         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL |
4636                            ctx->default_tcg_memop_mask);
4637         gen_store_gpr(t0, rt);
4638         break;
4639 #if defined(TARGET_MIPS64)
4640     case OPC_GSLDX:
4641         gen_base_offset_addr(ctx, t0, rs, offset);
4642         if (rd) {
4643             gen_op_addr_add(ctx, t0, cpu_gpr[rd], t0);
4644         }
4645         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ |
4646                            ctx->default_tcg_memop_mask);
4647         gen_store_gpr(t0, rt);
4648         break;
4649 #endif
4650     case OPC_GSLWXC1:
4651         gen_base_offset_addr(ctx, t0, rs, offset);
4652         if (rd) {
4653             gen_op_addr_add(ctx, t0, cpu_gpr[rd], t0);
4654         }
4655         fp0 = tcg_temp_new_i32();
4656         tcg_gen_qemu_ld_i32(fp0, t0, ctx->mem_idx, MO_TESL |
4657                             ctx->default_tcg_memop_mask);
4658         gen_store_fpr32(ctx, fp0, rt);
4659         tcg_temp_free_i32(fp0);
4660         break;
4661 #if defined(TARGET_MIPS64)
4662     case OPC_GSLDXC1:
4663         gen_base_offset_addr(ctx, t0, rs, offset);
4664         if (rd) {
4665             gen_op_addr_add(ctx, t0, cpu_gpr[rd], t0);
4666         }
4667         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ |
4668                            ctx->default_tcg_memop_mask);
4669         gen_store_fpr64(ctx, t0, rt);
4670         break;
4671 #endif
4672     case OPC_GSSBX:
4673         t1 = tcg_temp_new();
4674         gen_load_gpr(t1, rt);
4675         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_SB);
4676         tcg_temp_free(t1);
4677         break;
4678     case OPC_GSSHX:
4679         t1 = tcg_temp_new();
4680         gen_load_gpr(t1, rt);
4681         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUW |
4682                            ctx->default_tcg_memop_mask);
4683         tcg_temp_free(t1);
4684         break;
4685     case OPC_GSSWX:
4686         t1 = tcg_temp_new();
4687         gen_load_gpr(t1, rt);
4688         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL |
4689                            ctx->default_tcg_memop_mask);
4690         tcg_temp_free(t1);
4691         break;
4692 #if defined(TARGET_MIPS64)
4693     case OPC_GSSDX:
4694         t1 = tcg_temp_new();
4695         gen_load_gpr(t1, rt);
4696         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ |
4697                            ctx->default_tcg_memop_mask);
4698         tcg_temp_free(t1);
4699         break;
4700 #endif
4701     case OPC_GSSWXC1:
4702         fp0 = tcg_temp_new_i32();
4703         gen_load_fpr32(ctx, fp0, rt);
4704         tcg_gen_qemu_st_i32(fp0, t0, ctx->mem_idx, MO_TEUL |
4705                             ctx->default_tcg_memop_mask);
4706         tcg_temp_free_i32(fp0);
4707         break;
4708 #if defined(TARGET_MIPS64)
4709     case OPC_GSSDXC1:
4710         t1 = tcg_temp_new();
4711         gen_load_fpr64(ctx, t1, rt);
4712         tcg_gen_qemu_st_i64(t1, t0, ctx->mem_idx, MO_TEQ |
4713                             ctx->default_tcg_memop_mask);
4714         tcg_temp_free(t1);
4715         break;
4716 #endif
4717     default:
4718         break;
4719     }
4720 
4721     tcg_temp_free(t0);
4722 }
4723 
4724 /* Traps */
4725 static void gen_trap(DisasContext *ctx, uint32_t opc,
4726                      int rs, int rt, int16_t imm)
4727 {
4728     int cond;
4729     TCGv t0 = tcg_temp_new();
4730     TCGv t1 = tcg_temp_new();
4731 
4732     cond = 0;
4733     /* Load needed operands */
4734     switch (opc) {
4735     case OPC_TEQ:
4736     case OPC_TGE:
4737     case OPC_TGEU:
4738     case OPC_TLT:
4739     case OPC_TLTU:
4740     case OPC_TNE:
4741         /* Compare two registers */
4742         if (rs != rt) {
4743             gen_load_gpr(t0, rs);
4744             gen_load_gpr(t1, rt);
4745             cond = 1;
4746         }
4747         break;
4748     case OPC_TEQI:
4749     case OPC_TGEI:
4750     case OPC_TGEIU:
4751     case OPC_TLTI:
4752     case OPC_TLTIU:
4753     case OPC_TNEI:
4754         /* Compare register to immediate */
4755         if (rs != 0 || imm != 0) {
4756             gen_load_gpr(t0, rs);
4757             tcg_gen_movi_tl(t1, (int32_t)imm);
4758             cond = 1;
4759         }
4760         break;
4761     }
4762     if (cond == 0) {
4763         switch (opc) {
4764         case OPC_TEQ:   /* rs == rs */
4765         case OPC_TEQI:  /* r0 == 0  */
4766         case OPC_TGE:   /* rs >= rs */
4767         case OPC_TGEI:  /* r0 >= 0  */
4768         case OPC_TGEU:  /* rs >= rs unsigned */
4769         case OPC_TGEIU: /* r0 >= 0  unsigned */
4770             /* Always trap */
4771             generate_exception_end(ctx, EXCP_TRAP);
4772             break;
4773         case OPC_TLT:   /* rs < rs           */
4774         case OPC_TLTI:  /* r0 < 0            */
4775         case OPC_TLTU:  /* rs < rs unsigned  */
4776         case OPC_TLTIU: /* r0 < 0  unsigned  */
4777         case OPC_TNE:   /* rs != rs          */
4778         case OPC_TNEI:  /* r0 != 0           */
4779             /* Never trap: treat as NOP. */
4780             break;
4781         }
4782     } else {
4783         TCGLabel *l1 = gen_new_label();
4784 
4785         switch (opc) {
4786         case OPC_TEQ:
4787         case OPC_TEQI:
4788             tcg_gen_brcond_tl(TCG_COND_NE, t0, t1, l1);
4789             break;
4790         case OPC_TGE:
4791         case OPC_TGEI:
4792             tcg_gen_brcond_tl(TCG_COND_LT, t0, t1, l1);
4793             break;
4794         case OPC_TGEU:
4795         case OPC_TGEIU:
4796             tcg_gen_brcond_tl(TCG_COND_LTU, t0, t1, l1);
4797             break;
4798         case OPC_TLT:
4799         case OPC_TLTI:
4800             tcg_gen_brcond_tl(TCG_COND_GE, t0, t1, l1);
4801             break;
4802         case OPC_TLTU:
4803         case OPC_TLTIU:
4804             tcg_gen_brcond_tl(TCG_COND_GEU, t0, t1, l1);
4805             break;
4806         case OPC_TNE:
4807         case OPC_TNEI:
4808             tcg_gen_brcond_tl(TCG_COND_EQ, t0, t1, l1);
4809             break;
4810         }
4811         generate_exception(ctx, EXCP_TRAP);
4812         gen_set_label(l1);
4813     }
4814     tcg_temp_free(t0);
4815     tcg_temp_free(t1);
4816 }
4817 
4818 static void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
4819 {
4820     if (translator_use_goto_tb(&ctx->base, dest)) {
4821         tcg_gen_goto_tb(n);
4822         gen_save_pc(dest);
4823         tcg_gen_exit_tb(ctx->base.tb, n);
4824     } else {
4825         gen_save_pc(dest);
4826         tcg_gen_lookup_and_goto_ptr();
4827     }
4828 }
4829 
4830 /* Branches (before delay slot) */
4831 static void gen_compute_branch(DisasContext *ctx, uint32_t opc,
4832                                int insn_bytes,
4833                                int rs, int rt, int32_t offset,
4834                                int delayslot_size)
4835 {
4836     target_ulong btgt = -1;
4837     int blink = 0;
4838     int bcond_compute = 0;
4839     TCGv t0 = tcg_temp_new();
4840     TCGv t1 = tcg_temp_new();
4841 
4842     if (ctx->hflags & MIPS_HFLAG_BMASK) {
4843 #ifdef MIPS_DEBUG_DISAS
4844         LOG_DISAS("Branch in delay / forbidden slot at PC 0x"
4845                   TARGET_FMT_lx "\n", ctx->base.pc_next);
4846 #endif
4847         gen_reserved_instruction(ctx);
4848         goto out;
4849     }
4850 
4851     /* Load needed operands */
4852     switch (opc) {
4853     case OPC_BEQ:
4854     case OPC_BEQL:
4855     case OPC_BNE:
4856     case OPC_BNEL:
4857         /* Compare two registers */
4858         if (rs != rt) {
4859             gen_load_gpr(t0, rs);
4860             gen_load_gpr(t1, rt);
4861             bcond_compute = 1;
4862         }
4863         btgt = ctx->base.pc_next + insn_bytes + offset;
4864         break;
4865     case OPC_BGEZ:
4866     case OPC_BGEZAL:
4867     case OPC_BGEZALL:
4868     case OPC_BGEZL:
4869     case OPC_BGTZ:
4870     case OPC_BGTZL:
4871     case OPC_BLEZ:
4872     case OPC_BLEZL:
4873     case OPC_BLTZ:
4874     case OPC_BLTZAL:
4875     case OPC_BLTZALL:
4876     case OPC_BLTZL:
4877         /* Compare to zero */
4878         if (rs != 0) {
4879             gen_load_gpr(t0, rs);
4880             bcond_compute = 1;
4881         }
4882         btgt = ctx->base.pc_next + insn_bytes + offset;
4883         break;
4884     case OPC_BPOSGE32:
4885 #if defined(TARGET_MIPS64)
4886     case OPC_BPOSGE64:
4887         tcg_gen_andi_tl(t0, cpu_dspctrl, 0x7F);
4888 #else
4889         tcg_gen_andi_tl(t0, cpu_dspctrl, 0x3F);
4890 #endif
4891         bcond_compute = 1;
4892         btgt = ctx->base.pc_next + insn_bytes + offset;
4893         break;
4894     case OPC_J:
4895     case OPC_JAL:
4896     case OPC_JALX:
4897         /* Jump to immediate */
4898         btgt = ((ctx->base.pc_next + insn_bytes) & (int32_t)0xF0000000) |
4899             (uint32_t)offset;
4900         break;
4901     case OPC_JR:
4902     case OPC_JALR:
4903         /* Jump to register */
4904         if (offset != 0 && offset != 16) {
4905             /*
4906              * Hint = 0 is JR/JALR, hint 16 is JR.HB/JALR.HB, the
4907              * others are reserved.
4908              */
4909             MIPS_INVAL("jump hint");
4910             gen_reserved_instruction(ctx);
4911             goto out;
4912         }
4913         gen_load_gpr(btarget, rs);
4914         break;
4915     default:
4916         MIPS_INVAL("branch/jump");
4917         gen_reserved_instruction(ctx);
4918         goto out;
4919     }
4920     if (bcond_compute == 0) {
4921         /* No condition to be computed */
4922         switch (opc) {
4923         case OPC_BEQ:     /* rx == rx        */
4924         case OPC_BEQL:    /* rx == rx likely */
4925         case OPC_BGEZ:    /* 0 >= 0          */
4926         case OPC_BGEZL:   /* 0 >= 0 likely   */
4927         case OPC_BLEZ:    /* 0 <= 0          */
4928         case OPC_BLEZL:   /* 0 <= 0 likely   */
4929             /* Always take */
4930             ctx->hflags |= MIPS_HFLAG_B;
4931             break;
4932         case OPC_BGEZAL:  /* 0 >= 0          */
4933         case OPC_BGEZALL: /* 0 >= 0 likely   */
4934             /* Always take and link */
4935             blink = 31;
4936             ctx->hflags |= MIPS_HFLAG_B;
4937             break;
4938         case OPC_BNE:     /* rx != rx        */
4939         case OPC_BGTZ:    /* 0 > 0           */
4940         case OPC_BLTZ:    /* 0 < 0           */
4941             /* Treat as NOP. */
4942             goto out;
4943         case OPC_BLTZAL:  /* 0 < 0           */
4944             /*
4945              * Handle as an unconditional branch to get correct delay
4946              * slot checking.
4947              */
4948             blink = 31;
4949             btgt = ctx->base.pc_next + insn_bytes + delayslot_size;
4950             ctx->hflags |= MIPS_HFLAG_B;
4951             break;
4952         case OPC_BLTZALL: /* 0 < 0 likely */
4953             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 8);
4954             /* Skip the instruction in the delay slot */
4955             ctx->base.pc_next += 4;
4956             goto out;
4957         case OPC_BNEL:    /* rx != rx likely */
4958         case OPC_BGTZL:   /* 0 > 0 likely */
4959         case OPC_BLTZL:   /* 0 < 0 likely */
4960             /* Skip the instruction in the delay slot */
4961             ctx->base.pc_next += 4;
4962             goto out;
4963         case OPC_J:
4964             ctx->hflags |= MIPS_HFLAG_B;
4965             break;
4966         case OPC_JALX:
4967             ctx->hflags |= MIPS_HFLAG_BX;
4968             /* Fallthrough */
4969         case OPC_JAL:
4970             blink = 31;
4971             ctx->hflags |= MIPS_HFLAG_B;
4972             break;
4973         case OPC_JR:
4974             ctx->hflags |= MIPS_HFLAG_BR;
4975             break;
4976         case OPC_JALR:
4977             blink = rt;
4978             ctx->hflags |= MIPS_HFLAG_BR;
4979             break;
4980         default:
4981             MIPS_INVAL("branch/jump");
4982             gen_reserved_instruction(ctx);
4983             goto out;
4984         }
4985     } else {
4986         switch (opc) {
4987         case OPC_BEQ:
4988             tcg_gen_setcond_tl(TCG_COND_EQ, bcond, t0, t1);
4989             goto not_likely;
4990         case OPC_BEQL:
4991             tcg_gen_setcond_tl(TCG_COND_EQ, bcond, t0, t1);
4992             goto likely;
4993         case OPC_BNE:
4994             tcg_gen_setcond_tl(TCG_COND_NE, bcond, t0, t1);
4995             goto not_likely;
4996         case OPC_BNEL:
4997             tcg_gen_setcond_tl(TCG_COND_NE, bcond, t0, t1);
4998             goto likely;
4999         case OPC_BGEZ:
5000             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
5001             goto not_likely;
5002         case OPC_BGEZL:
5003             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
5004             goto likely;
5005         case OPC_BGEZAL:
5006             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
5007             blink = 31;
5008             goto not_likely;
5009         case OPC_BGEZALL:
5010             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
5011             blink = 31;
5012             goto likely;
5013         case OPC_BGTZ:
5014             tcg_gen_setcondi_tl(TCG_COND_GT, bcond, t0, 0);
5015             goto not_likely;
5016         case OPC_BGTZL:
5017             tcg_gen_setcondi_tl(TCG_COND_GT, bcond, t0, 0);
5018             goto likely;
5019         case OPC_BLEZ:
5020             tcg_gen_setcondi_tl(TCG_COND_LE, bcond, t0, 0);
5021             goto not_likely;
5022         case OPC_BLEZL:
5023             tcg_gen_setcondi_tl(TCG_COND_LE, bcond, t0, 0);
5024             goto likely;
5025         case OPC_BLTZ:
5026             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
5027             goto not_likely;
5028         case OPC_BLTZL:
5029             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
5030             goto likely;
5031         case OPC_BPOSGE32:
5032             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 32);
5033             goto not_likely;
5034 #if defined(TARGET_MIPS64)
5035         case OPC_BPOSGE64:
5036             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 64);
5037             goto not_likely;
5038 #endif
5039         case OPC_BLTZAL:
5040             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
5041             blink = 31;
5042         not_likely:
5043             ctx->hflags |= MIPS_HFLAG_BC;
5044             break;
5045         case OPC_BLTZALL:
5046             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
5047             blink = 31;
5048         likely:
5049             ctx->hflags |= MIPS_HFLAG_BL;
5050             break;
5051         default:
5052             MIPS_INVAL("conditional branch/jump");
5053             gen_reserved_instruction(ctx);
5054             goto out;
5055         }
5056     }
5057 
5058     ctx->btarget = btgt;
5059 
5060     switch (delayslot_size) {
5061     case 2:
5062         ctx->hflags |= MIPS_HFLAG_BDS16;
5063         break;
5064     case 4:
5065         ctx->hflags |= MIPS_HFLAG_BDS32;
5066         break;
5067     }
5068 
5069     if (blink > 0) {
5070         int post_delay = insn_bytes + delayslot_size;
5071         int lowbit = !!(ctx->hflags & MIPS_HFLAG_M16);
5072 
5073         tcg_gen_movi_tl(cpu_gpr[blink],
5074                         ctx->base.pc_next + post_delay + lowbit);
5075     }
5076 
5077  out:
5078     if (insn_bytes == 2) {
5079         ctx->hflags |= MIPS_HFLAG_B16;
5080     }
5081     tcg_temp_free(t0);
5082     tcg_temp_free(t1);
5083 }
5084 
5085 
5086 /* special3 bitfield operations */
5087 static void gen_bitops(DisasContext *ctx, uint32_t opc, int rt,
5088                        int rs, int lsb, int msb)
5089 {
5090     TCGv t0 = tcg_temp_new();
5091     TCGv t1 = tcg_temp_new();
5092 
5093     gen_load_gpr(t1, rs);
5094     switch (opc) {
5095     case OPC_EXT:
5096         if (lsb + msb > 31) {
5097             goto fail;
5098         }
5099         if (msb != 31) {
5100             tcg_gen_extract_tl(t0, t1, lsb, msb + 1);
5101         } else {
5102             /*
5103              * The two checks together imply that lsb == 0,
5104              * so this is a simple sign-extension.
5105              */
5106             tcg_gen_ext32s_tl(t0, t1);
5107         }
5108         break;
5109 #if defined(TARGET_MIPS64)
5110     case OPC_DEXTU:
5111         lsb += 32;
5112         goto do_dext;
5113     case OPC_DEXTM:
5114         msb += 32;
5115         goto do_dext;
5116     case OPC_DEXT:
5117     do_dext:
5118         if (lsb + msb > 63) {
5119             goto fail;
5120         }
5121         tcg_gen_extract_tl(t0, t1, lsb, msb + 1);
5122         break;
5123 #endif
5124     case OPC_INS:
5125         if (lsb > msb) {
5126             goto fail;
5127         }
5128         gen_load_gpr(t0, rt);
5129         tcg_gen_deposit_tl(t0, t0, t1, lsb, msb - lsb + 1);
5130         tcg_gen_ext32s_tl(t0, t0);
5131         break;
5132 #if defined(TARGET_MIPS64)
5133     case OPC_DINSU:
5134         lsb += 32;
5135         /* FALLTHRU */
5136     case OPC_DINSM:
5137         msb += 32;
5138         /* FALLTHRU */
5139     case OPC_DINS:
5140         if (lsb > msb) {
5141             goto fail;
5142         }
5143         gen_load_gpr(t0, rt);
5144         tcg_gen_deposit_tl(t0, t0, t1, lsb, msb - lsb + 1);
5145         break;
5146 #endif
5147     default:
5148 fail:
5149         MIPS_INVAL("bitops");
5150         gen_reserved_instruction(ctx);
5151         tcg_temp_free(t0);
5152         tcg_temp_free(t1);
5153         return;
5154     }
5155     gen_store_gpr(t0, rt);
5156     tcg_temp_free(t0);
5157     tcg_temp_free(t1);
5158 }
5159 
5160 static void gen_bshfl(DisasContext *ctx, uint32_t op2, int rt, int rd)
5161 {
5162     TCGv t0;
5163 
5164     if (rd == 0) {
5165         /* If no destination, treat it as a NOP. */
5166         return;
5167     }
5168 
5169     t0 = tcg_temp_new();
5170     gen_load_gpr(t0, rt);
5171     switch (op2) {
5172     case OPC_WSBH:
5173         {
5174             TCGv t1 = tcg_temp_new();
5175             TCGv t2 = tcg_const_tl(0x00FF00FF);
5176 
5177             tcg_gen_shri_tl(t1, t0, 8);
5178             tcg_gen_and_tl(t1, t1, t2);
5179             tcg_gen_and_tl(t0, t0, t2);
5180             tcg_gen_shli_tl(t0, t0, 8);
5181             tcg_gen_or_tl(t0, t0, t1);
5182             tcg_temp_free(t2);
5183             tcg_temp_free(t1);
5184             tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
5185         }
5186         break;
5187     case OPC_SEB:
5188         tcg_gen_ext8s_tl(cpu_gpr[rd], t0);
5189         break;
5190     case OPC_SEH:
5191         tcg_gen_ext16s_tl(cpu_gpr[rd], t0);
5192         break;
5193 #if defined(TARGET_MIPS64)
5194     case OPC_DSBH:
5195         {
5196             TCGv t1 = tcg_temp_new();
5197             TCGv t2 = tcg_const_tl(0x00FF00FF00FF00FFULL);
5198 
5199             tcg_gen_shri_tl(t1, t0, 8);
5200             tcg_gen_and_tl(t1, t1, t2);
5201             tcg_gen_and_tl(t0, t0, t2);
5202             tcg_gen_shli_tl(t0, t0, 8);
5203             tcg_gen_or_tl(cpu_gpr[rd], t0, t1);
5204             tcg_temp_free(t2);
5205             tcg_temp_free(t1);
5206         }
5207         break;
5208     case OPC_DSHD:
5209         {
5210             TCGv t1 = tcg_temp_new();
5211             TCGv t2 = tcg_const_tl(0x0000FFFF0000FFFFULL);
5212 
5213             tcg_gen_shri_tl(t1, t0, 16);
5214             tcg_gen_and_tl(t1, t1, t2);
5215             tcg_gen_and_tl(t0, t0, t2);
5216             tcg_gen_shli_tl(t0, t0, 16);
5217             tcg_gen_or_tl(t0, t0, t1);
5218             tcg_gen_shri_tl(t1, t0, 32);
5219             tcg_gen_shli_tl(t0, t0, 32);
5220             tcg_gen_or_tl(cpu_gpr[rd], t0, t1);
5221             tcg_temp_free(t2);
5222             tcg_temp_free(t1);
5223         }
5224         break;
5225 #endif
5226     default:
5227         MIPS_INVAL("bsfhl");
5228         gen_reserved_instruction(ctx);
5229         tcg_temp_free(t0);
5230         return;
5231     }
5232     tcg_temp_free(t0);
5233 }
5234 
5235 static void gen_align_bits(DisasContext *ctx, int wordsz, int rd, int rs,
5236                            int rt, int bits)
5237 {
5238     TCGv t0;
5239     if (rd == 0) {
5240         /* Treat as NOP. */
5241         return;
5242     }
5243     t0 = tcg_temp_new();
5244     if (bits == 0 || bits == wordsz) {
5245         if (bits == 0) {
5246             gen_load_gpr(t0, rt);
5247         } else {
5248             gen_load_gpr(t0, rs);
5249         }
5250         switch (wordsz) {
5251         case 32:
5252             tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
5253             break;
5254 #if defined(TARGET_MIPS64)
5255         case 64:
5256             tcg_gen_mov_tl(cpu_gpr[rd], t0);
5257             break;
5258 #endif
5259         }
5260     } else {
5261         TCGv t1 = tcg_temp_new();
5262         gen_load_gpr(t0, rt);
5263         gen_load_gpr(t1, rs);
5264         switch (wordsz) {
5265         case 32:
5266             {
5267                 TCGv_i64 t2 = tcg_temp_new_i64();
5268                 tcg_gen_concat_tl_i64(t2, t1, t0);
5269                 tcg_gen_shri_i64(t2, t2, 32 - bits);
5270                 gen_move_low32(cpu_gpr[rd], t2);
5271                 tcg_temp_free_i64(t2);
5272             }
5273             break;
5274 #if defined(TARGET_MIPS64)
5275         case 64:
5276             tcg_gen_shli_tl(t0, t0, bits);
5277             tcg_gen_shri_tl(t1, t1, 64 - bits);
5278             tcg_gen_or_tl(cpu_gpr[rd], t1, t0);
5279             break;
5280 #endif
5281         }
5282         tcg_temp_free(t1);
5283     }
5284 
5285     tcg_temp_free(t0);
5286 }
5287 
5288 void gen_align(DisasContext *ctx, int wordsz, int rd, int rs, int rt, int bp)
5289 {
5290     gen_align_bits(ctx, wordsz, rd, rs, rt, bp * 8);
5291 }
5292 
5293 static void gen_bitswap(DisasContext *ctx, int opc, int rd, int rt)
5294 {
5295     TCGv t0;
5296     if (rd == 0) {
5297         /* Treat as NOP. */
5298         return;
5299     }
5300     t0 = tcg_temp_new();
5301     gen_load_gpr(t0, rt);
5302     switch (opc) {
5303     case OPC_BITSWAP:
5304         gen_helper_bitswap(cpu_gpr[rd], t0);
5305         break;
5306 #if defined(TARGET_MIPS64)
5307     case OPC_DBITSWAP:
5308         gen_helper_dbitswap(cpu_gpr[rd], t0);
5309         break;
5310 #endif
5311     }
5312     tcg_temp_free(t0);
5313 }
5314 
5315 #ifndef CONFIG_USER_ONLY
5316 /* CP0 (MMU and control) */
5317 static inline void gen_mthc0_entrylo(TCGv arg, target_ulong off)
5318 {
5319     TCGv_i64 t0 = tcg_temp_new_i64();
5320     TCGv_i64 t1 = tcg_temp_new_i64();
5321 
5322     tcg_gen_ext_tl_i64(t0, arg);
5323     tcg_gen_ld_i64(t1, cpu_env, off);
5324 #if defined(TARGET_MIPS64)
5325     tcg_gen_deposit_i64(t1, t1, t0, 30, 32);
5326 #else
5327     tcg_gen_concat32_i64(t1, t1, t0);
5328 #endif
5329     tcg_gen_st_i64(t1, cpu_env, off);
5330     tcg_temp_free_i64(t1);
5331     tcg_temp_free_i64(t0);
5332 }
5333 
5334 static inline void gen_mthc0_store64(TCGv arg, target_ulong off)
5335 {
5336     TCGv_i64 t0 = tcg_temp_new_i64();
5337     TCGv_i64 t1 = tcg_temp_new_i64();
5338 
5339     tcg_gen_ext_tl_i64(t0, arg);
5340     tcg_gen_ld_i64(t1, cpu_env, off);
5341     tcg_gen_concat32_i64(t1, t1, t0);
5342     tcg_gen_st_i64(t1, cpu_env, off);
5343     tcg_temp_free_i64(t1);
5344     tcg_temp_free_i64(t0);
5345 }
5346 
5347 static inline void gen_mfhc0_entrylo(TCGv arg, target_ulong off)
5348 {
5349     TCGv_i64 t0 = tcg_temp_new_i64();
5350 
5351     tcg_gen_ld_i64(t0, cpu_env, off);
5352 #if defined(TARGET_MIPS64)
5353     tcg_gen_shri_i64(t0, t0, 30);
5354 #else
5355     tcg_gen_shri_i64(t0, t0, 32);
5356 #endif
5357     gen_move_low32(arg, t0);
5358     tcg_temp_free_i64(t0);
5359 }
5360 
5361 static inline void gen_mfhc0_load64(TCGv arg, target_ulong off, int shift)
5362 {
5363     TCGv_i64 t0 = tcg_temp_new_i64();
5364 
5365     tcg_gen_ld_i64(t0, cpu_env, off);
5366     tcg_gen_shri_i64(t0, t0, 32 + shift);
5367     gen_move_low32(arg, t0);
5368     tcg_temp_free_i64(t0);
5369 }
5370 
5371 static inline void gen_mfc0_load32(TCGv arg, target_ulong off)
5372 {
5373     TCGv_i32 t0 = tcg_temp_new_i32();
5374 
5375     tcg_gen_ld_i32(t0, cpu_env, off);
5376     tcg_gen_ext_i32_tl(arg, t0);
5377     tcg_temp_free_i32(t0);
5378 }
5379 
5380 static inline void gen_mfc0_load64(TCGv arg, target_ulong off)
5381 {
5382     tcg_gen_ld_tl(arg, cpu_env, off);
5383     tcg_gen_ext32s_tl(arg, arg);
5384 }
5385 
5386 static inline void gen_mtc0_store32(TCGv arg, target_ulong off)
5387 {
5388     TCGv_i32 t0 = tcg_temp_new_i32();
5389 
5390     tcg_gen_trunc_tl_i32(t0, arg);
5391     tcg_gen_st_i32(t0, cpu_env, off);
5392     tcg_temp_free_i32(t0);
5393 }
5394 
5395 #define CP0_CHECK(c)                            \
5396     do {                                        \
5397         if (!(c)) {                             \
5398             goto cp0_unimplemented;             \
5399         }                                       \
5400     } while (0)
5401 
5402 static void gen_mfhc0(DisasContext *ctx, TCGv arg, int reg, int sel)
5403 {
5404     const char *register_name = "invalid";
5405 
5406     switch (reg) {
5407     case CP0_REGISTER_02:
5408         switch (sel) {
5409         case 0:
5410             CP0_CHECK(ctx->hflags & MIPS_HFLAG_ELPA);
5411             gen_mfhc0_entrylo(arg, offsetof(CPUMIPSState, CP0_EntryLo0));
5412             register_name = "EntryLo0";
5413             break;
5414         default:
5415             goto cp0_unimplemented;
5416         }
5417         break;
5418     case CP0_REGISTER_03:
5419         switch (sel) {
5420         case CP0_REG03__ENTRYLO1:
5421             CP0_CHECK(ctx->hflags & MIPS_HFLAG_ELPA);
5422             gen_mfhc0_entrylo(arg, offsetof(CPUMIPSState, CP0_EntryLo1));
5423             register_name = "EntryLo1";
5424             break;
5425         default:
5426             goto cp0_unimplemented;
5427         }
5428         break;
5429     case CP0_REGISTER_09:
5430         switch (sel) {
5431         case CP0_REG09__SAAR:
5432             CP0_CHECK(ctx->saar);
5433             gen_helper_mfhc0_saar(arg, cpu_env);
5434             register_name = "SAAR";
5435             break;
5436         default:
5437             goto cp0_unimplemented;
5438         }
5439         break;
5440     case CP0_REGISTER_17:
5441         switch (sel) {
5442         case CP0_REG17__LLADDR:
5443             gen_mfhc0_load64(arg, offsetof(CPUMIPSState, CP0_LLAddr),
5444                              ctx->CP0_LLAddr_shift);
5445             register_name = "LLAddr";
5446             break;
5447         case CP0_REG17__MAAR:
5448             CP0_CHECK(ctx->mrp);
5449             gen_helper_mfhc0_maar(arg, cpu_env);
5450             register_name = "MAAR";
5451             break;
5452         default:
5453             goto cp0_unimplemented;
5454         }
5455         break;
5456     case CP0_REGISTER_19:
5457         switch (sel) {
5458         case CP0_REG19__WATCHHI0:
5459         case CP0_REG19__WATCHHI1:
5460         case CP0_REG19__WATCHHI2:
5461         case CP0_REG19__WATCHHI3:
5462         case CP0_REG19__WATCHHI4:
5463         case CP0_REG19__WATCHHI5:
5464         case CP0_REG19__WATCHHI6:
5465         case CP0_REG19__WATCHHI7:
5466             /* upper 32 bits are only available when Config5MI != 0 */
5467             CP0_CHECK(ctx->mi);
5468             gen_mfhc0_load64(arg, offsetof(CPUMIPSState, CP0_WatchHi[sel]), 0);
5469             register_name = "WatchHi";
5470             break;
5471         default:
5472             goto cp0_unimplemented;
5473         }
5474         break;
5475     case CP0_REGISTER_28:
5476         switch (sel) {
5477         case 0:
5478         case 2:
5479         case 4:
5480         case 6:
5481             gen_mfhc0_load64(arg, offsetof(CPUMIPSState, CP0_TagLo), 0);
5482             register_name = "TagLo";
5483             break;
5484         default:
5485             goto cp0_unimplemented;
5486         }
5487         break;
5488     default:
5489         goto cp0_unimplemented;
5490     }
5491     trace_mips_translate_c0("mfhc0", register_name, reg, sel);
5492     return;
5493 
5494 cp0_unimplemented:
5495     qemu_log_mask(LOG_UNIMP, "mfhc0 %s (reg %d sel %d)\n",
5496                   register_name, reg, sel);
5497     tcg_gen_movi_tl(arg, 0);
5498 }
5499 
5500 static void gen_mthc0(DisasContext *ctx, TCGv arg, int reg, int sel)
5501 {
5502     const char *register_name = "invalid";
5503     uint64_t mask = ctx->PAMask >> 36;
5504 
5505     switch (reg) {
5506     case CP0_REGISTER_02:
5507         switch (sel) {
5508         case 0:
5509             CP0_CHECK(ctx->hflags & MIPS_HFLAG_ELPA);
5510             tcg_gen_andi_tl(arg, arg, mask);
5511             gen_mthc0_entrylo(arg, offsetof(CPUMIPSState, CP0_EntryLo0));
5512             register_name = "EntryLo0";
5513             break;
5514         default:
5515             goto cp0_unimplemented;
5516         }
5517         break;
5518     case CP0_REGISTER_03:
5519         switch (sel) {
5520         case CP0_REG03__ENTRYLO1:
5521             CP0_CHECK(ctx->hflags & MIPS_HFLAG_ELPA);
5522             tcg_gen_andi_tl(arg, arg, mask);
5523             gen_mthc0_entrylo(arg, offsetof(CPUMIPSState, CP0_EntryLo1));
5524             register_name = "EntryLo1";
5525             break;
5526         default:
5527             goto cp0_unimplemented;
5528         }
5529         break;
5530     case CP0_REGISTER_09:
5531         switch (sel) {
5532         case CP0_REG09__SAAR:
5533             CP0_CHECK(ctx->saar);
5534             gen_helper_mthc0_saar(cpu_env, arg);
5535             register_name = "SAAR";
5536             break;
5537         default:
5538             goto cp0_unimplemented;
5539         }
5540         break;
5541     case CP0_REGISTER_17:
5542         switch (sel) {
5543         case CP0_REG17__LLADDR:
5544             /*
5545              * LLAddr is read-only (the only exception is bit 0 if LLB is
5546              * supported); the CP0_LLAddr_rw_bitmask does not seem to be
5547              * relevant for modern MIPS cores supporting MTHC0, therefore
5548              * treating MTHC0 to LLAddr as NOP.
5549              */
5550             register_name = "LLAddr";
5551             break;
5552         case CP0_REG17__MAAR:
5553             CP0_CHECK(ctx->mrp);
5554             gen_helper_mthc0_maar(cpu_env, arg);
5555             register_name = "MAAR";
5556             break;
5557         default:
5558             goto cp0_unimplemented;
5559         }
5560         break;
5561     case CP0_REGISTER_19:
5562         switch (sel) {
5563         case CP0_REG19__WATCHHI0:
5564         case CP0_REG19__WATCHHI1:
5565         case CP0_REG19__WATCHHI2:
5566         case CP0_REG19__WATCHHI3:
5567         case CP0_REG19__WATCHHI4:
5568         case CP0_REG19__WATCHHI5:
5569         case CP0_REG19__WATCHHI6:
5570         case CP0_REG19__WATCHHI7:
5571             /* upper 32 bits are only available when Config5MI != 0 */
5572             CP0_CHECK(ctx->mi);
5573             gen_helper_0e1i(mthc0_watchhi, arg, sel);
5574             register_name = "WatchHi";
5575             break;
5576         default:
5577             goto cp0_unimplemented;
5578         }
5579         break;
5580     case CP0_REGISTER_28:
5581         switch (sel) {
5582         case 0:
5583         case 2:
5584         case 4:
5585         case 6:
5586             tcg_gen_andi_tl(arg, arg, mask);
5587             gen_mthc0_store64(arg, offsetof(CPUMIPSState, CP0_TagLo));
5588             register_name = "TagLo";
5589             break;
5590         default:
5591             goto cp0_unimplemented;
5592         }
5593         break;
5594     default:
5595         goto cp0_unimplemented;
5596     }
5597     trace_mips_translate_c0("mthc0", register_name, reg, sel);
5598     return;
5599 
5600 cp0_unimplemented:
5601     qemu_log_mask(LOG_UNIMP, "mthc0 %s (reg %d sel %d)\n",
5602                   register_name, reg, sel);
5603 }
5604 
5605 static inline void gen_mfc0_unimplemented(DisasContext *ctx, TCGv arg)
5606 {
5607     if (ctx->insn_flags & ISA_MIPS_R6) {
5608         tcg_gen_movi_tl(arg, 0);
5609     } else {
5610         tcg_gen_movi_tl(arg, ~0);
5611     }
5612 }
5613 
5614 static void gen_mfc0(DisasContext *ctx, TCGv arg, int reg, int sel)
5615 {
5616     const char *register_name = "invalid";
5617 
5618     if (sel != 0) {
5619         check_insn(ctx, ISA_MIPS_R1);
5620     }
5621 
5622     switch (reg) {
5623     case CP0_REGISTER_00:
5624         switch (sel) {
5625         case CP0_REG00__INDEX:
5626             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Index));
5627             register_name = "Index";
5628             break;
5629         case CP0_REG00__MVPCONTROL:
5630             CP0_CHECK(ctx->insn_flags & ASE_MT);
5631             gen_helper_mfc0_mvpcontrol(arg, cpu_env);
5632             register_name = "MVPControl";
5633             break;
5634         case CP0_REG00__MVPCONF0:
5635             CP0_CHECK(ctx->insn_flags & ASE_MT);
5636             gen_helper_mfc0_mvpconf0(arg, cpu_env);
5637             register_name = "MVPConf0";
5638             break;
5639         case CP0_REG00__MVPCONF1:
5640             CP0_CHECK(ctx->insn_flags & ASE_MT);
5641             gen_helper_mfc0_mvpconf1(arg, cpu_env);
5642             register_name = "MVPConf1";
5643             break;
5644         case CP0_REG00__VPCONTROL:
5645             CP0_CHECK(ctx->vp);
5646             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPControl));
5647             register_name = "VPControl";
5648             break;
5649         default:
5650             goto cp0_unimplemented;
5651         }
5652         break;
5653     case CP0_REGISTER_01:
5654         switch (sel) {
5655         case CP0_REG01__RANDOM:
5656             CP0_CHECK(!(ctx->insn_flags & ISA_MIPS_R6));
5657             gen_helper_mfc0_random(arg, cpu_env);
5658             register_name = "Random";
5659             break;
5660         case CP0_REG01__VPECONTROL:
5661             CP0_CHECK(ctx->insn_flags & ASE_MT);
5662             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEControl));
5663             register_name = "VPEControl";
5664             break;
5665         case CP0_REG01__VPECONF0:
5666             CP0_CHECK(ctx->insn_flags & ASE_MT);
5667             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf0));
5668             register_name = "VPEConf0";
5669             break;
5670         case CP0_REG01__VPECONF1:
5671             CP0_CHECK(ctx->insn_flags & ASE_MT);
5672             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf1));
5673             register_name = "VPEConf1";
5674             break;
5675         case CP0_REG01__YQMASK:
5676             CP0_CHECK(ctx->insn_flags & ASE_MT);
5677             gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_YQMask));
5678             register_name = "YQMask";
5679             break;
5680         case CP0_REG01__VPESCHEDULE:
5681             CP0_CHECK(ctx->insn_flags & ASE_MT);
5682             gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_VPESchedule));
5683             register_name = "VPESchedule";
5684             break;
5685         case CP0_REG01__VPESCHEFBACK:
5686             CP0_CHECK(ctx->insn_flags & ASE_MT);
5687             gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_VPEScheFBack));
5688             register_name = "VPEScheFBack";
5689             break;
5690         case CP0_REG01__VPEOPT:
5691             CP0_CHECK(ctx->insn_flags & ASE_MT);
5692             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEOpt));
5693             register_name = "VPEOpt";
5694             break;
5695         default:
5696             goto cp0_unimplemented;
5697         }
5698         break;
5699     case CP0_REGISTER_02:
5700         switch (sel) {
5701         case CP0_REG02__ENTRYLO0:
5702             {
5703                 TCGv_i64 tmp = tcg_temp_new_i64();
5704                 tcg_gen_ld_i64(tmp, cpu_env,
5705                                offsetof(CPUMIPSState, CP0_EntryLo0));
5706 #if defined(TARGET_MIPS64)
5707                 if (ctx->rxi) {
5708                     /* Move RI/XI fields to bits 31:30 */
5709                     tcg_gen_shri_tl(arg, tmp, CP0EnLo_XI);
5710                     tcg_gen_deposit_tl(tmp, tmp, arg, 30, 2);
5711                 }
5712 #endif
5713                 gen_move_low32(arg, tmp);
5714                 tcg_temp_free_i64(tmp);
5715             }
5716             register_name = "EntryLo0";
5717             break;
5718         case CP0_REG02__TCSTATUS:
5719             CP0_CHECK(ctx->insn_flags & ASE_MT);
5720             gen_helper_mfc0_tcstatus(arg, cpu_env);
5721             register_name = "TCStatus";
5722             break;
5723         case CP0_REG02__TCBIND:
5724             CP0_CHECK(ctx->insn_flags & ASE_MT);
5725             gen_helper_mfc0_tcbind(arg, cpu_env);
5726             register_name = "TCBind";
5727             break;
5728         case CP0_REG02__TCRESTART:
5729             CP0_CHECK(ctx->insn_flags & ASE_MT);
5730             gen_helper_mfc0_tcrestart(arg, cpu_env);
5731             register_name = "TCRestart";
5732             break;
5733         case CP0_REG02__TCHALT:
5734             CP0_CHECK(ctx->insn_flags & ASE_MT);
5735             gen_helper_mfc0_tchalt(arg, cpu_env);
5736             register_name = "TCHalt";
5737             break;
5738         case CP0_REG02__TCCONTEXT:
5739             CP0_CHECK(ctx->insn_flags & ASE_MT);
5740             gen_helper_mfc0_tccontext(arg, cpu_env);
5741             register_name = "TCContext";
5742             break;
5743         case CP0_REG02__TCSCHEDULE:
5744             CP0_CHECK(ctx->insn_flags & ASE_MT);
5745             gen_helper_mfc0_tcschedule(arg, cpu_env);
5746             register_name = "TCSchedule";
5747             break;
5748         case CP0_REG02__TCSCHEFBACK:
5749             CP0_CHECK(ctx->insn_flags & ASE_MT);
5750             gen_helper_mfc0_tcschefback(arg, cpu_env);
5751             register_name = "TCScheFBack";
5752             break;
5753         default:
5754             goto cp0_unimplemented;
5755         }
5756         break;
5757     case CP0_REGISTER_03:
5758         switch (sel) {
5759         case CP0_REG03__ENTRYLO1:
5760             {
5761                 TCGv_i64 tmp = tcg_temp_new_i64();
5762                 tcg_gen_ld_i64(tmp, cpu_env,
5763                                offsetof(CPUMIPSState, CP0_EntryLo1));
5764 #if defined(TARGET_MIPS64)
5765                 if (ctx->rxi) {
5766                     /* Move RI/XI fields to bits 31:30 */
5767                     tcg_gen_shri_tl(arg, tmp, CP0EnLo_XI);
5768                     tcg_gen_deposit_tl(tmp, tmp, arg, 30, 2);
5769                 }
5770 #endif
5771                 gen_move_low32(arg, tmp);
5772                 tcg_temp_free_i64(tmp);
5773             }
5774             register_name = "EntryLo1";
5775             break;
5776         case CP0_REG03__GLOBALNUM:
5777             CP0_CHECK(ctx->vp);
5778             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_GlobalNumber));
5779             register_name = "GlobalNumber";
5780             break;
5781         default:
5782             goto cp0_unimplemented;
5783         }
5784         break;
5785     case CP0_REGISTER_04:
5786         switch (sel) {
5787         case CP0_REG04__CONTEXT:
5788             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_Context));
5789             tcg_gen_ext32s_tl(arg, arg);
5790             register_name = "Context";
5791             break;
5792         case CP0_REG04__CONTEXTCONFIG:
5793             /* SmartMIPS ASE */
5794             /* gen_helper_mfc0_contextconfig(arg); */
5795             register_name = "ContextConfig";
5796             goto cp0_unimplemented;
5797         case CP0_REG04__USERLOCAL:
5798             CP0_CHECK(ctx->ulri);
5799             tcg_gen_ld_tl(arg, cpu_env,
5800                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
5801             tcg_gen_ext32s_tl(arg, arg);
5802             register_name = "UserLocal";
5803             break;
5804         case CP0_REG04__MMID:
5805             CP0_CHECK(ctx->mi);
5806             gen_helper_mtc0_memorymapid(cpu_env, arg);
5807             register_name = "MMID";
5808             break;
5809         default:
5810             goto cp0_unimplemented;
5811         }
5812         break;
5813     case CP0_REGISTER_05:
5814         switch (sel) {
5815         case CP0_REG05__PAGEMASK:
5816             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageMask));
5817             register_name = "PageMask";
5818             break;
5819         case CP0_REG05__PAGEGRAIN:
5820             check_insn(ctx, ISA_MIPS_R2);
5821             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageGrain));
5822             register_name = "PageGrain";
5823             break;
5824         case CP0_REG05__SEGCTL0:
5825             CP0_CHECK(ctx->sc);
5826             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl0));
5827             tcg_gen_ext32s_tl(arg, arg);
5828             register_name = "SegCtl0";
5829             break;
5830         case CP0_REG05__SEGCTL1:
5831             CP0_CHECK(ctx->sc);
5832             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl1));
5833             tcg_gen_ext32s_tl(arg, arg);
5834             register_name = "SegCtl1";
5835             break;
5836         case CP0_REG05__SEGCTL2:
5837             CP0_CHECK(ctx->sc);
5838             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl2));
5839             tcg_gen_ext32s_tl(arg, arg);
5840             register_name = "SegCtl2";
5841             break;
5842         case CP0_REG05__PWBASE:
5843             check_pw(ctx);
5844             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PWBase));
5845             register_name = "PWBase";
5846             break;
5847         case CP0_REG05__PWFIELD:
5848             check_pw(ctx);
5849             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PWField));
5850             register_name = "PWField";
5851             break;
5852         case CP0_REG05__PWSIZE:
5853             check_pw(ctx);
5854             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PWSize));
5855             register_name = "PWSize";
5856             break;
5857         default:
5858             goto cp0_unimplemented;
5859         }
5860         break;
5861     case CP0_REGISTER_06:
5862         switch (sel) {
5863         case CP0_REG06__WIRED:
5864             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Wired));
5865             register_name = "Wired";
5866             break;
5867         case CP0_REG06__SRSCONF0:
5868             check_insn(ctx, ISA_MIPS_R2);
5869             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf0));
5870             register_name = "SRSConf0";
5871             break;
5872         case CP0_REG06__SRSCONF1:
5873             check_insn(ctx, ISA_MIPS_R2);
5874             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf1));
5875             register_name = "SRSConf1";
5876             break;
5877         case CP0_REG06__SRSCONF2:
5878             check_insn(ctx, ISA_MIPS_R2);
5879             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf2));
5880             register_name = "SRSConf2";
5881             break;
5882         case CP0_REG06__SRSCONF3:
5883             check_insn(ctx, ISA_MIPS_R2);
5884             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf3));
5885             register_name = "SRSConf3";
5886             break;
5887         case CP0_REG06__SRSCONF4:
5888             check_insn(ctx, ISA_MIPS_R2);
5889             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf4));
5890             register_name = "SRSConf4";
5891             break;
5892         case CP0_REG06__PWCTL:
5893             check_pw(ctx);
5894             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PWCtl));
5895             register_name = "PWCtl";
5896             break;
5897         default:
5898             goto cp0_unimplemented;
5899         }
5900         break;
5901     case CP0_REGISTER_07:
5902         switch (sel) {
5903         case CP0_REG07__HWRENA:
5904             check_insn(ctx, ISA_MIPS_R2);
5905             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_HWREna));
5906             register_name = "HWREna";
5907             break;
5908         default:
5909             goto cp0_unimplemented;
5910         }
5911         break;
5912     case CP0_REGISTER_08:
5913         switch (sel) {
5914         case CP0_REG08__BADVADDR:
5915             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));
5916             tcg_gen_ext32s_tl(arg, arg);
5917             register_name = "BadVAddr";
5918             break;
5919         case CP0_REG08__BADINSTR:
5920             CP0_CHECK(ctx->bi);
5921             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstr));
5922             register_name = "BadInstr";
5923             break;
5924         case CP0_REG08__BADINSTRP:
5925             CP0_CHECK(ctx->bp);
5926             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrP));
5927             register_name = "BadInstrP";
5928             break;
5929         case CP0_REG08__BADINSTRX:
5930             CP0_CHECK(ctx->bi);
5931             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrX));
5932             tcg_gen_andi_tl(arg, arg, ~0xffff);
5933             register_name = "BadInstrX";
5934             break;
5935         default:
5936             goto cp0_unimplemented;
5937         }
5938         break;
5939     case CP0_REGISTER_09:
5940         switch (sel) {
5941         case CP0_REG09__COUNT:
5942             /* Mark as an IO operation because we read the time.  */
5943             if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
5944                 gen_io_start();
5945             }
5946             gen_helper_mfc0_count(arg, cpu_env);
5947             /*
5948              * Break the TB to be able to take timer interrupts immediately
5949              * after reading count. DISAS_STOP isn't sufficient, we need to
5950              * ensure we break completely out of translated code.
5951              */
5952             gen_save_pc(ctx->base.pc_next + 4);
5953             ctx->base.is_jmp = DISAS_EXIT;
5954             register_name = "Count";
5955             break;
5956         case CP0_REG09__SAARI:
5957             CP0_CHECK(ctx->saar);
5958             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SAARI));
5959             register_name = "SAARI";
5960             break;
5961         case CP0_REG09__SAAR:
5962             CP0_CHECK(ctx->saar);
5963             gen_helper_mfc0_saar(arg, cpu_env);
5964             register_name = "SAAR";
5965             break;
5966         default:
5967             goto cp0_unimplemented;
5968         }
5969         break;
5970     case CP0_REGISTER_10:
5971         switch (sel) {
5972         case CP0_REG10__ENTRYHI:
5973             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryHi));
5974             tcg_gen_ext32s_tl(arg, arg);
5975             register_name = "EntryHi";
5976             break;
5977         default:
5978             goto cp0_unimplemented;
5979         }
5980         break;
5981     case CP0_REGISTER_11:
5982         switch (sel) {
5983         case CP0_REG11__COMPARE:
5984             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Compare));
5985             register_name = "Compare";
5986             break;
5987         /* 6,7 are implementation dependent */
5988         default:
5989             goto cp0_unimplemented;
5990         }
5991         break;
5992     case CP0_REGISTER_12:
5993         switch (sel) {
5994         case CP0_REG12__STATUS:
5995             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Status));
5996             register_name = "Status";
5997             break;
5998         case CP0_REG12__INTCTL:
5999             check_insn(ctx, ISA_MIPS_R2);
6000             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_IntCtl));
6001             register_name = "IntCtl";
6002             break;
6003         case CP0_REG12__SRSCTL:
6004             check_insn(ctx, ISA_MIPS_R2);
6005             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSCtl));
6006             register_name = "SRSCtl";
6007             break;
6008         case CP0_REG12__SRSMAP:
6009             check_insn(ctx, ISA_MIPS_R2);
6010             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
6011             register_name = "SRSMap";
6012             break;
6013         default:
6014             goto cp0_unimplemented;
6015        }
6016         break;
6017     case CP0_REGISTER_13:
6018         switch (sel) {
6019         case CP0_REG13__CAUSE:
6020             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Cause));
6021             register_name = "Cause";
6022             break;
6023         default:
6024             goto cp0_unimplemented;
6025        }
6026         break;
6027     case CP0_REGISTER_14:
6028         switch (sel) {
6029         case CP0_REG14__EPC:
6030             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
6031             tcg_gen_ext32s_tl(arg, arg);
6032             register_name = "EPC";
6033             break;
6034         default:
6035             goto cp0_unimplemented;
6036         }
6037         break;
6038     case CP0_REGISTER_15:
6039         switch (sel) {
6040         case CP0_REG15__PRID:
6041             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PRid));
6042             register_name = "PRid";
6043             break;
6044         case CP0_REG15__EBASE:
6045             check_insn(ctx, ISA_MIPS_R2);
6046             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EBase));
6047             tcg_gen_ext32s_tl(arg, arg);
6048             register_name = "EBase";
6049             break;
6050         case CP0_REG15__CMGCRBASE:
6051             check_insn(ctx, ISA_MIPS_R2);
6052             CP0_CHECK(ctx->cmgcr);
6053             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_CMGCRBase));
6054             tcg_gen_ext32s_tl(arg, arg);
6055             register_name = "CMGCRBase";
6056             break;
6057         default:
6058             goto cp0_unimplemented;
6059        }
6060         break;
6061     case CP0_REGISTER_16:
6062         switch (sel) {
6063         case CP0_REG16__CONFIG:
6064             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config0));
6065             register_name = "Config";
6066             break;
6067         case CP0_REG16__CONFIG1:
6068             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config1));
6069             register_name = "Config1";
6070             break;
6071         case CP0_REG16__CONFIG2:
6072             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config2));
6073             register_name = "Config2";
6074             break;
6075         case CP0_REG16__CONFIG3:
6076             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config3));
6077             register_name = "Config3";
6078             break;
6079         case CP0_REG16__CONFIG4:
6080             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config4));
6081             register_name = "Config4";
6082             break;
6083         case CP0_REG16__CONFIG5:
6084             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config5));
6085             register_name = "Config5";
6086             break;
6087         /* 6,7 are implementation dependent */
6088         case CP0_REG16__CONFIG6:
6089             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config6));
6090             register_name = "Config6";
6091             break;
6092         case CP0_REG16__CONFIG7:
6093             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config7));
6094             register_name = "Config7";
6095             break;
6096         default:
6097             goto cp0_unimplemented;
6098         }
6099         break;
6100     case CP0_REGISTER_17:
6101         switch (sel) {
6102         case CP0_REG17__LLADDR:
6103             gen_helper_mfc0_lladdr(arg, cpu_env);
6104             register_name = "LLAddr";
6105             break;
6106         case CP0_REG17__MAAR:
6107             CP0_CHECK(ctx->mrp);
6108             gen_helper_mfc0_maar(arg, cpu_env);
6109             register_name = "MAAR";
6110             break;
6111         case CP0_REG17__MAARI:
6112             CP0_CHECK(ctx->mrp);
6113             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_MAARI));
6114             register_name = "MAARI";
6115             break;
6116         default:
6117             goto cp0_unimplemented;
6118         }
6119         break;
6120     case CP0_REGISTER_18:
6121         switch (sel) {
6122         case CP0_REG18__WATCHLO0:
6123         case CP0_REG18__WATCHLO1:
6124         case CP0_REG18__WATCHLO2:
6125         case CP0_REG18__WATCHLO3:
6126         case CP0_REG18__WATCHLO4:
6127         case CP0_REG18__WATCHLO5:
6128         case CP0_REG18__WATCHLO6:
6129         case CP0_REG18__WATCHLO7:
6130             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
6131             gen_helper_1e0i(mfc0_watchlo, arg, sel);
6132             register_name = "WatchLo";
6133             break;
6134         default:
6135             goto cp0_unimplemented;
6136         }
6137         break;
6138     case CP0_REGISTER_19:
6139         switch (sel) {
6140         case CP0_REG19__WATCHHI0:
6141         case CP0_REG19__WATCHHI1:
6142         case CP0_REG19__WATCHHI2:
6143         case CP0_REG19__WATCHHI3:
6144         case CP0_REG19__WATCHHI4:
6145         case CP0_REG19__WATCHHI5:
6146         case CP0_REG19__WATCHHI6:
6147         case CP0_REG19__WATCHHI7:
6148             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
6149             gen_helper_1e0i(mfc0_watchhi, arg, sel);
6150             register_name = "WatchHi";
6151             break;
6152         default:
6153             goto cp0_unimplemented;
6154         }
6155         break;
6156     case CP0_REGISTER_20:
6157         switch (sel) {
6158         case CP0_REG20__XCONTEXT:
6159 #if defined(TARGET_MIPS64)
6160             check_insn(ctx, ISA_MIPS3);
6161             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_XContext));
6162             tcg_gen_ext32s_tl(arg, arg);
6163             register_name = "XContext";
6164             break;
6165 #endif
6166         default:
6167             goto cp0_unimplemented;
6168         }
6169         break;
6170     case CP0_REGISTER_21:
6171        /* Officially reserved, but sel 0 is used for R1x000 framemask */
6172         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS_R6));
6173         switch (sel) {
6174         case 0:
6175             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Framemask));
6176             register_name = "Framemask";
6177             break;
6178         default:
6179             goto cp0_unimplemented;
6180         }
6181         break;
6182     case CP0_REGISTER_22:
6183         tcg_gen_movi_tl(arg, 0); /* unimplemented */
6184         register_name = "'Diagnostic"; /* implementation dependent */
6185         break;
6186     case CP0_REGISTER_23:
6187         switch (sel) {
6188         case CP0_REG23__DEBUG:
6189             gen_helper_mfc0_debug(arg, cpu_env); /* EJTAG support */
6190             register_name = "Debug";
6191             break;
6192         case CP0_REG23__TRACECONTROL:
6193             /* PDtrace support */
6194             /* gen_helper_mfc0_tracecontrol(arg);  */
6195             register_name = "TraceControl";
6196             goto cp0_unimplemented;
6197         case CP0_REG23__TRACECONTROL2:
6198             /* PDtrace support */
6199             /* gen_helper_mfc0_tracecontrol2(arg); */
6200             register_name = "TraceControl2";
6201             goto cp0_unimplemented;
6202         case CP0_REG23__USERTRACEDATA1:
6203             /* PDtrace support */
6204             /* gen_helper_mfc0_usertracedata1(arg);*/
6205             register_name = "UserTraceData1";
6206             goto cp0_unimplemented;
6207         case CP0_REG23__TRACEIBPC:
6208             /* PDtrace support */
6209             /* gen_helper_mfc0_traceibpc(arg);     */
6210             register_name = "TraceIBPC";
6211             goto cp0_unimplemented;
6212         case CP0_REG23__TRACEDBPC:
6213             /* PDtrace support */
6214             /* gen_helper_mfc0_tracedbpc(arg);     */
6215             register_name = "TraceDBPC";
6216             goto cp0_unimplemented;
6217         default:
6218             goto cp0_unimplemented;
6219         }
6220         break;
6221     case CP0_REGISTER_24:
6222         switch (sel) {
6223         case CP0_REG24__DEPC:
6224             /* EJTAG support */
6225             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
6226             tcg_gen_ext32s_tl(arg, arg);
6227             register_name = "DEPC";
6228             break;
6229         default:
6230             goto cp0_unimplemented;
6231         }
6232         break;
6233     case CP0_REGISTER_25:
6234         switch (sel) {
6235         case CP0_REG25__PERFCTL0:
6236             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Performance0));
6237             register_name = "Performance0";
6238             break;
6239         case CP0_REG25__PERFCNT0:
6240             /* gen_helper_mfc0_performance1(arg); */
6241             register_name = "Performance1";
6242             goto cp0_unimplemented;
6243         case CP0_REG25__PERFCTL1:
6244             /* gen_helper_mfc0_performance2(arg); */
6245             register_name = "Performance2";
6246             goto cp0_unimplemented;
6247         case CP0_REG25__PERFCNT1:
6248             /* gen_helper_mfc0_performance3(arg); */
6249             register_name = "Performance3";
6250             goto cp0_unimplemented;
6251         case CP0_REG25__PERFCTL2:
6252             /* gen_helper_mfc0_performance4(arg); */
6253             register_name = "Performance4";
6254             goto cp0_unimplemented;
6255         case CP0_REG25__PERFCNT2:
6256             /* gen_helper_mfc0_performance5(arg); */
6257             register_name = "Performance5";
6258             goto cp0_unimplemented;
6259         case CP0_REG25__PERFCTL3:
6260             /* gen_helper_mfc0_performance6(arg); */
6261             register_name = "Performance6";
6262             goto cp0_unimplemented;
6263         case CP0_REG25__PERFCNT3:
6264             /* gen_helper_mfc0_performance7(arg); */
6265             register_name = "Performance7";
6266             goto cp0_unimplemented;
6267         default:
6268             goto cp0_unimplemented;
6269         }
6270         break;
6271     case CP0_REGISTER_26:
6272         switch (sel) {
6273         case CP0_REG26__ERRCTL:
6274             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_ErrCtl));
6275             register_name = "ErrCtl";
6276             break;
6277         default:
6278             goto cp0_unimplemented;
6279         }
6280         break;
6281     case CP0_REGISTER_27:
6282         switch (sel) {
6283         case CP0_REG27__CACHERR:
6284             tcg_gen_movi_tl(arg, 0); /* unimplemented */
6285             register_name = "CacheErr";
6286             break;
6287         default:
6288             goto cp0_unimplemented;
6289         }
6290         break;
6291     case CP0_REGISTER_28:
6292         switch (sel) {
6293         case CP0_REG28__TAGLO:
6294         case CP0_REG28__TAGLO1:
6295         case CP0_REG28__TAGLO2:
6296         case CP0_REG28__TAGLO3:
6297             {
6298                 TCGv_i64 tmp = tcg_temp_new_i64();
6299                 tcg_gen_ld_i64(tmp, cpu_env, offsetof(CPUMIPSState, CP0_TagLo));
6300                 gen_move_low32(arg, tmp);
6301                 tcg_temp_free_i64(tmp);
6302             }
6303             register_name = "TagLo";
6304             break;
6305         case CP0_REG28__DATALO:
6306         case CP0_REG28__DATALO1:
6307         case CP0_REG28__DATALO2:
6308         case CP0_REG28__DATALO3:
6309             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataLo));
6310             register_name = "DataLo";
6311             break;
6312         default:
6313             goto cp0_unimplemented;
6314         }
6315         break;
6316     case CP0_REGISTER_29:
6317         switch (sel) {
6318         case CP0_REG29__TAGHI:
6319         case CP0_REG29__TAGHI1:
6320         case CP0_REG29__TAGHI2:
6321         case CP0_REG29__TAGHI3:
6322             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagHi));
6323             register_name = "TagHi";
6324             break;
6325         case CP0_REG29__DATAHI:
6326         case CP0_REG29__DATAHI1:
6327         case CP0_REG29__DATAHI2:
6328         case CP0_REG29__DATAHI3:
6329             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataHi));
6330             register_name = "DataHi";
6331             break;
6332         default:
6333             goto cp0_unimplemented;
6334         }
6335         break;
6336     case CP0_REGISTER_30:
6337         switch (sel) {
6338         case CP0_REG30__ERROREPC:
6339             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
6340             tcg_gen_ext32s_tl(arg, arg);
6341             register_name = "ErrorEPC";
6342             break;
6343         default:
6344             goto cp0_unimplemented;
6345         }
6346         break;
6347     case CP0_REGISTER_31:
6348         switch (sel) {
6349         case CP0_REG31__DESAVE:
6350             /* EJTAG support */
6351             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
6352             register_name = "DESAVE";
6353             break;
6354         case CP0_REG31__KSCRATCH1:
6355         case CP0_REG31__KSCRATCH2:
6356         case CP0_REG31__KSCRATCH3:
6357         case CP0_REG31__KSCRATCH4:
6358         case CP0_REG31__KSCRATCH5:
6359         case CP0_REG31__KSCRATCH6:
6360             CP0_CHECK(ctx->kscrexist & (1 << sel));
6361             tcg_gen_ld_tl(arg, cpu_env,
6362                           offsetof(CPUMIPSState, CP0_KScratch[sel - 2]));
6363             tcg_gen_ext32s_tl(arg, arg);
6364             register_name = "KScratch";
6365             break;
6366         default:
6367             goto cp0_unimplemented;
6368         }
6369         break;
6370     default:
6371        goto cp0_unimplemented;
6372     }
6373     trace_mips_translate_c0("mfc0", register_name, reg, sel);
6374     return;
6375 
6376 cp0_unimplemented:
6377     qemu_log_mask(LOG_UNIMP, "mfc0 %s (reg %d sel %d)\n",
6378                   register_name, reg, sel);
6379     gen_mfc0_unimplemented(ctx, arg);
6380 }
6381 
6382 static void gen_mtc0(DisasContext *ctx, TCGv arg, int reg, int sel)
6383 {
6384     const char *register_name = "invalid";
6385 
6386     if (sel != 0) {
6387         check_insn(ctx, ISA_MIPS_R1);
6388     }
6389 
6390     if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
6391         gen_io_start();
6392     }
6393 
6394     switch (reg) {
6395     case CP0_REGISTER_00:
6396         switch (sel) {
6397         case CP0_REG00__INDEX:
6398             gen_helper_mtc0_index(cpu_env, arg);
6399             register_name = "Index";
6400             break;
6401         case CP0_REG00__MVPCONTROL:
6402             CP0_CHECK(ctx->insn_flags & ASE_MT);
6403             gen_helper_mtc0_mvpcontrol(cpu_env, arg);
6404             register_name = "MVPControl";
6405             break;
6406         case CP0_REG00__MVPCONF0:
6407             CP0_CHECK(ctx->insn_flags & ASE_MT);
6408             /* ignored */
6409             register_name = "MVPConf0";
6410             break;
6411         case CP0_REG00__MVPCONF1:
6412             CP0_CHECK(ctx->insn_flags & ASE_MT);
6413             /* ignored */
6414             register_name = "MVPConf1";
6415             break;
6416         case CP0_REG00__VPCONTROL:
6417             CP0_CHECK(ctx->vp);
6418             /* ignored */
6419             register_name = "VPControl";
6420             break;
6421         default:
6422             goto cp0_unimplemented;
6423         }
6424         break;
6425     case CP0_REGISTER_01:
6426         switch (sel) {
6427         case CP0_REG01__RANDOM:
6428             /* ignored */
6429             register_name = "Random";
6430             break;
6431         case CP0_REG01__VPECONTROL:
6432             CP0_CHECK(ctx->insn_flags & ASE_MT);
6433             gen_helper_mtc0_vpecontrol(cpu_env, arg);
6434             register_name = "VPEControl";
6435             break;
6436         case CP0_REG01__VPECONF0:
6437             CP0_CHECK(ctx->insn_flags & ASE_MT);
6438             gen_helper_mtc0_vpeconf0(cpu_env, arg);
6439             register_name = "VPEConf0";
6440             break;
6441         case CP0_REG01__VPECONF1:
6442             CP0_CHECK(ctx->insn_flags & ASE_MT);
6443             gen_helper_mtc0_vpeconf1(cpu_env, arg);
6444             register_name = "VPEConf1";
6445             break;
6446         case CP0_REG01__YQMASK:
6447             CP0_CHECK(ctx->insn_flags & ASE_MT);
6448             gen_helper_mtc0_yqmask(cpu_env, arg);
6449             register_name = "YQMask";
6450             break;
6451         case CP0_REG01__VPESCHEDULE:
6452             CP0_CHECK(ctx->insn_flags & ASE_MT);
6453             tcg_gen_st_tl(arg, cpu_env,
6454                           offsetof(CPUMIPSState, CP0_VPESchedule));
6455             register_name = "VPESchedule";
6456             break;
6457         case CP0_REG01__VPESCHEFBACK:
6458             CP0_CHECK(ctx->insn_flags & ASE_MT);
6459             tcg_gen_st_tl(arg, cpu_env,
6460                           offsetof(CPUMIPSState, CP0_VPEScheFBack));
6461             register_name = "VPEScheFBack";
6462             break;
6463         case CP0_REG01__VPEOPT:
6464             CP0_CHECK(ctx->insn_flags & ASE_MT);
6465             gen_helper_mtc0_vpeopt(cpu_env, arg);
6466             register_name = "VPEOpt";
6467             break;
6468         default:
6469             goto cp0_unimplemented;
6470         }
6471         break;
6472     case CP0_REGISTER_02:
6473         switch (sel) {
6474         case CP0_REG02__ENTRYLO0:
6475             gen_helper_mtc0_entrylo0(cpu_env, arg);
6476             register_name = "EntryLo0";
6477             break;
6478         case CP0_REG02__TCSTATUS:
6479             CP0_CHECK(ctx->insn_flags & ASE_MT);
6480             gen_helper_mtc0_tcstatus(cpu_env, arg);
6481             register_name = "TCStatus";
6482             break;
6483         case CP0_REG02__TCBIND:
6484             CP0_CHECK(ctx->insn_flags & ASE_MT);
6485             gen_helper_mtc0_tcbind(cpu_env, arg);
6486             register_name = "TCBind";
6487             break;
6488         case CP0_REG02__TCRESTART:
6489             CP0_CHECK(ctx->insn_flags & ASE_MT);
6490             gen_helper_mtc0_tcrestart(cpu_env, arg);
6491             register_name = "TCRestart";
6492             break;
6493         case CP0_REG02__TCHALT:
6494             CP0_CHECK(ctx->insn_flags & ASE_MT);
6495             gen_helper_mtc0_tchalt(cpu_env, arg);
6496             register_name = "TCHalt";
6497             break;
6498         case CP0_REG02__TCCONTEXT:
6499             CP0_CHECK(ctx->insn_flags & ASE_MT);
6500             gen_helper_mtc0_tccontext(cpu_env, arg);
6501             register_name = "TCContext";
6502             break;
6503         case CP0_REG02__TCSCHEDULE:
6504             CP0_CHECK(ctx->insn_flags & ASE_MT);
6505             gen_helper_mtc0_tcschedule(cpu_env, arg);
6506             register_name = "TCSchedule";
6507             break;
6508         case CP0_REG02__TCSCHEFBACK:
6509             CP0_CHECK(ctx->insn_flags & ASE_MT);
6510             gen_helper_mtc0_tcschefback(cpu_env, arg);
6511             register_name = "TCScheFBack";
6512             break;
6513         default:
6514             goto cp0_unimplemented;
6515         }
6516         break;
6517     case CP0_REGISTER_03:
6518         switch (sel) {
6519         case CP0_REG03__ENTRYLO1:
6520             gen_helper_mtc0_entrylo1(cpu_env, arg);
6521             register_name = "EntryLo1";
6522             break;
6523         case CP0_REG03__GLOBALNUM:
6524             CP0_CHECK(ctx->vp);
6525             /* ignored */
6526             register_name = "GlobalNumber";
6527             break;
6528         default:
6529             goto cp0_unimplemented;
6530         }
6531         break;
6532     case CP0_REGISTER_04:
6533         switch (sel) {
6534         case CP0_REG04__CONTEXT:
6535             gen_helper_mtc0_context(cpu_env, arg);
6536             register_name = "Context";
6537             break;
6538         case CP0_REG04__CONTEXTCONFIG:
6539             /* SmartMIPS ASE */
6540             /* gen_helper_mtc0_contextconfig(arg); */
6541             register_name = "ContextConfig";
6542             goto cp0_unimplemented;
6543         case CP0_REG04__USERLOCAL:
6544             CP0_CHECK(ctx->ulri);
6545             tcg_gen_st_tl(arg, cpu_env,
6546                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
6547             register_name = "UserLocal";
6548             break;
6549         case CP0_REG04__MMID:
6550             CP0_CHECK(ctx->mi);
6551             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_MemoryMapID));
6552             register_name = "MMID";
6553             break;
6554         default:
6555             goto cp0_unimplemented;
6556         }
6557         break;
6558     case CP0_REGISTER_05:
6559         switch (sel) {
6560         case CP0_REG05__PAGEMASK:
6561             gen_helper_mtc0_pagemask(cpu_env, arg);
6562             register_name = "PageMask";
6563             break;
6564         case CP0_REG05__PAGEGRAIN:
6565             check_insn(ctx, ISA_MIPS_R2);
6566             gen_helper_mtc0_pagegrain(cpu_env, arg);
6567             register_name = "PageGrain";
6568             ctx->base.is_jmp = DISAS_STOP;
6569             break;
6570         case CP0_REG05__SEGCTL0:
6571             CP0_CHECK(ctx->sc);
6572             gen_helper_mtc0_segctl0(cpu_env, arg);
6573             register_name = "SegCtl0";
6574             break;
6575         case CP0_REG05__SEGCTL1:
6576             CP0_CHECK(ctx->sc);
6577             gen_helper_mtc0_segctl1(cpu_env, arg);
6578             register_name = "SegCtl1";
6579             break;
6580         case CP0_REG05__SEGCTL2:
6581             CP0_CHECK(ctx->sc);
6582             gen_helper_mtc0_segctl2(cpu_env, arg);
6583             register_name = "SegCtl2";
6584             break;
6585         case CP0_REG05__PWBASE:
6586             check_pw(ctx);
6587             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_PWBase));
6588             register_name = "PWBase";
6589             break;
6590         case CP0_REG05__PWFIELD:
6591             check_pw(ctx);
6592             gen_helper_mtc0_pwfield(cpu_env, arg);
6593             register_name = "PWField";
6594             break;
6595         case CP0_REG05__PWSIZE:
6596             check_pw(ctx);
6597             gen_helper_mtc0_pwsize(cpu_env, arg);
6598             register_name = "PWSize";
6599             break;
6600         default:
6601             goto cp0_unimplemented;
6602         }
6603         break;
6604     case CP0_REGISTER_06:
6605         switch (sel) {
6606         case CP0_REG06__WIRED:
6607             gen_helper_mtc0_wired(cpu_env, arg);
6608             register_name = "Wired";
6609             break;
6610         case CP0_REG06__SRSCONF0:
6611             check_insn(ctx, ISA_MIPS_R2);
6612             gen_helper_mtc0_srsconf0(cpu_env, arg);
6613             register_name = "SRSConf0";
6614             break;
6615         case CP0_REG06__SRSCONF1:
6616             check_insn(ctx, ISA_MIPS_R2);
6617             gen_helper_mtc0_srsconf1(cpu_env, arg);
6618             register_name = "SRSConf1";
6619             break;
6620         case CP0_REG06__SRSCONF2:
6621             check_insn(ctx, ISA_MIPS_R2);
6622             gen_helper_mtc0_srsconf2(cpu_env, arg);
6623             register_name = "SRSConf2";
6624             break;
6625         case CP0_REG06__SRSCONF3:
6626             check_insn(ctx, ISA_MIPS_R2);
6627             gen_helper_mtc0_srsconf3(cpu_env, arg);
6628             register_name = "SRSConf3";
6629             break;
6630         case CP0_REG06__SRSCONF4:
6631             check_insn(ctx, ISA_MIPS_R2);
6632             gen_helper_mtc0_srsconf4(cpu_env, arg);
6633             register_name = "SRSConf4";
6634             break;
6635         case CP0_REG06__PWCTL:
6636             check_pw(ctx);
6637             gen_helper_mtc0_pwctl(cpu_env, arg);
6638             register_name = "PWCtl";
6639             break;
6640         default:
6641             goto cp0_unimplemented;
6642         }
6643         break;
6644     case CP0_REGISTER_07:
6645         switch (sel) {
6646         case CP0_REG07__HWRENA:
6647             check_insn(ctx, ISA_MIPS_R2);
6648             gen_helper_mtc0_hwrena(cpu_env, arg);
6649             ctx->base.is_jmp = DISAS_STOP;
6650             register_name = "HWREna";
6651             break;
6652         default:
6653             goto cp0_unimplemented;
6654         }
6655         break;
6656     case CP0_REGISTER_08:
6657         switch (sel) {
6658         case CP0_REG08__BADVADDR:
6659             /* ignored */
6660             register_name = "BadVAddr";
6661             break;
6662         case CP0_REG08__BADINSTR:
6663             /* ignored */
6664             register_name = "BadInstr";
6665             break;
6666         case CP0_REG08__BADINSTRP:
6667             /* ignored */
6668             register_name = "BadInstrP";
6669             break;
6670         case CP0_REG08__BADINSTRX:
6671             /* ignored */
6672             register_name = "BadInstrX";
6673             break;
6674         default:
6675             goto cp0_unimplemented;
6676         }
6677         break;
6678     case CP0_REGISTER_09:
6679         switch (sel) {
6680         case CP0_REG09__COUNT:
6681             gen_helper_mtc0_count(cpu_env, arg);
6682             register_name = "Count";
6683             break;
6684         case CP0_REG09__SAARI:
6685             CP0_CHECK(ctx->saar);
6686             gen_helper_mtc0_saari(cpu_env, arg);
6687             register_name = "SAARI";
6688             break;
6689         case CP0_REG09__SAAR:
6690             CP0_CHECK(ctx->saar);
6691             gen_helper_mtc0_saar(cpu_env, arg);
6692             register_name = "SAAR";
6693             break;
6694         default:
6695             goto cp0_unimplemented;
6696         }
6697         break;
6698     case CP0_REGISTER_10:
6699         switch (sel) {
6700         case CP0_REG10__ENTRYHI:
6701             gen_helper_mtc0_entryhi(cpu_env, arg);
6702             register_name = "EntryHi";
6703             break;
6704         default:
6705             goto cp0_unimplemented;
6706         }
6707         break;
6708     case CP0_REGISTER_11:
6709         switch (sel) {
6710         case CP0_REG11__COMPARE:
6711             gen_helper_mtc0_compare(cpu_env, arg);
6712             register_name = "Compare";
6713             break;
6714         /* 6,7 are implementation dependent */
6715         default:
6716             goto cp0_unimplemented;
6717         }
6718         break;
6719     case CP0_REGISTER_12:
6720         switch (sel) {
6721         case CP0_REG12__STATUS:
6722             save_cpu_state(ctx, 1);
6723             gen_helper_mtc0_status(cpu_env, arg);
6724             /* DISAS_STOP isn't good enough here, hflags may have changed. */
6725             gen_save_pc(ctx->base.pc_next + 4);
6726             ctx->base.is_jmp = DISAS_EXIT;
6727             register_name = "Status";
6728             break;
6729         case CP0_REG12__INTCTL:
6730             check_insn(ctx, ISA_MIPS_R2);
6731             gen_helper_mtc0_intctl(cpu_env, arg);
6732             /* Stop translation as we may have switched the execution mode */
6733             ctx->base.is_jmp = DISAS_STOP;
6734             register_name = "IntCtl";
6735             break;
6736         case CP0_REG12__SRSCTL:
6737             check_insn(ctx, ISA_MIPS_R2);
6738             gen_helper_mtc0_srsctl(cpu_env, arg);
6739             /* Stop translation as we may have switched the execution mode */
6740             ctx->base.is_jmp = DISAS_STOP;
6741             register_name = "SRSCtl";
6742             break;
6743         case CP0_REG12__SRSMAP:
6744             check_insn(ctx, ISA_MIPS_R2);
6745             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
6746             /* Stop translation as we may have switched the execution mode */
6747             ctx->base.is_jmp = DISAS_STOP;
6748             register_name = "SRSMap";
6749             break;
6750         default:
6751             goto cp0_unimplemented;
6752         }
6753         break;
6754     case CP0_REGISTER_13:
6755         switch (sel) {
6756         case CP0_REG13__CAUSE:
6757             save_cpu_state(ctx, 1);
6758             gen_helper_mtc0_cause(cpu_env, arg);
6759             /*
6760              * Stop translation as we may have triggered an interrupt.
6761              * DISAS_STOP isn't sufficient, we need to ensure we break out of
6762              * translated code to check for pending interrupts.
6763              */
6764             gen_save_pc(ctx->base.pc_next + 4);
6765             ctx->base.is_jmp = DISAS_EXIT;
6766             register_name = "Cause";
6767             break;
6768         default:
6769             goto cp0_unimplemented;
6770         }
6771         break;
6772     case CP0_REGISTER_14:
6773         switch (sel) {
6774         case CP0_REG14__EPC:
6775             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
6776             register_name = "EPC";
6777             break;
6778         default:
6779             goto cp0_unimplemented;
6780         }
6781         break;
6782     case CP0_REGISTER_15:
6783         switch (sel) {
6784         case CP0_REG15__PRID:
6785             /* ignored */
6786             register_name = "PRid";
6787             break;
6788         case CP0_REG15__EBASE:
6789             check_insn(ctx, ISA_MIPS_R2);
6790             gen_helper_mtc0_ebase(cpu_env, arg);
6791             register_name = "EBase";
6792             break;
6793         default:
6794             goto cp0_unimplemented;
6795         }
6796         break;
6797     case CP0_REGISTER_16:
6798         switch (sel) {
6799         case CP0_REG16__CONFIG:
6800             gen_helper_mtc0_config0(cpu_env, arg);
6801             register_name = "Config";
6802             /* Stop translation as we may have switched the execution mode */
6803             ctx->base.is_jmp = DISAS_STOP;
6804             break;
6805         case CP0_REG16__CONFIG1:
6806             /* ignored, read only */
6807             register_name = "Config1";
6808             break;
6809         case CP0_REG16__CONFIG2:
6810             gen_helper_mtc0_config2(cpu_env, arg);
6811             register_name = "Config2";
6812             /* Stop translation as we may have switched the execution mode */
6813             ctx->base.is_jmp = DISAS_STOP;
6814             break;
6815         case CP0_REG16__CONFIG3:
6816             gen_helper_mtc0_config3(cpu_env, arg);
6817             register_name = "Config3";
6818             /* Stop translation as we may have switched the execution mode */
6819             ctx->base.is_jmp = DISAS_STOP;
6820             break;
6821         case CP0_REG16__CONFIG4:
6822             gen_helper_mtc0_config4(cpu_env, arg);
6823             register_name = "Config4";
6824             ctx->base.is_jmp = DISAS_STOP;
6825             break;
6826         case CP0_REG16__CONFIG5:
6827             gen_helper_mtc0_config5(cpu_env, arg);
6828             register_name = "Config5";
6829             /* Stop translation as we may have switched the execution mode */
6830             ctx->base.is_jmp = DISAS_STOP;
6831             break;
6832         /* 6,7 are implementation dependent */
6833         case CP0_REG16__CONFIG6:
6834             /* ignored */
6835             register_name = "Config6";
6836             break;
6837         case CP0_REG16__CONFIG7:
6838             /* ignored */
6839             register_name = "Config7";
6840             break;
6841         default:
6842             register_name = "Invalid config selector";
6843             goto cp0_unimplemented;
6844         }
6845         break;
6846     case CP0_REGISTER_17:
6847         switch (sel) {
6848         case CP0_REG17__LLADDR:
6849             gen_helper_mtc0_lladdr(cpu_env, arg);
6850             register_name = "LLAddr";
6851             break;
6852         case CP0_REG17__MAAR:
6853             CP0_CHECK(ctx->mrp);
6854             gen_helper_mtc0_maar(cpu_env, arg);
6855             register_name = "MAAR";
6856             break;
6857         case CP0_REG17__MAARI:
6858             CP0_CHECK(ctx->mrp);
6859             gen_helper_mtc0_maari(cpu_env, arg);
6860             register_name = "MAARI";
6861             break;
6862         default:
6863             goto cp0_unimplemented;
6864         }
6865         break;
6866     case CP0_REGISTER_18:
6867         switch (sel) {
6868         case CP0_REG18__WATCHLO0:
6869         case CP0_REG18__WATCHLO1:
6870         case CP0_REG18__WATCHLO2:
6871         case CP0_REG18__WATCHLO3:
6872         case CP0_REG18__WATCHLO4:
6873         case CP0_REG18__WATCHLO5:
6874         case CP0_REG18__WATCHLO6:
6875         case CP0_REG18__WATCHLO7:
6876             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
6877             gen_helper_0e1i(mtc0_watchlo, arg, sel);
6878             register_name = "WatchLo";
6879             break;
6880         default:
6881             goto cp0_unimplemented;
6882         }
6883         break;
6884     case CP0_REGISTER_19:
6885         switch (sel) {
6886         case CP0_REG19__WATCHHI0:
6887         case CP0_REG19__WATCHHI1:
6888         case CP0_REG19__WATCHHI2:
6889         case CP0_REG19__WATCHHI3:
6890         case CP0_REG19__WATCHHI4:
6891         case CP0_REG19__WATCHHI5:
6892         case CP0_REG19__WATCHHI6:
6893         case CP0_REG19__WATCHHI7:
6894             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
6895             gen_helper_0e1i(mtc0_watchhi, arg, sel);
6896             register_name = "WatchHi";
6897             break;
6898         default:
6899             goto cp0_unimplemented;
6900         }
6901         break;
6902     case CP0_REGISTER_20:
6903         switch (sel) {
6904         case CP0_REG20__XCONTEXT:
6905 #if defined(TARGET_MIPS64)
6906             check_insn(ctx, ISA_MIPS3);
6907             gen_helper_mtc0_xcontext(cpu_env, arg);
6908             register_name = "XContext";
6909             break;
6910 #endif
6911         default:
6912             goto cp0_unimplemented;
6913         }
6914         break;
6915     case CP0_REGISTER_21:
6916        /* Officially reserved, but sel 0 is used for R1x000 framemask */
6917         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS_R6));
6918         switch (sel) {
6919         case 0:
6920             gen_helper_mtc0_framemask(cpu_env, arg);
6921             register_name = "Framemask";
6922             break;
6923         default:
6924             goto cp0_unimplemented;
6925         }
6926         break;
6927     case CP0_REGISTER_22:
6928         /* ignored */
6929         register_name = "Diagnostic"; /* implementation dependent */
6930         break;
6931     case CP0_REGISTER_23:
6932         switch (sel) {
6933         case CP0_REG23__DEBUG:
6934             gen_helper_mtc0_debug(cpu_env, arg); /* EJTAG support */
6935             /* DISAS_STOP isn't good enough here, hflags may have changed. */
6936             gen_save_pc(ctx->base.pc_next + 4);
6937             ctx->base.is_jmp = DISAS_EXIT;
6938             register_name = "Debug";
6939             break;
6940         case CP0_REG23__TRACECONTROL:
6941             /* PDtrace support */
6942             /* gen_helper_mtc0_tracecontrol(cpu_env, arg);  */
6943             register_name = "TraceControl";
6944             /* Stop translation as we may have switched the execution mode */
6945             ctx->base.is_jmp = DISAS_STOP;
6946             goto cp0_unimplemented;
6947         case CP0_REG23__TRACECONTROL2:
6948             /* PDtrace support */
6949             /* gen_helper_mtc0_tracecontrol2(cpu_env, arg); */
6950             register_name = "TraceControl2";
6951             /* Stop translation as we may have switched the execution mode */
6952             ctx->base.is_jmp = DISAS_STOP;
6953             goto cp0_unimplemented;
6954         case CP0_REG23__USERTRACEDATA1:
6955             /* Stop translation as we may have switched the execution mode */
6956             ctx->base.is_jmp = DISAS_STOP;
6957             /* PDtrace support */
6958             /* gen_helper_mtc0_usertracedata1(cpu_env, arg);*/
6959             register_name = "UserTraceData";
6960             /* Stop translation as we may have switched the execution mode */
6961             ctx->base.is_jmp = DISAS_STOP;
6962             goto cp0_unimplemented;
6963         case CP0_REG23__TRACEIBPC:
6964             /* PDtrace support */
6965             /* gen_helper_mtc0_traceibpc(cpu_env, arg);     */
6966             /* Stop translation as we may have switched the execution mode */
6967             ctx->base.is_jmp = DISAS_STOP;
6968             register_name = "TraceIBPC";
6969             goto cp0_unimplemented;
6970         case CP0_REG23__TRACEDBPC:
6971             /* PDtrace support */
6972             /* gen_helper_mtc0_tracedbpc(cpu_env, arg);     */
6973             /* Stop translation as we may have switched the execution mode */
6974             ctx->base.is_jmp = DISAS_STOP;
6975             register_name = "TraceDBPC";
6976             goto cp0_unimplemented;
6977         default:
6978             goto cp0_unimplemented;
6979         }
6980         break;
6981     case CP0_REGISTER_24:
6982         switch (sel) {
6983         case CP0_REG24__DEPC:
6984             /* EJTAG support */
6985             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
6986             register_name = "DEPC";
6987             break;
6988         default:
6989             goto cp0_unimplemented;
6990         }
6991         break;
6992     case CP0_REGISTER_25:
6993         switch (sel) {
6994         case CP0_REG25__PERFCTL0:
6995             gen_helper_mtc0_performance0(cpu_env, arg);
6996             register_name = "Performance0";
6997             break;
6998         case CP0_REG25__PERFCNT0:
6999             /* gen_helper_mtc0_performance1(arg); */
7000             register_name = "Performance1";
7001             goto cp0_unimplemented;
7002         case CP0_REG25__PERFCTL1:
7003             /* gen_helper_mtc0_performance2(arg); */
7004             register_name = "Performance2";
7005             goto cp0_unimplemented;
7006         case CP0_REG25__PERFCNT1:
7007             /* gen_helper_mtc0_performance3(arg); */
7008             register_name = "Performance3";
7009             goto cp0_unimplemented;
7010         case CP0_REG25__PERFCTL2:
7011             /* gen_helper_mtc0_performance4(arg); */
7012             register_name = "Performance4";
7013             goto cp0_unimplemented;
7014         case CP0_REG25__PERFCNT2:
7015             /* gen_helper_mtc0_performance5(arg); */
7016             register_name = "Performance5";
7017             goto cp0_unimplemented;
7018         case CP0_REG25__PERFCTL3:
7019             /* gen_helper_mtc0_performance6(arg); */
7020             register_name = "Performance6";
7021             goto cp0_unimplemented;
7022         case CP0_REG25__PERFCNT3:
7023             /* gen_helper_mtc0_performance7(arg); */
7024             register_name = "Performance7";
7025             goto cp0_unimplemented;
7026         default:
7027             goto cp0_unimplemented;
7028         }
7029        break;
7030     case CP0_REGISTER_26:
7031         switch (sel) {
7032         case CP0_REG26__ERRCTL:
7033             gen_helper_mtc0_errctl(cpu_env, arg);
7034             ctx->base.is_jmp = DISAS_STOP;
7035             register_name = "ErrCtl";
7036             break;
7037         default:
7038             goto cp0_unimplemented;
7039         }
7040         break;
7041     case CP0_REGISTER_27:
7042         switch (sel) {
7043         case CP0_REG27__CACHERR:
7044             /* ignored */
7045             register_name = "CacheErr";
7046             break;
7047         default:
7048             goto cp0_unimplemented;
7049         }
7050        break;
7051     case CP0_REGISTER_28:
7052         switch (sel) {
7053         case CP0_REG28__TAGLO:
7054         case CP0_REG28__TAGLO1:
7055         case CP0_REG28__TAGLO2:
7056         case CP0_REG28__TAGLO3:
7057             gen_helper_mtc0_taglo(cpu_env, arg);
7058             register_name = "TagLo";
7059             break;
7060         case CP0_REG28__DATALO:
7061         case CP0_REG28__DATALO1:
7062         case CP0_REG28__DATALO2:
7063         case CP0_REG28__DATALO3:
7064             gen_helper_mtc0_datalo(cpu_env, arg);
7065             register_name = "DataLo";
7066             break;
7067         default:
7068             goto cp0_unimplemented;
7069         }
7070         break;
7071     case CP0_REGISTER_29:
7072         switch (sel) {
7073         case CP0_REG29__TAGHI:
7074         case CP0_REG29__TAGHI1:
7075         case CP0_REG29__TAGHI2:
7076         case CP0_REG29__TAGHI3:
7077             gen_helper_mtc0_taghi(cpu_env, arg);
7078             register_name = "TagHi";
7079             break;
7080         case CP0_REG29__DATAHI:
7081         case CP0_REG29__DATAHI1:
7082         case CP0_REG29__DATAHI2:
7083         case CP0_REG29__DATAHI3:
7084             gen_helper_mtc0_datahi(cpu_env, arg);
7085             register_name = "DataHi";
7086             break;
7087         default:
7088             register_name = "invalid sel";
7089             goto cp0_unimplemented;
7090         }
7091        break;
7092     case CP0_REGISTER_30:
7093         switch (sel) {
7094         case CP0_REG30__ERROREPC:
7095             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
7096             register_name = "ErrorEPC";
7097             break;
7098         default:
7099             goto cp0_unimplemented;
7100         }
7101         break;
7102     case CP0_REGISTER_31:
7103         switch (sel) {
7104         case CP0_REG31__DESAVE:
7105             /* EJTAG support */
7106             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
7107             register_name = "DESAVE";
7108             break;
7109         case CP0_REG31__KSCRATCH1:
7110         case CP0_REG31__KSCRATCH2:
7111         case CP0_REG31__KSCRATCH3:
7112         case CP0_REG31__KSCRATCH4:
7113         case CP0_REG31__KSCRATCH5:
7114         case CP0_REG31__KSCRATCH6:
7115             CP0_CHECK(ctx->kscrexist & (1 << sel));
7116             tcg_gen_st_tl(arg, cpu_env,
7117                           offsetof(CPUMIPSState, CP0_KScratch[sel - 2]));
7118             register_name = "KScratch";
7119             break;
7120         default:
7121             goto cp0_unimplemented;
7122         }
7123         break;
7124     default:
7125        goto cp0_unimplemented;
7126     }
7127     trace_mips_translate_c0("mtc0", register_name, reg, sel);
7128 
7129     /* For simplicity assume that all writes can cause interrupts.  */
7130     if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
7131         /*
7132          * DISAS_STOP isn't sufficient, we need to ensure we break out of
7133          * translated code to check for pending interrupts.
7134          */
7135         gen_save_pc(ctx->base.pc_next + 4);
7136         ctx->base.is_jmp = DISAS_EXIT;
7137     }
7138     return;
7139 
7140 cp0_unimplemented:
7141     qemu_log_mask(LOG_UNIMP, "mtc0 %s (reg %d sel %d)\n",
7142                   register_name, reg, sel);
7143 }
7144 
7145 #if defined(TARGET_MIPS64)
7146 static void gen_dmfc0(DisasContext *ctx, TCGv arg, int reg, int sel)
7147 {
7148     const char *register_name = "invalid";
7149 
7150     if (sel != 0) {
7151         check_insn(ctx, ISA_MIPS_R1);
7152     }
7153 
7154     switch (reg) {
7155     case CP0_REGISTER_00:
7156         switch (sel) {
7157         case CP0_REG00__INDEX:
7158             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Index));
7159             register_name = "Index";
7160             break;
7161         case CP0_REG00__MVPCONTROL:
7162             CP0_CHECK(ctx->insn_flags & ASE_MT);
7163             gen_helper_mfc0_mvpcontrol(arg, cpu_env);
7164             register_name = "MVPControl";
7165             break;
7166         case CP0_REG00__MVPCONF0:
7167             CP0_CHECK(ctx->insn_flags & ASE_MT);
7168             gen_helper_mfc0_mvpconf0(arg, cpu_env);
7169             register_name = "MVPConf0";
7170             break;
7171         case CP0_REG00__MVPCONF1:
7172             CP0_CHECK(ctx->insn_flags & ASE_MT);
7173             gen_helper_mfc0_mvpconf1(arg, cpu_env);
7174             register_name = "MVPConf1";
7175             break;
7176         case CP0_REG00__VPCONTROL:
7177             CP0_CHECK(ctx->vp);
7178             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPControl));
7179             register_name = "VPControl";
7180             break;
7181         default:
7182             goto cp0_unimplemented;
7183         }
7184         break;
7185     case CP0_REGISTER_01:
7186         switch (sel) {
7187         case CP0_REG01__RANDOM:
7188             CP0_CHECK(!(ctx->insn_flags & ISA_MIPS_R6));
7189             gen_helper_mfc0_random(arg, cpu_env);
7190             register_name = "Random";
7191             break;
7192         case CP0_REG01__VPECONTROL:
7193             CP0_CHECK(ctx->insn_flags & ASE_MT);
7194             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEControl));
7195             register_name = "VPEControl";
7196             break;
7197         case CP0_REG01__VPECONF0:
7198             CP0_CHECK(ctx->insn_flags & ASE_MT);
7199             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf0));
7200             register_name = "VPEConf0";
7201             break;
7202         case CP0_REG01__VPECONF1:
7203             CP0_CHECK(ctx->insn_flags & ASE_MT);
7204             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf1));
7205             register_name = "VPEConf1";
7206             break;
7207         case CP0_REG01__YQMASK:
7208             CP0_CHECK(ctx->insn_flags & ASE_MT);
7209             tcg_gen_ld_tl(arg, cpu_env,
7210                           offsetof(CPUMIPSState, CP0_YQMask));
7211             register_name = "YQMask";
7212             break;
7213         case CP0_REG01__VPESCHEDULE:
7214             CP0_CHECK(ctx->insn_flags & ASE_MT);
7215             tcg_gen_ld_tl(arg, cpu_env,
7216                           offsetof(CPUMIPSState, CP0_VPESchedule));
7217             register_name = "VPESchedule";
7218             break;
7219         case CP0_REG01__VPESCHEFBACK:
7220             CP0_CHECK(ctx->insn_flags & ASE_MT);
7221             tcg_gen_ld_tl(arg, cpu_env,
7222                           offsetof(CPUMIPSState, CP0_VPEScheFBack));
7223             register_name = "VPEScheFBack";
7224             break;
7225         case CP0_REG01__VPEOPT:
7226             CP0_CHECK(ctx->insn_flags & ASE_MT);
7227             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEOpt));
7228             register_name = "VPEOpt";
7229             break;
7230         default:
7231             goto cp0_unimplemented;
7232         }
7233         break;
7234     case CP0_REGISTER_02:
7235         switch (sel) {
7236         case CP0_REG02__ENTRYLO0:
7237             tcg_gen_ld_tl(arg, cpu_env,
7238                           offsetof(CPUMIPSState, CP0_EntryLo0));
7239             register_name = "EntryLo0";
7240             break;
7241         case CP0_REG02__TCSTATUS:
7242             CP0_CHECK(ctx->insn_flags & ASE_MT);
7243             gen_helper_mfc0_tcstatus(arg, cpu_env);
7244             register_name = "TCStatus";
7245             break;
7246         case CP0_REG02__TCBIND:
7247             CP0_CHECK(ctx->insn_flags & ASE_MT);
7248             gen_helper_mfc0_tcbind(arg, cpu_env);
7249             register_name = "TCBind";
7250             break;
7251         case CP0_REG02__TCRESTART:
7252             CP0_CHECK(ctx->insn_flags & ASE_MT);
7253             gen_helper_dmfc0_tcrestart(arg, cpu_env);
7254             register_name = "TCRestart";
7255             break;
7256         case CP0_REG02__TCHALT:
7257             CP0_CHECK(ctx->insn_flags & ASE_MT);
7258             gen_helper_dmfc0_tchalt(arg, cpu_env);
7259             register_name = "TCHalt";
7260             break;
7261         case CP0_REG02__TCCONTEXT:
7262             CP0_CHECK(ctx->insn_flags & ASE_MT);
7263             gen_helper_dmfc0_tccontext(arg, cpu_env);
7264             register_name = "TCContext";
7265             break;
7266         case CP0_REG02__TCSCHEDULE:
7267             CP0_CHECK(ctx->insn_flags & ASE_MT);
7268             gen_helper_dmfc0_tcschedule(arg, cpu_env);
7269             register_name = "TCSchedule";
7270             break;
7271         case CP0_REG02__TCSCHEFBACK:
7272             CP0_CHECK(ctx->insn_flags & ASE_MT);
7273             gen_helper_dmfc0_tcschefback(arg, cpu_env);
7274             register_name = "TCScheFBack";
7275             break;
7276         default:
7277             goto cp0_unimplemented;
7278         }
7279         break;
7280     case CP0_REGISTER_03:
7281         switch (sel) {
7282         case CP0_REG03__ENTRYLO1:
7283             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryLo1));
7284             register_name = "EntryLo1";
7285             break;
7286         case CP0_REG03__GLOBALNUM:
7287             CP0_CHECK(ctx->vp);
7288             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_GlobalNumber));
7289             register_name = "GlobalNumber";
7290             break;
7291         default:
7292             goto cp0_unimplemented;
7293         }
7294         break;
7295     case CP0_REGISTER_04:
7296         switch (sel) {
7297         case CP0_REG04__CONTEXT:
7298             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_Context));
7299             register_name = "Context";
7300             break;
7301         case CP0_REG04__CONTEXTCONFIG:
7302             /* SmartMIPS ASE */
7303             /* gen_helper_dmfc0_contextconfig(arg); */
7304             register_name = "ContextConfig";
7305             goto cp0_unimplemented;
7306         case CP0_REG04__USERLOCAL:
7307             CP0_CHECK(ctx->ulri);
7308             tcg_gen_ld_tl(arg, cpu_env,
7309                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
7310             register_name = "UserLocal";
7311             break;
7312         case CP0_REG04__MMID:
7313             CP0_CHECK(ctx->mi);
7314             gen_helper_mtc0_memorymapid(cpu_env, arg);
7315             register_name = "MMID";
7316             break;
7317         default:
7318             goto cp0_unimplemented;
7319         }
7320         break;
7321     case CP0_REGISTER_05:
7322         switch (sel) {
7323         case CP0_REG05__PAGEMASK:
7324             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageMask));
7325             register_name = "PageMask";
7326             break;
7327         case CP0_REG05__PAGEGRAIN:
7328             check_insn(ctx, ISA_MIPS_R2);
7329             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageGrain));
7330             register_name = "PageGrain";
7331             break;
7332         case CP0_REG05__SEGCTL0:
7333             CP0_CHECK(ctx->sc);
7334             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl0));
7335             register_name = "SegCtl0";
7336             break;
7337         case CP0_REG05__SEGCTL1:
7338             CP0_CHECK(ctx->sc);
7339             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl1));
7340             register_name = "SegCtl1";
7341             break;
7342         case CP0_REG05__SEGCTL2:
7343             CP0_CHECK(ctx->sc);
7344             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl2));
7345             register_name = "SegCtl2";
7346             break;
7347         case CP0_REG05__PWBASE:
7348             check_pw(ctx);
7349             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_PWBase));
7350             register_name = "PWBase";
7351             break;
7352         case CP0_REG05__PWFIELD:
7353             check_pw(ctx);
7354             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_PWField));
7355             register_name = "PWField";
7356             break;
7357         case CP0_REG05__PWSIZE:
7358             check_pw(ctx);
7359             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_PWSize));
7360             register_name = "PWSize";
7361             break;
7362         default:
7363             goto cp0_unimplemented;
7364         }
7365         break;
7366     case CP0_REGISTER_06:
7367         switch (sel) {
7368         case CP0_REG06__WIRED:
7369             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Wired));
7370             register_name = "Wired";
7371             break;
7372         case CP0_REG06__SRSCONF0:
7373             check_insn(ctx, ISA_MIPS_R2);
7374             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf0));
7375             register_name = "SRSConf0";
7376             break;
7377         case CP0_REG06__SRSCONF1:
7378             check_insn(ctx, ISA_MIPS_R2);
7379             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf1));
7380             register_name = "SRSConf1";
7381             break;
7382         case CP0_REG06__SRSCONF2:
7383             check_insn(ctx, ISA_MIPS_R2);
7384             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf2));
7385             register_name = "SRSConf2";
7386             break;
7387         case CP0_REG06__SRSCONF3:
7388             check_insn(ctx, ISA_MIPS_R2);
7389             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf3));
7390             register_name = "SRSConf3";
7391             break;
7392         case CP0_REG06__SRSCONF4:
7393             check_insn(ctx, ISA_MIPS_R2);
7394             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf4));
7395             register_name = "SRSConf4";
7396             break;
7397         case CP0_REG06__PWCTL:
7398             check_pw(ctx);
7399             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PWCtl));
7400             register_name = "PWCtl";
7401             break;
7402         default:
7403             goto cp0_unimplemented;
7404         }
7405         break;
7406     case CP0_REGISTER_07:
7407         switch (sel) {
7408         case CP0_REG07__HWRENA:
7409             check_insn(ctx, ISA_MIPS_R2);
7410             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_HWREna));
7411             register_name = "HWREna";
7412             break;
7413         default:
7414             goto cp0_unimplemented;
7415         }
7416         break;
7417     case CP0_REGISTER_08:
7418         switch (sel) {
7419         case CP0_REG08__BADVADDR:
7420             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));
7421             register_name = "BadVAddr";
7422             break;
7423         case CP0_REG08__BADINSTR:
7424             CP0_CHECK(ctx->bi);
7425             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstr));
7426             register_name = "BadInstr";
7427             break;
7428         case CP0_REG08__BADINSTRP:
7429             CP0_CHECK(ctx->bp);
7430             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrP));
7431             register_name = "BadInstrP";
7432             break;
7433         case CP0_REG08__BADINSTRX:
7434             CP0_CHECK(ctx->bi);
7435             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrX));
7436             tcg_gen_andi_tl(arg, arg, ~0xffff);
7437             register_name = "BadInstrX";
7438             break;
7439         default:
7440             goto cp0_unimplemented;
7441         }
7442         break;
7443     case CP0_REGISTER_09:
7444         switch (sel) {
7445         case CP0_REG09__COUNT:
7446             /* Mark as an IO operation because we read the time.  */
7447             if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
7448                 gen_io_start();
7449             }
7450             gen_helper_mfc0_count(arg, cpu_env);
7451             /*
7452              * Break the TB to be able to take timer interrupts immediately
7453              * after reading count. DISAS_STOP isn't sufficient, we need to
7454              * ensure we break completely out of translated code.
7455              */
7456             gen_save_pc(ctx->base.pc_next + 4);
7457             ctx->base.is_jmp = DISAS_EXIT;
7458             register_name = "Count";
7459             break;
7460         case CP0_REG09__SAARI:
7461             CP0_CHECK(ctx->saar);
7462             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SAARI));
7463             register_name = "SAARI";
7464             break;
7465         case CP0_REG09__SAAR:
7466             CP0_CHECK(ctx->saar);
7467             gen_helper_dmfc0_saar(arg, cpu_env);
7468             register_name = "SAAR";
7469             break;
7470         default:
7471             goto cp0_unimplemented;
7472         }
7473         break;
7474     case CP0_REGISTER_10:
7475         switch (sel) {
7476         case CP0_REG10__ENTRYHI:
7477             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryHi));
7478             register_name = "EntryHi";
7479             break;
7480         default:
7481             goto cp0_unimplemented;
7482         }
7483         break;
7484     case CP0_REGISTER_11:
7485         switch (sel) {
7486         case CP0_REG11__COMPARE:
7487             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Compare));
7488             register_name = "Compare";
7489             break;
7490         /* 6,7 are implementation dependent */
7491         default:
7492             goto cp0_unimplemented;
7493         }
7494         break;
7495     case CP0_REGISTER_12:
7496         switch (sel) {
7497         case CP0_REG12__STATUS:
7498             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Status));
7499             register_name = "Status";
7500             break;
7501         case CP0_REG12__INTCTL:
7502             check_insn(ctx, ISA_MIPS_R2);
7503             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_IntCtl));
7504             register_name = "IntCtl";
7505             break;
7506         case CP0_REG12__SRSCTL:
7507             check_insn(ctx, ISA_MIPS_R2);
7508             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSCtl));
7509             register_name = "SRSCtl";
7510             break;
7511         case CP0_REG12__SRSMAP:
7512             check_insn(ctx, ISA_MIPS_R2);
7513             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
7514             register_name = "SRSMap";
7515             break;
7516         default:
7517             goto cp0_unimplemented;
7518         }
7519         break;
7520     case CP0_REGISTER_13:
7521         switch (sel) {
7522         case CP0_REG13__CAUSE:
7523             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Cause));
7524             register_name = "Cause";
7525             break;
7526         default:
7527             goto cp0_unimplemented;
7528         }
7529         break;
7530     case CP0_REGISTER_14:
7531         switch (sel) {
7532         case CP0_REG14__EPC:
7533             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
7534             register_name = "EPC";
7535             break;
7536         default:
7537             goto cp0_unimplemented;
7538         }
7539         break;
7540     case CP0_REGISTER_15:
7541         switch (sel) {
7542         case CP0_REG15__PRID:
7543             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PRid));
7544             register_name = "PRid";
7545             break;
7546         case CP0_REG15__EBASE:
7547             check_insn(ctx, ISA_MIPS_R2);
7548             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EBase));
7549             register_name = "EBase";
7550             break;
7551         case CP0_REG15__CMGCRBASE:
7552             check_insn(ctx, ISA_MIPS_R2);
7553             CP0_CHECK(ctx->cmgcr);
7554             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_CMGCRBase));
7555             register_name = "CMGCRBase";
7556             break;
7557         default:
7558             goto cp0_unimplemented;
7559         }
7560         break;
7561     case CP0_REGISTER_16:
7562         switch (sel) {
7563         case CP0_REG16__CONFIG:
7564             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config0));
7565             register_name = "Config";
7566             break;
7567         case CP0_REG16__CONFIG1:
7568             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config1));
7569             register_name = "Config1";
7570             break;
7571         case CP0_REG16__CONFIG2:
7572             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config2));
7573             register_name = "Config2";
7574             break;
7575         case CP0_REG16__CONFIG3:
7576             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config3));
7577             register_name = "Config3";
7578             break;
7579         case CP0_REG16__CONFIG4:
7580             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config4));
7581             register_name = "Config4";
7582             break;
7583         case CP0_REG16__CONFIG5:
7584             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config5));
7585             register_name = "Config5";
7586             break;
7587         /* 6,7 are implementation dependent */
7588         case CP0_REG16__CONFIG6:
7589             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config6));
7590             register_name = "Config6";
7591             break;
7592         case CP0_REG16__CONFIG7:
7593             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config7));
7594             register_name = "Config7";
7595             break;
7596         default:
7597             goto cp0_unimplemented;
7598         }
7599         break;
7600     case CP0_REGISTER_17:
7601         switch (sel) {
7602         case CP0_REG17__LLADDR:
7603             gen_helper_dmfc0_lladdr(arg, cpu_env);
7604             register_name = "LLAddr";
7605             break;
7606         case CP0_REG17__MAAR:
7607             CP0_CHECK(ctx->mrp);
7608             gen_helper_dmfc0_maar(arg, cpu_env);
7609             register_name = "MAAR";
7610             break;
7611         case CP0_REG17__MAARI:
7612             CP0_CHECK(ctx->mrp);
7613             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_MAARI));
7614             register_name = "MAARI";
7615             break;
7616         default:
7617             goto cp0_unimplemented;
7618         }
7619         break;
7620     case CP0_REGISTER_18:
7621         switch (sel) {
7622         case CP0_REG18__WATCHLO0:
7623         case CP0_REG18__WATCHLO1:
7624         case CP0_REG18__WATCHLO2:
7625         case CP0_REG18__WATCHLO3:
7626         case CP0_REG18__WATCHLO4:
7627         case CP0_REG18__WATCHLO5:
7628         case CP0_REG18__WATCHLO6:
7629         case CP0_REG18__WATCHLO7:
7630             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
7631             gen_helper_1e0i(dmfc0_watchlo, arg, sel);
7632             register_name = "WatchLo";
7633             break;
7634         default:
7635             goto cp0_unimplemented;
7636         }
7637         break;
7638     case CP0_REGISTER_19:
7639         switch (sel) {
7640         case CP0_REG19__WATCHHI0:
7641         case CP0_REG19__WATCHHI1:
7642         case CP0_REG19__WATCHHI2:
7643         case CP0_REG19__WATCHHI3:
7644         case CP0_REG19__WATCHHI4:
7645         case CP0_REG19__WATCHHI5:
7646         case CP0_REG19__WATCHHI6:
7647         case CP0_REG19__WATCHHI7:
7648             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
7649             gen_helper_1e0i(dmfc0_watchhi, arg, sel);
7650             register_name = "WatchHi";
7651             break;
7652         default:
7653             goto cp0_unimplemented;
7654         }
7655         break;
7656     case CP0_REGISTER_20:
7657         switch (sel) {
7658         case CP0_REG20__XCONTEXT:
7659             check_insn(ctx, ISA_MIPS3);
7660             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_XContext));
7661             register_name = "XContext";
7662             break;
7663         default:
7664             goto cp0_unimplemented;
7665         }
7666         break;
7667     case CP0_REGISTER_21:
7668         /* Officially reserved, but sel 0 is used for R1x000 framemask */
7669         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS_R6));
7670         switch (sel) {
7671         case 0:
7672             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Framemask));
7673             register_name = "Framemask";
7674             break;
7675         default:
7676             goto cp0_unimplemented;
7677         }
7678         break;
7679     case CP0_REGISTER_22:
7680         tcg_gen_movi_tl(arg, 0); /* unimplemented */
7681         register_name = "'Diagnostic"; /* implementation dependent */
7682         break;
7683     case CP0_REGISTER_23:
7684         switch (sel) {
7685         case CP0_REG23__DEBUG:
7686             gen_helper_mfc0_debug(arg, cpu_env); /* EJTAG support */
7687             register_name = "Debug";
7688             break;
7689         case CP0_REG23__TRACECONTROL:
7690             /* PDtrace support */
7691             /* gen_helper_dmfc0_tracecontrol(arg, cpu_env);  */
7692             register_name = "TraceControl";
7693             goto cp0_unimplemented;
7694         case CP0_REG23__TRACECONTROL2:
7695             /* PDtrace support */
7696             /* gen_helper_dmfc0_tracecontrol2(arg, cpu_env); */
7697             register_name = "TraceControl2";
7698             goto cp0_unimplemented;
7699         case CP0_REG23__USERTRACEDATA1:
7700             /* PDtrace support */
7701             /* gen_helper_dmfc0_usertracedata1(arg, cpu_env);*/
7702             register_name = "UserTraceData1";
7703             goto cp0_unimplemented;
7704         case CP0_REG23__TRACEIBPC:
7705             /* PDtrace support */
7706             /* gen_helper_dmfc0_traceibpc(arg, cpu_env);     */
7707             register_name = "TraceIBPC";
7708             goto cp0_unimplemented;
7709         case CP0_REG23__TRACEDBPC:
7710             /* PDtrace support */
7711             /* gen_helper_dmfc0_tracedbpc(arg, cpu_env);     */
7712             register_name = "TraceDBPC";
7713             goto cp0_unimplemented;
7714         default:
7715             goto cp0_unimplemented;
7716         }
7717         break;
7718     case CP0_REGISTER_24:
7719         switch (sel) {
7720         case CP0_REG24__DEPC:
7721             /* EJTAG support */
7722             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
7723             register_name = "DEPC";
7724             break;
7725         default:
7726             goto cp0_unimplemented;
7727         }
7728         break;
7729     case CP0_REGISTER_25:
7730         switch (sel) {
7731         case CP0_REG25__PERFCTL0:
7732             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Performance0));
7733             register_name = "Performance0";
7734             break;
7735         case CP0_REG25__PERFCNT0:
7736             /* gen_helper_dmfc0_performance1(arg); */
7737             register_name = "Performance1";
7738             goto cp0_unimplemented;
7739         case CP0_REG25__PERFCTL1:
7740             /* gen_helper_dmfc0_performance2(arg); */
7741             register_name = "Performance2";
7742             goto cp0_unimplemented;
7743         case CP0_REG25__PERFCNT1:
7744             /* gen_helper_dmfc0_performance3(arg); */
7745             register_name = "Performance3";
7746             goto cp0_unimplemented;
7747         case CP0_REG25__PERFCTL2:
7748             /* gen_helper_dmfc0_performance4(arg); */
7749             register_name = "Performance4";
7750             goto cp0_unimplemented;
7751         case CP0_REG25__PERFCNT2:
7752             /* gen_helper_dmfc0_performance5(arg); */
7753             register_name = "Performance5";
7754             goto cp0_unimplemented;
7755         case CP0_REG25__PERFCTL3:
7756             /* gen_helper_dmfc0_performance6(arg); */
7757             register_name = "Performance6";
7758             goto cp0_unimplemented;
7759         case CP0_REG25__PERFCNT3:
7760             /* gen_helper_dmfc0_performance7(arg); */
7761             register_name = "Performance7";
7762             goto cp0_unimplemented;
7763         default:
7764             goto cp0_unimplemented;
7765         }
7766         break;
7767     case CP0_REGISTER_26:
7768         switch (sel) {
7769         case CP0_REG26__ERRCTL:
7770             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_ErrCtl));
7771             register_name = "ErrCtl";
7772             break;
7773         default:
7774             goto cp0_unimplemented;
7775         }
7776         break;
7777     case CP0_REGISTER_27:
7778         switch (sel) {
7779         /* ignored */
7780         case CP0_REG27__CACHERR:
7781             tcg_gen_movi_tl(arg, 0); /* unimplemented */
7782             register_name = "CacheErr";
7783             break;
7784         default:
7785             goto cp0_unimplemented;
7786         }
7787         break;
7788     case CP0_REGISTER_28:
7789         switch (sel) {
7790         case CP0_REG28__TAGLO:
7791         case CP0_REG28__TAGLO1:
7792         case CP0_REG28__TAGLO2:
7793         case CP0_REG28__TAGLO3:
7794             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagLo));
7795             register_name = "TagLo";
7796             break;
7797         case CP0_REG28__DATALO:
7798         case CP0_REG28__DATALO1:
7799         case CP0_REG28__DATALO2:
7800         case CP0_REG28__DATALO3:
7801             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataLo));
7802             register_name = "DataLo";
7803             break;
7804         default:
7805             goto cp0_unimplemented;
7806         }
7807         break;
7808     case CP0_REGISTER_29:
7809         switch (sel) {
7810         case CP0_REG29__TAGHI:
7811         case CP0_REG29__TAGHI1:
7812         case CP0_REG29__TAGHI2:
7813         case CP0_REG29__TAGHI3:
7814             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagHi));
7815             register_name = "TagHi";
7816             break;
7817         case CP0_REG29__DATAHI:
7818         case CP0_REG29__DATAHI1:
7819         case CP0_REG29__DATAHI2:
7820         case CP0_REG29__DATAHI3:
7821             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataHi));
7822             register_name = "DataHi";
7823             break;
7824         default:
7825             goto cp0_unimplemented;
7826         }
7827         break;
7828     case CP0_REGISTER_30:
7829         switch (sel) {
7830         case CP0_REG30__ERROREPC:
7831             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
7832             register_name = "ErrorEPC";
7833             break;
7834         default:
7835             goto cp0_unimplemented;
7836         }
7837         break;
7838     case CP0_REGISTER_31:
7839         switch (sel) {
7840         case CP0_REG31__DESAVE:
7841             /* EJTAG support */
7842             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
7843             register_name = "DESAVE";
7844             break;
7845         case CP0_REG31__KSCRATCH1:
7846         case CP0_REG31__KSCRATCH2:
7847         case CP0_REG31__KSCRATCH3:
7848         case CP0_REG31__KSCRATCH4:
7849         case CP0_REG31__KSCRATCH5:
7850         case CP0_REG31__KSCRATCH6:
7851             CP0_CHECK(ctx->kscrexist & (1 << sel));
7852             tcg_gen_ld_tl(arg, cpu_env,
7853                           offsetof(CPUMIPSState, CP0_KScratch[sel - 2]));
7854             register_name = "KScratch";
7855             break;
7856         default:
7857             goto cp0_unimplemented;
7858         }
7859         break;
7860     default:
7861         goto cp0_unimplemented;
7862     }
7863     trace_mips_translate_c0("dmfc0", register_name, reg, sel);
7864     return;
7865 
7866 cp0_unimplemented:
7867     qemu_log_mask(LOG_UNIMP, "dmfc0 %s (reg %d sel %d)\n",
7868                   register_name, reg, sel);
7869     gen_mfc0_unimplemented(ctx, arg);
7870 }
7871 
7872 static void gen_dmtc0(DisasContext *ctx, TCGv arg, int reg, int sel)
7873 {
7874     const char *register_name = "invalid";
7875 
7876     if (sel != 0) {
7877         check_insn(ctx, ISA_MIPS_R1);
7878     }
7879 
7880     if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
7881         gen_io_start();
7882     }
7883 
7884     switch (reg) {
7885     case CP0_REGISTER_00:
7886         switch (sel) {
7887         case CP0_REG00__INDEX:
7888             gen_helper_mtc0_index(cpu_env, arg);
7889             register_name = "Index";
7890             break;
7891         case CP0_REG00__MVPCONTROL:
7892             CP0_CHECK(ctx->insn_flags & ASE_MT);
7893             gen_helper_mtc0_mvpcontrol(cpu_env, arg);
7894             register_name = "MVPControl";
7895             break;
7896         case CP0_REG00__MVPCONF0:
7897             CP0_CHECK(ctx->insn_flags & ASE_MT);
7898             /* ignored */
7899             register_name = "MVPConf0";
7900             break;
7901         case CP0_REG00__MVPCONF1:
7902             CP0_CHECK(ctx->insn_flags & ASE_MT);
7903             /* ignored */
7904             register_name = "MVPConf1";
7905             break;
7906         case CP0_REG00__VPCONTROL:
7907             CP0_CHECK(ctx->vp);
7908             /* ignored */
7909             register_name = "VPControl";
7910             break;
7911         default:
7912             goto cp0_unimplemented;
7913         }
7914         break;
7915     case CP0_REGISTER_01:
7916         switch (sel) {
7917         case CP0_REG01__RANDOM:
7918             /* ignored */
7919             register_name = "Random";
7920             break;
7921         case CP0_REG01__VPECONTROL:
7922             CP0_CHECK(ctx->insn_flags & ASE_MT);
7923             gen_helper_mtc0_vpecontrol(cpu_env, arg);
7924             register_name = "VPEControl";
7925             break;
7926         case CP0_REG01__VPECONF0:
7927             CP0_CHECK(ctx->insn_flags & ASE_MT);
7928             gen_helper_mtc0_vpeconf0(cpu_env, arg);
7929             register_name = "VPEConf0";
7930             break;
7931         case CP0_REG01__VPECONF1:
7932             CP0_CHECK(ctx->insn_flags & ASE_MT);
7933             gen_helper_mtc0_vpeconf1(cpu_env, arg);
7934             register_name = "VPEConf1";
7935             break;
7936         case CP0_REG01__YQMASK:
7937             CP0_CHECK(ctx->insn_flags & ASE_MT);
7938             gen_helper_mtc0_yqmask(cpu_env, arg);
7939             register_name = "YQMask";
7940             break;
7941         case CP0_REG01__VPESCHEDULE:
7942             CP0_CHECK(ctx->insn_flags & ASE_MT);
7943             tcg_gen_st_tl(arg, cpu_env,
7944                           offsetof(CPUMIPSState, CP0_VPESchedule));
7945             register_name = "VPESchedule";
7946             break;
7947         case CP0_REG01__VPESCHEFBACK:
7948             CP0_CHECK(ctx->insn_flags & ASE_MT);
7949             tcg_gen_st_tl(arg, cpu_env,
7950                           offsetof(CPUMIPSState, CP0_VPEScheFBack));
7951             register_name = "VPEScheFBack";
7952             break;
7953         case CP0_REG01__VPEOPT:
7954             CP0_CHECK(ctx->insn_flags & ASE_MT);
7955             gen_helper_mtc0_vpeopt(cpu_env, arg);
7956             register_name = "VPEOpt";
7957             break;
7958         default:
7959             goto cp0_unimplemented;
7960         }
7961         break;
7962     case CP0_REGISTER_02:
7963         switch (sel) {
7964         case CP0_REG02__ENTRYLO0:
7965             gen_helper_dmtc0_entrylo0(cpu_env, arg);
7966             register_name = "EntryLo0";
7967             break;
7968         case CP0_REG02__TCSTATUS:
7969             CP0_CHECK(ctx->insn_flags & ASE_MT);
7970             gen_helper_mtc0_tcstatus(cpu_env, arg);
7971             register_name = "TCStatus";
7972             break;
7973         case CP0_REG02__TCBIND:
7974             CP0_CHECK(ctx->insn_flags & ASE_MT);
7975             gen_helper_mtc0_tcbind(cpu_env, arg);
7976             register_name = "TCBind";
7977             break;
7978         case CP0_REG02__TCRESTART:
7979             CP0_CHECK(ctx->insn_flags & ASE_MT);
7980             gen_helper_mtc0_tcrestart(cpu_env, arg);
7981             register_name = "TCRestart";
7982             break;
7983         case CP0_REG02__TCHALT:
7984             CP0_CHECK(ctx->insn_flags & ASE_MT);
7985             gen_helper_mtc0_tchalt(cpu_env, arg);
7986             register_name = "TCHalt";
7987             break;
7988         case CP0_REG02__TCCONTEXT:
7989             CP0_CHECK(ctx->insn_flags & ASE_MT);
7990             gen_helper_mtc0_tccontext(cpu_env, arg);
7991             register_name = "TCContext";
7992             break;
7993         case CP0_REG02__TCSCHEDULE:
7994             CP0_CHECK(ctx->insn_flags & ASE_MT);
7995             gen_helper_mtc0_tcschedule(cpu_env, arg);
7996             register_name = "TCSchedule";
7997             break;
7998         case CP0_REG02__TCSCHEFBACK:
7999             CP0_CHECK(ctx->insn_flags & ASE_MT);
8000             gen_helper_mtc0_tcschefback(cpu_env, arg);
8001             register_name = "TCScheFBack";
8002             break;
8003         default:
8004             goto cp0_unimplemented;
8005         }
8006         break;
8007     case CP0_REGISTER_03:
8008         switch (sel) {
8009         case CP0_REG03__ENTRYLO1:
8010             gen_helper_dmtc0_entrylo1(cpu_env, arg);
8011             register_name = "EntryLo1";
8012             break;
8013         case CP0_REG03__GLOBALNUM:
8014             CP0_CHECK(ctx->vp);
8015             /* ignored */
8016             register_name = "GlobalNumber";
8017             break;
8018         default:
8019             goto cp0_unimplemented;
8020         }
8021         break;
8022     case CP0_REGISTER_04:
8023         switch (sel) {
8024         case CP0_REG04__CONTEXT:
8025             gen_helper_mtc0_context(cpu_env, arg);
8026             register_name = "Context";
8027             break;
8028         case CP0_REG04__CONTEXTCONFIG:
8029             /* SmartMIPS ASE */
8030             /* gen_helper_dmtc0_contextconfig(arg); */
8031             register_name = "ContextConfig";
8032             goto cp0_unimplemented;
8033         case CP0_REG04__USERLOCAL:
8034             CP0_CHECK(ctx->ulri);
8035             tcg_gen_st_tl(arg, cpu_env,
8036                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
8037             register_name = "UserLocal";
8038             break;
8039         case CP0_REG04__MMID:
8040             CP0_CHECK(ctx->mi);
8041             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_MemoryMapID));
8042             register_name = "MMID";
8043             break;
8044         default:
8045             goto cp0_unimplemented;
8046         }
8047         break;
8048     case CP0_REGISTER_05:
8049         switch (sel) {
8050         case CP0_REG05__PAGEMASK:
8051             gen_helper_mtc0_pagemask(cpu_env, arg);
8052             register_name = "PageMask";
8053             break;
8054         case CP0_REG05__PAGEGRAIN:
8055             check_insn(ctx, ISA_MIPS_R2);
8056             gen_helper_mtc0_pagegrain(cpu_env, arg);
8057             register_name = "PageGrain";
8058             break;
8059         case CP0_REG05__SEGCTL0:
8060             CP0_CHECK(ctx->sc);
8061             gen_helper_mtc0_segctl0(cpu_env, arg);
8062             register_name = "SegCtl0";
8063             break;
8064         case CP0_REG05__SEGCTL1:
8065             CP0_CHECK(ctx->sc);
8066             gen_helper_mtc0_segctl1(cpu_env, arg);
8067             register_name = "SegCtl1";
8068             break;
8069         case CP0_REG05__SEGCTL2:
8070             CP0_CHECK(ctx->sc);
8071             gen_helper_mtc0_segctl2(cpu_env, arg);
8072             register_name = "SegCtl2";
8073             break;
8074         case CP0_REG05__PWBASE:
8075             check_pw(ctx);
8076             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_PWBase));
8077             register_name = "PWBase";
8078             break;
8079         case CP0_REG05__PWFIELD:
8080             check_pw(ctx);
8081             gen_helper_mtc0_pwfield(cpu_env, arg);
8082             register_name = "PWField";
8083             break;
8084         case CP0_REG05__PWSIZE:
8085             check_pw(ctx);
8086             gen_helper_mtc0_pwsize(cpu_env, arg);
8087             register_name = "PWSize";
8088             break;
8089         default:
8090             goto cp0_unimplemented;
8091         }
8092         break;
8093     case CP0_REGISTER_06:
8094         switch (sel) {
8095         case CP0_REG06__WIRED:
8096             gen_helper_mtc0_wired(cpu_env, arg);
8097             register_name = "Wired";
8098             break;
8099         case CP0_REG06__SRSCONF0:
8100             check_insn(ctx, ISA_MIPS_R2);
8101             gen_helper_mtc0_srsconf0(cpu_env, arg);
8102             register_name = "SRSConf0";
8103             break;
8104         case CP0_REG06__SRSCONF1:
8105             check_insn(ctx, ISA_MIPS_R2);
8106             gen_helper_mtc0_srsconf1(cpu_env, arg);
8107             register_name = "SRSConf1";
8108             break;
8109         case CP0_REG06__SRSCONF2:
8110             check_insn(ctx, ISA_MIPS_R2);
8111             gen_helper_mtc0_srsconf2(cpu_env, arg);
8112             register_name = "SRSConf2";
8113             break;
8114         case CP0_REG06__SRSCONF3:
8115             check_insn(ctx, ISA_MIPS_R2);
8116             gen_helper_mtc0_srsconf3(cpu_env, arg);
8117             register_name = "SRSConf3";
8118             break;
8119         case CP0_REG06__SRSCONF4:
8120             check_insn(ctx, ISA_MIPS_R2);
8121             gen_helper_mtc0_srsconf4(cpu_env, arg);
8122             register_name = "SRSConf4";
8123             break;
8124         case CP0_REG06__PWCTL:
8125             check_pw(ctx);
8126             gen_helper_mtc0_pwctl(cpu_env, arg);
8127             register_name = "PWCtl";
8128             break;
8129         default:
8130             goto cp0_unimplemented;
8131         }
8132         break;
8133     case CP0_REGISTER_07:
8134         switch (sel) {
8135         case CP0_REG07__HWRENA:
8136             check_insn(ctx, ISA_MIPS_R2);
8137             gen_helper_mtc0_hwrena(cpu_env, arg);
8138             ctx->base.is_jmp = DISAS_STOP;
8139             register_name = "HWREna";
8140             break;
8141         default:
8142             goto cp0_unimplemented;
8143         }
8144         break;
8145     case CP0_REGISTER_08:
8146         switch (sel) {
8147         case CP0_REG08__BADVADDR:
8148             /* ignored */
8149             register_name = "BadVAddr";
8150             break;
8151         case CP0_REG08__BADINSTR:
8152             /* ignored */
8153             register_name = "BadInstr";
8154             break;
8155         case CP0_REG08__BADINSTRP:
8156             /* ignored */
8157             register_name = "BadInstrP";
8158             break;
8159         case CP0_REG08__BADINSTRX:
8160             /* ignored */
8161             register_name = "BadInstrX";
8162             break;
8163         default:
8164             goto cp0_unimplemented;
8165         }
8166         break;
8167     case CP0_REGISTER_09:
8168         switch (sel) {
8169         case CP0_REG09__COUNT:
8170             gen_helper_mtc0_count(cpu_env, arg);
8171             register_name = "Count";
8172             break;
8173         case CP0_REG09__SAARI:
8174             CP0_CHECK(ctx->saar);
8175             gen_helper_mtc0_saari(cpu_env, arg);
8176             register_name = "SAARI";
8177             break;
8178         case CP0_REG09__SAAR:
8179             CP0_CHECK(ctx->saar);
8180             gen_helper_mtc0_saar(cpu_env, arg);
8181             register_name = "SAAR";
8182             break;
8183         default:
8184             goto cp0_unimplemented;
8185         }
8186         /* Stop translation as we may have switched the execution mode */
8187         ctx->base.is_jmp = DISAS_STOP;
8188         break;
8189     case CP0_REGISTER_10:
8190         switch (sel) {
8191         case CP0_REG10__ENTRYHI:
8192             gen_helper_mtc0_entryhi(cpu_env, arg);
8193             register_name = "EntryHi";
8194             break;
8195         default:
8196             goto cp0_unimplemented;
8197         }
8198         break;
8199     case CP0_REGISTER_11:
8200         switch (sel) {
8201         case CP0_REG11__COMPARE:
8202             gen_helper_mtc0_compare(cpu_env, arg);
8203             register_name = "Compare";
8204             break;
8205         /* 6,7 are implementation dependent */
8206         default:
8207             goto cp0_unimplemented;
8208         }
8209         /* Stop translation as we may have switched the execution mode */
8210         ctx->base.is_jmp = DISAS_STOP;
8211         break;
8212     case CP0_REGISTER_12:
8213         switch (sel) {
8214         case CP0_REG12__STATUS:
8215             save_cpu_state(ctx, 1);
8216             gen_helper_mtc0_status(cpu_env, arg);
8217             /* DISAS_STOP isn't good enough here, hflags may have changed. */
8218             gen_save_pc(ctx->base.pc_next + 4);
8219             ctx->base.is_jmp = DISAS_EXIT;
8220             register_name = "Status";
8221             break;
8222         case CP0_REG12__INTCTL:
8223             check_insn(ctx, ISA_MIPS_R2);
8224             gen_helper_mtc0_intctl(cpu_env, arg);
8225             /* Stop translation as we may have switched the execution mode */
8226             ctx->base.is_jmp = DISAS_STOP;
8227             register_name = "IntCtl";
8228             break;
8229         case CP0_REG12__SRSCTL:
8230             check_insn(ctx, ISA_MIPS_R2);
8231             gen_helper_mtc0_srsctl(cpu_env, arg);
8232             /* Stop translation as we may have switched the execution mode */
8233             ctx->base.is_jmp = DISAS_STOP;
8234             register_name = "SRSCtl";
8235             break;
8236         case CP0_REG12__SRSMAP:
8237             check_insn(ctx, ISA_MIPS_R2);
8238             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
8239             /* Stop translation as we may have switched the execution mode */
8240             ctx->base.is_jmp = DISAS_STOP;
8241             register_name = "SRSMap";
8242             break;
8243         default:
8244             goto cp0_unimplemented;
8245         }
8246         break;
8247     case CP0_REGISTER_13:
8248         switch (sel) {
8249         case CP0_REG13__CAUSE:
8250             save_cpu_state(ctx, 1);
8251             gen_helper_mtc0_cause(cpu_env, arg);
8252             /*
8253              * Stop translation as we may have triggered an interrupt.
8254              * DISAS_STOP isn't sufficient, we need to ensure we break out of
8255              * translated code to check for pending interrupts.
8256              */
8257             gen_save_pc(ctx->base.pc_next + 4);
8258             ctx->base.is_jmp = DISAS_EXIT;
8259             register_name = "Cause";
8260             break;
8261         default:
8262             goto cp0_unimplemented;
8263         }
8264         break;
8265     case CP0_REGISTER_14:
8266         switch (sel) {
8267         case CP0_REG14__EPC:
8268             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
8269             register_name = "EPC";
8270             break;
8271         default:
8272             goto cp0_unimplemented;
8273         }
8274         break;
8275     case CP0_REGISTER_15:
8276         switch (sel) {
8277         case CP0_REG15__PRID:
8278             /* ignored */
8279             register_name = "PRid";
8280             break;
8281         case CP0_REG15__EBASE:
8282             check_insn(ctx, ISA_MIPS_R2);
8283             gen_helper_mtc0_ebase(cpu_env, arg);
8284             register_name = "EBase";
8285             break;
8286         default:
8287             goto cp0_unimplemented;
8288         }
8289         break;
8290     case CP0_REGISTER_16:
8291         switch (sel) {
8292         case CP0_REG16__CONFIG:
8293             gen_helper_mtc0_config0(cpu_env, arg);
8294             register_name = "Config";
8295             /* Stop translation as we may have switched the execution mode */
8296             ctx->base.is_jmp = DISAS_STOP;
8297             break;
8298         case CP0_REG16__CONFIG1:
8299             /* ignored, read only */
8300             register_name = "Config1";
8301             break;
8302         case CP0_REG16__CONFIG2:
8303             gen_helper_mtc0_config2(cpu_env, arg);
8304             register_name = "Config2";
8305             /* Stop translation as we may have switched the execution mode */
8306             ctx->base.is_jmp = DISAS_STOP;
8307             break;
8308         case CP0_REG16__CONFIG3:
8309             gen_helper_mtc0_config3(cpu_env, arg);
8310             register_name = "Config3";
8311             /* Stop translation as we may have switched the execution mode */
8312             ctx->base.is_jmp = DISAS_STOP;
8313             break;
8314         case CP0_REG16__CONFIG4:
8315             /* currently ignored */
8316             register_name = "Config4";
8317             break;
8318         case CP0_REG16__CONFIG5:
8319             gen_helper_mtc0_config5(cpu_env, arg);
8320             register_name = "Config5";
8321             /* Stop translation as we may have switched the execution mode */
8322             ctx->base.is_jmp = DISAS_STOP;
8323             break;
8324         /* 6,7 are implementation dependent */
8325         default:
8326             register_name = "Invalid config selector";
8327             goto cp0_unimplemented;
8328         }
8329         break;
8330     case CP0_REGISTER_17:
8331         switch (sel) {
8332         case CP0_REG17__LLADDR:
8333             gen_helper_mtc0_lladdr(cpu_env, arg);
8334             register_name = "LLAddr";
8335             break;
8336         case CP0_REG17__MAAR:
8337             CP0_CHECK(ctx->mrp);
8338             gen_helper_mtc0_maar(cpu_env, arg);
8339             register_name = "MAAR";
8340             break;
8341         case CP0_REG17__MAARI:
8342             CP0_CHECK(ctx->mrp);
8343             gen_helper_mtc0_maari(cpu_env, arg);
8344             register_name = "MAARI";
8345             break;
8346         default:
8347             goto cp0_unimplemented;
8348         }
8349         break;
8350     case CP0_REGISTER_18:
8351         switch (sel) {
8352         case CP0_REG18__WATCHLO0:
8353         case CP0_REG18__WATCHLO1:
8354         case CP0_REG18__WATCHLO2:
8355         case CP0_REG18__WATCHLO3:
8356         case CP0_REG18__WATCHLO4:
8357         case CP0_REG18__WATCHLO5:
8358         case CP0_REG18__WATCHLO6:
8359         case CP0_REG18__WATCHLO7:
8360             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
8361             gen_helper_0e1i(mtc0_watchlo, arg, sel);
8362             register_name = "WatchLo";
8363             break;
8364         default:
8365             goto cp0_unimplemented;
8366         }
8367         break;
8368     case CP0_REGISTER_19:
8369         switch (sel) {
8370         case CP0_REG19__WATCHHI0:
8371         case CP0_REG19__WATCHHI1:
8372         case CP0_REG19__WATCHHI2:
8373         case CP0_REG19__WATCHHI3:
8374         case CP0_REG19__WATCHHI4:
8375         case CP0_REG19__WATCHHI5:
8376         case CP0_REG19__WATCHHI6:
8377         case CP0_REG19__WATCHHI7:
8378             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
8379             gen_helper_0e1i(mtc0_watchhi, arg, sel);
8380             register_name = "WatchHi";
8381             break;
8382         default:
8383             goto cp0_unimplemented;
8384         }
8385         break;
8386     case CP0_REGISTER_20:
8387         switch (sel) {
8388         case CP0_REG20__XCONTEXT:
8389             check_insn(ctx, ISA_MIPS3);
8390             gen_helper_mtc0_xcontext(cpu_env, arg);
8391             register_name = "XContext";
8392             break;
8393         default:
8394             goto cp0_unimplemented;
8395         }
8396         break;
8397     case CP0_REGISTER_21:
8398        /* Officially reserved, but sel 0 is used for R1x000 framemask */
8399         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS_R6));
8400         switch (sel) {
8401         case 0:
8402             gen_helper_mtc0_framemask(cpu_env, arg);
8403             register_name = "Framemask";
8404             break;
8405         default:
8406             goto cp0_unimplemented;
8407         }
8408         break;
8409     case CP0_REGISTER_22:
8410         /* ignored */
8411         register_name = "Diagnostic"; /* implementation dependent */
8412         break;
8413     case CP0_REGISTER_23:
8414         switch (sel) {
8415         case CP0_REG23__DEBUG:
8416             gen_helper_mtc0_debug(cpu_env, arg); /* EJTAG support */
8417             /* DISAS_STOP isn't good enough here, hflags may have changed. */
8418             gen_save_pc(ctx->base.pc_next + 4);
8419             ctx->base.is_jmp = DISAS_EXIT;
8420             register_name = "Debug";
8421             break;
8422         case CP0_REG23__TRACECONTROL:
8423             /* PDtrace support */
8424             /* gen_helper_mtc0_tracecontrol(cpu_env, arg);  */
8425             /* Stop translation as we may have switched the execution mode */
8426             ctx->base.is_jmp = DISAS_STOP;
8427             register_name = "TraceControl";
8428             goto cp0_unimplemented;
8429         case CP0_REG23__TRACECONTROL2:
8430             /* PDtrace support */
8431             /* gen_helper_mtc0_tracecontrol2(cpu_env, arg); */
8432             /* Stop translation as we may have switched the execution mode */
8433             ctx->base.is_jmp = DISAS_STOP;
8434             register_name = "TraceControl2";
8435             goto cp0_unimplemented;
8436         case CP0_REG23__USERTRACEDATA1:
8437             /* PDtrace support */
8438             /* gen_helper_mtc0_usertracedata1(cpu_env, arg);*/
8439             /* Stop translation as we may have switched the execution mode */
8440             ctx->base.is_jmp = DISAS_STOP;
8441             register_name = "UserTraceData1";
8442             goto cp0_unimplemented;
8443         case CP0_REG23__TRACEIBPC:
8444             /* PDtrace support */
8445             /* gen_helper_mtc0_traceibpc(cpu_env, arg);     */
8446             /* Stop translation as we may have switched the execution mode */
8447             ctx->base.is_jmp = DISAS_STOP;
8448             register_name = "TraceIBPC";
8449             goto cp0_unimplemented;
8450         case CP0_REG23__TRACEDBPC:
8451             /* PDtrace support */
8452             /* gen_helper_mtc0_tracedbpc(cpu_env, arg);     */
8453             /* Stop translation as we may have switched the execution mode */
8454             ctx->base.is_jmp = DISAS_STOP;
8455             register_name = "TraceDBPC";
8456             goto cp0_unimplemented;
8457         default:
8458             goto cp0_unimplemented;
8459         }
8460         break;
8461     case CP0_REGISTER_24:
8462         switch (sel) {
8463         case CP0_REG24__DEPC:
8464             /* EJTAG support */
8465             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
8466             register_name = "DEPC";
8467             break;
8468         default:
8469             goto cp0_unimplemented;
8470         }
8471         break;
8472     case CP0_REGISTER_25:
8473         switch (sel) {
8474         case CP0_REG25__PERFCTL0:
8475             gen_helper_mtc0_performance0(cpu_env, arg);
8476             register_name = "Performance0";
8477             break;
8478         case CP0_REG25__PERFCNT0:
8479             /* gen_helper_mtc0_performance1(cpu_env, arg); */
8480             register_name = "Performance1";
8481             goto cp0_unimplemented;
8482         case CP0_REG25__PERFCTL1:
8483             /* gen_helper_mtc0_performance2(cpu_env, arg); */
8484             register_name = "Performance2";
8485             goto cp0_unimplemented;
8486         case CP0_REG25__PERFCNT1:
8487             /* gen_helper_mtc0_performance3(cpu_env, arg); */
8488             register_name = "Performance3";
8489             goto cp0_unimplemented;
8490         case CP0_REG25__PERFCTL2:
8491             /* gen_helper_mtc0_performance4(cpu_env, arg); */
8492             register_name = "Performance4";
8493             goto cp0_unimplemented;
8494         case CP0_REG25__PERFCNT2:
8495             /* gen_helper_mtc0_performance5(cpu_env, arg); */
8496             register_name = "Performance5";
8497             goto cp0_unimplemented;
8498         case CP0_REG25__PERFCTL3:
8499             /* gen_helper_mtc0_performance6(cpu_env, arg); */
8500             register_name = "Performance6";
8501             goto cp0_unimplemented;
8502         case CP0_REG25__PERFCNT3:
8503             /* gen_helper_mtc0_performance7(cpu_env, arg); */
8504             register_name = "Performance7";
8505             goto cp0_unimplemented;
8506         default:
8507             goto cp0_unimplemented;
8508         }
8509         break;
8510     case CP0_REGISTER_26:
8511         switch (sel) {
8512         case CP0_REG26__ERRCTL:
8513             gen_helper_mtc0_errctl(cpu_env, arg);
8514             ctx->base.is_jmp = DISAS_STOP;
8515             register_name = "ErrCtl";
8516             break;
8517         default:
8518             goto cp0_unimplemented;
8519         }
8520         break;
8521     case CP0_REGISTER_27:
8522         switch (sel) {
8523         case CP0_REG27__CACHERR:
8524             /* ignored */
8525             register_name = "CacheErr";
8526             break;
8527         default:
8528             goto cp0_unimplemented;
8529         }
8530         break;
8531     case CP0_REGISTER_28:
8532         switch (sel) {
8533         case CP0_REG28__TAGLO:
8534         case CP0_REG28__TAGLO1:
8535         case CP0_REG28__TAGLO2:
8536         case CP0_REG28__TAGLO3:
8537             gen_helper_mtc0_taglo(cpu_env, arg);
8538             register_name = "TagLo";
8539             break;
8540         case CP0_REG28__DATALO:
8541         case CP0_REG28__DATALO1:
8542         case CP0_REG28__DATALO2:
8543         case CP0_REG28__DATALO3:
8544             gen_helper_mtc0_datalo(cpu_env, arg);
8545             register_name = "DataLo";
8546             break;
8547         default:
8548             goto cp0_unimplemented;
8549         }
8550         break;
8551     case CP0_REGISTER_29:
8552         switch (sel) {
8553         case CP0_REG29__TAGHI:
8554         case CP0_REG29__TAGHI1:
8555         case CP0_REG29__TAGHI2:
8556         case CP0_REG29__TAGHI3:
8557             gen_helper_mtc0_taghi(cpu_env, arg);
8558             register_name = "TagHi";
8559             break;
8560         case CP0_REG29__DATAHI:
8561         case CP0_REG29__DATAHI1:
8562         case CP0_REG29__DATAHI2:
8563         case CP0_REG29__DATAHI3:
8564             gen_helper_mtc0_datahi(cpu_env, arg);
8565             register_name = "DataHi";
8566             break;
8567         default:
8568             register_name = "invalid sel";
8569             goto cp0_unimplemented;
8570         }
8571         break;
8572     case CP0_REGISTER_30:
8573         switch (sel) {
8574         case CP0_REG30__ERROREPC:
8575             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
8576             register_name = "ErrorEPC";
8577             break;
8578         default:
8579             goto cp0_unimplemented;
8580         }
8581         break;
8582     case CP0_REGISTER_31:
8583         switch (sel) {
8584         case CP0_REG31__DESAVE:
8585             /* EJTAG support */
8586             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
8587             register_name = "DESAVE";
8588             break;
8589         case CP0_REG31__KSCRATCH1:
8590         case CP0_REG31__KSCRATCH2:
8591         case CP0_REG31__KSCRATCH3:
8592         case CP0_REG31__KSCRATCH4:
8593         case CP0_REG31__KSCRATCH5:
8594         case CP0_REG31__KSCRATCH6:
8595             CP0_CHECK(ctx->kscrexist & (1 << sel));
8596             tcg_gen_st_tl(arg, cpu_env,
8597                           offsetof(CPUMIPSState, CP0_KScratch[sel - 2]));
8598             register_name = "KScratch";
8599             break;
8600         default:
8601             goto cp0_unimplemented;
8602         }
8603         break;
8604     default:
8605         goto cp0_unimplemented;
8606     }
8607     trace_mips_translate_c0("dmtc0", register_name, reg, sel);
8608 
8609     /* For simplicity assume that all writes can cause interrupts.  */
8610     if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
8611         /*
8612          * DISAS_STOP isn't sufficient, we need to ensure we break out of
8613          * translated code to check for pending interrupts.
8614          */
8615         gen_save_pc(ctx->base.pc_next + 4);
8616         ctx->base.is_jmp = DISAS_EXIT;
8617     }
8618     return;
8619 
8620 cp0_unimplemented:
8621     qemu_log_mask(LOG_UNIMP, "dmtc0 %s (reg %d sel %d)\n",
8622                   register_name, reg, sel);
8623 }
8624 #endif /* TARGET_MIPS64 */
8625 
8626 static void gen_mftr(CPUMIPSState *env, DisasContext *ctx, int rt, int rd,
8627                      int u, int sel, int h)
8628 {
8629     int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
8630     TCGv t0 = tcg_temp_local_new();
8631 
8632     if ((env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) == 0 &&
8633         ((env->tcs[other_tc].CP0_TCBind & (0xf << CP0TCBd_CurVPE)) !=
8634          (env->active_tc.CP0_TCBind & (0xf << CP0TCBd_CurVPE)))) {
8635         tcg_gen_movi_tl(t0, -1);
8636     } else if ((env->CP0_VPEControl & (0xff << CP0VPECo_TargTC)) >
8637                (env->mvp->CP0_MVPConf0 & (0xff << CP0MVPC0_PTC))) {
8638         tcg_gen_movi_tl(t0, -1);
8639     } else if (u == 0) {
8640         switch (rt) {
8641         case 1:
8642             switch (sel) {
8643             case 1:
8644                 gen_helper_mftc0_vpecontrol(t0, cpu_env);
8645                 break;
8646             case 2:
8647                 gen_helper_mftc0_vpeconf0(t0, cpu_env);
8648                 break;
8649             default:
8650                 goto die;
8651                 break;
8652             }
8653             break;
8654         case 2:
8655             switch (sel) {
8656             case 1:
8657                 gen_helper_mftc0_tcstatus(t0, cpu_env);
8658                 break;
8659             case 2:
8660                 gen_helper_mftc0_tcbind(t0, cpu_env);
8661                 break;
8662             case 3:
8663                 gen_helper_mftc0_tcrestart(t0, cpu_env);
8664                 break;
8665             case 4:
8666                 gen_helper_mftc0_tchalt(t0, cpu_env);
8667                 break;
8668             case 5:
8669                 gen_helper_mftc0_tccontext(t0, cpu_env);
8670                 break;
8671             case 6:
8672                 gen_helper_mftc0_tcschedule(t0, cpu_env);
8673                 break;
8674             case 7:
8675                 gen_helper_mftc0_tcschefback(t0, cpu_env);
8676                 break;
8677             default:
8678                 gen_mfc0(ctx, t0, rt, sel);
8679                 break;
8680             }
8681             break;
8682         case 10:
8683             switch (sel) {
8684             case 0:
8685                 gen_helper_mftc0_entryhi(t0, cpu_env);
8686                 break;
8687             default:
8688                 gen_mfc0(ctx, t0, rt, sel);
8689                 break;
8690             }
8691             break;
8692         case 12:
8693             switch (sel) {
8694             case 0:
8695                 gen_helper_mftc0_status(t0, cpu_env);
8696                 break;
8697             default:
8698                 gen_mfc0(ctx, t0, rt, sel);
8699                 break;
8700             }
8701             break;
8702         case 13:
8703             switch (sel) {
8704             case 0:
8705                 gen_helper_mftc0_cause(t0, cpu_env);
8706                 break;
8707             default:
8708                 goto die;
8709                 break;
8710             }
8711             break;
8712         case 14:
8713             switch (sel) {
8714             case 0:
8715                 gen_helper_mftc0_epc(t0, cpu_env);
8716                 break;
8717             default:
8718                 goto die;
8719                 break;
8720             }
8721             break;
8722         case 15:
8723             switch (sel) {
8724             case 1:
8725                 gen_helper_mftc0_ebase(t0, cpu_env);
8726                 break;
8727             default:
8728                 goto die;
8729                 break;
8730             }
8731             break;
8732         case 16:
8733             switch (sel) {
8734             case 0:
8735             case 1:
8736             case 2:
8737             case 3:
8738             case 4:
8739             case 5:
8740             case 6:
8741             case 7:
8742                 gen_helper_mftc0_configx(t0, cpu_env, tcg_const_tl(sel));
8743                 break;
8744             default:
8745                 goto die;
8746                 break;
8747             }
8748             break;
8749         case 23:
8750             switch (sel) {
8751             case 0:
8752                 gen_helper_mftc0_debug(t0, cpu_env);
8753                 break;
8754             default:
8755                 gen_mfc0(ctx, t0, rt, sel);
8756                 break;
8757             }
8758             break;
8759         default:
8760             gen_mfc0(ctx, t0, rt, sel);
8761         }
8762     } else {
8763         switch (sel) {
8764         /* GPR registers. */
8765         case 0:
8766             gen_helper_1e0i(mftgpr, t0, rt);
8767             break;
8768         /* Auxiliary CPU registers */
8769         case 1:
8770             switch (rt) {
8771             case 0:
8772                 gen_helper_1e0i(mftlo, t0, 0);
8773                 break;
8774             case 1:
8775                 gen_helper_1e0i(mfthi, t0, 0);
8776                 break;
8777             case 2:
8778                 gen_helper_1e0i(mftacx, t0, 0);
8779                 break;
8780             case 4:
8781                 gen_helper_1e0i(mftlo, t0, 1);
8782                 break;
8783             case 5:
8784                 gen_helper_1e0i(mfthi, t0, 1);
8785                 break;
8786             case 6:
8787                 gen_helper_1e0i(mftacx, t0, 1);
8788                 break;
8789             case 8:
8790                 gen_helper_1e0i(mftlo, t0, 2);
8791                 break;
8792             case 9:
8793                 gen_helper_1e0i(mfthi, t0, 2);
8794                 break;
8795             case 10:
8796                 gen_helper_1e0i(mftacx, t0, 2);
8797                 break;
8798             case 12:
8799                 gen_helper_1e0i(mftlo, t0, 3);
8800                 break;
8801             case 13:
8802                 gen_helper_1e0i(mfthi, t0, 3);
8803                 break;
8804             case 14:
8805                 gen_helper_1e0i(mftacx, t0, 3);
8806                 break;
8807             case 16:
8808                 gen_helper_mftdsp(t0, cpu_env);
8809                 break;
8810             default:
8811                 goto die;
8812             }
8813             break;
8814         /* Floating point (COP1). */
8815         case 2:
8816             /* XXX: For now we support only a single FPU context. */
8817             if (h == 0) {
8818                 TCGv_i32 fp0 = tcg_temp_new_i32();
8819 
8820                 gen_load_fpr32(ctx, fp0, rt);
8821                 tcg_gen_ext_i32_tl(t0, fp0);
8822                 tcg_temp_free_i32(fp0);
8823             } else {
8824                 TCGv_i32 fp0 = tcg_temp_new_i32();
8825 
8826                 gen_load_fpr32h(ctx, fp0, rt);
8827                 tcg_gen_ext_i32_tl(t0, fp0);
8828                 tcg_temp_free_i32(fp0);
8829             }
8830             break;
8831         case 3:
8832             /* XXX: For now we support only a single FPU context. */
8833             gen_helper_1e0i(cfc1, t0, rt);
8834             break;
8835         /* COP2: Not implemented. */
8836         case 4:
8837         case 5:
8838             /* fall through */
8839         default:
8840             goto die;
8841         }
8842     }
8843     trace_mips_translate_tr("mftr", rt, u, sel, h);
8844     gen_store_gpr(t0, rd);
8845     tcg_temp_free(t0);
8846     return;
8847 
8848 die:
8849     tcg_temp_free(t0);
8850     LOG_DISAS("mftr (reg %d u %d sel %d h %d)\n", rt, u, sel, h);
8851     gen_reserved_instruction(ctx);
8852 }
8853 
8854 static void gen_mttr(CPUMIPSState *env, DisasContext *ctx, int rd, int rt,
8855                      int u, int sel, int h)
8856 {
8857     int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
8858     TCGv t0 = tcg_temp_local_new();
8859 
8860     gen_load_gpr(t0, rt);
8861     if ((env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) == 0 &&
8862         ((env->tcs[other_tc].CP0_TCBind & (0xf << CP0TCBd_CurVPE)) !=
8863          (env->active_tc.CP0_TCBind & (0xf << CP0TCBd_CurVPE)))) {
8864         /* NOP */
8865         ;
8866     } else if ((env->CP0_VPEControl & (0xff << CP0VPECo_TargTC)) >
8867              (env->mvp->CP0_MVPConf0 & (0xff << CP0MVPC0_PTC))) {
8868         /* NOP */
8869         ;
8870     } else if (u == 0) {
8871         switch (rd) {
8872         case 1:
8873             switch (sel) {
8874             case 1:
8875                 gen_helper_mttc0_vpecontrol(cpu_env, t0);
8876                 break;
8877             case 2:
8878                 gen_helper_mttc0_vpeconf0(cpu_env, t0);
8879                 break;
8880             default:
8881                 goto die;
8882                 break;
8883             }
8884             break;
8885         case 2:
8886             switch (sel) {
8887             case 1:
8888                 gen_helper_mttc0_tcstatus(cpu_env, t0);
8889                 break;
8890             case 2:
8891                 gen_helper_mttc0_tcbind(cpu_env, t0);
8892                 break;
8893             case 3:
8894                 gen_helper_mttc0_tcrestart(cpu_env, t0);
8895                 break;
8896             case 4:
8897                 gen_helper_mttc0_tchalt(cpu_env, t0);
8898                 break;
8899             case 5:
8900                 gen_helper_mttc0_tccontext(cpu_env, t0);
8901                 break;
8902             case 6:
8903                 gen_helper_mttc0_tcschedule(cpu_env, t0);
8904                 break;
8905             case 7:
8906                 gen_helper_mttc0_tcschefback(cpu_env, t0);
8907                 break;
8908             default:
8909                 gen_mtc0(ctx, t0, rd, sel);
8910                 break;
8911             }
8912             break;
8913         case 10:
8914             switch (sel) {
8915             case 0:
8916                 gen_helper_mttc0_entryhi(cpu_env, t0);
8917                 break;
8918             default:
8919                 gen_mtc0(ctx, t0, rd, sel);
8920                 break;
8921             }
8922             break;
8923         case 12:
8924             switch (sel) {
8925             case 0:
8926                 gen_helper_mttc0_status(cpu_env, t0);
8927                 break;
8928             default:
8929                 gen_mtc0(ctx, t0, rd, sel);
8930                 break;
8931             }
8932             break;
8933         case 13:
8934             switch (sel) {
8935             case 0:
8936                 gen_helper_mttc0_cause(cpu_env, t0);
8937                 break;
8938             default:
8939                 goto die;
8940                 break;
8941             }
8942             break;
8943         case 15:
8944             switch (sel) {
8945             case 1:
8946                 gen_helper_mttc0_ebase(cpu_env, t0);
8947                 break;
8948             default:
8949                 goto die;
8950                 break;
8951             }
8952             break;
8953         case 23:
8954             switch (sel) {
8955             case 0:
8956                 gen_helper_mttc0_debug(cpu_env, t0);
8957                 break;
8958             default:
8959                 gen_mtc0(ctx, t0, rd, sel);
8960                 break;
8961             }
8962             break;
8963         default:
8964             gen_mtc0(ctx, t0, rd, sel);
8965         }
8966     } else {
8967         switch (sel) {
8968         /* GPR registers. */
8969         case 0:
8970             gen_helper_0e1i(mttgpr, t0, rd);
8971             break;
8972         /* Auxiliary CPU registers */
8973         case 1:
8974             switch (rd) {
8975             case 0:
8976                 gen_helper_0e1i(mttlo, t0, 0);
8977                 break;
8978             case 1:
8979                 gen_helper_0e1i(mtthi, t0, 0);
8980                 break;
8981             case 2:
8982                 gen_helper_0e1i(mttacx, t0, 0);
8983                 break;
8984             case 4:
8985                 gen_helper_0e1i(mttlo, t0, 1);
8986                 break;
8987             case 5:
8988                 gen_helper_0e1i(mtthi, t0, 1);
8989                 break;
8990             case 6:
8991                 gen_helper_0e1i(mttacx, t0, 1);
8992                 break;
8993             case 8:
8994                 gen_helper_0e1i(mttlo, t0, 2);
8995                 break;
8996             case 9:
8997                 gen_helper_0e1i(mtthi, t0, 2);
8998                 break;
8999             case 10:
9000                 gen_helper_0e1i(mttacx, t0, 2);
9001                 break;
9002             case 12:
9003                 gen_helper_0e1i(mttlo, t0, 3);
9004                 break;
9005             case 13:
9006                 gen_helper_0e1i(mtthi, t0, 3);
9007                 break;
9008             case 14:
9009                 gen_helper_0e1i(mttacx, t0, 3);
9010                 break;
9011             case 16:
9012                 gen_helper_mttdsp(cpu_env, t0);
9013                 break;
9014             default:
9015                 goto die;
9016             }
9017             break;
9018         /* Floating point (COP1). */
9019         case 2:
9020             /* XXX: For now we support only a single FPU context. */
9021             if (h == 0) {
9022                 TCGv_i32 fp0 = tcg_temp_new_i32();
9023 
9024                 tcg_gen_trunc_tl_i32(fp0, t0);
9025                 gen_store_fpr32(ctx, fp0, rd);
9026                 tcg_temp_free_i32(fp0);
9027             } else {
9028                 TCGv_i32 fp0 = tcg_temp_new_i32();
9029 
9030                 tcg_gen_trunc_tl_i32(fp0, t0);
9031                 gen_store_fpr32h(ctx, fp0, rd);
9032                 tcg_temp_free_i32(fp0);
9033             }
9034             break;
9035         case 3:
9036             /* XXX: For now we support only a single FPU context. */
9037             gen_helper_0e2i(ctc1, t0, tcg_constant_i32(rd), rt);
9038             /* Stop translation as we may have changed hflags */
9039             ctx->base.is_jmp = DISAS_STOP;
9040             break;
9041         /* COP2: Not implemented. */
9042         case 4:
9043         case 5:
9044             /* fall through */
9045         default:
9046             goto die;
9047         }
9048     }
9049     trace_mips_translate_tr("mttr", rd, u, sel, h);
9050     tcg_temp_free(t0);
9051     return;
9052 
9053 die:
9054     tcg_temp_free(t0);
9055     LOG_DISAS("mttr (reg %d u %d sel %d h %d)\n", rd, u, sel, h);
9056     gen_reserved_instruction(ctx);
9057 }
9058 
9059 static void gen_cp0(CPUMIPSState *env, DisasContext *ctx, uint32_t opc,
9060                     int rt, int rd)
9061 {
9062     const char *opn = "ldst";
9063 
9064     check_cp0_enabled(ctx);
9065     switch (opc) {
9066     case OPC_MFC0:
9067         if (rt == 0) {
9068             /* Treat as NOP. */
9069             return;
9070         }
9071         gen_mfc0(ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
9072         opn = "mfc0";
9073         break;
9074     case OPC_MTC0:
9075         {
9076             TCGv t0 = tcg_temp_new();
9077 
9078             gen_load_gpr(t0, rt);
9079             gen_mtc0(ctx, t0, rd, ctx->opcode & 0x7);
9080             tcg_temp_free(t0);
9081         }
9082         opn = "mtc0";
9083         break;
9084 #if defined(TARGET_MIPS64)
9085     case OPC_DMFC0:
9086         check_insn(ctx, ISA_MIPS3);
9087         if (rt == 0) {
9088             /* Treat as NOP. */
9089             return;
9090         }
9091         gen_dmfc0(ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
9092         opn = "dmfc0";
9093         break;
9094     case OPC_DMTC0:
9095         check_insn(ctx, ISA_MIPS3);
9096         {
9097             TCGv t0 = tcg_temp_new();
9098 
9099             gen_load_gpr(t0, rt);
9100             gen_dmtc0(ctx, t0, rd, ctx->opcode & 0x7);
9101             tcg_temp_free(t0);
9102         }
9103         opn = "dmtc0";
9104         break;
9105 #endif
9106     case OPC_MFHC0:
9107         check_mvh(ctx);
9108         if (rt == 0) {
9109             /* Treat as NOP. */
9110             return;
9111         }
9112         gen_mfhc0(ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
9113         opn = "mfhc0";
9114         break;
9115     case OPC_MTHC0:
9116         check_mvh(ctx);
9117         {
9118             TCGv t0 = tcg_temp_new();
9119             gen_load_gpr(t0, rt);
9120             gen_mthc0(ctx, t0, rd, ctx->opcode & 0x7);
9121             tcg_temp_free(t0);
9122         }
9123         opn = "mthc0";
9124         break;
9125     case OPC_MFTR:
9126         check_cp0_enabled(ctx);
9127         if (rd == 0) {
9128             /* Treat as NOP. */
9129             return;
9130         }
9131         gen_mftr(env, ctx, rt, rd, (ctx->opcode >> 5) & 1,
9132                  ctx->opcode & 0x7, (ctx->opcode >> 4) & 1);
9133         opn = "mftr";
9134         break;
9135     case OPC_MTTR:
9136         check_cp0_enabled(ctx);
9137         gen_mttr(env, ctx, rd, rt, (ctx->opcode >> 5) & 1,
9138                  ctx->opcode & 0x7, (ctx->opcode >> 4) & 1);
9139         opn = "mttr";
9140         break;
9141     case OPC_TLBWI:
9142         opn = "tlbwi";
9143         if (!env->tlb->helper_tlbwi) {
9144             goto die;
9145         }
9146         gen_helper_tlbwi(cpu_env);
9147         break;
9148     case OPC_TLBINV:
9149         opn = "tlbinv";
9150         if (ctx->ie >= 2) {
9151             if (!env->tlb->helper_tlbinv) {
9152                 goto die;
9153             }
9154             gen_helper_tlbinv(cpu_env);
9155         } /* treat as nop if TLBINV not supported */
9156         break;
9157     case OPC_TLBINVF:
9158         opn = "tlbinvf";
9159         if (ctx->ie >= 2) {
9160             if (!env->tlb->helper_tlbinvf) {
9161                 goto die;
9162             }
9163             gen_helper_tlbinvf(cpu_env);
9164         } /* treat as nop if TLBINV not supported */
9165         break;
9166     case OPC_TLBWR:
9167         opn = "tlbwr";
9168         if (!env->tlb->helper_tlbwr) {
9169             goto die;
9170         }
9171         gen_helper_tlbwr(cpu_env);
9172         break;
9173     case OPC_TLBP:
9174         opn = "tlbp";
9175         if (!env->tlb->helper_tlbp) {
9176             goto die;
9177         }
9178         gen_helper_tlbp(cpu_env);
9179         break;
9180     case OPC_TLBR:
9181         opn = "tlbr";
9182         if (!env->tlb->helper_tlbr) {
9183             goto die;
9184         }
9185         gen_helper_tlbr(cpu_env);
9186         break;
9187     case OPC_ERET: /* OPC_ERETNC */
9188         if ((ctx->insn_flags & ISA_MIPS_R6) &&
9189             (ctx->hflags & MIPS_HFLAG_BMASK)) {
9190             goto die;
9191         } else {
9192             int bit_shift = (ctx->hflags & MIPS_HFLAG_M16) ? 16 : 6;
9193             if (ctx->opcode & (1 << bit_shift)) {
9194                 /* OPC_ERETNC */
9195                 opn = "eretnc";
9196                 check_insn(ctx, ISA_MIPS_R5);
9197                 gen_helper_eretnc(cpu_env);
9198             } else {
9199                 /* OPC_ERET */
9200                 opn = "eret";
9201                 check_insn(ctx, ISA_MIPS2);
9202                 gen_helper_eret(cpu_env);
9203             }
9204             ctx->base.is_jmp = DISAS_EXIT;
9205         }
9206         break;
9207     case OPC_DERET:
9208         opn = "deret";
9209         check_insn(ctx, ISA_MIPS_R1);
9210         if ((ctx->insn_flags & ISA_MIPS_R6) &&
9211             (ctx->hflags & MIPS_HFLAG_BMASK)) {
9212             goto die;
9213         }
9214         if (!(ctx->hflags & MIPS_HFLAG_DM)) {
9215             MIPS_INVAL(opn);
9216             gen_reserved_instruction(ctx);
9217         } else {
9218             gen_helper_deret(cpu_env);
9219             ctx->base.is_jmp = DISAS_EXIT;
9220         }
9221         break;
9222     case OPC_WAIT:
9223         opn = "wait";
9224         check_insn(ctx, ISA_MIPS3 | ISA_MIPS_R1);
9225         if ((ctx->insn_flags & ISA_MIPS_R6) &&
9226             (ctx->hflags & MIPS_HFLAG_BMASK)) {
9227             goto die;
9228         }
9229         /* If we get an exception, we want to restart at next instruction */
9230         ctx->base.pc_next += 4;
9231         save_cpu_state(ctx, 1);
9232         ctx->base.pc_next -= 4;
9233         gen_helper_wait(cpu_env);
9234         ctx->base.is_jmp = DISAS_NORETURN;
9235         break;
9236     default:
9237  die:
9238         MIPS_INVAL(opn);
9239         gen_reserved_instruction(ctx);
9240         return;
9241     }
9242     (void)opn; /* avoid a compiler warning */
9243 }
9244 #endif /* !CONFIG_USER_ONLY */
9245 
9246 /* CP1 Branches (before delay slot) */
9247 static void gen_compute_branch1(DisasContext *ctx, uint32_t op,
9248                                 int32_t cc, int32_t offset)
9249 {
9250     target_ulong btarget;
9251     TCGv_i32 t0 = tcg_temp_new_i32();
9252 
9253     if ((ctx->insn_flags & ISA_MIPS_R6) && (ctx->hflags & MIPS_HFLAG_BMASK)) {
9254         gen_reserved_instruction(ctx);
9255         goto out;
9256     }
9257 
9258     if (cc != 0) {
9259         check_insn(ctx, ISA_MIPS4 | ISA_MIPS_R1);
9260     }
9261 
9262     btarget = ctx->base.pc_next + 4 + offset;
9263 
9264     switch (op) {
9265     case OPC_BC1F:
9266         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
9267         tcg_gen_not_i32(t0, t0);
9268         tcg_gen_andi_i32(t0, t0, 1);
9269         tcg_gen_extu_i32_tl(bcond, t0);
9270         goto not_likely;
9271     case OPC_BC1FL:
9272         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
9273         tcg_gen_not_i32(t0, t0);
9274         tcg_gen_andi_i32(t0, t0, 1);
9275         tcg_gen_extu_i32_tl(bcond, t0);
9276         goto likely;
9277     case OPC_BC1T:
9278         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
9279         tcg_gen_andi_i32(t0, t0, 1);
9280         tcg_gen_extu_i32_tl(bcond, t0);
9281         goto not_likely;
9282     case OPC_BC1TL:
9283         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
9284         tcg_gen_andi_i32(t0, t0, 1);
9285         tcg_gen_extu_i32_tl(bcond, t0);
9286     likely:
9287         ctx->hflags |= MIPS_HFLAG_BL;
9288         break;
9289     case OPC_BC1FANY2:
9290         {
9291             TCGv_i32 t1 = tcg_temp_new_i32();
9292             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
9293             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc + 1));
9294             tcg_gen_nand_i32(t0, t0, t1);
9295             tcg_temp_free_i32(t1);
9296             tcg_gen_andi_i32(t0, t0, 1);
9297             tcg_gen_extu_i32_tl(bcond, t0);
9298         }
9299         goto not_likely;
9300     case OPC_BC1TANY2:
9301         {
9302             TCGv_i32 t1 = tcg_temp_new_i32();
9303             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
9304             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc + 1));
9305             tcg_gen_or_i32(t0, t0, t1);
9306             tcg_temp_free_i32(t1);
9307             tcg_gen_andi_i32(t0, t0, 1);
9308             tcg_gen_extu_i32_tl(bcond, t0);
9309         }
9310         goto not_likely;
9311     case OPC_BC1FANY4:
9312         {
9313             TCGv_i32 t1 = tcg_temp_new_i32();
9314             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
9315             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc + 1));
9316             tcg_gen_and_i32(t0, t0, t1);
9317             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc + 2));
9318             tcg_gen_and_i32(t0, t0, t1);
9319             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc + 3));
9320             tcg_gen_nand_i32(t0, t0, t1);
9321             tcg_temp_free_i32(t1);
9322             tcg_gen_andi_i32(t0, t0, 1);
9323             tcg_gen_extu_i32_tl(bcond, t0);
9324         }
9325         goto not_likely;
9326     case OPC_BC1TANY4:
9327         {
9328             TCGv_i32 t1 = tcg_temp_new_i32();
9329             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
9330             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc + 1));
9331             tcg_gen_or_i32(t0, t0, t1);
9332             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc + 2));
9333             tcg_gen_or_i32(t0, t0, t1);
9334             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc + 3));
9335             tcg_gen_or_i32(t0, t0, t1);
9336             tcg_temp_free_i32(t1);
9337             tcg_gen_andi_i32(t0, t0, 1);
9338             tcg_gen_extu_i32_tl(bcond, t0);
9339         }
9340     not_likely:
9341         ctx->hflags |= MIPS_HFLAG_BC;
9342         break;
9343     default:
9344         MIPS_INVAL("cp1 cond branch");
9345         gen_reserved_instruction(ctx);
9346         goto out;
9347     }
9348     ctx->btarget = btarget;
9349     ctx->hflags |= MIPS_HFLAG_BDS32;
9350  out:
9351     tcg_temp_free_i32(t0);
9352 }
9353 
9354 /* R6 CP1 Branches */
9355 static void gen_compute_branch1_r6(DisasContext *ctx, uint32_t op,
9356                                    int32_t ft, int32_t offset,
9357                                    int delayslot_size)
9358 {
9359     target_ulong btarget;
9360     TCGv_i64 t0 = tcg_temp_new_i64();
9361 
9362     if (ctx->hflags & MIPS_HFLAG_BMASK) {
9363 #ifdef MIPS_DEBUG_DISAS
9364         LOG_DISAS("Branch in delay / forbidden slot at PC 0x" TARGET_FMT_lx
9365                   "\n", ctx->base.pc_next);
9366 #endif
9367         gen_reserved_instruction(ctx);
9368         goto out;
9369     }
9370 
9371     gen_load_fpr64(ctx, t0, ft);
9372     tcg_gen_andi_i64(t0, t0, 1);
9373 
9374     btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
9375 
9376     switch (op) {
9377     case OPC_BC1EQZ:
9378         tcg_gen_xori_i64(t0, t0, 1);
9379         ctx->hflags |= MIPS_HFLAG_BC;
9380         break;
9381     case OPC_BC1NEZ:
9382         /* t0 already set */
9383         ctx->hflags |= MIPS_HFLAG_BC;
9384         break;
9385     default:
9386         MIPS_INVAL("cp1 cond branch");
9387         gen_reserved_instruction(ctx);
9388         goto out;
9389     }
9390 
9391     tcg_gen_trunc_i64_tl(bcond, t0);
9392 
9393     ctx->btarget = btarget;
9394 
9395     switch (delayslot_size) {
9396     case 2:
9397         ctx->hflags |= MIPS_HFLAG_BDS16;
9398         break;
9399     case 4:
9400         ctx->hflags |= MIPS_HFLAG_BDS32;
9401         break;
9402     }
9403 
9404 out:
9405     tcg_temp_free_i64(t0);
9406 }
9407 
9408 /* Coprocessor 1 (FPU) */
9409 
9410 #define FOP(func, fmt) (((fmt) << 21) | (func))
9411 
9412 enum fopcode {
9413     OPC_ADD_S = FOP(0, FMT_S),
9414     OPC_SUB_S = FOP(1, FMT_S),
9415     OPC_MUL_S = FOP(2, FMT_S),
9416     OPC_DIV_S = FOP(3, FMT_S),
9417     OPC_SQRT_S = FOP(4, FMT_S),
9418     OPC_ABS_S = FOP(5, FMT_S),
9419     OPC_MOV_S = FOP(6, FMT_S),
9420     OPC_NEG_S = FOP(7, FMT_S),
9421     OPC_ROUND_L_S = FOP(8, FMT_S),
9422     OPC_TRUNC_L_S = FOP(9, FMT_S),
9423     OPC_CEIL_L_S = FOP(10, FMT_S),
9424     OPC_FLOOR_L_S = FOP(11, FMT_S),
9425     OPC_ROUND_W_S = FOP(12, FMT_S),
9426     OPC_TRUNC_W_S = FOP(13, FMT_S),
9427     OPC_CEIL_W_S = FOP(14, FMT_S),
9428     OPC_FLOOR_W_S = FOP(15, FMT_S),
9429     OPC_SEL_S = FOP(16, FMT_S),
9430     OPC_MOVCF_S = FOP(17, FMT_S),
9431     OPC_MOVZ_S = FOP(18, FMT_S),
9432     OPC_MOVN_S = FOP(19, FMT_S),
9433     OPC_SELEQZ_S = FOP(20, FMT_S),
9434     OPC_RECIP_S = FOP(21, FMT_S),
9435     OPC_RSQRT_S = FOP(22, FMT_S),
9436     OPC_SELNEZ_S = FOP(23, FMT_S),
9437     OPC_MADDF_S = FOP(24, FMT_S),
9438     OPC_MSUBF_S = FOP(25, FMT_S),
9439     OPC_RINT_S = FOP(26, FMT_S),
9440     OPC_CLASS_S = FOP(27, FMT_S),
9441     OPC_MIN_S = FOP(28, FMT_S),
9442     OPC_RECIP2_S = FOP(28, FMT_S),
9443     OPC_MINA_S = FOP(29, FMT_S),
9444     OPC_RECIP1_S = FOP(29, FMT_S),
9445     OPC_MAX_S = FOP(30, FMT_S),
9446     OPC_RSQRT1_S = FOP(30, FMT_S),
9447     OPC_MAXA_S = FOP(31, FMT_S),
9448     OPC_RSQRT2_S = FOP(31, FMT_S),
9449     OPC_CVT_D_S = FOP(33, FMT_S),
9450     OPC_CVT_W_S = FOP(36, FMT_S),
9451     OPC_CVT_L_S = FOP(37, FMT_S),
9452     OPC_CVT_PS_S = FOP(38, FMT_S),
9453     OPC_CMP_F_S = FOP(48, FMT_S),
9454     OPC_CMP_UN_S = FOP(49, FMT_S),
9455     OPC_CMP_EQ_S = FOP(50, FMT_S),
9456     OPC_CMP_UEQ_S = FOP(51, FMT_S),
9457     OPC_CMP_OLT_S = FOP(52, FMT_S),
9458     OPC_CMP_ULT_S = FOP(53, FMT_S),
9459     OPC_CMP_OLE_S = FOP(54, FMT_S),
9460     OPC_CMP_ULE_S = FOP(55, FMT_S),
9461     OPC_CMP_SF_S = FOP(56, FMT_S),
9462     OPC_CMP_NGLE_S = FOP(57, FMT_S),
9463     OPC_CMP_SEQ_S = FOP(58, FMT_S),
9464     OPC_CMP_NGL_S = FOP(59, FMT_S),
9465     OPC_CMP_LT_S = FOP(60, FMT_S),
9466     OPC_CMP_NGE_S = FOP(61, FMT_S),
9467     OPC_CMP_LE_S = FOP(62, FMT_S),
9468     OPC_CMP_NGT_S = FOP(63, FMT_S),
9469 
9470     OPC_ADD_D = FOP(0, FMT_D),
9471     OPC_SUB_D = FOP(1, FMT_D),
9472     OPC_MUL_D = FOP(2, FMT_D),
9473     OPC_DIV_D = FOP(3, FMT_D),
9474     OPC_SQRT_D = FOP(4, FMT_D),
9475     OPC_ABS_D = FOP(5, FMT_D),
9476     OPC_MOV_D = FOP(6, FMT_D),
9477     OPC_NEG_D = FOP(7, FMT_D),
9478     OPC_ROUND_L_D = FOP(8, FMT_D),
9479     OPC_TRUNC_L_D = FOP(9, FMT_D),
9480     OPC_CEIL_L_D = FOP(10, FMT_D),
9481     OPC_FLOOR_L_D = FOP(11, FMT_D),
9482     OPC_ROUND_W_D = FOP(12, FMT_D),
9483     OPC_TRUNC_W_D = FOP(13, FMT_D),
9484     OPC_CEIL_W_D = FOP(14, FMT_D),
9485     OPC_FLOOR_W_D = FOP(15, FMT_D),
9486     OPC_SEL_D = FOP(16, FMT_D),
9487     OPC_MOVCF_D = FOP(17, FMT_D),
9488     OPC_MOVZ_D = FOP(18, FMT_D),
9489     OPC_MOVN_D = FOP(19, FMT_D),
9490     OPC_SELEQZ_D = FOP(20, FMT_D),
9491     OPC_RECIP_D = FOP(21, FMT_D),
9492     OPC_RSQRT_D = FOP(22, FMT_D),
9493     OPC_SELNEZ_D = FOP(23, FMT_D),
9494     OPC_MADDF_D = FOP(24, FMT_D),
9495     OPC_MSUBF_D = FOP(25, FMT_D),
9496     OPC_RINT_D = FOP(26, FMT_D),
9497     OPC_CLASS_D = FOP(27, FMT_D),
9498     OPC_MIN_D = FOP(28, FMT_D),
9499     OPC_RECIP2_D = FOP(28, FMT_D),
9500     OPC_MINA_D = FOP(29, FMT_D),
9501     OPC_RECIP1_D = FOP(29, FMT_D),
9502     OPC_MAX_D = FOP(30, FMT_D),
9503     OPC_RSQRT1_D = FOP(30, FMT_D),
9504     OPC_MAXA_D = FOP(31, FMT_D),
9505     OPC_RSQRT2_D = FOP(31, FMT_D),
9506     OPC_CVT_S_D = FOP(32, FMT_D),
9507     OPC_CVT_W_D = FOP(36, FMT_D),
9508     OPC_CVT_L_D = FOP(37, FMT_D),
9509     OPC_CMP_F_D = FOP(48, FMT_D),
9510     OPC_CMP_UN_D = FOP(49, FMT_D),
9511     OPC_CMP_EQ_D = FOP(50, FMT_D),
9512     OPC_CMP_UEQ_D = FOP(51, FMT_D),
9513     OPC_CMP_OLT_D = FOP(52, FMT_D),
9514     OPC_CMP_ULT_D = FOP(53, FMT_D),
9515     OPC_CMP_OLE_D = FOP(54, FMT_D),
9516     OPC_CMP_ULE_D = FOP(55, FMT_D),
9517     OPC_CMP_SF_D = FOP(56, FMT_D),
9518     OPC_CMP_NGLE_D = FOP(57, FMT_D),
9519     OPC_CMP_SEQ_D = FOP(58, FMT_D),
9520     OPC_CMP_NGL_D = FOP(59, FMT_D),
9521     OPC_CMP_LT_D = FOP(60, FMT_D),
9522     OPC_CMP_NGE_D = FOP(61, FMT_D),
9523     OPC_CMP_LE_D = FOP(62, FMT_D),
9524     OPC_CMP_NGT_D = FOP(63, FMT_D),
9525 
9526     OPC_CVT_S_W = FOP(32, FMT_W),
9527     OPC_CVT_D_W = FOP(33, FMT_W),
9528     OPC_CVT_S_L = FOP(32, FMT_L),
9529     OPC_CVT_D_L = FOP(33, FMT_L),
9530     OPC_CVT_PS_PW = FOP(38, FMT_W),
9531 
9532     OPC_ADD_PS = FOP(0, FMT_PS),
9533     OPC_SUB_PS = FOP(1, FMT_PS),
9534     OPC_MUL_PS = FOP(2, FMT_PS),
9535     OPC_DIV_PS = FOP(3, FMT_PS),
9536     OPC_ABS_PS = FOP(5, FMT_PS),
9537     OPC_MOV_PS = FOP(6, FMT_PS),
9538     OPC_NEG_PS = FOP(7, FMT_PS),
9539     OPC_MOVCF_PS = FOP(17, FMT_PS),
9540     OPC_MOVZ_PS = FOP(18, FMT_PS),
9541     OPC_MOVN_PS = FOP(19, FMT_PS),
9542     OPC_ADDR_PS = FOP(24, FMT_PS),
9543     OPC_MULR_PS = FOP(26, FMT_PS),
9544     OPC_RECIP2_PS = FOP(28, FMT_PS),
9545     OPC_RECIP1_PS = FOP(29, FMT_PS),
9546     OPC_RSQRT1_PS = FOP(30, FMT_PS),
9547     OPC_RSQRT2_PS = FOP(31, FMT_PS),
9548 
9549     OPC_CVT_S_PU = FOP(32, FMT_PS),
9550     OPC_CVT_PW_PS = FOP(36, FMT_PS),
9551     OPC_CVT_S_PL = FOP(40, FMT_PS),
9552     OPC_PLL_PS = FOP(44, FMT_PS),
9553     OPC_PLU_PS = FOP(45, FMT_PS),
9554     OPC_PUL_PS = FOP(46, FMT_PS),
9555     OPC_PUU_PS = FOP(47, FMT_PS),
9556     OPC_CMP_F_PS = FOP(48, FMT_PS),
9557     OPC_CMP_UN_PS = FOP(49, FMT_PS),
9558     OPC_CMP_EQ_PS = FOP(50, FMT_PS),
9559     OPC_CMP_UEQ_PS = FOP(51, FMT_PS),
9560     OPC_CMP_OLT_PS = FOP(52, FMT_PS),
9561     OPC_CMP_ULT_PS = FOP(53, FMT_PS),
9562     OPC_CMP_OLE_PS = FOP(54, FMT_PS),
9563     OPC_CMP_ULE_PS = FOP(55, FMT_PS),
9564     OPC_CMP_SF_PS = FOP(56, FMT_PS),
9565     OPC_CMP_NGLE_PS = FOP(57, FMT_PS),
9566     OPC_CMP_SEQ_PS = FOP(58, FMT_PS),
9567     OPC_CMP_NGL_PS = FOP(59, FMT_PS),
9568     OPC_CMP_LT_PS = FOP(60, FMT_PS),
9569     OPC_CMP_NGE_PS = FOP(61, FMT_PS),
9570     OPC_CMP_LE_PS = FOP(62, FMT_PS),
9571     OPC_CMP_NGT_PS = FOP(63, FMT_PS),
9572 };
9573 
9574 enum r6_f_cmp_op {
9575     R6_OPC_CMP_AF_S   = FOP(0, FMT_W),
9576     R6_OPC_CMP_UN_S   = FOP(1, FMT_W),
9577     R6_OPC_CMP_EQ_S   = FOP(2, FMT_W),
9578     R6_OPC_CMP_UEQ_S  = FOP(3, FMT_W),
9579     R6_OPC_CMP_LT_S   = FOP(4, FMT_W),
9580     R6_OPC_CMP_ULT_S  = FOP(5, FMT_W),
9581     R6_OPC_CMP_LE_S   = FOP(6, FMT_W),
9582     R6_OPC_CMP_ULE_S  = FOP(7, FMT_W),
9583     R6_OPC_CMP_SAF_S  = FOP(8, FMT_W),
9584     R6_OPC_CMP_SUN_S  = FOP(9, FMT_W),
9585     R6_OPC_CMP_SEQ_S  = FOP(10, FMT_W),
9586     R6_OPC_CMP_SEUQ_S = FOP(11, FMT_W),
9587     R6_OPC_CMP_SLT_S  = FOP(12, FMT_W),
9588     R6_OPC_CMP_SULT_S = FOP(13, FMT_W),
9589     R6_OPC_CMP_SLE_S  = FOP(14, FMT_W),
9590     R6_OPC_CMP_SULE_S = FOP(15, FMT_W),
9591     R6_OPC_CMP_OR_S   = FOP(17, FMT_W),
9592     R6_OPC_CMP_UNE_S  = FOP(18, FMT_W),
9593     R6_OPC_CMP_NE_S   = FOP(19, FMT_W),
9594     R6_OPC_CMP_SOR_S  = FOP(25, FMT_W),
9595     R6_OPC_CMP_SUNE_S = FOP(26, FMT_W),
9596     R6_OPC_CMP_SNE_S  = FOP(27, FMT_W),
9597 
9598     R6_OPC_CMP_AF_D   = FOP(0, FMT_L),
9599     R6_OPC_CMP_UN_D   = FOP(1, FMT_L),
9600     R6_OPC_CMP_EQ_D   = FOP(2, FMT_L),
9601     R6_OPC_CMP_UEQ_D  = FOP(3, FMT_L),
9602     R6_OPC_CMP_LT_D   = FOP(4, FMT_L),
9603     R6_OPC_CMP_ULT_D  = FOP(5, FMT_L),
9604     R6_OPC_CMP_LE_D   = FOP(6, FMT_L),
9605     R6_OPC_CMP_ULE_D  = FOP(7, FMT_L),
9606     R6_OPC_CMP_SAF_D  = FOP(8, FMT_L),
9607     R6_OPC_CMP_SUN_D  = FOP(9, FMT_L),
9608     R6_OPC_CMP_SEQ_D  = FOP(10, FMT_L),
9609     R6_OPC_CMP_SEUQ_D = FOP(11, FMT_L),
9610     R6_OPC_CMP_SLT_D  = FOP(12, FMT_L),
9611     R6_OPC_CMP_SULT_D = FOP(13, FMT_L),
9612     R6_OPC_CMP_SLE_D  = FOP(14, FMT_L),
9613     R6_OPC_CMP_SULE_D = FOP(15, FMT_L),
9614     R6_OPC_CMP_OR_D   = FOP(17, FMT_L),
9615     R6_OPC_CMP_UNE_D  = FOP(18, FMT_L),
9616     R6_OPC_CMP_NE_D   = FOP(19, FMT_L),
9617     R6_OPC_CMP_SOR_D  = FOP(25, FMT_L),
9618     R6_OPC_CMP_SUNE_D = FOP(26, FMT_L),
9619     R6_OPC_CMP_SNE_D  = FOP(27, FMT_L),
9620 };
9621 
9622 static void gen_cp1(DisasContext *ctx, uint32_t opc, int rt, int fs)
9623 {
9624     TCGv t0 = tcg_temp_new();
9625 
9626     switch (opc) {
9627     case OPC_MFC1:
9628         {
9629             TCGv_i32 fp0 = tcg_temp_new_i32();
9630 
9631             gen_load_fpr32(ctx, fp0, fs);
9632             tcg_gen_ext_i32_tl(t0, fp0);
9633             tcg_temp_free_i32(fp0);
9634         }
9635         gen_store_gpr(t0, rt);
9636         break;
9637     case OPC_MTC1:
9638         gen_load_gpr(t0, rt);
9639         {
9640             TCGv_i32 fp0 = tcg_temp_new_i32();
9641 
9642             tcg_gen_trunc_tl_i32(fp0, t0);
9643             gen_store_fpr32(ctx, fp0, fs);
9644             tcg_temp_free_i32(fp0);
9645         }
9646         break;
9647     case OPC_CFC1:
9648         gen_helper_1e0i(cfc1, t0, fs);
9649         gen_store_gpr(t0, rt);
9650         break;
9651     case OPC_CTC1:
9652         gen_load_gpr(t0, rt);
9653         save_cpu_state(ctx, 0);
9654         gen_helper_0e2i(ctc1, t0, tcg_constant_i32(fs), rt);
9655         /* Stop translation as we may have changed hflags */
9656         ctx->base.is_jmp = DISAS_STOP;
9657         break;
9658 #if defined(TARGET_MIPS64)
9659     case OPC_DMFC1:
9660         gen_load_fpr64(ctx, t0, fs);
9661         gen_store_gpr(t0, rt);
9662         break;
9663     case OPC_DMTC1:
9664         gen_load_gpr(t0, rt);
9665         gen_store_fpr64(ctx, t0, fs);
9666         break;
9667 #endif
9668     case OPC_MFHC1:
9669         {
9670             TCGv_i32 fp0 = tcg_temp_new_i32();
9671 
9672             gen_load_fpr32h(ctx, fp0, fs);
9673             tcg_gen_ext_i32_tl(t0, fp0);
9674             tcg_temp_free_i32(fp0);
9675         }
9676         gen_store_gpr(t0, rt);
9677         break;
9678     case OPC_MTHC1:
9679         gen_load_gpr(t0, rt);
9680         {
9681             TCGv_i32 fp0 = tcg_temp_new_i32();
9682 
9683             tcg_gen_trunc_tl_i32(fp0, t0);
9684             gen_store_fpr32h(ctx, fp0, fs);
9685             tcg_temp_free_i32(fp0);
9686         }
9687         break;
9688     default:
9689         MIPS_INVAL("cp1 move");
9690         gen_reserved_instruction(ctx);
9691         goto out;
9692     }
9693 
9694  out:
9695     tcg_temp_free(t0);
9696 }
9697 
9698 static void gen_movci(DisasContext *ctx, int rd, int rs, int cc, int tf)
9699 {
9700     TCGLabel *l1;
9701     TCGCond cond;
9702     TCGv_i32 t0;
9703 
9704     if (rd == 0) {
9705         /* Treat as NOP. */
9706         return;
9707     }
9708 
9709     if (tf) {
9710         cond = TCG_COND_EQ;
9711     } else {
9712         cond = TCG_COND_NE;
9713     }
9714 
9715     l1 = gen_new_label();
9716     t0 = tcg_temp_new_i32();
9717     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
9718     tcg_gen_brcondi_i32(cond, t0, 0, l1);
9719     tcg_temp_free_i32(t0);
9720     gen_load_gpr(cpu_gpr[rd], rs);
9721     gen_set_label(l1);
9722 }
9723 
9724 static inline void gen_movcf_s(DisasContext *ctx, int fs, int fd, int cc,
9725                                int tf)
9726 {
9727     int cond;
9728     TCGv_i32 t0 = tcg_temp_new_i32();
9729     TCGLabel *l1 = gen_new_label();
9730 
9731     if (tf) {
9732         cond = TCG_COND_EQ;
9733     } else {
9734         cond = TCG_COND_NE;
9735     }
9736 
9737     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
9738     tcg_gen_brcondi_i32(cond, t0, 0, l1);
9739     gen_load_fpr32(ctx, t0, fs);
9740     gen_store_fpr32(ctx, t0, fd);
9741     gen_set_label(l1);
9742     tcg_temp_free_i32(t0);
9743 }
9744 
9745 static inline void gen_movcf_d(DisasContext *ctx, int fs, int fd, int cc,
9746                                int tf)
9747 {
9748     int cond;
9749     TCGv_i32 t0 = tcg_temp_new_i32();
9750     TCGv_i64 fp0;
9751     TCGLabel *l1 = gen_new_label();
9752 
9753     if (tf) {
9754         cond = TCG_COND_EQ;
9755     } else {
9756         cond = TCG_COND_NE;
9757     }
9758 
9759     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
9760     tcg_gen_brcondi_i32(cond, t0, 0, l1);
9761     tcg_temp_free_i32(t0);
9762     fp0 = tcg_temp_new_i64();
9763     gen_load_fpr64(ctx, fp0, fs);
9764     gen_store_fpr64(ctx, fp0, fd);
9765     tcg_temp_free_i64(fp0);
9766     gen_set_label(l1);
9767 }
9768 
9769 static inline void gen_movcf_ps(DisasContext *ctx, int fs, int fd,
9770                                 int cc, int tf)
9771 {
9772     int cond;
9773     TCGv_i32 t0 = tcg_temp_new_i32();
9774     TCGLabel *l1 = gen_new_label();
9775     TCGLabel *l2 = gen_new_label();
9776 
9777     if (tf) {
9778         cond = TCG_COND_EQ;
9779     } else {
9780         cond = TCG_COND_NE;
9781     }
9782 
9783     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
9784     tcg_gen_brcondi_i32(cond, t0, 0, l1);
9785     gen_load_fpr32(ctx, t0, fs);
9786     gen_store_fpr32(ctx, t0, fd);
9787     gen_set_label(l1);
9788 
9789     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc + 1));
9790     tcg_gen_brcondi_i32(cond, t0, 0, l2);
9791     gen_load_fpr32h(ctx, t0, fs);
9792     gen_store_fpr32h(ctx, t0, fd);
9793     tcg_temp_free_i32(t0);
9794     gen_set_label(l2);
9795 }
9796 
9797 static void gen_sel_s(DisasContext *ctx, enum fopcode op1, int fd, int ft,
9798                       int fs)
9799 {
9800     TCGv_i32 t1 = tcg_const_i32(0);
9801     TCGv_i32 fp0 = tcg_temp_new_i32();
9802     TCGv_i32 fp1 = tcg_temp_new_i32();
9803     TCGv_i32 fp2 = tcg_temp_new_i32();
9804     gen_load_fpr32(ctx, fp0, fd);
9805     gen_load_fpr32(ctx, fp1, ft);
9806     gen_load_fpr32(ctx, fp2, fs);
9807 
9808     switch (op1) {
9809     case OPC_SEL_S:
9810         tcg_gen_andi_i32(fp0, fp0, 1);
9811         tcg_gen_movcond_i32(TCG_COND_NE, fp0, fp0, t1, fp1, fp2);
9812         break;
9813     case OPC_SELEQZ_S:
9814         tcg_gen_andi_i32(fp1, fp1, 1);
9815         tcg_gen_movcond_i32(TCG_COND_EQ, fp0, fp1, t1, fp2, t1);
9816         break;
9817     case OPC_SELNEZ_S:
9818         tcg_gen_andi_i32(fp1, fp1, 1);
9819         tcg_gen_movcond_i32(TCG_COND_NE, fp0, fp1, t1, fp2, t1);
9820         break;
9821     default:
9822         MIPS_INVAL("gen_sel_s");
9823         gen_reserved_instruction(ctx);
9824         break;
9825     }
9826 
9827     gen_store_fpr32(ctx, fp0, fd);
9828     tcg_temp_free_i32(fp2);
9829     tcg_temp_free_i32(fp1);
9830     tcg_temp_free_i32(fp0);
9831     tcg_temp_free_i32(t1);
9832 }
9833 
9834 static void gen_sel_d(DisasContext *ctx, enum fopcode op1, int fd, int ft,
9835                       int fs)
9836 {
9837     TCGv_i64 t1 = tcg_const_i64(0);
9838     TCGv_i64 fp0 = tcg_temp_new_i64();
9839     TCGv_i64 fp1 = tcg_temp_new_i64();
9840     TCGv_i64 fp2 = tcg_temp_new_i64();
9841     gen_load_fpr64(ctx, fp0, fd);
9842     gen_load_fpr64(ctx, fp1, ft);
9843     gen_load_fpr64(ctx, fp2, fs);
9844 
9845     switch (op1) {
9846     case OPC_SEL_D:
9847         tcg_gen_andi_i64(fp0, fp0, 1);
9848         tcg_gen_movcond_i64(TCG_COND_NE, fp0, fp0, t1, fp1, fp2);
9849         break;
9850     case OPC_SELEQZ_D:
9851         tcg_gen_andi_i64(fp1, fp1, 1);
9852         tcg_gen_movcond_i64(TCG_COND_EQ, fp0, fp1, t1, fp2, t1);
9853         break;
9854     case OPC_SELNEZ_D:
9855         tcg_gen_andi_i64(fp1, fp1, 1);
9856         tcg_gen_movcond_i64(TCG_COND_NE, fp0, fp1, t1, fp2, t1);
9857         break;
9858     default:
9859         MIPS_INVAL("gen_sel_d");
9860         gen_reserved_instruction(ctx);
9861         break;
9862     }
9863 
9864     gen_store_fpr64(ctx, fp0, fd);
9865     tcg_temp_free_i64(fp2);
9866     tcg_temp_free_i64(fp1);
9867     tcg_temp_free_i64(fp0);
9868     tcg_temp_free_i64(t1);
9869 }
9870 
9871 static void gen_farith(DisasContext *ctx, enum fopcode op1,
9872                        int ft, int fs, int fd, int cc)
9873 {
9874     uint32_t func = ctx->opcode & 0x3f;
9875     switch (op1) {
9876     case OPC_ADD_S:
9877         {
9878             TCGv_i32 fp0 = tcg_temp_new_i32();
9879             TCGv_i32 fp1 = tcg_temp_new_i32();
9880 
9881             gen_load_fpr32(ctx, fp0, fs);
9882             gen_load_fpr32(ctx, fp1, ft);
9883             gen_helper_float_add_s(fp0, cpu_env, fp0, fp1);
9884             tcg_temp_free_i32(fp1);
9885             gen_store_fpr32(ctx, fp0, fd);
9886             tcg_temp_free_i32(fp0);
9887         }
9888         break;
9889     case OPC_SUB_S:
9890         {
9891             TCGv_i32 fp0 = tcg_temp_new_i32();
9892             TCGv_i32 fp1 = tcg_temp_new_i32();
9893 
9894             gen_load_fpr32(ctx, fp0, fs);
9895             gen_load_fpr32(ctx, fp1, ft);
9896             gen_helper_float_sub_s(fp0, cpu_env, fp0, fp1);
9897             tcg_temp_free_i32(fp1);
9898             gen_store_fpr32(ctx, fp0, fd);
9899             tcg_temp_free_i32(fp0);
9900         }
9901         break;
9902     case OPC_MUL_S:
9903         {
9904             TCGv_i32 fp0 = tcg_temp_new_i32();
9905             TCGv_i32 fp1 = tcg_temp_new_i32();
9906 
9907             gen_load_fpr32(ctx, fp0, fs);
9908             gen_load_fpr32(ctx, fp1, ft);
9909             gen_helper_float_mul_s(fp0, cpu_env, fp0, fp1);
9910             tcg_temp_free_i32(fp1);
9911             gen_store_fpr32(ctx, fp0, fd);
9912             tcg_temp_free_i32(fp0);
9913         }
9914         break;
9915     case OPC_DIV_S:
9916         {
9917             TCGv_i32 fp0 = tcg_temp_new_i32();
9918             TCGv_i32 fp1 = tcg_temp_new_i32();
9919 
9920             gen_load_fpr32(ctx, fp0, fs);
9921             gen_load_fpr32(ctx, fp1, ft);
9922             gen_helper_float_div_s(fp0, cpu_env, fp0, fp1);
9923             tcg_temp_free_i32(fp1);
9924             gen_store_fpr32(ctx, fp0, fd);
9925             tcg_temp_free_i32(fp0);
9926         }
9927         break;
9928     case OPC_SQRT_S:
9929         {
9930             TCGv_i32 fp0 = tcg_temp_new_i32();
9931 
9932             gen_load_fpr32(ctx, fp0, fs);
9933             gen_helper_float_sqrt_s(fp0, cpu_env, fp0);
9934             gen_store_fpr32(ctx, fp0, fd);
9935             tcg_temp_free_i32(fp0);
9936         }
9937         break;
9938     case OPC_ABS_S:
9939         {
9940             TCGv_i32 fp0 = tcg_temp_new_i32();
9941 
9942             gen_load_fpr32(ctx, fp0, fs);
9943             if (ctx->abs2008) {
9944                 tcg_gen_andi_i32(fp0, fp0, 0x7fffffffUL);
9945             } else {
9946                 gen_helper_float_abs_s(fp0, fp0);
9947             }
9948             gen_store_fpr32(ctx, fp0, fd);
9949             tcg_temp_free_i32(fp0);
9950         }
9951         break;
9952     case OPC_MOV_S:
9953         {
9954             TCGv_i32 fp0 = tcg_temp_new_i32();
9955 
9956             gen_load_fpr32(ctx, fp0, fs);
9957             gen_store_fpr32(ctx, fp0, fd);
9958             tcg_temp_free_i32(fp0);
9959         }
9960         break;
9961     case OPC_NEG_S:
9962         {
9963             TCGv_i32 fp0 = tcg_temp_new_i32();
9964 
9965             gen_load_fpr32(ctx, fp0, fs);
9966             if (ctx->abs2008) {
9967                 tcg_gen_xori_i32(fp0, fp0, 1UL << 31);
9968             } else {
9969                 gen_helper_float_chs_s(fp0, fp0);
9970             }
9971             gen_store_fpr32(ctx, fp0, fd);
9972             tcg_temp_free_i32(fp0);
9973         }
9974         break;
9975     case OPC_ROUND_L_S:
9976         check_cp1_64bitmode(ctx);
9977         {
9978             TCGv_i32 fp32 = tcg_temp_new_i32();
9979             TCGv_i64 fp64 = tcg_temp_new_i64();
9980 
9981             gen_load_fpr32(ctx, fp32, fs);
9982             if (ctx->nan2008) {
9983                 gen_helper_float_round_2008_l_s(fp64, cpu_env, fp32);
9984             } else {
9985                 gen_helper_float_round_l_s(fp64, cpu_env, fp32);
9986             }
9987             tcg_temp_free_i32(fp32);
9988             gen_store_fpr64(ctx, fp64, fd);
9989             tcg_temp_free_i64(fp64);
9990         }
9991         break;
9992     case OPC_TRUNC_L_S:
9993         check_cp1_64bitmode(ctx);
9994         {
9995             TCGv_i32 fp32 = tcg_temp_new_i32();
9996             TCGv_i64 fp64 = tcg_temp_new_i64();
9997 
9998             gen_load_fpr32(ctx, fp32, fs);
9999             if (ctx->nan2008) {
10000                 gen_helper_float_trunc_2008_l_s(fp64, cpu_env, fp32);
10001             } else {
10002                 gen_helper_float_trunc_l_s(fp64, cpu_env, fp32);
10003             }
10004             tcg_temp_free_i32(fp32);
10005             gen_store_fpr64(ctx, fp64, fd);
10006             tcg_temp_free_i64(fp64);
10007         }
10008         break;
10009     case OPC_CEIL_L_S:
10010         check_cp1_64bitmode(ctx);
10011         {
10012             TCGv_i32 fp32 = tcg_temp_new_i32();
10013             TCGv_i64 fp64 = tcg_temp_new_i64();
10014 
10015             gen_load_fpr32(ctx, fp32, fs);
10016             if (ctx->nan2008) {
10017                 gen_helper_float_ceil_2008_l_s(fp64, cpu_env, fp32);
10018             } else {
10019                 gen_helper_float_ceil_l_s(fp64, cpu_env, fp32);
10020             }
10021             tcg_temp_free_i32(fp32);
10022             gen_store_fpr64(ctx, fp64, fd);
10023             tcg_temp_free_i64(fp64);
10024         }
10025         break;
10026     case OPC_FLOOR_L_S:
10027         check_cp1_64bitmode(ctx);
10028         {
10029             TCGv_i32 fp32 = tcg_temp_new_i32();
10030             TCGv_i64 fp64 = tcg_temp_new_i64();
10031 
10032             gen_load_fpr32(ctx, fp32, fs);
10033             if (ctx->nan2008) {
10034                 gen_helper_float_floor_2008_l_s(fp64, cpu_env, fp32);
10035             } else {
10036                 gen_helper_float_floor_l_s(fp64, cpu_env, fp32);
10037             }
10038             tcg_temp_free_i32(fp32);
10039             gen_store_fpr64(ctx, fp64, fd);
10040             tcg_temp_free_i64(fp64);
10041         }
10042         break;
10043     case OPC_ROUND_W_S:
10044         {
10045             TCGv_i32 fp0 = tcg_temp_new_i32();
10046 
10047             gen_load_fpr32(ctx, fp0, fs);
10048             if (ctx->nan2008) {
10049                 gen_helper_float_round_2008_w_s(fp0, cpu_env, fp0);
10050             } else {
10051                 gen_helper_float_round_w_s(fp0, cpu_env, fp0);
10052             }
10053             gen_store_fpr32(ctx, fp0, fd);
10054             tcg_temp_free_i32(fp0);
10055         }
10056         break;
10057     case OPC_TRUNC_W_S:
10058         {
10059             TCGv_i32 fp0 = tcg_temp_new_i32();
10060 
10061             gen_load_fpr32(ctx, fp0, fs);
10062             if (ctx->nan2008) {
10063                 gen_helper_float_trunc_2008_w_s(fp0, cpu_env, fp0);
10064             } else {
10065                 gen_helper_float_trunc_w_s(fp0, cpu_env, fp0);
10066             }
10067             gen_store_fpr32(ctx, fp0, fd);
10068             tcg_temp_free_i32(fp0);
10069         }
10070         break;
10071     case OPC_CEIL_W_S:
10072         {
10073             TCGv_i32 fp0 = tcg_temp_new_i32();
10074 
10075             gen_load_fpr32(ctx, fp0, fs);
10076             if (ctx->nan2008) {
10077                 gen_helper_float_ceil_2008_w_s(fp0, cpu_env, fp0);
10078             } else {
10079                 gen_helper_float_ceil_w_s(fp0, cpu_env, fp0);
10080             }
10081             gen_store_fpr32(ctx, fp0, fd);
10082             tcg_temp_free_i32(fp0);
10083         }
10084         break;
10085     case OPC_FLOOR_W_S:
10086         {
10087             TCGv_i32 fp0 = tcg_temp_new_i32();
10088 
10089             gen_load_fpr32(ctx, fp0, fs);
10090             if (ctx->nan2008) {
10091                 gen_helper_float_floor_2008_w_s(fp0, cpu_env, fp0);
10092             } else {
10093                 gen_helper_float_floor_w_s(fp0, cpu_env, fp0);
10094             }
10095             gen_store_fpr32(ctx, fp0, fd);
10096             tcg_temp_free_i32(fp0);
10097         }
10098         break;
10099     case OPC_SEL_S:
10100         check_insn(ctx, ISA_MIPS_R6);
10101         gen_sel_s(ctx, op1, fd, ft, fs);
10102         break;
10103     case OPC_SELEQZ_S:
10104         check_insn(ctx, ISA_MIPS_R6);
10105         gen_sel_s(ctx, op1, fd, ft, fs);
10106         break;
10107     case OPC_SELNEZ_S:
10108         check_insn(ctx, ISA_MIPS_R6);
10109         gen_sel_s(ctx, op1, fd, ft, fs);
10110         break;
10111     case OPC_MOVCF_S:
10112         check_insn_opc_removed(ctx, ISA_MIPS_R6);
10113         gen_movcf_s(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1);
10114         break;
10115     case OPC_MOVZ_S:
10116         check_insn_opc_removed(ctx, ISA_MIPS_R6);
10117         {
10118             TCGLabel *l1 = gen_new_label();
10119             TCGv_i32 fp0;
10120 
10121             if (ft != 0) {
10122                 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
10123             }
10124             fp0 = tcg_temp_new_i32();
10125             gen_load_fpr32(ctx, fp0, fs);
10126             gen_store_fpr32(ctx, fp0, fd);
10127             tcg_temp_free_i32(fp0);
10128             gen_set_label(l1);
10129         }
10130         break;
10131     case OPC_MOVN_S:
10132         check_insn_opc_removed(ctx, ISA_MIPS_R6);
10133         {
10134             TCGLabel *l1 = gen_new_label();
10135             TCGv_i32 fp0;
10136 
10137             if (ft != 0) {
10138                 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
10139                 fp0 = tcg_temp_new_i32();
10140                 gen_load_fpr32(ctx, fp0, fs);
10141                 gen_store_fpr32(ctx, fp0, fd);
10142                 tcg_temp_free_i32(fp0);
10143                 gen_set_label(l1);
10144             }
10145         }
10146         break;
10147     case OPC_RECIP_S:
10148         {
10149             TCGv_i32 fp0 = tcg_temp_new_i32();
10150 
10151             gen_load_fpr32(ctx, fp0, fs);
10152             gen_helper_float_recip_s(fp0, cpu_env, fp0);
10153             gen_store_fpr32(ctx, fp0, fd);
10154             tcg_temp_free_i32(fp0);
10155         }
10156         break;
10157     case OPC_RSQRT_S:
10158         {
10159             TCGv_i32 fp0 = tcg_temp_new_i32();
10160 
10161             gen_load_fpr32(ctx, fp0, fs);
10162             gen_helper_float_rsqrt_s(fp0, cpu_env, fp0);
10163             gen_store_fpr32(ctx, fp0, fd);
10164             tcg_temp_free_i32(fp0);
10165         }
10166         break;
10167     case OPC_MADDF_S:
10168         check_insn(ctx, ISA_MIPS_R6);
10169         {
10170             TCGv_i32 fp0 = tcg_temp_new_i32();
10171             TCGv_i32 fp1 = tcg_temp_new_i32();
10172             TCGv_i32 fp2 = tcg_temp_new_i32();
10173             gen_load_fpr32(ctx, fp0, fs);
10174             gen_load_fpr32(ctx, fp1, ft);
10175             gen_load_fpr32(ctx, fp2, fd);
10176             gen_helper_float_maddf_s(fp2, cpu_env, fp0, fp1, fp2);
10177             gen_store_fpr32(ctx, fp2, fd);
10178             tcg_temp_free_i32(fp2);
10179             tcg_temp_free_i32(fp1);
10180             tcg_temp_free_i32(fp0);
10181         }
10182         break;
10183     case OPC_MSUBF_S:
10184         check_insn(ctx, ISA_MIPS_R6);
10185         {
10186             TCGv_i32 fp0 = tcg_temp_new_i32();
10187             TCGv_i32 fp1 = tcg_temp_new_i32();
10188             TCGv_i32 fp2 = tcg_temp_new_i32();
10189             gen_load_fpr32(ctx, fp0, fs);
10190             gen_load_fpr32(ctx, fp1, ft);
10191             gen_load_fpr32(ctx, fp2, fd);
10192             gen_helper_float_msubf_s(fp2, cpu_env, fp0, fp1, fp2);
10193             gen_store_fpr32(ctx, fp2, fd);
10194             tcg_temp_free_i32(fp2);
10195             tcg_temp_free_i32(fp1);
10196             tcg_temp_free_i32(fp0);
10197         }
10198         break;
10199     case OPC_RINT_S:
10200         check_insn(ctx, ISA_MIPS_R6);
10201         {
10202             TCGv_i32 fp0 = tcg_temp_new_i32();
10203             gen_load_fpr32(ctx, fp0, fs);
10204             gen_helper_float_rint_s(fp0, cpu_env, fp0);
10205             gen_store_fpr32(ctx, fp0, fd);
10206             tcg_temp_free_i32(fp0);
10207         }
10208         break;
10209     case OPC_CLASS_S:
10210         check_insn(ctx, ISA_MIPS_R6);
10211         {
10212             TCGv_i32 fp0 = tcg_temp_new_i32();
10213             gen_load_fpr32(ctx, fp0, fs);
10214             gen_helper_float_class_s(fp0, cpu_env, fp0);
10215             gen_store_fpr32(ctx, fp0, fd);
10216             tcg_temp_free_i32(fp0);
10217         }
10218         break;
10219     case OPC_MIN_S: /* OPC_RECIP2_S */
10220         if (ctx->insn_flags & ISA_MIPS_R6) {
10221             /* OPC_MIN_S */
10222             TCGv_i32 fp0 = tcg_temp_new_i32();
10223             TCGv_i32 fp1 = tcg_temp_new_i32();
10224             TCGv_i32 fp2 = tcg_temp_new_i32();
10225             gen_load_fpr32(ctx, fp0, fs);
10226             gen_load_fpr32(ctx, fp1, ft);
10227             gen_helper_float_min_s(fp2, cpu_env, fp0, fp1);
10228             gen_store_fpr32(ctx, fp2, fd);
10229             tcg_temp_free_i32(fp2);
10230             tcg_temp_free_i32(fp1);
10231             tcg_temp_free_i32(fp0);
10232         } else {
10233             /* OPC_RECIP2_S */
10234             check_cp1_64bitmode(ctx);
10235             {
10236                 TCGv_i32 fp0 = tcg_temp_new_i32();
10237                 TCGv_i32 fp1 = tcg_temp_new_i32();
10238 
10239                 gen_load_fpr32(ctx, fp0, fs);
10240                 gen_load_fpr32(ctx, fp1, ft);
10241                 gen_helper_float_recip2_s(fp0, cpu_env, fp0, fp1);
10242                 tcg_temp_free_i32(fp1);
10243                 gen_store_fpr32(ctx, fp0, fd);
10244                 tcg_temp_free_i32(fp0);
10245             }
10246         }
10247         break;
10248     case OPC_MINA_S: /* OPC_RECIP1_S */
10249         if (ctx->insn_flags & ISA_MIPS_R6) {
10250             /* OPC_MINA_S */
10251             TCGv_i32 fp0 = tcg_temp_new_i32();
10252             TCGv_i32 fp1 = tcg_temp_new_i32();
10253             TCGv_i32 fp2 = tcg_temp_new_i32();
10254             gen_load_fpr32(ctx, fp0, fs);
10255             gen_load_fpr32(ctx, fp1, ft);
10256             gen_helper_float_mina_s(fp2, cpu_env, fp0, fp1);
10257             gen_store_fpr32(ctx, fp2, fd);
10258             tcg_temp_free_i32(fp2);
10259             tcg_temp_free_i32(fp1);
10260             tcg_temp_free_i32(fp0);
10261         } else {
10262             /* OPC_RECIP1_S */
10263             check_cp1_64bitmode(ctx);
10264             {
10265                 TCGv_i32 fp0 = tcg_temp_new_i32();
10266 
10267                 gen_load_fpr32(ctx, fp0, fs);
10268                 gen_helper_float_recip1_s(fp0, cpu_env, fp0);
10269                 gen_store_fpr32(ctx, fp0, fd);
10270                 tcg_temp_free_i32(fp0);
10271             }
10272         }
10273         break;
10274     case OPC_MAX_S: /* OPC_RSQRT1_S */
10275         if (ctx->insn_flags & ISA_MIPS_R6) {
10276             /* OPC_MAX_S */
10277             TCGv_i32 fp0 = tcg_temp_new_i32();
10278             TCGv_i32 fp1 = tcg_temp_new_i32();
10279             gen_load_fpr32(ctx, fp0, fs);
10280             gen_load_fpr32(ctx, fp1, ft);
10281             gen_helper_float_max_s(fp1, cpu_env, fp0, fp1);
10282             gen_store_fpr32(ctx, fp1, fd);
10283             tcg_temp_free_i32(fp1);
10284             tcg_temp_free_i32(fp0);
10285         } else {
10286             /* OPC_RSQRT1_S */
10287             check_cp1_64bitmode(ctx);
10288             {
10289                 TCGv_i32 fp0 = tcg_temp_new_i32();
10290 
10291                 gen_load_fpr32(ctx, fp0, fs);
10292                 gen_helper_float_rsqrt1_s(fp0, cpu_env, fp0);
10293                 gen_store_fpr32(ctx, fp0, fd);
10294                 tcg_temp_free_i32(fp0);
10295             }
10296         }
10297         break;
10298     case OPC_MAXA_S: /* OPC_RSQRT2_S */
10299         if (ctx->insn_flags & ISA_MIPS_R6) {
10300             /* OPC_MAXA_S */
10301             TCGv_i32 fp0 = tcg_temp_new_i32();
10302             TCGv_i32 fp1 = tcg_temp_new_i32();
10303             gen_load_fpr32(ctx, fp0, fs);
10304             gen_load_fpr32(ctx, fp1, ft);
10305             gen_helper_float_maxa_s(fp1, cpu_env, fp0, fp1);
10306             gen_store_fpr32(ctx, fp1, fd);
10307             tcg_temp_free_i32(fp1);
10308             tcg_temp_free_i32(fp0);
10309         } else {
10310             /* OPC_RSQRT2_S */
10311             check_cp1_64bitmode(ctx);
10312             {
10313                 TCGv_i32 fp0 = tcg_temp_new_i32();
10314                 TCGv_i32 fp1 = tcg_temp_new_i32();
10315 
10316                 gen_load_fpr32(ctx, fp0, fs);
10317                 gen_load_fpr32(ctx, fp1, ft);
10318                 gen_helper_float_rsqrt2_s(fp0, cpu_env, fp0, fp1);
10319                 tcg_temp_free_i32(fp1);
10320                 gen_store_fpr32(ctx, fp0, fd);
10321                 tcg_temp_free_i32(fp0);
10322             }
10323         }
10324         break;
10325     case OPC_CVT_D_S:
10326         check_cp1_registers(ctx, fd);
10327         {
10328             TCGv_i32 fp32 = tcg_temp_new_i32();
10329             TCGv_i64 fp64 = tcg_temp_new_i64();
10330 
10331             gen_load_fpr32(ctx, fp32, fs);
10332             gen_helper_float_cvtd_s(fp64, cpu_env, fp32);
10333             tcg_temp_free_i32(fp32);
10334             gen_store_fpr64(ctx, fp64, fd);
10335             tcg_temp_free_i64(fp64);
10336         }
10337         break;
10338     case OPC_CVT_W_S:
10339         {
10340             TCGv_i32 fp0 = tcg_temp_new_i32();
10341 
10342             gen_load_fpr32(ctx, fp0, fs);
10343             if (ctx->nan2008) {
10344                 gen_helper_float_cvt_2008_w_s(fp0, cpu_env, fp0);
10345             } else {
10346                 gen_helper_float_cvt_w_s(fp0, cpu_env, fp0);
10347             }
10348             gen_store_fpr32(ctx, fp0, fd);
10349             tcg_temp_free_i32(fp0);
10350         }
10351         break;
10352     case OPC_CVT_L_S:
10353         check_cp1_64bitmode(ctx);
10354         {
10355             TCGv_i32 fp32 = tcg_temp_new_i32();
10356             TCGv_i64 fp64 = tcg_temp_new_i64();
10357 
10358             gen_load_fpr32(ctx, fp32, fs);
10359             if (ctx->nan2008) {
10360                 gen_helper_float_cvt_2008_l_s(fp64, cpu_env, fp32);
10361             } else {
10362                 gen_helper_float_cvt_l_s(fp64, cpu_env, fp32);
10363             }
10364             tcg_temp_free_i32(fp32);
10365             gen_store_fpr64(ctx, fp64, fd);
10366             tcg_temp_free_i64(fp64);
10367         }
10368         break;
10369     case OPC_CVT_PS_S:
10370         check_ps(ctx);
10371         {
10372             TCGv_i64 fp64 = tcg_temp_new_i64();
10373             TCGv_i32 fp32_0 = tcg_temp_new_i32();
10374             TCGv_i32 fp32_1 = tcg_temp_new_i32();
10375 
10376             gen_load_fpr32(ctx, fp32_0, fs);
10377             gen_load_fpr32(ctx, fp32_1, ft);
10378             tcg_gen_concat_i32_i64(fp64, fp32_1, fp32_0);
10379             tcg_temp_free_i32(fp32_1);
10380             tcg_temp_free_i32(fp32_0);
10381             gen_store_fpr64(ctx, fp64, fd);
10382             tcg_temp_free_i64(fp64);
10383         }
10384         break;
10385     case OPC_CMP_F_S:
10386     case OPC_CMP_UN_S:
10387     case OPC_CMP_EQ_S:
10388     case OPC_CMP_UEQ_S:
10389     case OPC_CMP_OLT_S:
10390     case OPC_CMP_ULT_S:
10391     case OPC_CMP_OLE_S:
10392     case OPC_CMP_ULE_S:
10393     case OPC_CMP_SF_S:
10394     case OPC_CMP_NGLE_S:
10395     case OPC_CMP_SEQ_S:
10396     case OPC_CMP_NGL_S:
10397     case OPC_CMP_LT_S:
10398     case OPC_CMP_NGE_S:
10399     case OPC_CMP_LE_S:
10400     case OPC_CMP_NGT_S:
10401         check_insn_opc_removed(ctx, ISA_MIPS_R6);
10402         if (ctx->opcode & (1 << 6)) {
10403             gen_cmpabs_s(ctx, func - 48, ft, fs, cc);
10404         } else {
10405             gen_cmp_s(ctx, func - 48, ft, fs, cc);
10406         }
10407         break;
10408     case OPC_ADD_D:
10409         check_cp1_registers(ctx, fs | ft | fd);
10410         {
10411             TCGv_i64 fp0 = tcg_temp_new_i64();
10412             TCGv_i64 fp1 = tcg_temp_new_i64();
10413 
10414             gen_load_fpr64(ctx, fp0, fs);
10415             gen_load_fpr64(ctx, fp1, ft);
10416             gen_helper_float_add_d(fp0, cpu_env, fp0, fp1);
10417             tcg_temp_free_i64(fp1);
10418             gen_store_fpr64(ctx, fp0, fd);
10419             tcg_temp_free_i64(fp0);
10420         }
10421         break;
10422     case OPC_SUB_D:
10423         check_cp1_registers(ctx, fs | ft | fd);
10424         {
10425             TCGv_i64 fp0 = tcg_temp_new_i64();
10426             TCGv_i64 fp1 = tcg_temp_new_i64();
10427 
10428             gen_load_fpr64(ctx, fp0, fs);
10429             gen_load_fpr64(ctx, fp1, ft);
10430             gen_helper_float_sub_d(fp0, cpu_env, fp0, fp1);
10431             tcg_temp_free_i64(fp1);
10432             gen_store_fpr64(ctx, fp0, fd);
10433             tcg_temp_free_i64(fp0);
10434         }
10435         break;
10436     case OPC_MUL_D:
10437         check_cp1_registers(ctx, fs | ft | fd);
10438         {
10439             TCGv_i64 fp0 = tcg_temp_new_i64();
10440             TCGv_i64 fp1 = tcg_temp_new_i64();
10441 
10442             gen_load_fpr64(ctx, fp0, fs);
10443             gen_load_fpr64(ctx, fp1, ft);
10444             gen_helper_float_mul_d(fp0, cpu_env, fp0, fp1);
10445             tcg_temp_free_i64(fp1);
10446             gen_store_fpr64(ctx, fp0, fd);
10447             tcg_temp_free_i64(fp0);
10448         }
10449         break;
10450     case OPC_DIV_D:
10451         check_cp1_registers(ctx, fs | ft | fd);
10452         {
10453             TCGv_i64 fp0 = tcg_temp_new_i64();
10454             TCGv_i64 fp1 = tcg_temp_new_i64();
10455 
10456             gen_load_fpr64(ctx, fp0, fs);
10457             gen_load_fpr64(ctx, fp1, ft);
10458             gen_helper_float_div_d(fp0, cpu_env, fp0, fp1);
10459             tcg_temp_free_i64(fp1);
10460             gen_store_fpr64(ctx, fp0, fd);
10461             tcg_temp_free_i64(fp0);
10462         }
10463         break;
10464     case OPC_SQRT_D:
10465         check_cp1_registers(ctx, fs | fd);
10466         {
10467             TCGv_i64 fp0 = tcg_temp_new_i64();
10468 
10469             gen_load_fpr64(ctx, fp0, fs);
10470             gen_helper_float_sqrt_d(fp0, cpu_env, fp0);
10471             gen_store_fpr64(ctx, fp0, fd);
10472             tcg_temp_free_i64(fp0);
10473         }
10474         break;
10475     case OPC_ABS_D:
10476         check_cp1_registers(ctx, fs | fd);
10477         {
10478             TCGv_i64 fp0 = tcg_temp_new_i64();
10479 
10480             gen_load_fpr64(ctx, fp0, fs);
10481             if (ctx->abs2008) {
10482                 tcg_gen_andi_i64(fp0, fp0, 0x7fffffffffffffffULL);
10483             } else {
10484                 gen_helper_float_abs_d(fp0, fp0);
10485             }
10486             gen_store_fpr64(ctx, fp0, fd);
10487             tcg_temp_free_i64(fp0);
10488         }
10489         break;
10490     case OPC_MOV_D:
10491         check_cp1_registers(ctx, fs | fd);
10492         {
10493             TCGv_i64 fp0 = tcg_temp_new_i64();
10494 
10495             gen_load_fpr64(ctx, fp0, fs);
10496             gen_store_fpr64(ctx, fp0, fd);
10497             tcg_temp_free_i64(fp0);
10498         }
10499         break;
10500     case OPC_NEG_D:
10501         check_cp1_registers(ctx, fs | fd);
10502         {
10503             TCGv_i64 fp0 = tcg_temp_new_i64();
10504 
10505             gen_load_fpr64(ctx, fp0, fs);
10506             if (ctx->abs2008) {
10507                 tcg_gen_xori_i64(fp0, fp0, 1ULL << 63);
10508             } else {
10509                 gen_helper_float_chs_d(fp0, fp0);
10510             }
10511             gen_store_fpr64(ctx, fp0, fd);
10512             tcg_temp_free_i64(fp0);
10513         }
10514         break;
10515     case OPC_ROUND_L_D:
10516         check_cp1_64bitmode(ctx);
10517         {
10518             TCGv_i64 fp0 = tcg_temp_new_i64();
10519 
10520             gen_load_fpr64(ctx, fp0, fs);
10521             if (ctx->nan2008) {
10522                 gen_helper_float_round_2008_l_d(fp0, cpu_env, fp0);
10523             } else {
10524                 gen_helper_float_round_l_d(fp0, cpu_env, fp0);
10525             }
10526             gen_store_fpr64(ctx, fp0, fd);
10527             tcg_temp_free_i64(fp0);
10528         }
10529         break;
10530     case OPC_TRUNC_L_D:
10531         check_cp1_64bitmode(ctx);
10532         {
10533             TCGv_i64 fp0 = tcg_temp_new_i64();
10534 
10535             gen_load_fpr64(ctx, fp0, fs);
10536             if (ctx->nan2008) {
10537                 gen_helper_float_trunc_2008_l_d(fp0, cpu_env, fp0);
10538             } else {
10539                 gen_helper_float_trunc_l_d(fp0, cpu_env, fp0);
10540             }
10541             gen_store_fpr64(ctx, fp0, fd);
10542             tcg_temp_free_i64(fp0);
10543         }
10544         break;
10545     case OPC_CEIL_L_D:
10546         check_cp1_64bitmode(ctx);
10547         {
10548             TCGv_i64 fp0 = tcg_temp_new_i64();
10549 
10550             gen_load_fpr64(ctx, fp0, fs);
10551             if (ctx->nan2008) {
10552                 gen_helper_float_ceil_2008_l_d(fp0, cpu_env, fp0);
10553             } else {
10554                 gen_helper_float_ceil_l_d(fp0, cpu_env, fp0);
10555             }
10556             gen_store_fpr64(ctx, fp0, fd);
10557             tcg_temp_free_i64(fp0);
10558         }
10559         break;
10560     case OPC_FLOOR_L_D:
10561         check_cp1_64bitmode(ctx);
10562         {
10563             TCGv_i64 fp0 = tcg_temp_new_i64();
10564 
10565             gen_load_fpr64(ctx, fp0, fs);
10566             if (ctx->nan2008) {
10567                 gen_helper_float_floor_2008_l_d(fp0, cpu_env, fp0);
10568             } else {
10569                 gen_helper_float_floor_l_d(fp0, cpu_env, fp0);
10570             }
10571             gen_store_fpr64(ctx, fp0, fd);
10572             tcg_temp_free_i64(fp0);
10573         }
10574         break;
10575     case OPC_ROUND_W_D:
10576         check_cp1_registers(ctx, fs);
10577         {
10578             TCGv_i32 fp32 = tcg_temp_new_i32();
10579             TCGv_i64 fp64 = tcg_temp_new_i64();
10580 
10581             gen_load_fpr64(ctx, fp64, fs);
10582             if (ctx->nan2008) {
10583                 gen_helper_float_round_2008_w_d(fp32, cpu_env, fp64);
10584             } else {
10585                 gen_helper_float_round_w_d(fp32, cpu_env, fp64);
10586             }
10587             tcg_temp_free_i64(fp64);
10588             gen_store_fpr32(ctx, fp32, fd);
10589             tcg_temp_free_i32(fp32);
10590         }
10591         break;
10592     case OPC_TRUNC_W_D:
10593         check_cp1_registers(ctx, fs);
10594         {
10595             TCGv_i32 fp32 = tcg_temp_new_i32();
10596             TCGv_i64 fp64 = tcg_temp_new_i64();
10597 
10598             gen_load_fpr64(ctx, fp64, fs);
10599             if (ctx->nan2008) {
10600                 gen_helper_float_trunc_2008_w_d(fp32, cpu_env, fp64);
10601             } else {
10602                 gen_helper_float_trunc_w_d(fp32, cpu_env, fp64);
10603             }
10604             tcg_temp_free_i64(fp64);
10605             gen_store_fpr32(ctx, fp32, fd);
10606             tcg_temp_free_i32(fp32);
10607         }
10608         break;
10609     case OPC_CEIL_W_D:
10610         check_cp1_registers(ctx, fs);
10611         {
10612             TCGv_i32 fp32 = tcg_temp_new_i32();
10613             TCGv_i64 fp64 = tcg_temp_new_i64();
10614 
10615             gen_load_fpr64(ctx, fp64, fs);
10616             if (ctx->nan2008) {
10617                 gen_helper_float_ceil_2008_w_d(fp32, cpu_env, fp64);
10618             } else {
10619                 gen_helper_float_ceil_w_d(fp32, cpu_env, fp64);
10620             }
10621             tcg_temp_free_i64(fp64);
10622             gen_store_fpr32(ctx, fp32, fd);
10623             tcg_temp_free_i32(fp32);
10624         }
10625         break;
10626     case OPC_FLOOR_W_D:
10627         check_cp1_registers(ctx, fs);
10628         {
10629             TCGv_i32 fp32 = tcg_temp_new_i32();
10630             TCGv_i64 fp64 = tcg_temp_new_i64();
10631 
10632             gen_load_fpr64(ctx, fp64, fs);
10633             if (ctx->nan2008) {
10634                 gen_helper_float_floor_2008_w_d(fp32, cpu_env, fp64);
10635             } else {
10636                 gen_helper_float_floor_w_d(fp32, cpu_env, fp64);
10637             }
10638             tcg_temp_free_i64(fp64);
10639             gen_store_fpr32(ctx, fp32, fd);
10640             tcg_temp_free_i32(fp32);
10641         }
10642         break;
10643     case OPC_SEL_D:
10644         check_insn(ctx, ISA_MIPS_R6);
10645         gen_sel_d(ctx, op1, fd, ft, fs);
10646         break;
10647     case OPC_SELEQZ_D:
10648         check_insn(ctx, ISA_MIPS_R6);
10649         gen_sel_d(ctx, op1, fd, ft, fs);
10650         break;
10651     case OPC_SELNEZ_D:
10652         check_insn(ctx, ISA_MIPS_R6);
10653         gen_sel_d(ctx, op1, fd, ft, fs);
10654         break;
10655     case OPC_MOVCF_D:
10656         check_insn_opc_removed(ctx, ISA_MIPS_R6);
10657         gen_movcf_d(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1);
10658         break;
10659     case OPC_MOVZ_D:
10660         check_insn_opc_removed(ctx, ISA_MIPS_R6);
10661         {
10662             TCGLabel *l1 = gen_new_label();
10663             TCGv_i64 fp0;
10664 
10665             if (ft != 0) {
10666                 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
10667             }
10668             fp0 = tcg_temp_new_i64();
10669             gen_load_fpr64(ctx, fp0, fs);
10670             gen_store_fpr64(ctx, fp0, fd);
10671             tcg_temp_free_i64(fp0);
10672             gen_set_label(l1);
10673         }
10674         break;
10675     case OPC_MOVN_D:
10676         check_insn_opc_removed(ctx, ISA_MIPS_R6);
10677         {
10678             TCGLabel *l1 = gen_new_label();
10679             TCGv_i64 fp0;
10680 
10681             if (ft != 0) {
10682                 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
10683                 fp0 = tcg_temp_new_i64();
10684                 gen_load_fpr64(ctx, fp0, fs);
10685                 gen_store_fpr64(ctx, fp0, fd);
10686                 tcg_temp_free_i64(fp0);
10687                 gen_set_label(l1);
10688             }
10689         }
10690         break;
10691     case OPC_RECIP_D:
10692         check_cp1_registers(ctx, fs | fd);
10693         {
10694             TCGv_i64 fp0 = tcg_temp_new_i64();
10695 
10696             gen_load_fpr64(ctx, fp0, fs);
10697             gen_helper_float_recip_d(fp0, cpu_env, fp0);
10698             gen_store_fpr64(ctx, fp0, fd);
10699             tcg_temp_free_i64(fp0);
10700         }
10701         break;
10702     case OPC_RSQRT_D:
10703         check_cp1_registers(ctx, fs | fd);
10704         {
10705             TCGv_i64 fp0 = tcg_temp_new_i64();
10706 
10707             gen_load_fpr64(ctx, fp0, fs);
10708             gen_helper_float_rsqrt_d(fp0, cpu_env, fp0);
10709             gen_store_fpr64(ctx, fp0, fd);
10710             tcg_temp_free_i64(fp0);
10711         }
10712         break;
10713     case OPC_MADDF_D:
10714         check_insn(ctx, ISA_MIPS_R6);
10715         {
10716             TCGv_i64 fp0 = tcg_temp_new_i64();
10717             TCGv_i64 fp1 = tcg_temp_new_i64();
10718             TCGv_i64 fp2 = tcg_temp_new_i64();
10719             gen_load_fpr64(ctx, fp0, fs);
10720             gen_load_fpr64(ctx, fp1, ft);
10721             gen_load_fpr64(ctx, fp2, fd);
10722             gen_helper_float_maddf_d(fp2, cpu_env, fp0, fp1, fp2);
10723             gen_store_fpr64(ctx, fp2, fd);
10724             tcg_temp_free_i64(fp2);
10725             tcg_temp_free_i64(fp1);
10726             tcg_temp_free_i64(fp0);
10727         }
10728         break;
10729     case OPC_MSUBF_D:
10730         check_insn(ctx, ISA_MIPS_R6);
10731         {
10732             TCGv_i64 fp0 = tcg_temp_new_i64();
10733             TCGv_i64 fp1 = tcg_temp_new_i64();
10734             TCGv_i64 fp2 = tcg_temp_new_i64();
10735             gen_load_fpr64(ctx, fp0, fs);
10736             gen_load_fpr64(ctx, fp1, ft);
10737             gen_load_fpr64(ctx, fp2, fd);
10738             gen_helper_float_msubf_d(fp2, cpu_env, fp0, fp1, fp2);
10739             gen_store_fpr64(ctx, fp2, fd);
10740             tcg_temp_free_i64(fp2);
10741             tcg_temp_free_i64(fp1);
10742             tcg_temp_free_i64(fp0);
10743         }
10744         break;
10745     case OPC_RINT_D:
10746         check_insn(ctx, ISA_MIPS_R6);
10747         {
10748             TCGv_i64 fp0 = tcg_temp_new_i64();
10749             gen_load_fpr64(ctx, fp0, fs);
10750             gen_helper_float_rint_d(fp0, cpu_env, fp0);
10751             gen_store_fpr64(ctx, fp0, fd);
10752             tcg_temp_free_i64(fp0);
10753         }
10754         break;
10755     case OPC_CLASS_D:
10756         check_insn(ctx, ISA_MIPS_R6);
10757         {
10758             TCGv_i64 fp0 = tcg_temp_new_i64();
10759             gen_load_fpr64(ctx, fp0, fs);
10760             gen_helper_float_class_d(fp0, cpu_env, fp0);
10761             gen_store_fpr64(ctx, fp0, fd);
10762             tcg_temp_free_i64(fp0);
10763         }
10764         break;
10765     case OPC_MIN_D: /* OPC_RECIP2_D */
10766         if (ctx->insn_flags & ISA_MIPS_R6) {
10767             /* OPC_MIN_D */
10768             TCGv_i64 fp0 = tcg_temp_new_i64();
10769             TCGv_i64 fp1 = tcg_temp_new_i64();
10770             gen_load_fpr64(ctx, fp0, fs);
10771             gen_load_fpr64(ctx, fp1, ft);
10772             gen_helper_float_min_d(fp1, cpu_env, fp0, fp1);
10773             gen_store_fpr64(ctx, fp1, fd);
10774             tcg_temp_free_i64(fp1);
10775             tcg_temp_free_i64(fp0);
10776         } else {
10777             /* OPC_RECIP2_D */
10778             check_cp1_64bitmode(ctx);
10779             {
10780                 TCGv_i64 fp0 = tcg_temp_new_i64();
10781                 TCGv_i64 fp1 = tcg_temp_new_i64();
10782 
10783                 gen_load_fpr64(ctx, fp0, fs);
10784                 gen_load_fpr64(ctx, fp1, ft);
10785                 gen_helper_float_recip2_d(fp0, cpu_env, fp0, fp1);
10786                 tcg_temp_free_i64(fp1);
10787                 gen_store_fpr64(ctx, fp0, fd);
10788                 tcg_temp_free_i64(fp0);
10789             }
10790         }
10791         break;
10792     case OPC_MINA_D: /* OPC_RECIP1_D */
10793         if (ctx->insn_flags & ISA_MIPS_R6) {
10794             /* OPC_MINA_D */
10795             TCGv_i64 fp0 = tcg_temp_new_i64();
10796             TCGv_i64 fp1 = tcg_temp_new_i64();
10797             gen_load_fpr64(ctx, fp0, fs);
10798             gen_load_fpr64(ctx, fp1, ft);
10799             gen_helper_float_mina_d(fp1, cpu_env, fp0, fp1);
10800             gen_store_fpr64(ctx, fp1, fd);
10801             tcg_temp_free_i64(fp1);
10802             tcg_temp_free_i64(fp0);
10803         } else {
10804             /* OPC_RECIP1_D */
10805             check_cp1_64bitmode(ctx);
10806             {
10807                 TCGv_i64 fp0 = tcg_temp_new_i64();
10808 
10809                 gen_load_fpr64(ctx, fp0, fs);
10810                 gen_helper_float_recip1_d(fp0, cpu_env, fp0);
10811                 gen_store_fpr64(ctx, fp0, fd);
10812                 tcg_temp_free_i64(fp0);
10813             }
10814         }
10815         break;
10816     case OPC_MAX_D: /*  OPC_RSQRT1_D */
10817         if (ctx->insn_flags & ISA_MIPS_R6) {
10818             /* OPC_MAX_D */
10819             TCGv_i64 fp0 = tcg_temp_new_i64();
10820             TCGv_i64 fp1 = tcg_temp_new_i64();
10821             gen_load_fpr64(ctx, fp0, fs);
10822             gen_load_fpr64(ctx, fp1, ft);
10823             gen_helper_float_max_d(fp1, cpu_env, fp0, fp1);
10824             gen_store_fpr64(ctx, fp1, fd);
10825             tcg_temp_free_i64(fp1);
10826             tcg_temp_free_i64(fp0);
10827         } else {
10828             /* OPC_RSQRT1_D */
10829             check_cp1_64bitmode(ctx);
10830             {
10831                 TCGv_i64 fp0 = tcg_temp_new_i64();
10832 
10833                 gen_load_fpr64(ctx, fp0, fs);
10834                 gen_helper_float_rsqrt1_d(fp0, cpu_env, fp0);
10835                 gen_store_fpr64(ctx, fp0, fd);
10836                 tcg_temp_free_i64(fp0);
10837             }
10838         }
10839         break;
10840     case OPC_MAXA_D: /* OPC_RSQRT2_D */
10841         if (ctx->insn_flags & ISA_MIPS_R6) {
10842             /* OPC_MAXA_D */
10843             TCGv_i64 fp0 = tcg_temp_new_i64();
10844             TCGv_i64 fp1 = tcg_temp_new_i64();
10845             gen_load_fpr64(ctx, fp0, fs);
10846             gen_load_fpr64(ctx, fp1, ft);
10847             gen_helper_float_maxa_d(fp1, cpu_env, fp0, fp1);
10848             gen_store_fpr64(ctx, fp1, fd);
10849             tcg_temp_free_i64(fp1);
10850             tcg_temp_free_i64(fp0);
10851         } else {
10852             /* OPC_RSQRT2_D */
10853             check_cp1_64bitmode(ctx);
10854             {
10855                 TCGv_i64 fp0 = tcg_temp_new_i64();
10856                 TCGv_i64 fp1 = tcg_temp_new_i64();
10857 
10858                 gen_load_fpr64(ctx, fp0, fs);
10859                 gen_load_fpr64(ctx, fp1, ft);
10860                 gen_helper_float_rsqrt2_d(fp0, cpu_env, fp0, fp1);
10861                 tcg_temp_free_i64(fp1);
10862                 gen_store_fpr64(ctx, fp0, fd);
10863                 tcg_temp_free_i64(fp0);
10864             }
10865         }
10866         break;
10867     case OPC_CMP_F_D:
10868     case OPC_CMP_UN_D:
10869     case OPC_CMP_EQ_D:
10870     case OPC_CMP_UEQ_D:
10871     case OPC_CMP_OLT_D:
10872     case OPC_CMP_ULT_D:
10873     case OPC_CMP_OLE_D:
10874     case OPC_CMP_ULE_D:
10875     case OPC_CMP_SF_D:
10876     case OPC_CMP_NGLE_D:
10877     case OPC_CMP_SEQ_D:
10878     case OPC_CMP_NGL_D:
10879     case OPC_CMP_LT_D:
10880     case OPC_CMP_NGE_D:
10881     case OPC_CMP_LE_D:
10882     case OPC_CMP_NGT_D:
10883         check_insn_opc_removed(ctx, ISA_MIPS_R6);
10884         if (ctx->opcode & (1 << 6)) {
10885             gen_cmpabs_d(ctx, func - 48, ft, fs, cc);
10886         } else {
10887             gen_cmp_d(ctx, func - 48, ft, fs, cc);
10888         }
10889         break;
10890     case OPC_CVT_S_D:
10891         check_cp1_registers(ctx, fs);
10892         {
10893             TCGv_i32 fp32 = tcg_temp_new_i32();
10894             TCGv_i64 fp64 = tcg_temp_new_i64();
10895 
10896             gen_load_fpr64(ctx, fp64, fs);
10897             gen_helper_float_cvts_d(fp32, cpu_env, fp64);
10898             tcg_temp_free_i64(fp64);
10899             gen_store_fpr32(ctx, fp32, fd);
10900             tcg_temp_free_i32(fp32);
10901         }
10902         break;
10903     case OPC_CVT_W_D:
10904         check_cp1_registers(ctx, fs);
10905         {
10906             TCGv_i32 fp32 = tcg_temp_new_i32();
10907             TCGv_i64 fp64 = tcg_temp_new_i64();
10908 
10909             gen_load_fpr64(ctx, fp64, fs);
10910             if (ctx->nan2008) {
10911                 gen_helper_float_cvt_2008_w_d(fp32, cpu_env, fp64);
10912             } else {
10913                 gen_helper_float_cvt_w_d(fp32, cpu_env, fp64);
10914             }
10915             tcg_temp_free_i64(fp64);
10916             gen_store_fpr32(ctx, fp32, fd);
10917             tcg_temp_free_i32(fp32);
10918         }
10919         break;
10920     case OPC_CVT_L_D:
10921         check_cp1_64bitmode(ctx);
10922         {
10923             TCGv_i64 fp0 = tcg_temp_new_i64();
10924 
10925             gen_load_fpr64(ctx, fp0, fs);
10926             if (ctx->nan2008) {
10927                 gen_helper_float_cvt_2008_l_d(fp0, cpu_env, fp0);
10928             } else {
10929                 gen_helper_float_cvt_l_d(fp0, cpu_env, fp0);
10930             }
10931             gen_store_fpr64(ctx, fp0, fd);
10932             tcg_temp_free_i64(fp0);
10933         }
10934         break;
10935     case OPC_CVT_S_W:
10936         {
10937             TCGv_i32 fp0 = tcg_temp_new_i32();
10938 
10939             gen_load_fpr32(ctx, fp0, fs);
10940             gen_helper_float_cvts_w(fp0, cpu_env, fp0);
10941             gen_store_fpr32(ctx, fp0, fd);
10942             tcg_temp_free_i32(fp0);
10943         }
10944         break;
10945     case OPC_CVT_D_W:
10946         check_cp1_registers(ctx, fd);
10947         {
10948             TCGv_i32 fp32 = tcg_temp_new_i32();
10949             TCGv_i64 fp64 = tcg_temp_new_i64();
10950 
10951             gen_load_fpr32(ctx, fp32, fs);
10952             gen_helper_float_cvtd_w(fp64, cpu_env, fp32);
10953             tcg_temp_free_i32(fp32);
10954             gen_store_fpr64(ctx, fp64, fd);
10955             tcg_temp_free_i64(fp64);
10956         }
10957         break;
10958     case OPC_CVT_S_L:
10959         check_cp1_64bitmode(ctx);
10960         {
10961             TCGv_i32 fp32 = tcg_temp_new_i32();
10962             TCGv_i64 fp64 = tcg_temp_new_i64();
10963 
10964             gen_load_fpr64(ctx, fp64, fs);
10965             gen_helper_float_cvts_l(fp32, cpu_env, fp64);
10966             tcg_temp_free_i64(fp64);
10967             gen_store_fpr32(ctx, fp32, fd);
10968             tcg_temp_free_i32(fp32);
10969         }
10970         break;
10971     case OPC_CVT_D_L:
10972         check_cp1_64bitmode(ctx);
10973         {
10974             TCGv_i64 fp0 = tcg_temp_new_i64();
10975 
10976             gen_load_fpr64(ctx, fp0, fs);
10977             gen_helper_float_cvtd_l(fp0, cpu_env, fp0);
10978             gen_store_fpr64(ctx, fp0, fd);
10979             tcg_temp_free_i64(fp0);
10980         }
10981         break;
10982     case OPC_CVT_PS_PW:
10983         check_ps(ctx);
10984         {
10985             TCGv_i64 fp0 = tcg_temp_new_i64();
10986 
10987             gen_load_fpr64(ctx, fp0, fs);
10988             gen_helper_float_cvtps_pw(fp0, cpu_env, fp0);
10989             gen_store_fpr64(ctx, fp0, fd);
10990             tcg_temp_free_i64(fp0);
10991         }
10992         break;
10993     case OPC_ADD_PS:
10994         check_ps(ctx);
10995         {
10996             TCGv_i64 fp0 = tcg_temp_new_i64();
10997             TCGv_i64 fp1 = tcg_temp_new_i64();
10998 
10999             gen_load_fpr64(ctx, fp0, fs);
11000             gen_load_fpr64(ctx, fp1, ft);
11001             gen_helper_float_add_ps(fp0, cpu_env, fp0, fp1);
11002             tcg_temp_free_i64(fp1);
11003             gen_store_fpr64(ctx, fp0, fd);
11004             tcg_temp_free_i64(fp0);
11005         }
11006         break;
11007     case OPC_SUB_PS:
11008         check_ps(ctx);
11009         {
11010             TCGv_i64 fp0 = tcg_temp_new_i64();
11011             TCGv_i64 fp1 = tcg_temp_new_i64();
11012 
11013             gen_load_fpr64(ctx, fp0, fs);
11014             gen_load_fpr64(ctx, fp1, ft);
11015             gen_helper_float_sub_ps(fp0, cpu_env, fp0, fp1);
11016             tcg_temp_free_i64(fp1);
11017             gen_store_fpr64(ctx, fp0, fd);
11018             tcg_temp_free_i64(fp0);
11019         }
11020         break;
11021     case OPC_MUL_PS:
11022         check_ps(ctx);
11023         {
11024             TCGv_i64 fp0 = tcg_temp_new_i64();
11025             TCGv_i64 fp1 = tcg_temp_new_i64();
11026 
11027             gen_load_fpr64(ctx, fp0, fs);
11028             gen_load_fpr64(ctx, fp1, ft);
11029             gen_helper_float_mul_ps(fp0, cpu_env, fp0, fp1);
11030             tcg_temp_free_i64(fp1);
11031             gen_store_fpr64(ctx, fp0, fd);
11032             tcg_temp_free_i64(fp0);
11033         }
11034         break;
11035     case OPC_ABS_PS:
11036         check_ps(ctx);
11037         {
11038             TCGv_i64 fp0 = tcg_temp_new_i64();
11039 
11040             gen_load_fpr64(ctx, fp0, fs);
11041             gen_helper_float_abs_ps(fp0, fp0);
11042             gen_store_fpr64(ctx, fp0, fd);
11043             tcg_temp_free_i64(fp0);
11044         }
11045         break;
11046     case OPC_MOV_PS:
11047         check_ps(ctx);
11048         {
11049             TCGv_i64 fp0 = tcg_temp_new_i64();
11050 
11051             gen_load_fpr64(ctx, fp0, fs);
11052             gen_store_fpr64(ctx, fp0, fd);
11053             tcg_temp_free_i64(fp0);
11054         }
11055         break;
11056     case OPC_NEG_PS:
11057         check_ps(ctx);
11058         {
11059             TCGv_i64 fp0 = tcg_temp_new_i64();
11060 
11061             gen_load_fpr64(ctx, fp0, fs);
11062             gen_helper_float_chs_ps(fp0, fp0);
11063             gen_store_fpr64(ctx, fp0, fd);
11064             tcg_temp_free_i64(fp0);
11065         }
11066         break;
11067     case OPC_MOVCF_PS:
11068         check_ps(ctx);
11069         gen_movcf_ps(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1);
11070         break;
11071     case OPC_MOVZ_PS:
11072         check_ps(ctx);
11073         {
11074             TCGLabel *l1 = gen_new_label();
11075             TCGv_i64 fp0;
11076 
11077             if (ft != 0) {
11078                 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
11079             }
11080             fp0 = tcg_temp_new_i64();
11081             gen_load_fpr64(ctx, fp0, fs);
11082             gen_store_fpr64(ctx, fp0, fd);
11083             tcg_temp_free_i64(fp0);
11084             gen_set_label(l1);
11085         }
11086         break;
11087     case OPC_MOVN_PS:
11088         check_ps(ctx);
11089         {
11090             TCGLabel *l1 = gen_new_label();
11091             TCGv_i64 fp0;
11092 
11093             if (ft != 0) {
11094                 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
11095                 fp0 = tcg_temp_new_i64();
11096                 gen_load_fpr64(ctx, fp0, fs);
11097                 gen_store_fpr64(ctx, fp0, fd);
11098                 tcg_temp_free_i64(fp0);
11099                 gen_set_label(l1);
11100             }
11101         }
11102         break;
11103     case OPC_ADDR_PS:
11104         check_ps(ctx);
11105         {
11106             TCGv_i64 fp0 = tcg_temp_new_i64();
11107             TCGv_i64 fp1 = tcg_temp_new_i64();
11108 
11109             gen_load_fpr64(ctx, fp0, ft);
11110             gen_load_fpr64(ctx, fp1, fs);
11111             gen_helper_float_addr_ps(fp0, cpu_env, fp0, fp1);
11112             tcg_temp_free_i64(fp1);
11113             gen_store_fpr64(ctx, fp0, fd);
11114             tcg_temp_free_i64(fp0);
11115         }
11116         break;
11117     case OPC_MULR_PS:
11118         check_ps(ctx);
11119         {
11120             TCGv_i64 fp0 = tcg_temp_new_i64();
11121             TCGv_i64 fp1 = tcg_temp_new_i64();
11122 
11123             gen_load_fpr64(ctx, fp0, ft);
11124             gen_load_fpr64(ctx, fp1, fs);
11125             gen_helper_float_mulr_ps(fp0, cpu_env, fp0, fp1);
11126             tcg_temp_free_i64(fp1);
11127             gen_store_fpr64(ctx, fp0, fd);
11128             tcg_temp_free_i64(fp0);
11129         }
11130         break;
11131     case OPC_RECIP2_PS:
11132         check_ps(ctx);
11133         {
11134             TCGv_i64 fp0 = tcg_temp_new_i64();
11135             TCGv_i64 fp1 = tcg_temp_new_i64();
11136 
11137             gen_load_fpr64(ctx, fp0, fs);
11138             gen_load_fpr64(ctx, fp1, ft);
11139             gen_helper_float_recip2_ps(fp0, cpu_env, fp0, fp1);
11140             tcg_temp_free_i64(fp1);
11141             gen_store_fpr64(ctx, fp0, fd);
11142             tcg_temp_free_i64(fp0);
11143         }
11144         break;
11145     case OPC_RECIP1_PS:
11146         check_ps(ctx);
11147         {
11148             TCGv_i64 fp0 = tcg_temp_new_i64();
11149 
11150             gen_load_fpr64(ctx, fp0, fs);
11151             gen_helper_float_recip1_ps(fp0, cpu_env, fp0);
11152             gen_store_fpr64(ctx, fp0, fd);
11153             tcg_temp_free_i64(fp0);
11154         }
11155         break;
11156     case OPC_RSQRT1_PS:
11157         check_ps(ctx);
11158         {
11159             TCGv_i64 fp0 = tcg_temp_new_i64();
11160 
11161             gen_load_fpr64(ctx, fp0, fs);
11162             gen_helper_float_rsqrt1_ps(fp0, cpu_env, fp0);
11163             gen_store_fpr64(ctx, fp0, fd);
11164             tcg_temp_free_i64(fp0);
11165         }
11166         break;
11167     case OPC_RSQRT2_PS:
11168         check_ps(ctx);
11169         {
11170             TCGv_i64 fp0 = tcg_temp_new_i64();
11171             TCGv_i64 fp1 = tcg_temp_new_i64();
11172 
11173             gen_load_fpr64(ctx, fp0, fs);
11174             gen_load_fpr64(ctx, fp1, ft);
11175             gen_helper_float_rsqrt2_ps(fp0, cpu_env, fp0, fp1);
11176             tcg_temp_free_i64(fp1);
11177             gen_store_fpr64(ctx, fp0, fd);
11178             tcg_temp_free_i64(fp0);
11179         }
11180         break;
11181     case OPC_CVT_S_PU:
11182         check_cp1_64bitmode(ctx);
11183         {
11184             TCGv_i32 fp0 = tcg_temp_new_i32();
11185 
11186             gen_load_fpr32h(ctx, fp0, fs);
11187             gen_helper_float_cvts_pu(fp0, cpu_env, fp0);
11188             gen_store_fpr32(ctx, fp0, fd);
11189             tcg_temp_free_i32(fp0);
11190         }
11191         break;
11192     case OPC_CVT_PW_PS:
11193         check_ps(ctx);
11194         {
11195             TCGv_i64 fp0 = tcg_temp_new_i64();
11196 
11197             gen_load_fpr64(ctx, fp0, fs);
11198             gen_helper_float_cvtpw_ps(fp0, cpu_env, fp0);
11199             gen_store_fpr64(ctx, fp0, fd);
11200             tcg_temp_free_i64(fp0);
11201         }
11202         break;
11203     case OPC_CVT_S_PL:
11204         check_cp1_64bitmode(ctx);
11205         {
11206             TCGv_i32 fp0 = tcg_temp_new_i32();
11207 
11208             gen_load_fpr32(ctx, fp0, fs);
11209             gen_helper_float_cvts_pl(fp0, cpu_env, fp0);
11210             gen_store_fpr32(ctx, fp0, fd);
11211             tcg_temp_free_i32(fp0);
11212         }
11213         break;
11214     case OPC_PLL_PS:
11215         check_ps(ctx);
11216         {
11217             TCGv_i32 fp0 = tcg_temp_new_i32();
11218             TCGv_i32 fp1 = tcg_temp_new_i32();
11219 
11220             gen_load_fpr32(ctx, fp0, fs);
11221             gen_load_fpr32(ctx, fp1, ft);
11222             gen_store_fpr32h(ctx, fp0, fd);
11223             gen_store_fpr32(ctx, fp1, fd);
11224             tcg_temp_free_i32(fp0);
11225             tcg_temp_free_i32(fp1);
11226         }
11227         break;
11228     case OPC_PLU_PS:
11229         check_ps(ctx);
11230         {
11231             TCGv_i32 fp0 = tcg_temp_new_i32();
11232             TCGv_i32 fp1 = tcg_temp_new_i32();
11233 
11234             gen_load_fpr32(ctx, fp0, fs);
11235             gen_load_fpr32h(ctx, fp1, ft);
11236             gen_store_fpr32(ctx, fp1, fd);
11237             gen_store_fpr32h(ctx, fp0, fd);
11238             tcg_temp_free_i32(fp0);
11239             tcg_temp_free_i32(fp1);
11240         }
11241         break;
11242     case OPC_PUL_PS:
11243         check_ps(ctx);
11244         {
11245             TCGv_i32 fp0 = tcg_temp_new_i32();
11246             TCGv_i32 fp1 = tcg_temp_new_i32();
11247 
11248             gen_load_fpr32h(ctx, fp0, fs);
11249             gen_load_fpr32(ctx, fp1, ft);
11250             gen_store_fpr32(ctx, fp1, fd);
11251             gen_store_fpr32h(ctx, fp0, fd);
11252             tcg_temp_free_i32(fp0);
11253             tcg_temp_free_i32(fp1);
11254         }
11255         break;
11256     case OPC_PUU_PS:
11257         check_ps(ctx);
11258         {
11259             TCGv_i32 fp0 = tcg_temp_new_i32();
11260             TCGv_i32 fp1 = tcg_temp_new_i32();
11261 
11262             gen_load_fpr32h(ctx, fp0, fs);
11263             gen_load_fpr32h(ctx, fp1, ft);
11264             gen_store_fpr32(ctx, fp1, fd);
11265             gen_store_fpr32h(ctx, fp0, fd);
11266             tcg_temp_free_i32(fp0);
11267             tcg_temp_free_i32(fp1);
11268         }
11269         break;
11270     case OPC_CMP_F_PS:
11271     case OPC_CMP_UN_PS:
11272     case OPC_CMP_EQ_PS:
11273     case OPC_CMP_UEQ_PS:
11274     case OPC_CMP_OLT_PS:
11275     case OPC_CMP_ULT_PS:
11276     case OPC_CMP_OLE_PS:
11277     case OPC_CMP_ULE_PS:
11278     case OPC_CMP_SF_PS:
11279     case OPC_CMP_NGLE_PS:
11280     case OPC_CMP_SEQ_PS:
11281     case OPC_CMP_NGL_PS:
11282     case OPC_CMP_LT_PS:
11283     case OPC_CMP_NGE_PS:
11284     case OPC_CMP_LE_PS:
11285     case OPC_CMP_NGT_PS:
11286         if (ctx->opcode & (1 << 6)) {
11287             gen_cmpabs_ps(ctx, func - 48, ft, fs, cc);
11288         } else {
11289             gen_cmp_ps(ctx, func - 48, ft, fs, cc);
11290         }
11291         break;
11292     default:
11293         MIPS_INVAL("farith");
11294         gen_reserved_instruction(ctx);
11295         return;
11296     }
11297 }
11298 
11299 /* Coprocessor 3 (FPU) */
11300 static void gen_flt3_ldst(DisasContext *ctx, uint32_t opc,
11301                           int fd, int fs, int base, int index)
11302 {
11303     TCGv t0 = tcg_temp_new();
11304 
11305     if (base == 0) {
11306         gen_load_gpr(t0, index);
11307     } else if (index == 0) {
11308         gen_load_gpr(t0, base);
11309     } else {
11310         gen_op_addr_add(ctx, t0, cpu_gpr[base], cpu_gpr[index]);
11311     }
11312     /*
11313      * Don't do NOP if destination is zero: we must perform the actual
11314      * memory access.
11315      */
11316     switch (opc) {
11317     case OPC_LWXC1:
11318         check_cop1x(ctx);
11319         {
11320             TCGv_i32 fp0 = tcg_temp_new_i32();
11321 
11322             tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL);
11323             tcg_gen_trunc_tl_i32(fp0, t0);
11324             gen_store_fpr32(ctx, fp0, fd);
11325             tcg_temp_free_i32(fp0);
11326         }
11327         break;
11328     case OPC_LDXC1:
11329         check_cop1x(ctx);
11330         check_cp1_registers(ctx, fd);
11331         {
11332             TCGv_i64 fp0 = tcg_temp_new_i64();
11333             tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
11334             gen_store_fpr64(ctx, fp0, fd);
11335             tcg_temp_free_i64(fp0);
11336         }
11337         break;
11338     case OPC_LUXC1:
11339         check_cp1_64bitmode(ctx);
11340         tcg_gen_andi_tl(t0, t0, ~0x7);
11341         {
11342             TCGv_i64 fp0 = tcg_temp_new_i64();
11343 
11344             tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
11345             gen_store_fpr64(ctx, fp0, fd);
11346             tcg_temp_free_i64(fp0);
11347         }
11348         break;
11349     case OPC_SWXC1:
11350         check_cop1x(ctx);
11351         {
11352             TCGv_i32 fp0 = tcg_temp_new_i32();
11353             gen_load_fpr32(ctx, fp0, fs);
11354             tcg_gen_qemu_st_i32(fp0, t0, ctx->mem_idx, MO_TEUL);
11355             tcg_temp_free_i32(fp0);
11356         }
11357         break;
11358     case OPC_SDXC1:
11359         check_cop1x(ctx);
11360         check_cp1_registers(ctx, fs);
11361         {
11362             TCGv_i64 fp0 = tcg_temp_new_i64();
11363             gen_load_fpr64(ctx, fp0, fs);
11364             tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
11365             tcg_temp_free_i64(fp0);
11366         }
11367         break;
11368     case OPC_SUXC1:
11369         check_cp1_64bitmode(ctx);
11370         tcg_gen_andi_tl(t0, t0, ~0x7);
11371         {
11372             TCGv_i64 fp0 = tcg_temp_new_i64();
11373             gen_load_fpr64(ctx, fp0, fs);
11374             tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
11375             tcg_temp_free_i64(fp0);
11376         }
11377         break;
11378     }
11379     tcg_temp_free(t0);
11380 }
11381 
11382 static void gen_flt3_arith(DisasContext *ctx, uint32_t opc,
11383                            int fd, int fr, int fs, int ft)
11384 {
11385     switch (opc) {
11386     case OPC_ALNV_PS:
11387         check_ps(ctx);
11388         {
11389             TCGv t0 = tcg_temp_local_new();
11390             TCGv_i32 fp = tcg_temp_new_i32();
11391             TCGv_i32 fph = tcg_temp_new_i32();
11392             TCGLabel *l1 = gen_new_label();
11393             TCGLabel *l2 = gen_new_label();
11394 
11395             gen_load_gpr(t0, fr);
11396             tcg_gen_andi_tl(t0, t0, 0x7);
11397 
11398             tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0, l1);
11399             gen_load_fpr32(ctx, fp, fs);
11400             gen_load_fpr32h(ctx, fph, fs);
11401             gen_store_fpr32(ctx, fp, fd);
11402             gen_store_fpr32h(ctx, fph, fd);
11403             tcg_gen_br(l2);
11404             gen_set_label(l1);
11405             tcg_gen_brcondi_tl(TCG_COND_NE, t0, 4, l2);
11406             tcg_temp_free(t0);
11407             if (cpu_is_bigendian(ctx)) {
11408                 gen_load_fpr32(ctx, fp, fs);
11409                 gen_load_fpr32h(ctx, fph, ft);
11410                 gen_store_fpr32h(ctx, fp, fd);
11411                 gen_store_fpr32(ctx, fph, fd);
11412             } else {
11413                 gen_load_fpr32h(ctx, fph, fs);
11414                 gen_load_fpr32(ctx, fp, ft);
11415                 gen_store_fpr32(ctx, fph, fd);
11416                 gen_store_fpr32h(ctx, fp, fd);
11417             }
11418             gen_set_label(l2);
11419             tcg_temp_free_i32(fp);
11420             tcg_temp_free_i32(fph);
11421         }
11422         break;
11423     case OPC_MADD_S:
11424         check_cop1x(ctx);
11425         {
11426             TCGv_i32 fp0 = tcg_temp_new_i32();
11427             TCGv_i32 fp1 = tcg_temp_new_i32();
11428             TCGv_i32 fp2 = tcg_temp_new_i32();
11429 
11430             gen_load_fpr32(ctx, fp0, fs);
11431             gen_load_fpr32(ctx, fp1, ft);
11432             gen_load_fpr32(ctx, fp2, fr);
11433             gen_helper_float_madd_s(fp2, cpu_env, fp0, fp1, fp2);
11434             tcg_temp_free_i32(fp0);
11435             tcg_temp_free_i32(fp1);
11436             gen_store_fpr32(ctx, fp2, fd);
11437             tcg_temp_free_i32(fp2);
11438         }
11439         break;
11440     case OPC_MADD_D:
11441         check_cop1x(ctx);
11442         check_cp1_registers(ctx, fd | fs | ft | fr);
11443         {
11444             TCGv_i64 fp0 = tcg_temp_new_i64();
11445             TCGv_i64 fp1 = tcg_temp_new_i64();
11446             TCGv_i64 fp2 = tcg_temp_new_i64();
11447 
11448             gen_load_fpr64(ctx, fp0, fs);
11449             gen_load_fpr64(ctx, fp1, ft);
11450             gen_load_fpr64(ctx, fp2, fr);
11451             gen_helper_float_madd_d(fp2, cpu_env, fp0, fp1, fp2);
11452             tcg_temp_free_i64(fp0);
11453             tcg_temp_free_i64(fp1);
11454             gen_store_fpr64(ctx, fp2, fd);
11455             tcg_temp_free_i64(fp2);
11456         }
11457         break;
11458     case OPC_MADD_PS:
11459         check_ps(ctx);
11460         {
11461             TCGv_i64 fp0 = tcg_temp_new_i64();
11462             TCGv_i64 fp1 = tcg_temp_new_i64();
11463             TCGv_i64 fp2 = tcg_temp_new_i64();
11464 
11465             gen_load_fpr64(ctx, fp0, fs);
11466             gen_load_fpr64(ctx, fp1, ft);
11467             gen_load_fpr64(ctx, fp2, fr);
11468             gen_helper_float_madd_ps(fp2, cpu_env, fp0, fp1, fp2);
11469             tcg_temp_free_i64(fp0);
11470             tcg_temp_free_i64(fp1);
11471             gen_store_fpr64(ctx, fp2, fd);
11472             tcg_temp_free_i64(fp2);
11473         }
11474         break;
11475     case OPC_MSUB_S:
11476         check_cop1x(ctx);
11477         {
11478             TCGv_i32 fp0 = tcg_temp_new_i32();
11479             TCGv_i32 fp1 = tcg_temp_new_i32();
11480             TCGv_i32 fp2 = tcg_temp_new_i32();
11481 
11482             gen_load_fpr32(ctx, fp0, fs);
11483             gen_load_fpr32(ctx, fp1, ft);
11484             gen_load_fpr32(ctx, fp2, fr);
11485             gen_helper_float_msub_s(fp2, cpu_env, fp0, fp1, fp2);
11486             tcg_temp_free_i32(fp0);
11487             tcg_temp_free_i32(fp1);
11488             gen_store_fpr32(ctx, fp2, fd);
11489             tcg_temp_free_i32(fp2);
11490         }
11491         break;
11492     case OPC_MSUB_D:
11493         check_cop1x(ctx);
11494         check_cp1_registers(ctx, fd | fs | ft | fr);
11495         {
11496             TCGv_i64 fp0 = tcg_temp_new_i64();
11497             TCGv_i64 fp1 = tcg_temp_new_i64();
11498             TCGv_i64 fp2 = tcg_temp_new_i64();
11499 
11500             gen_load_fpr64(ctx, fp0, fs);
11501             gen_load_fpr64(ctx, fp1, ft);
11502             gen_load_fpr64(ctx, fp2, fr);
11503             gen_helper_float_msub_d(fp2, cpu_env, fp0, fp1, fp2);
11504             tcg_temp_free_i64(fp0);
11505             tcg_temp_free_i64(fp1);
11506             gen_store_fpr64(ctx, fp2, fd);
11507             tcg_temp_free_i64(fp2);
11508         }
11509         break;
11510     case OPC_MSUB_PS:
11511         check_ps(ctx);
11512         {
11513             TCGv_i64 fp0 = tcg_temp_new_i64();
11514             TCGv_i64 fp1 = tcg_temp_new_i64();
11515             TCGv_i64 fp2 = tcg_temp_new_i64();
11516 
11517             gen_load_fpr64(ctx, fp0, fs);
11518             gen_load_fpr64(ctx, fp1, ft);
11519             gen_load_fpr64(ctx, fp2, fr);
11520             gen_helper_float_msub_ps(fp2, cpu_env, fp0, fp1, fp2);
11521             tcg_temp_free_i64(fp0);
11522             tcg_temp_free_i64(fp1);
11523             gen_store_fpr64(ctx, fp2, fd);
11524             tcg_temp_free_i64(fp2);
11525         }
11526         break;
11527     case OPC_NMADD_S:
11528         check_cop1x(ctx);
11529         {
11530             TCGv_i32 fp0 = tcg_temp_new_i32();
11531             TCGv_i32 fp1 = tcg_temp_new_i32();
11532             TCGv_i32 fp2 = tcg_temp_new_i32();
11533 
11534             gen_load_fpr32(ctx, fp0, fs);
11535             gen_load_fpr32(ctx, fp1, ft);
11536             gen_load_fpr32(ctx, fp2, fr);
11537             gen_helper_float_nmadd_s(fp2, cpu_env, fp0, fp1, fp2);
11538             tcg_temp_free_i32(fp0);
11539             tcg_temp_free_i32(fp1);
11540             gen_store_fpr32(ctx, fp2, fd);
11541             tcg_temp_free_i32(fp2);
11542         }
11543         break;
11544     case OPC_NMADD_D:
11545         check_cop1x(ctx);
11546         check_cp1_registers(ctx, fd | fs | ft | fr);
11547         {
11548             TCGv_i64 fp0 = tcg_temp_new_i64();
11549             TCGv_i64 fp1 = tcg_temp_new_i64();
11550             TCGv_i64 fp2 = tcg_temp_new_i64();
11551 
11552             gen_load_fpr64(ctx, fp0, fs);
11553             gen_load_fpr64(ctx, fp1, ft);
11554             gen_load_fpr64(ctx, fp2, fr);
11555             gen_helper_float_nmadd_d(fp2, cpu_env, fp0, fp1, fp2);
11556             tcg_temp_free_i64(fp0);
11557             tcg_temp_free_i64(fp1);
11558             gen_store_fpr64(ctx, fp2, fd);
11559             tcg_temp_free_i64(fp2);
11560         }
11561         break;
11562     case OPC_NMADD_PS:
11563         check_ps(ctx);
11564         {
11565             TCGv_i64 fp0 = tcg_temp_new_i64();
11566             TCGv_i64 fp1 = tcg_temp_new_i64();
11567             TCGv_i64 fp2 = tcg_temp_new_i64();
11568 
11569             gen_load_fpr64(ctx, fp0, fs);
11570             gen_load_fpr64(ctx, fp1, ft);
11571             gen_load_fpr64(ctx, fp2, fr);
11572             gen_helper_float_nmadd_ps(fp2, cpu_env, fp0, fp1, fp2);
11573             tcg_temp_free_i64(fp0);
11574             tcg_temp_free_i64(fp1);
11575             gen_store_fpr64(ctx, fp2, fd);
11576             tcg_temp_free_i64(fp2);
11577         }
11578         break;
11579     case OPC_NMSUB_S:
11580         check_cop1x(ctx);
11581         {
11582             TCGv_i32 fp0 = tcg_temp_new_i32();
11583             TCGv_i32 fp1 = tcg_temp_new_i32();
11584             TCGv_i32 fp2 = tcg_temp_new_i32();
11585 
11586             gen_load_fpr32(ctx, fp0, fs);
11587             gen_load_fpr32(ctx, fp1, ft);
11588             gen_load_fpr32(ctx, fp2, fr);
11589             gen_helper_float_nmsub_s(fp2, cpu_env, fp0, fp1, fp2);
11590             tcg_temp_free_i32(fp0);
11591             tcg_temp_free_i32(fp1);
11592             gen_store_fpr32(ctx, fp2, fd);
11593             tcg_temp_free_i32(fp2);
11594         }
11595         break;
11596     case OPC_NMSUB_D:
11597         check_cop1x(ctx);
11598         check_cp1_registers(ctx, fd | fs | ft | fr);
11599         {
11600             TCGv_i64 fp0 = tcg_temp_new_i64();
11601             TCGv_i64 fp1 = tcg_temp_new_i64();
11602             TCGv_i64 fp2 = tcg_temp_new_i64();
11603 
11604             gen_load_fpr64(ctx, fp0, fs);
11605             gen_load_fpr64(ctx, fp1, ft);
11606             gen_load_fpr64(ctx, fp2, fr);
11607             gen_helper_float_nmsub_d(fp2, cpu_env, fp0, fp1, fp2);
11608             tcg_temp_free_i64(fp0);
11609             tcg_temp_free_i64(fp1);
11610             gen_store_fpr64(ctx, fp2, fd);
11611             tcg_temp_free_i64(fp2);
11612         }
11613         break;
11614     case OPC_NMSUB_PS:
11615         check_ps(ctx);
11616         {
11617             TCGv_i64 fp0 = tcg_temp_new_i64();
11618             TCGv_i64 fp1 = tcg_temp_new_i64();
11619             TCGv_i64 fp2 = tcg_temp_new_i64();
11620 
11621             gen_load_fpr64(ctx, fp0, fs);
11622             gen_load_fpr64(ctx, fp1, ft);
11623             gen_load_fpr64(ctx, fp2, fr);
11624             gen_helper_float_nmsub_ps(fp2, cpu_env, fp0, fp1, fp2);
11625             tcg_temp_free_i64(fp0);
11626             tcg_temp_free_i64(fp1);
11627             gen_store_fpr64(ctx, fp2, fd);
11628             tcg_temp_free_i64(fp2);
11629         }
11630         break;
11631     default:
11632         MIPS_INVAL("flt3_arith");
11633         gen_reserved_instruction(ctx);
11634         return;
11635     }
11636 }
11637 
11638 void gen_rdhwr(DisasContext *ctx, int rt, int rd, int sel)
11639 {
11640     TCGv t0;
11641 
11642 #if !defined(CONFIG_USER_ONLY)
11643     /*
11644      * The Linux kernel will emulate rdhwr if it's not supported natively.
11645      * Therefore only check the ISA in system mode.
11646      */
11647     check_insn(ctx, ISA_MIPS_R2);
11648 #endif
11649     t0 = tcg_temp_new();
11650 
11651     switch (rd) {
11652     case 0:
11653         gen_helper_rdhwr_cpunum(t0, cpu_env);
11654         gen_store_gpr(t0, rt);
11655         break;
11656     case 1:
11657         gen_helper_rdhwr_synci_step(t0, cpu_env);
11658         gen_store_gpr(t0, rt);
11659         break;
11660     case 2:
11661         if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
11662             gen_io_start();
11663         }
11664         gen_helper_rdhwr_cc(t0, cpu_env);
11665         gen_store_gpr(t0, rt);
11666         /*
11667          * Break the TB to be able to take timer interrupts immediately
11668          * after reading count. DISAS_STOP isn't sufficient, we need to ensure
11669          * we break completely out of translated code.
11670          */
11671         gen_save_pc(ctx->base.pc_next + 4);
11672         ctx->base.is_jmp = DISAS_EXIT;
11673         break;
11674     case 3:
11675         gen_helper_rdhwr_ccres(t0, cpu_env);
11676         gen_store_gpr(t0, rt);
11677         break;
11678     case 4:
11679         check_insn(ctx, ISA_MIPS_R6);
11680         if (sel != 0) {
11681             /*
11682              * Performance counter registers are not implemented other than
11683              * control register 0.
11684              */
11685             generate_exception(ctx, EXCP_RI);
11686         }
11687         gen_helper_rdhwr_performance(t0, cpu_env);
11688         gen_store_gpr(t0, rt);
11689         break;
11690     case 5:
11691         check_insn(ctx, ISA_MIPS_R6);
11692         gen_helper_rdhwr_xnp(t0, cpu_env);
11693         gen_store_gpr(t0, rt);
11694         break;
11695     case 29:
11696 #if defined(CONFIG_USER_ONLY)
11697         tcg_gen_ld_tl(t0, cpu_env,
11698                       offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
11699         gen_store_gpr(t0, rt);
11700         break;
11701 #else
11702         if ((ctx->hflags & MIPS_HFLAG_CP0) ||
11703             (ctx->hflags & MIPS_HFLAG_HWRENA_ULR)) {
11704             tcg_gen_ld_tl(t0, cpu_env,
11705                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
11706             gen_store_gpr(t0, rt);
11707         } else {
11708             gen_reserved_instruction(ctx);
11709         }
11710         break;
11711 #endif
11712     default:            /* Invalid */
11713         MIPS_INVAL("rdhwr");
11714         gen_reserved_instruction(ctx);
11715         break;
11716     }
11717     tcg_temp_free(t0);
11718 }
11719 
11720 static inline void clear_branch_hflags(DisasContext *ctx)
11721 {
11722     ctx->hflags &= ~MIPS_HFLAG_BMASK;
11723     if (ctx->base.is_jmp == DISAS_NEXT) {
11724         save_cpu_state(ctx, 0);
11725     } else {
11726         /*
11727          * It is not safe to save ctx->hflags as hflags may be changed
11728          * in execution time by the instruction in delay / forbidden slot.
11729          */
11730         tcg_gen_andi_i32(hflags, hflags, ~MIPS_HFLAG_BMASK);
11731     }
11732 }
11733 
11734 static void gen_branch(DisasContext *ctx, int insn_bytes)
11735 {
11736     if (ctx->hflags & MIPS_HFLAG_BMASK) {
11737         int proc_hflags = ctx->hflags & MIPS_HFLAG_BMASK;
11738         /* Branches completion */
11739         clear_branch_hflags(ctx);
11740         ctx->base.is_jmp = DISAS_NORETURN;
11741         /* FIXME: Need to clear can_do_io.  */
11742         switch (proc_hflags & MIPS_HFLAG_BMASK_BASE) {
11743         case MIPS_HFLAG_FBNSLOT:
11744             gen_goto_tb(ctx, 0, ctx->base.pc_next + insn_bytes);
11745             break;
11746         case MIPS_HFLAG_B:
11747             /* unconditional branch */
11748             if (proc_hflags & MIPS_HFLAG_BX) {
11749                 tcg_gen_xori_i32(hflags, hflags, MIPS_HFLAG_M16);
11750             }
11751             gen_goto_tb(ctx, 0, ctx->btarget);
11752             break;
11753         case MIPS_HFLAG_BL:
11754             /* blikely taken case */
11755             gen_goto_tb(ctx, 0, ctx->btarget);
11756             break;
11757         case MIPS_HFLAG_BC:
11758             /* Conditional branch */
11759             {
11760                 TCGLabel *l1 = gen_new_label();
11761 
11762                 tcg_gen_brcondi_tl(TCG_COND_NE, bcond, 0, l1);
11763                 gen_goto_tb(ctx, 1, ctx->base.pc_next + insn_bytes);
11764                 gen_set_label(l1);
11765                 gen_goto_tb(ctx, 0, ctx->btarget);
11766             }
11767             break;
11768         case MIPS_HFLAG_BR:
11769             /* unconditional branch to register */
11770             if (ctx->insn_flags & (ASE_MIPS16 | ASE_MICROMIPS)) {
11771                 TCGv t0 = tcg_temp_new();
11772                 TCGv_i32 t1 = tcg_temp_new_i32();
11773 
11774                 tcg_gen_andi_tl(t0, btarget, 0x1);
11775                 tcg_gen_trunc_tl_i32(t1, t0);
11776                 tcg_temp_free(t0);
11777                 tcg_gen_andi_i32(hflags, hflags, ~(uint32_t)MIPS_HFLAG_M16);
11778                 tcg_gen_shli_i32(t1, t1, MIPS_HFLAG_M16_SHIFT);
11779                 tcg_gen_or_i32(hflags, hflags, t1);
11780                 tcg_temp_free_i32(t1);
11781 
11782                 tcg_gen_andi_tl(cpu_PC, btarget, ~(target_ulong)0x1);
11783             } else {
11784                 tcg_gen_mov_tl(cpu_PC, btarget);
11785             }
11786             tcg_gen_lookup_and_goto_ptr();
11787             break;
11788         default:
11789             LOG_DISAS("unknown branch 0x%x\n", proc_hflags);
11790             gen_reserved_instruction(ctx);
11791         }
11792     }
11793 }
11794 
11795 /* Compact Branches */
11796 static void gen_compute_compact_branch(DisasContext *ctx, uint32_t opc,
11797                                        int rs, int rt, int32_t offset)
11798 {
11799     int bcond_compute = 0;
11800     TCGv t0 = tcg_temp_new();
11801     TCGv t1 = tcg_temp_new();
11802     int m16_lowbit = (ctx->hflags & MIPS_HFLAG_M16) != 0;
11803 
11804     if (ctx->hflags & MIPS_HFLAG_BMASK) {
11805 #ifdef MIPS_DEBUG_DISAS
11806         LOG_DISAS("Branch in delay / forbidden slot at PC 0x" TARGET_FMT_lx
11807                   "\n", ctx->base.pc_next);
11808 #endif
11809         gen_reserved_instruction(ctx);
11810         goto out;
11811     }
11812 
11813     /* Load needed operands and calculate btarget */
11814     switch (opc) {
11815     /* compact branch */
11816     case OPC_BOVC: /* OPC_BEQZALC, OPC_BEQC */
11817     case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC */
11818         gen_load_gpr(t0, rs);
11819         gen_load_gpr(t1, rt);
11820         bcond_compute = 1;
11821         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
11822         if (rs <= rt && rs == 0) {
11823             /* OPC_BEQZALC, OPC_BNEZALC */
11824             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4 + m16_lowbit);
11825         }
11826         break;
11827     case OPC_BLEZC: /* OPC_BGEZC, OPC_BGEC */
11828     case OPC_BGTZC: /* OPC_BLTZC, OPC_BLTC */
11829         gen_load_gpr(t0, rs);
11830         gen_load_gpr(t1, rt);
11831         bcond_compute = 1;
11832         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
11833         break;
11834     case OPC_BLEZALC: /* OPC_BGEZALC, OPC_BGEUC */
11835     case OPC_BGTZALC: /* OPC_BLTZALC, OPC_BLTUC */
11836         if (rs == 0 || rs == rt) {
11837             /* OPC_BLEZALC, OPC_BGEZALC */
11838             /* OPC_BGTZALC, OPC_BLTZALC */
11839             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4 + m16_lowbit);
11840         }
11841         gen_load_gpr(t0, rs);
11842         gen_load_gpr(t1, rt);
11843         bcond_compute = 1;
11844         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
11845         break;
11846     case OPC_BC:
11847     case OPC_BALC:
11848         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
11849         break;
11850     case OPC_BEQZC:
11851     case OPC_BNEZC:
11852         if (rs != 0) {
11853             /* OPC_BEQZC, OPC_BNEZC */
11854             gen_load_gpr(t0, rs);
11855             bcond_compute = 1;
11856             ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
11857         } else {
11858             /* OPC_JIC, OPC_JIALC */
11859             TCGv tbase = tcg_temp_new();
11860             TCGv toffset = tcg_temp_new();
11861 
11862             gen_load_gpr(tbase, rt);
11863             tcg_gen_movi_tl(toffset, offset);
11864             gen_op_addr_add(ctx, btarget, tbase, toffset);
11865             tcg_temp_free(tbase);
11866             tcg_temp_free(toffset);
11867         }
11868         break;
11869     default:
11870         MIPS_INVAL("Compact branch/jump");
11871         gen_reserved_instruction(ctx);
11872         goto out;
11873     }
11874 
11875     if (bcond_compute == 0) {
11876         /* Unconditional compact branch */
11877         switch (opc) {
11878         case OPC_JIALC:
11879             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4 + m16_lowbit);
11880             /* Fallthrough */
11881         case OPC_JIC:
11882             ctx->hflags |= MIPS_HFLAG_BR;
11883             break;
11884         case OPC_BALC:
11885             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4 + m16_lowbit);
11886             /* Fallthrough */
11887         case OPC_BC:
11888             ctx->hflags |= MIPS_HFLAG_B;
11889             break;
11890         default:
11891             MIPS_INVAL("Compact branch/jump");
11892             gen_reserved_instruction(ctx);
11893             goto out;
11894         }
11895 
11896         /* Generating branch here as compact branches don't have delay slot */
11897         gen_branch(ctx, 4);
11898     } else {
11899         /* Conditional compact branch */
11900         TCGLabel *fs = gen_new_label();
11901         save_cpu_state(ctx, 0);
11902 
11903         switch (opc) {
11904         case OPC_BLEZALC: /* OPC_BGEZALC, OPC_BGEUC */
11905             if (rs == 0 && rt != 0) {
11906                 /* OPC_BLEZALC */
11907                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LE), t1, 0, fs);
11908             } else if (rs != 0 && rt != 0 && rs == rt) {
11909                 /* OPC_BGEZALC */
11910                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GE), t1, 0, fs);
11911             } else {
11912                 /* OPC_BGEUC */
11913                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_GEU), t0, t1, fs);
11914             }
11915             break;
11916         case OPC_BGTZALC: /* OPC_BLTZALC, OPC_BLTUC */
11917             if (rs == 0 && rt != 0) {
11918                 /* OPC_BGTZALC */
11919                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GT), t1, 0, fs);
11920             } else if (rs != 0 && rt != 0 && rs == rt) {
11921                 /* OPC_BLTZALC */
11922                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LT), t1, 0, fs);
11923             } else {
11924                 /* OPC_BLTUC */
11925                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_LTU), t0, t1, fs);
11926             }
11927             break;
11928         case OPC_BLEZC: /* OPC_BGEZC, OPC_BGEC */
11929             if (rs == 0 && rt != 0) {
11930                 /* OPC_BLEZC */
11931                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LE), t1, 0, fs);
11932             } else if (rs != 0 && rt != 0 && rs == rt) {
11933                 /* OPC_BGEZC */
11934                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GE), t1, 0, fs);
11935             } else {
11936                 /* OPC_BGEC */
11937                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_GE), t0, t1, fs);
11938             }
11939             break;
11940         case OPC_BGTZC: /* OPC_BLTZC, OPC_BLTC */
11941             if (rs == 0 && rt != 0) {
11942                 /* OPC_BGTZC */
11943                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GT), t1, 0, fs);
11944             } else if (rs != 0 && rt != 0 && rs == rt) {
11945                 /* OPC_BLTZC */
11946                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LT), t1, 0, fs);
11947             } else {
11948                 /* OPC_BLTC */
11949                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_LT), t0, t1, fs);
11950             }
11951             break;
11952         case OPC_BOVC: /* OPC_BEQZALC, OPC_BEQC */
11953         case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC */
11954             if (rs >= rt) {
11955                 /* OPC_BOVC, OPC_BNVC */
11956                 TCGv t2 = tcg_temp_new();
11957                 TCGv t3 = tcg_temp_new();
11958                 TCGv t4 = tcg_temp_new();
11959                 TCGv input_overflow = tcg_temp_new();
11960 
11961                 gen_load_gpr(t0, rs);
11962                 gen_load_gpr(t1, rt);
11963                 tcg_gen_ext32s_tl(t2, t0);
11964                 tcg_gen_setcond_tl(TCG_COND_NE, input_overflow, t2, t0);
11965                 tcg_gen_ext32s_tl(t3, t1);
11966                 tcg_gen_setcond_tl(TCG_COND_NE, t4, t3, t1);
11967                 tcg_gen_or_tl(input_overflow, input_overflow, t4);
11968 
11969                 tcg_gen_add_tl(t4, t2, t3);
11970                 tcg_gen_ext32s_tl(t4, t4);
11971                 tcg_gen_xor_tl(t2, t2, t3);
11972                 tcg_gen_xor_tl(t3, t4, t3);
11973                 tcg_gen_andc_tl(t2, t3, t2);
11974                 tcg_gen_setcondi_tl(TCG_COND_LT, t4, t2, 0);
11975                 tcg_gen_or_tl(t4, t4, input_overflow);
11976                 if (opc == OPC_BOVC) {
11977                     /* OPC_BOVC */
11978                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_NE), t4, 0, fs);
11979                 } else {
11980                     /* OPC_BNVC */
11981                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_EQ), t4, 0, fs);
11982                 }
11983                 tcg_temp_free(input_overflow);
11984                 tcg_temp_free(t4);
11985                 tcg_temp_free(t3);
11986                 tcg_temp_free(t2);
11987             } else if (rs < rt && rs == 0) {
11988                 /* OPC_BEQZALC, OPC_BNEZALC */
11989                 if (opc == OPC_BEQZALC) {
11990                     /* OPC_BEQZALC */
11991                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_EQ), t1, 0, fs);
11992                 } else {
11993                     /* OPC_BNEZALC */
11994                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_NE), t1, 0, fs);
11995                 }
11996             } else {
11997                 /* OPC_BEQC, OPC_BNEC */
11998                 if (opc == OPC_BEQC) {
11999                     /* OPC_BEQC */
12000                     tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_EQ), t0, t1, fs);
12001                 } else {
12002                     /* OPC_BNEC */
12003                     tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_NE), t0, t1, fs);
12004                 }
12005             }
12006             break;
12007         case OPC_BEQZC:
12008             tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_EQ), t0, 0, fs);
12009             break;
12010         case OPC_BNEZC:
12011             tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_NE), t0, 0, fs);
12012             break;
12013         default:
12014             MIPS_INVAL("Compact conditional branch/jump");
12015             gen_reserved_instruction(ctx);
12016             goto out;
12017         }
12018 
12019         /* Generating branch here as compact branches don't have delay slot */
12020         gen_goto_tb(ctx, 1, ctx->btarget);
12021         gen_set_label(fs);
12022 
12023         ctx->hflags |= MIPS_HFLAG_FBNSLOT;
12024     }
12025 
12026 out:
12027     tcg_temp_free(t0);
12028     tcg_temp_free(t1);
12029 }
12030 
12031 void gen_addiupc(DisasContext *ctx, int rx, int imm,
12032                  int is_64_bit, int extended)
12033 {
12034     TCGv t0;
12035 
12036     if (extended && (ctx->hflags & MIPS_HFLAG_BMASK)) {
12037         gen_reserved_instruction(ctx);
12038         return;
12039     }
12040 
12041     t0 = tcg_temp_new();
12042 
12043     tcg_gen_movi_tl(t0, pc_relative_pc(ctx));
12044     tcg_gen_addi_tl(cpu_gpr[rx], t0, imm);
12045     if (!is_64_bit) {
12046         tcg_gen_ext32s_tl(cpu_gpr[rx], cpu_gpr[rx]);
12047     }
12048 
12049     tcg_temp_free(t0);
12050 }
12051 
12052 static void gen_cache_operation(DisasContext *ctx, uint32_t op, int base,
12053                                 int16_t offset)
12054 {
12055     TCGv_i32 t0 = tcg_const_i32(op);
12056     TCGv t1 = tcg_temp_new();
12057     gen_base_offset_addr(ctx, t1, base, offset);
12058     gen_helper_cache(cpu_env, t1, t0);
12059     tcg_temp_free(t1);
12060     tcg_temp_free_i32(t0);
12061 }
12062 
12063 static inline bool is_uhi(int sdbbp_code)
12064 {
12065 #ifdef CONFIG_USER_ONLY
12066     return false;
12067 #else
12068     return semihosting_enabled() && sdbbp_code == 1;
12069 #endif
12070 }
12071 
12072 #ifdef CONFIG_USER_ONLY
12073 /* The above should dead-code away any calls to this..*/
12074 static inline void gen_helper_do_semihosting(void *env)
12075 {
12076     g_assert_not_reached();
12077 }
12078 #endif
12079 
12080 void gen_ldxs(DisasContext *ctx, int base, int index, int rd)
12081 {
12082     TCGv t0 = tcg_temp_new();
12083     TCGv t1 = tcg_temp_new();
12084 
12085     gen_load_gpr(t0, base);
12086 
12087     if (index != 0) {
12088         gen_load_gpr(t1, index);
12089         tcg_gen_shli_tl(t1, t1, 2);
12090         gen_op_addr_add(ctx, t0, t1, t0);
12091     }
12092 
12093     tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL);
12094     gen_store_gpr(t1, rd);
12095 
12096     tcg_temp_free(t0);
12097     tcg_temp_free(t1);
12098 }
12099 
12100 static void gen_sync(int stype)
12101 {
12102     TCGBar tcg_mo = TCG_BAR_SC;
12103 
12104     switch (stype) {
12105     case 0x4: /* SYNC_WMB */
12106         tcg_mo |= TCG_MO_ST_ST;
12107         break;
12108     case 0x10: /* SYNC_MB */
12109         tcg_mo |= TCG_MO_ALL;
12110         break;
12111     case 0x11: /* SYNC_ACQUIRE */
12112         tcg_mo |= TCG_MO_LD_LD | TCG_MO_LD_ST;
12113         break;
12114     case 0x12: /* SYNC_RELEASE */
12115         tcg_mo |= TCG_MO_ST_ST | TCG_MO_LD_ST;
12116         break;
12117     case 0x13: /* SYNC_RMB */
12118         tcg_mo |= TCG_MO_LD_LD;
12119         break;
12120     default:
12121         tcg_mo |= TCG_MO_ALL;
12122         break;
12123     }
12124 
12125     tcg_gen_mb(tcg_mo);
12126 }
12127 
12128 /* ISA extensions (ASEs) */
12129 
12130 /* MIPS16 extension to MIPS32 */
12131 #include "mips16e_translate.c.inc"
12132 
12133 /* microMIPS extension to MIPS32/MIPS64 */
12134 
12135 /*
12136  * Values for microMIPS fmt field.  Variable-width, depending on which
12137  * formats the instruction supports.
12138  */
12139 enum {
12140     FMT_SD_S = 0,
12141     FMT_SD_D = 1,
12142 
12143     FMT_SDPS_S = 0,
12144     FMT_SDPS_D = 1,
12145     FMT_SDPS_PS = 2,
12146 
12147     FMT_SWL_S = 0,
12148     FMT_SWL_W = 1,
12149     FMT_SWL_L = 2,
12150 
12151     FMT_DWL_D = 0,
12152     FMT_DWL_W = 1,
12153     FMT_DWL_L = 2
12154 };
12155 
12156 #include "micromips_translate.c.inc"
12157 
12158 #include "nanomips_translate.c.inc"
12159 
12160 /* MIPSDSP functions. */
12161 static void gen_mipsdsp_ld(DisasContext *ctx, uint32_t opc,
12162                            int rd, int base, int offset)
12163 {
12164     TCGv t0;
12165 
12166     check_dsp(ctx);
12167     t0 = tcg_temp_new();
12168 
12169     if (base == 0) {
12170         gen_load_gpr(t0, offset);
12171     } else if (offset == 0) {
12172         gen_load_gpr(t0, base);
12173     } else {
12174         gen_op_addr_add(ctx, t0, cpu_gpr[base], cpu_gpr[offset]);
12175     }
12176 
12177     switch (opc) {
12178     case OPC_LBUX:
12179         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_UB);
12180         gen_store_gpr(t0, rd);
12181         break;
12182     case OPC_LHX:
12183         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESW);
12184         gen_store_gpr(t0, rd);
12185         break;
12186     case OPC_LWX:
12187         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL);
12188         gen_store_gpr(t0, rd);
12189         break;
12190 #if defined(TARGET_MIPS64)
12191     case OPC_LDX:
12192         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ);
12193         gen_store_gpr(t0, rd);
12194         break;
12195 #endif
12196     }
12197     tcg_temp_free(t0);
12198 }
12199 
12200 static void gen_mipsdsp_arith(DisasContext *ctx, uint32_t op1, uint32_t op2,
12201                               int ret, int v1, int v2)
12202 {
12203     TCGv v1_t;
12204     TCGv v2_t;
12205 
12206     if (ret == 0) {
12207         /* Treat as NOP. */
12208         return;
12209     }
12210 
12211     v1_t = tcg_temp_new();
12212     v2_t = tcg_temp_new();
12213 
12214     gen_load_gpr(v1_t, v1);
12215     gen_load_gpr(v2_t, v2);
12216 
12217     switch (op1) {
12218     /* OPC_MULT_G_2E is equal OPC_ADDUH_QB_DSP */
12219     case OPC_MULT_G_2E:
12220         check_dsp_r2(ctx);
12221         switch (op2) {
12222         case OPC_ADDUH_QB:
12223             gen_helper_adduh_qb(cpu_gpr[ret], v1_t, v2_t);
12224             break;
12225         case OPC_ADDUH_R_QB:
12226             gen_helper_adduh_r_qb(cpu_gpr[ret], v1_t, v2_t);
12227             break;
12228         case OPC_ADDQH_PH:
12229             gen_helper_addqh_ph(cpu_gpr[ret], v1_t, v2_t);
12230             break;
12231         case OPC_ADDQH_R_PH:
12232             gen_helper_addqh_r_ph(cpu_gpr[ret], v1_t, v2_t);
12233             break;
12234         case OPC_ADDQH_W:
12235             gen_helper_addqh_w(cpu_gpr[ret], v1_t, v2_t);
12236             break;
12237         case OPC_ADDQH_R_W:
12238             gen_helper_addqh_r_w(cpu_gpr[ret], v1_t, v2_t);
12239             break;
12240         case OPC_SUBUH_QB:
12241             gen_helper_subuh_qb(cpu_gpr[ret], v1_t, v2_t);
12242             break;
12243         case OPC_SUBUH_R_QB:
12244             gen_helper_subuh_r_qb(cpu_gpr[ret], v1_t, v2_t);
12245             break;
12246         case OPC_SUBQH_PH:
12247             gen_helper_subqh_ph(cpu_gpr[ret], v1_t, v2_t);
12248             break;
12249         case OPC_SUBQH_R_PH:
12250             gen_helper_subqh_r_ph(cpu_gpr[ret], v1_t, v2_t);
12251             break;
12252         case OPC_SUBQH_W:
12253             gen_helper_subqh_w(cpu_gpr[ret], v1_t, v2_t);
12254             break;
12255         case OPC_SUBQH_R_W:
12256             gen_helper_subqh_r_w(cpu_gpr[ret], v1_t, v2_t);
12257             break;
12258         }
12259         break;
12260     case OPC_ABSQ_S_PH_DSP:
12261         switch (op2) {
12262         case OPC_ABSQ_S_QB:
12263             check_dsp_r2(ctx);
12264             gen_helper_absq_s_qb(cpu_gpr[ret], v2_t, cpu_env);
12265             break;
12266         case OPC_ABSQ_S_PH:
12267             check_dsp(ctx);
12268             gen_helper_absq_s_ph(cpu_gpr[ret], v2_t, cpu_env);
12269             break;
12270         case OPC_ABSQ_S_W:
12271             check_dsp(ctx);
12272             gen_helper_absq_s_w(cpu_gpr[ret], v2_t, cpu_env);
12273             break;
12274         case OPC_PRECEQ_W_PHL:
12275             check_dsp(ctx);
12276             tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0xFFFF0000);
12277             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
12278             break;
12279         case OPC_PRECEQ_W_PHR:
12280             check_dsp(ctx);
12281             tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0x0000FFFF);
12282             tcg_gen_shli_tl(cpu_gpr[ret], cpu_gpr[ret], 16);
12283             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
12284             break;
12285         case OPC_PRECEQU_PH_QBL:
12286             check_dsp(ctx);
12287             gen_helper_precequ_ph_qbl(cpu_gpr[ret], v2_t);
12288             break;
12289         case OPC_PRECEQU_PH_QBR:
12290             check_dsp(ctx);
12291             gen_helper_precequ_ph_qbr(cpu_gpr[ret], v2_t);
12292             break;
12293         case OPC_PRECEQU_PH_QBLA:
12294             check_dsp(ctx);
12295             gen_helper_precequ_ph_qbla(cpu_gpr[ret], v2_t);
12296             break;
12297         case OPC_PRECEQU_PH_QBRA:
12298             check_dsp(ctx);
12299             gen_helper_precequ_ph_qbra(cpu_gpr[ret], v2_t);
12300             break;
12301         case OPC_PRECEU_PH_QBL:
12302             check_dsp(ctx);
12303             gen_helper_preceu_ph_qbl(cpu_gpr[ret], v2_t);
12304             break;
12305         case OPC_PRECEU_PH_QBR:
12306             check_dsp(ctx);
12307             gen_helper_preceu_ph_qbr(cpu_gpr[ret], v2_t);
12308             break;
12309         case OPC_PRECEU_PH_QBLA:
12310             check_dsp(ctx);
12311             gen_helper_preceu_ph_qbla(cpu_gpr[ret], v2_t);
12312             break;
12313         case OPC_PRECEU_PH_QBRA:
12314             check_dsp(ctx);
12315             gen_helper_preceu_ph_qbra(cpu_gpr[ret], v2_t);
12316             break;
12317         }
12318         break;
12319     case OPC_ADDU_QB_DSP:
12320         switch (op2) {
12321         case OPC_ADDQ_PH:
12322             check_dsp(ctx);
12323             gen_helper_addq_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12324             break;
12325         case OPC_ADDQ_S_PH:
12326             check_dsp(ctx);
12327             gen_helper_addq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12328             break;
12329         case OPC_ADDQ_S_W:
12330             check_dsp(ctx);
12331             gen_helper_addq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12332             break;
12333         case OPC_ADDU_QB:
12334             check_dsp(ctx);
12335             gen_helper_addu_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12336             break;
12337         case OPC_ADDU_S_QB:
12338             check_dsp(ctx);
12339             gen_helper_addu_s_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12340             break;
12341         case OPC_ADDU_PH:
12342             check_dsp_r2(ctx);
12343             gen_helper_addu_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12344             break;
12345         case OPC_ADDU_S_PH:
12346             check_dsp_r2(ctx);
12347             gen_helper_addu_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12348             break;
12349         case OPC_SUBQ_PH:
12350             check_dsp(ctx);
12351             gen_helper_subq_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12352             break;
12353         case OPC_SUBQ_S_PH:
12354             check_dsp(ctx);
12355             gen_helper_subq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12356             break;
12357         case OPC_SUBQ_S_W:
12358             check_dsp(ctx);
12359             gen_helper_subq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12360             break;
12361         case OPC_SUBU_QB:
12362             check_dsp(ctx);
12363             gen_helper_subu_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12364             break;
12365         case OPC_SUBU_S_QB:
12366             check_dsp(ctx);
12367             gen_helper_subu_s_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12368             break;
12369         case OPC_SUBU_PH:
12370             check_dsp_r2(ctx);
12371             gen_helper_subu_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12372             break;
12373         case OPC_SUBU_S_PH:
12374             check_dsp_r2(ctx);
12375             gen_helper_subu_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12376             break;
12377         case OPC_ADDSC:
12378             check_dsp(ctx);
12379             gen_helper_addsc(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12380             break;
12381         case OPC_ADDWC:
12382             check_dsp(ctx);
12383             gen_helper_addwc(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12384             break;
12385         case OPC_MODSUB:
12386             check_dsp(ctx);
12387             gen_helper_modsub(cpu_gpr[ret], v1_t, v2_t);
12388             break;
12389         case OPC_RADDU_W_QB:
12390             check_dsp(ctx);
12391             gen_helper_raddu_w_qb(cpu_gpr[ret], v1_t);
12392             break;
12393         }
12394         break;
12395     case OPC_CMPU_EQ_QB_DSP:
12396         switch (op2) {
12397         case OPC_PRECR_QB_PH:
12398             check_dsp_r2(ctx);
12399             gen_helper_precr_qb_ph(cpu_gpr[ret], v1_t, v2_t);
12400             break;
12401         case OPC_PRECRQ_QB_PH:
12402             check_dsp(ctx);
12403             gen_helper_precrq_qb_ph(cpu_gpr[ret], v1_t, v2_t);
12404             break;
12405         case OPC_PRECR_SRA_PH_W:
12406             check_dsp_r2(ctx);
12407             {
12408                 TCGv_i32 sa_t = tcg_const_i32(v2);
12409                 gen_helper_precr_sra_ph_w(cpu_gpr[ret], sa_t, v1_t,
12410                                           cpu_gpr[ret]);
12411                 tcg_temp_free_i32(sa_t);
12412                 break;
12413             }
12414         case OPC_PRECR_SRA_R_PH_W:
12415             check_dsp_r2(ctx);
12416             {
12417                 TCGv_i32 sa_t = tcg_const_i32(v2);
12418                 gen_helper_precr_sra_r_ph_w(cpu_gpr[ret], sa_t, v1_t,
12419                                             cpu_gpr[ret]);
12420                 tcg_temp_free_i32(sa_t);
12421                 break;
12422             }
12423         case OPC_PRECRQ_PH_W:
12424             check_dsp(ctx);
12425             gen_helper_precrq_ph_w(cpu_gpr[ret], v1_t, v2_t);
12426             break;
12427         case OPC_PRECRQ_RS_PH_W:
12428             check_dsp(ctx);
12429             gen_helper_precrq_rs_ph_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12430             break;
12431         case OPC_PRECRQU_S_QB_PH:
12432             check_dsp(ctx);
12433             gen_helper_precrqu_s_qb_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12434             break;
12435         }
12436         break;
12437 #ifdef TARGET_MIPS64
12438     case OPC_ABSQ_S_QH_DSP:
12439         switch (op2) {
12440         case OPC_PRECEQ_L_PWL:
12441             check_dsp(ctx);
12442             tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0xFFFFFFFF00000000ull);
12443             break;
12444         case OPC_PRECEQ_L_PWR:
12445             check_dsp(ctx);
12446             tcg_gen_shli_tl(cpu_gpr[ret], v2_t, 32);
12447             break;
12448         case OPC_PRECEQ_PW_QHL:
12449             check_dsp(ctx);
12450             gen_helper_preceq_pw_qhl(cpu_gpr[ret], v2_t);
12451             break;
12452         case OPC_PRECEQ_PW_QHR:
12453             check_dsp(ctx);
12454             gen_helper_preceq_pw_qhr(cpu_gpr[ret], v2_t);
12455             break;
12456         case OPC_PRECEQ_PW_QHLA:
12457             check_dsp(ctx);
12458             gen_helper_preceq_pw_qhla(cpu_gpr[ret], v2_t);
12459             break;
12460         case OPC_PRECEQ_PW_QHRA:
12461             check_dsp(ctx);
12462             gen_helper_preceq_pw_qhra(cpu_gpr[ret], v2_t);
12463             break;
12464         case OPC_PRECEQU_QH_OBL:
12465             check_dsp(ctx);
12466             gen_helper_precequ_qh_obl(cpu_gpr[ret], v2_t);
12467             break;
12468         case OPC_PRECEQU_QH_OBR:
12469             check_dsp(ctx);
12470             gen_helper_precequ_qh_obr(cpu_gpr[ret], v2_t);
12471             break;
12472         case OPC_PRECEQU_QH_OBLA:
12473             check_dsp(ctx);
12474             gen_helper_precequ_qh_obla(cpu_gpr[ret], v2_t);
12475             break;
12476         case OPC_PRECEQU_QH_OBRA:
12477             check_dsp(ctx);
12478             gen_helper_precequ_qh_obra(cpu_gpr[ret], v2_t);
12479             break;
12480         case OPC_PRECEU_QH_OBL:
12481             check_dsp(ctx);
12482             gen_helper_preceu_qh_obl(cpu_gpr[ret], v2_t);
12483             break;
12484         case OPC_PRECEU_QH_OBR:
12485             check_dsp(ctx);
12486             gen_helper_preceu_qh_obr(cpu_gpr[ret], v2_t);
12487             break;
12488         case OPC_PRECEU_QH_OBLA:
12489             check_dsp(ctx);
12490             gen_helper_preceu_qh_obla(cpu_gpr[ret], v2_t);
12491             break;
12492         case OPC_PRECEU_QH_OBRA:
12493             check_dsp(ctx);
12494             gen_helper_preceu_qh_obra(cpu_gpr[ret], v2_t);
12495             break;
12496         case OPC_ABSQ_S_OB:
12497             check_dsp_r2(ctx);
12498             gen_helper_absq_s_ob(cpu_gpr[ret], v2_t, cpu_env);
12499             break;
12500         case OPC_ABSQ_S_PW:
12501             check_dsp(ctx);
12502             gen_helper_absq_s_pw(cpu_gpr[ret], v2_t, cpu_env);
12503             break;
12504         case OPC_ABSQ_S_QH:
12505             check_dsp(ctx);
12506             gen_helper_absq_s_qh(cpu_gpr[ret], v2_t, cpu_env);
12507             break;
12508         }
12509         break;
12510     case OPC_ADDU_OB_DSP:
12511         switch (op2) {
12512         case OPC_RADDU_L_OB:
12513             check_dsp(ctx);
12514             gen_helper_raddu_l_ob(cpu_gpr[ret], v1_t);
12515             break;
12516         case OPC_SUBQ_PW:
12517             check_dsp(ctx);
12518             gen_helper_subq_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12519             break;
12520         case OPC_SUBQ_S_PW:
12521             check_dsp(ctx);
12522             gen_helper_subq_s_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12523             break;
12524         case OPC_SUBQ_QH:
12525             check_dsp(ctx);
12526             gen_helper_subq_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12527             break;
12528         case OPC_SUBQ_S_QH:
12529             check_dsp(ctx);
12530             gen_helper_subq_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12531             break;
12532         case OPC_SUBU_OB:
12533             check_dsp(ctx);
12534             gen_helper_subu_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12535             break;
12536         case OPC_SUBU_S_OB:
12537             check_dsp(ctx);
12538             gen_helper_subu_s_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12539             break;
12540         case OPC_SUBU_QH:
12541             check_dsp_r2(ctx);
12542             gen_helper_subu_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12543             break;
12544         case OPC_SUBU_S_QH:
12545             check_dsp_r2(ctx);
12546             gen_helper_subu_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12547             break;
12548         case OPC_SUBUH_OB:
12549             check_dsp_r2(ctx);
12550             gen_helper_subuh_ob(cpu_gpr[ret], v1_t, v2_t);
12551             break;
12552         case OPC_SUBUH_R_OB:
12553             check_dsp_r2(ctx);
12554             gen_helper_subuh_r_ob(cpu_gpr[ret], v1_t, v2_t);
12555             break;
12556         case OPC_ADDQ_PW:
12557             check_dsp(ctx);
12558             gen_helper_addq_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12559             break;
12560         case OPC_ADDQ_S_PW:
12561             check_dsp(ctx);
12562             gen_helper_addq_s_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12563             break;
12564         case OPC_ADDQ_QH:
12565             check_dsp(ctx);
12566             gen_helper_addq_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12567             break;
12568         case OPC_ADDQ_S_QH:
12569             check_dsp(ctx);
12570             gen_helper_addq_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12571             break;
12572         case OPC_ADDU_OB:
12573             check_dsp(ctx);
12574             gen_helper_addu_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12575             break;
12576         case OPC_ADDU_S_OB:
12577             check_dsp(ctx);
12578             gen_helper_addu_s_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12579             break;
12580         case OPC_ADDU_QH:
12581             check_dsp_r2(ctx);
12582             gen_helper_addu_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12583             break;
12584         case OPC_ADDU_S_QH:
12585             check_dsp_r2(ctx);
12586             gen_helper_addu_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12587             break;
12588         case OPC_ADDUH_OB:
12589             check_dsp_r2(ctx);
12590             gen_helper_adduh_ob(cpu_gpr[ret], v1_t, v2_t);
12591             break;
12592         case OPC_ADDUH_R_OB:
12593             check_dsp_r2(ctx);
12594             gen_helper_adduh_r_ob(cpu_gpr[ret], v1_t, v2_t);
12595             break;
12596         }
12597         break;
12598     case OPC_CMPU_EQ_OB_DSP:
12599         switch (op2) {
12600         case OPC_PRECR_OB_QH:
12601             check_dsp_r2(ctx);
12602             gen_helper_precr_ob_qh(cpu_gpr[ret], v1_t, v2_t);
12603             break;
12604         case OPC_PRECR_SRA_QH_PW:
12605             check_dsp_r2(ctx);
12606             {
12607                 TCGv_i32 ret_t = tcg_const_i32(ret);
12608                 gen_helper_precr_sra_qh_pw(v2_t, v1_t, v2_t, ret_t);
12609                 tcg_temp_free_i32(ret_t);
12610                 break;
12611             }
12612         case OPC_PRECR_SRA_R_QH_PW:
12613             check_dsp_r2(ctx);
12614             {
12615                 TCGv_i32 sa_v = tcg_const_i32(ret);
12616                 gen_helper_precr_sra_r_qh_pw(v2_t, v1_t, v2_t, sa_v);
12617                 tcg_temp_free_i32(sa_v);
12618                 break;
12619             }
12620         case OPC_PRECRQ_OB_QH:
12621             check_dsp(ctx);
12622             gen_helper_precrq_ob_qh(cpu_gpr[ret], v1_t, v2_t);
12623             break;
12624         case OPC_PRECRQ_PW_L:
12625             check_dsp(ctx);
12626             gen_helper_precrq_pw_l(cpu_gpr[ret], v1_t, v2_t);
12627             break;
12628         case OPC_PRECRQ_QH_PW:
12629             check_dsp(ctx);
12630             gen_helper_precrq_qh_pw(cpu_gpr[ret], v1_t, v2_t);
12631             break;
12632         case OPC_PRECRQ_RS_QH_PW:
12633             check_dsp(ctx);
12634             gen_helper_precrq_rs_qh_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12635             break;
12636         case OPC_PRECRQU_S_OB_QH:
12637             check_dsp(ctx);
12638             gen_helper_precrqu_s_ob_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12639             break;
12640         }
12641         break;
12642 #endif
12643     }
12644 
12645     tcg_temp_free(v1_t);
12646     tcg_temp_free(v2_t);
12647 }
12648 
12649 static void gen_mipsdsp_shift(DisasContext *ctx, uint32_t opc,
12650                               int ret, int v1, int v2)
12651 {
12652     uint32_t op2;
12653     TCGv t0;
12654     TCGv v1_t;
12655     TCGv v2_t;
12656 
12657     if (ret == 0) {
12658         /* Treat as NOP. */
12659         return;
12660     }
12661 
12662     t0 = tcg_temp_new();
12663     v1_t = tcg_temp_new();
12664     v2_t = tcg_temp_new();
12665 
12666     tcg_gen_movi_tl(t0, v1);
12667     gen_load_gpr(v1_t, v1);
12668     gen_load_gpr(v2_t, v2);
12669 
12670     switch (opc) {
12671     case OPC_SHLL_QB_DSP:
12672         {
12673             op2 = MASK_SHLL_QB(ctx->opcode);
12674             switch (op2) {
12675             case OPC_SHLL_QB:
12676                 check_dsp(ctx);
12677                 gen_helper_shll_qb(cpu_gpr[ret], t0, v2_t, cpu_env);
12678                 break;
12679             case OPC_SHLLV_QB:
12680                 check_dsp(ctx);
12681                 gen_helper_shll_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12682                 break;
12683             case OPC_SHLL_PH:
12684                 check_dsp(ctx);
12685                 gen_helper_shll_ph(cpu_gpr[ret], t0, v2_t, cpu_env);
12686                 break;
12687             case OPC_SHLLV_PH:
12688                 check_dsp(ctx);
12689                 gen_helper_shll_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12690                 break;
12691             case OPC_SHLL_S_PH:
12692                 check_dsp(ctx);
12693                 gen_helper_shll_s_ph(cpu_gpr[ret], t0, v2_t, cpu_env);
12694                 break;
12695             case OPC_SHLLV_S_PH:
12696                 check_dsp(ctx);
12697                 gen_helper_shll_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12698                 break;
12699             case OPC_SHLL_S_W:
12700                 check_dsp(ctx);
12701                 gen_helper_shll_s_w(cpu_gpr[ret], t0, v2_t, cpu_env);
12702                 break;
12703             case OPC_SHLLV_S_W:
12704                 check_dsp(ctx);
12705                 gen_helper_shll_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12706                 break;
12707             case OPC_SHRL_QB:
12708                 check_dsp(ctx);
12709                 gen_helper_shrl_qb(cpu_gpr[ret], t0, v2_t);
12710                 break;
12711             case OPC_SHRLV_QB:
12712                 check_dsp(ctx);
12713                 gen_helper_shrl_qb(cpu_gpr[ret], v1_t, v2_t);
12714                 break;
12715             case OPC_SHRL_PH:
12716                 check_dsp_r2(ctx);
12717                 gen_helper_shrl_ph(cpu_gpr[ret], t0, v2_t);
12718                 break;
12719             case OPC_SHRLV_PH:
12720                 check_dsp_r2(ctx);
12721                 gen_helper_shrl_ph(cpu_gpr[ret], v1_t, v2_t);
12722                 break;
12723             case OPC_SHRA_QB:
12724                 check_dsp_r2(ctx);
12725                 gen_helper_shra_qb(cpu_gpr[ret], t0, v2_t);
12726                 break;
12727             case OPC_SHRA_R_QB:
12728                 check_dsp_r2(ctx);
12729                 gen_helper_shra_r_qb(cpu_gpr[ret], t0, v2_t);
12730                 break;
12731             case OPC_SHRAV_QB:
12732                 check_dsp_r2(ctx);
12733                 gen_helper_shra_qb(cpu_gpr[ret], v1_t, v2_t);
12734                 break;
12735             case OPC_SHRAV_R_QB:
12736                 check_dsp_r2(ctx);
12737                 gen_helper_shra_r_qb(cpu_gpr[ret], v1_t, v2_t);
12738                 break;
12739             case OPC_SHRA_PH:
12740                 check_dsp(ctx);
12741                 gen_helper_shra_ph(cpu_gpr[ret], t0, v2_t);
12742                 break;
12743             case OPC_SHRA_R_PH:
12744                 check_dsp(ctx);
12745                 gen_helper_shra_r_ph(cpu_gpr[ret], t0, v2_t);
12746                 break;
12747             case OPC_SHRAV_PH:
12748                 check_dsp(ctx);
12749                 gen_helper_shra_ph(cpu_gpr[ret], v1_t, v2_t);
12750                 break;
12751             case OPC_SHRAV_R_PH:
12752                 check_dsp(ctx);
12753                 gen_helper_shra_r_ph(cpu_gpr[ret], v1_t, v2_t);
12754                 break;
12755             case OPC_SHRA_R_W:
12756                 check_dsp(ctx);
12757                 gen_helper_shra_r_w(cpu_gpr[ret], t0, v2_t);
12758                 break;
12759             case OPC_SHRAV_R_W:
12760                 check_dsp(ctx);
12761                 gen_helper_shra_r_w(cpu_gpr[ret], v1_t, v2_t);
12762                 break;
12763             default:            /* Invalid */
12764                 MIPS_INVAL("MASK SHLL.QB");
12765                 gen_reserved_instruction(ctx);
12766                 break;
12767             }
12768             break;
12769         }
12770 #ifdef TARGET_MIPS64
12771     case OPC_SHLL_OB_DSP:
12772         op2 = MASK_SHLL_OB(ctx->opcode);
12773         switch (op2) {
12774         case OPC_SHLL_PW:
12775             check_dsp(ctx);
12776             gen_helper_shll_pw(cpu_gpr[ret], v2_t, t0, cpu_env);
12777             break;
12778         case OPC_SHLLV_PW:
12779             check_dsp(ctx);
12780             gen_helper_shll_pw(cpu_gpr[ret], v2_t, v1_t, cpu_env);
12781             break;
12782         case OPC_SHLL_S_PW:
12783             check_dsp(ctx);
12784             gen_helper_shll_s_pw(cpu_gpr[ret], v2_t, t0, cpu_env);
12785             break;
12786         case OPC_SHLLV_S_PW:
12787             check_dsp(ctx);
12788             gen_helper_shll_s_pw(cpu_gpr[ret], v2_t, v1_t, cpu_env);
12789             break;
12790         case OPC_SHLL_OB:
12791             check_dsp(ctx);
12792             gen_helper_shll_ob(cpu_gpr[ret], v2_t, t0, cpu_env);
12793             break;
12794         case OPC_SHLLV_OB:
12795             check_dsp(ctx);
12796             gen_helper_shll_ob(cpu_gpr[ret], v2_t, v1_t, cpu_env);
12797             break;
12798         case OPC_SHLL_QH:
12799             check_dsp(ctx);
12800             gen_helper_shll_qh(cpu_gpr[ret], v2_t, t0, cpu_env);
12801             break;
12802         case OPC_SHLLV_QH:
12803             check_dsp(ctx);
12804             gen_helper_shll_qh(cpu_gpr[ret], v2_t, v1_t, cpu_env);
12805             break;
12806         case OPC_SHLL_S_QH:
12807             check_dsp(ctx);
12808             gen_helper_shll_s_qh(cpu_gpr[ret], v2_t, t0, cpu_env);
12809             break;
12810         case OPC_SHLLV_S_QH:
12811             check_dsp(ctx);
12812             gen_helper_shll_s_qh(cpu_gpr[ret], v2_t, v1_t, cpu_env);
12813             break;
12814         case OPC_SHRA_OB:
12815             check_dsp_r2(ctx);
12816             gen_helper_shra_ob(cpu_gpr[ret], v2_t, t0);
12817             break;
12818         case OPC_SHRAV_OB:
12819             check_dsp_r2(ctx);
12820             gen_helper_shra_ob(cpu_gpr[ret], v2_t, v1_t);
12821             break;
12822         case OPC_SHRA_R_OB:
12823             check_dsp_r2(ctx);
12824             gen_helper_shra_r_ob(cpu_gpr[ret], v2_t, t0);
12825             break;
12826         case OPC_SHRAV_R_OB:
12827             check_dsp_r2(ctx);
12828             gen_helper_shra_r_ob(cpu_gpr[ret], v2_t, v1_t);
12829             break;
12830         case OPC_SHRA_PW:
12831             check_dsp(ctx);
12832             gen_helper_shra_pw(cpu_gpr[ret], v2_t, t0);
12833             break;
12834         case OPC_SHRAV_PW:
12835             check_dsp(ctx);
12836             gen_helper_shra_pw(cpu_gpr[ret], v2_t, v1_t);
12837             break;
12838         case OPC_SHRA_R_PW:
12839             check_dsp(ctx);
12840             gen_helper_shra_r_pw(cpu_gpr[ret], v2_t, t0);
12841             break;
12842         case OPC_SHRAV_R_PW:
12843             check_dsp(ctx);
12844             gen_helper_shra_r_pw(cpu_gpr[ret], v2_t, v1_t);
12845             break;
12846         case OPC_SHRA_QH:
12847             check_dsp(ctx);
12848             gen_helper_shra_qh(cpu_gpr[ret], v2_t, t0);
12849             break;
12850         case OPC_SHRAV_QH:
12851             check_dsp(ctx);
12852             gen_helper_shra_qh(cpu_gpr[ret], v2_t, v1_t);
12853             break;
12854         case OPC_SHRA_R_QH:
12855             check_dsp(ctx);
12856             gen_helper_shra_r_qh(cpu_gpr[ret], v2_t, t0);
12857             break;
12858         case OPC_SHRAV_R_QH:
12859             check_dsp(ctx);
12860             gen_helper_shra_r_qh(cpu_gpr[ret], v2_t, v1_t);
12861             break;
12862         case OPC_SHRL_OB:
12863             check_dsp(ctx);
12864             gen_helper_shrl_ob(cpu_gpr[ret], v2_t, t0);
12865             break;
12866         case OPC_SHRLV_OB:
12867             check_dsp(ctx);
12868             gen_helper_shrl_ob(cpu_gpr[ret], v2_t, v1_t);
12869             break;
12870         case OPC_SHRL_QH:
12871             check_dsp_r2(ctx);
12872             gen_helper_shrl_qh(cpu_gpr[ret], v2_t, t0);
12873             break;
12874         case OPC_SHRLV_QH:
12875             check_dsp_r2(ctx);
12876             gen_helper_shrl_qh(cpu_gpr[ret], v2_t, v1_t);
12877             break;
12878         default:            /* Invalid */
12879             MIPS_INVAL("MASK SHLL.OB");
12880             gen_reserved_instruction(ctx);
12881             break;
12882         }
12883         break;
12884 #endif
12885     }
12886 
12887     tcg_temp_free(t0);
12888     tcg_temp_free(v1_t);
12889     tcg_temp_free(v2_t);
12890 }
12891 
12892 static void gen_mipsdsp_multiply(DisasContext *ctx, uint32_t op1, uint32_t op2,
12893                                  int ret, int v1, int v2, int check_ret)
12894 {
12895     TCGv_i32 t0;
12896     TCGv v1_t;
12897     TCGv v2_t;
12898 
12899     if ((ret == 0) && (check_ret == 1)) {
12900         /* Treat as NOP. */
12901         return;
12902     }
12903 
12904     t0 = tcg_temp_new_i32();
12905     v1_t = tcg_temp_new();
12906     v2_t = tcg_temp_new();
12907 
12908     tcg_gen_movi_i32(t0, ret);
12909     gen_load_gpr(v1_t, v1);
12910     gen_load_gpr(v2_t, v2);
12911 
12912     switch (op1) {
12913     /*
12914      * OPC_MULT_G_2E, OPC_ADDUH_QB_DSP, OPC_MUL_PH_DSP have
12915      * the same mask and op1.
12916      */
12917     case OPC_MULT_G_2E:
12918         check_dsp_r2(ctx);
12919         switch (op2) {
12920         case  OPC_MUL_PH:
12921             gen_helper_mul_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12922             break;
12923         case  OPC_MUL_S_PH:
12924             gen_helper_mul_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12925             break;
12926         case OPC_MULQ_S_W:
12927             gen_helper_mulq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12928             break;
12929         case OPC_MULQ_RS_W:
12930             gen_helper_mulq_rs_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12931             break;
12932         }
12933         break;
12934     case OPC_DPA_W_PH_DSP:
12935         switch (op2) {
12936         case OPC_DPAU_H_QBL:
12937             check_dsp(ctx);
12938             gen_helper_dpau_h_qbl(t0, v1_t, v2_t, cpu_env);
12939             break;
12940         case OPC_DPAU_H_QBR:
12941             check_dsp(ctx);
12942             gen_helper_dpau_h_qbr(t0, v1_t, v2_t, cpu_env);
12943             break;
12944         case OPC_DPSU_H_QBL:
12945             check_dsp(ctx);
12946             gen_helper_dpsu_h_qbl(t0, v1_t, v2_t, cpu_env);
12947             break;
12948         case OPC_DPSU_H_QBR:
12949             check_dsp(ctx);
12950             gen_helper_dpsu_h_qbr(t0, v1_t, v2_t, cpu_env);
12951             break;
12952         case OPC_DPA_W_PH:
12953             check_dsp_r2(ctx);
12954             gen_helper_dpa_w_ph(t0, v1_t, v2_t, cpu_env);
12955             break;
12956         case OPC_DPAX_W_PH:
12957             check_dsp_r2(ctx);
12958             gen_helper_dpax_w_ph(t0, v1_t, v2_t, cpu_env);
12959             break;
12960         case OPC_DPAQ_S_W_PH:
12961             check_dsp(ctx);
12962             gen_helper_dpaq_s_w_ph(t0, v1_t, v2_t, cpu_env);
12963             break;
12964         case OPC_DPAQX_S_W_PH:
12965             check_dsp_r2(ctx);
12966             gen_helper_dpaqx_s_w_ph(t0, v1_t, v2_t, cpu_env);
12967             break;
12968         case OPC_DPAQX_SA_W_PH:
12969             check_dsp_r2(ctx);
12970             gen_helper_dpaqx_sa_w_ph(t0, v1_t, v2_t, cpu_env);
12971             break;
12972         case OPC_DPS_W_PH:
12973             check_dsp_r2(ctx);
12974             gen_helper_dps_w_ph(t0, v1_t, v2_t, cpu_env);
12975             break;
12976         case OPC_DPSX_W_PH:
12977             check_dsp_r2(ctx);
12978             gen_helper_dpsx_w_ph(t0, v1_t, v2_t, cpu_env);
12979             break;
12980         case OPC_DPSQ_S_W_PH:
12981             check_dsp(ctx);
12982             gen_helper_dpsq_s_w_ph(t0, v1_t, v2_t, cpu_env);
12983             break;
12984         case OPC_DPSQX_S_W_PH:
12985             check_dsp_r2(ctx);
12986             gen_helper_dpsqx_s_w_ph(t0, v1_t, v2_t, cpu_env);
12987             break;
12988         case OPC_DPSQX_SA_W_PH:
12989             check_dsp_r2(ctx);
12990             gen_helper_dpsqx_sa_w_ph(t0, v1_t, v2_t, cpu_env);
12991             break;
12992         case OPC_MULSAQ_S_W_PH:
12993             check_dsp(ctx);
12994             gen_helper_mulsaq_s_w_ph(t0, v1_t, v2_t, cpu_env);
12995             break;
12996         case OPC_DPAQ_SA_L_W:
12997             check_dsp(ctx);
12998             gen_helper_dpaq_sa_l_w(t0, v1_t, v2_t, cpu_env);
12999             break;
13000         case OPC_DPSQ_SA_L_W:
13001             check_dsp(ctx);
13002             gen_helper_dpsq_sa_l_w(t0, v1_t, v2_t, cpu_env);
13003             break;
13004         case OPC_MAQ_S_W_PHL:
13005             check_dsp(ctx);
13006             gen_helper_maq_s_w_phl(t0, v1_t, v2_t, cpu_env);
13007             break;
13008         case OPC_MAQ_S_W_PHR:
13009             check_dsp(ctx);
13010             gen_helper_maq_s_w_phr(t0, v1_t, v2_t, cpu_env);
13011             break;
13012         case OPC_MAQ_SA_W_PHL:
13013             check_dsp(ctx);
13014             gen_helper_maq_sa_w_phl(t0, v1_t, v2_t, cpu_env);
13015             break;
13016         case OPC_MAQ_SA_W_PHR:
13017             check_dsp(ctx);
13018             gen_helper_maq_sa_w_phr(t0, v1_t, v2_t, cpu_env);
13019             break;
13020         case OPC_MULSA_W_PH:
13021             check_dsp_r2(ctx);
13022             gen_helper_mulsa_w_ph(t0, v1_t, v2_t, cpu_env);
13023             break;
13024         }
13025         break;
13026 #ifdef TARGET_MIPS64
13027     case OPC_DPAQ_W_QH_DSP:
13028         {
13029             int ac = ret & 0x03;
13030             tcg_gen_movi_i32(t0, ac);
13031 
13032             switch (op2) {
13033             case OPC_DMADD:
13034                 check_dsp(ctx);
13035                 gen_helper_dmadd(v1_t, v2_t, t0, cpu_env);
13036                 break;
13037             case OPC_DMADDU:
13038                 check_dsp(ctx);
13039                 gen_helper_dmaddu(v1_t, v2_t, t0, cpu_env);
13040                 break;
13041             case OPC_DMSUB:
13042                 check_dsp(ctx);
13043                 gen_helper_dmsub(v1_t, v2_t, t0, cpu_env);
13044                 break;
13045             case OPC_DMSUBU:
13046                 check_dsp(ctx);
13047                 gen_helper_dmsubu(v1_t, v2_t, t0, cpu_env);
13048                 break;
13049             case OPC_DPA_W_QH:
13050                 check_dsp_r2(ctx);
13051                 gen_helper_dpa_w_qh(v1_t, v2_t, t0, cpu_env);
13052                 break;
13053             case OPC_DPAQ_S_W_QH:
13054                 check_dsp(ctx);
13055                 gen_helper_dpaq_s_w_qh(v1_t, v2_t, t0, cpu_env);
13056                 break;
13057             case OPC_DPAQ_SA_L_PW:
13058                 check_dsp(ctx);
13059                 gen_helper_dpaq_sa_l_pw(v1_t, v2_t, t0, cpu_env);
13060                 break;
13061             case OPC_DPAU_H_OBL:
13062                 check_dsp(ctx);
13063                 gen_helper_dpau_h_obl(v1_t, v2_t, t0, cpu_env);
13064                 break;
13065             case OPC_DPAU_H_OBR:
13066                 check_dsp(ctx);
13067                 gen_helper_dpau_h_obr(v1_t, v2_t, t0, cpu_env);
13068                 break;
13069             case OPC_DPS_W_QH:
13070                 check_dsp_r2(ctx);
13071                 gen_helper_dps_w_qh(v1_t, v2_t, t0, cpu_env);
13072                 break;
13073             case OPC_DPSQ_S_W_QH:
13074                 check_dsp(ctx);
13075                 gen_helper_dpsq_s_w_qh(v1_t, v2_t, t0, cpu_env);
13076                 break;
13077             case OPC_DPSQ_SA_L_PW:
13078                 check_dsp(ctx);
13079                 gen_helper_dpsq_sa_l_pw(v1_t, v2_t, t0, cpu_env);
13080                 break;
13081             case OPC_DPSU_H_OBL:
13082                 check_dsp(ctx);
13083                 gen_helper_dpsu_h_obl(v1_t, v2_t, t0, cpu_env);
13084                 break;
13085             case OPC_DPSU_H_OBR:
13086                 check_dsp(ctx);
13087                 gen_helper_dpsu_h_obr(v1_t, v2_t, t0, cpu_env);
13088                 break;
13089             case OPC_MAQ_S_L_PWL:
13090                 check_dsp(ctx);
13091                 gen_helper_maq_s_l_pwl(v1_t, v2_t, t0, cpu_env);
13092                 break;
13093             case OPC_MAQ_S_L_PWR:
13094                 check_dsp(ctx);
13095                 gen_helper_maq_s_l_pwr(v1_t, v2_t, t0, cpu_env);
13096                 break;
13097             case OPC_MAQ_S_W_QHLL:
13098                 check_dsp(ctx);
13099                 gen_helper_maq_s_w_qhll(v1_t, v2_t, t0, cpu_env);
13100                 break;
13101             case OPC_MAQ_SA_W_QHLL:
13102                 check_dsp(ctx);
13103                 gen_helper_maq_sa_w_qhll(v1_t, v2_t, t0, cpu_env);
13104                 break;
13105             case OPC_MAQ_S_W_QHLR:
13106                 check_dsp(ctx);
13107                 gen_helper_maq_s_w_qhlr(v1_t, v2_t, t0, cpu_env);
13108                 break;
13109             case OPC_MAQ_SA_W_QHLR:
13110                 check_dsp(ctx);
13111                 gen_helper_maq_sa_w_qhlr(v1_t, v2_t, t0, cpu_env);
13112                 break;
13113             case OPC_MAQ_S_W_QHRL:
13114                 check_dsp(ctx);
13115                 gen_helper_maq_s_w_qhrl(v1_t, v2_t, t0, cpu_env);
13116                 break;
13117             case OPC_MAQ_SA_W_QHRL:
13118                 check_dsp(ctx);
13119                 gen_helper_maq_sa_w_qhrl(v1_t, v2_t, t0, cpu_env);
13120                 break;
13121             case OPC_MAQ_S_W_QHRR:
13122                 check_dsp(ctx);
13123                 gen_helper_maq_s_w_qhrr(v1_t, v2_t, t0, cpu_env);
13124                 break;
13125             case OPC_MAQ_SA_W_QHRR:
13126                 check_dsp(ctx);
13127                 gen_helper_maq_sa_w_qhrr(v1_t, v2_t, t0, cpu_env);
13128                 break;
13129             case OPC_MULSAQ_S_L_PW:
13130                 check_dsp(ctx);
13131                 gen_helper_mulsaq_s_l_pw(v1_t, v2_t, t0, cpu_env);
13132                 break;
13133             case OPC_MULSAQ_S_W_QH:
13134                 check_dsp(ctx);
13135                 gen_helper_mulsaq_s_w_qh(v1_t, v2_t, t0, cpu_env);
13136                 break;
13137             }
13138         }
13139         break;
13140 #endif
13141     case OPC_ADDU_QB_DSP:
13142         switch (op2) {
13143         case OPC_MULEU_S_PH_QBL:
13144             check_dsp(ctx);
13145             gen_helper_muleu_s_ph_qbl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13146             break;
13147         case OPC_MULEU_S_PH_QBR:
13148             check_dsp(ctx);
13149             gen_helper_muleu_s_ph_qbr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13150             break;
13151         case OPC_MULQ_RS_PH:
13152             check_dsp(ctx);
13153             gen_helper_mulq_rs_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13154             break;
13155         case OPC_MULEQ_S_W_PHL:
13156             check_dsp(ctx);
13157             gen_helper_muleq_s_w_phl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13158             break;
13159         case OPC_MULEQ_S_W_PHR:
13160             check_dsp(ctx);
13161             gen_helper_muleq_s_w_phr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13162             break;
13163         case OPC_MULQ_S_PH:
13164             check_dsp_r2(ctx);
13165             gen_helper_mulq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13166             break;
13167         }
13168         break;
13169 #ifdef TARGET_MIPS64
13170     case OPC_ADDU_OB_DSP:
13171         switch (op2) {
13172         case OPC_MULEQ_S_PW_QHL:
13173             check_dsp(ctx);
13174             gen_helper_muleq_s_pw_qhl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13175             break;
13176         case OPC_MULEQ_S_PW_QHR:
13177             check_dsp(ctx);
13178             gen_helper_muleq_s_pw_qhr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13179             break;
13180         case OPC_MULEU_S_QH_OBL:
13181             check_dsp(ctx);
13182             gen_helper_muleu_s_qh_obl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13183             break;
13184         case OPC_MULEU_S_QH_OBR:
13185             check_dsp(ctx);
13186             gen_helper_muleu_s_qh_obr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13187             break;
13188         case OPC_MULQ_RS_QH:
13189             check_dsp(ctx);
13190             gen_helper_mulq_rs_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13191             break;
13192         }
13193         break;
13194 #endif
13195     }
13196 
13197     tcg_temp_free_i32(t0);
13198     tcg_temp_free(v1_t);
13199     tcg_temp_free(v2_t);
13200 }
13201 
13202 static void gen_mipsdsp_bitinsn(DisasContext *ctx, uint32_t op1, uint32_t op2,
13203                                 int ret, int val)
13204 {
13205     int16_t imm;
13206     TCGv t0;
13207     TCGv val_t;
13208 
13209     if (ret == 0) {
13210         /* Treat as NOP. */
13211         return;
13212     }
13213 
13214     t0 = tcg_temp_new();
13215     val_t = tcg_temp_new();
13216     gen_load_gpr(val_t, val);
13217 
13218     switch (op1) {
13219     case OPC_ABSQ_S_PH_DSP:
13220         switch (op2) {
13221         case OPC_BITREV:
13222             check_dsp(ctx);
13223             gen_helper_bitrev(cpu_gpr[ret], val_t);
13224             break;
13225         case OPC_REPL_QB:
13226             check_dsp(ctx);
13227             {
13228                 target_long result;
13229                 imm = (ctx->opcode >> 16) & 0xFF;
13230                 result = (uint32_t)imm << 24 |
13231                          (uint32_t)imm << 16 |
13232                          (uint32_t)imm << 8  |
13233                          (uint32_t)imm;
13234                 result = (int32_t)result;
13235                 tcg_gen_movi_tl(cpu_gpr[ret], result);
13236             }
13237             break;
13238         case OPC_REPLV_QB:
13239             check_dsp(ctx);
13240             tcg_gen_ext8u_tl(cpu_gpr[ret], val_t);
13241             tcg_gen_shli_tl(t0, cpu_gpr[ret], 8);
13242             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13243             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
13244             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13245             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
13246             break;
13247         case OPC_REPL_PH:
13248             check_dsp(ctx);
13249             {
13250                 imm = (ctx->opcode >> 16) & 0x03FF;
13251                 imm = (int16_t)(imm << 6) >> 6;
13252                 tcg_gen_movi_tl(cpu_gpr[ret], \
13253                                 (target_long)((int32_t)imm << 16 | \
13254                                 (uint16_t)imm));
13255             }
13256             break;
13257         case OPC_REPLV_PH:
13258             check_dsp(ctx);
13259             tcg_gen_ext16u_tl(cpu_gpr[ret], val_t);
13260             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
13261             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13262             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
13263             break;
13264         }
13265         break;
13266 #ifdef TARGET_MIPS64
13267     case OPC_ABSQ_S_QH_DSP:
13268         switch (op2) {
13269         case OPC_REPL_OB:
13270             check_dsp(ctx);
13271             {
13272                 target_long temp;
13273 
13274                 imm = (ctx->opcode >> 16) & 0xFF;
13275                 temp = ((uint64_t)imm << 8) | (uint64_t)imm;
13276                 temp = (temp << 16) | temp;
13277                 temp = (temp << 32) | temp;
13278                 tcg_gen_movi_tl(cpu_gpr[ret], temp);
13279                 break;
13280             }
13281         case OPC_REPL_PW:
13282             check_dsp(ctx);
13283             {
13284                 target_long temp;
13285 
13286                 imm = (ctx->opcode >> 16) & 0x03FF;
13287                 imm = (int16_t)(imm << 6) >> 6;
13288                 temp = ((target_long)imm << 32) \
13289                        | ((target_long)imm & 0xFFFFFFFF);
13290                 tcg_gen_movi_tl(cpu_gpr[ret], temp);
13291                 break;
13292             }
13293         case OPC_REPL_QH:
13294             check_dsp(ctx);
13295             {
13296                 target_long temp;
13297 
13298                 imm = (ctx->opcode >> 16) & 0x03FF;
13299                 imm = (int16_t)(imm << 6) >> 6;
13300 
13301                 temp = ((uint64_t)(uint16_t)imm << 48) |
13302                        ((uint64_t)(uint16_t)imm << 32) |
13303                        ((uint64_t)(uint16_t)imm << 16) |
13304                        (uint64_t)(uint16_t)imm;
13305                 tcg_gen_movi_tl(cpu_gpr[ret], temp);
13306                 break;
13307             }
13308         case OPC_REPLV_OB:
13309             check_dsp(ctx);
13310             tcg_gen_ext8u_tl(cpu_gpr[ret], val_t);
13311             tcg_gen_shli_tl(t0, cpu_gpr[ret], 8);
13312             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13313             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
13314             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13315             tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
13316             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13317             break;
13318         case OPC_REPLV_PW:
13319             check_dsp(ctx);
13320             tcg_gen_ext32u_i64(cpu_gpr[ret], val_t);
13321             tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
13322             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13323             break;
13324         case OPC_REPLV_QH:
13325             check_dsp(ctx);
13326             tcg_gen_ext16u_tl(cpu_gpr[ret], val_t);
13327             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
13328             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13329             tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
13330             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13331             break;
13332         }
13333         break;
13334 #endif
13335     }
13336     tcg_temp_free(t0);
13337     tcg_temp_free(val_t);
13338 }
13339 
13340 static void gen_mipsdsp_add_cmp_pick(DisasContext *ctx,
13341                                      uint32_t op1, uint32_t op2,
13342                                      int ret, int v1, int v2, int check_ret)
13343 {
13344     TCGv t1;
13345     TCGv v1_t;
13346     TCGv v2_t;
13347 
13348     if ((ret == 0) && (check_ret == 1)) {
13349         /* Treat as NOP. */
13350         return;
13351     }
13352 
13353     t1 = tcg_temp_new();
13354     v1_t = tcg_temp_new();
13355     v2_t = tcg_temp_new();
13356 
13357     gen_load_gpr(v1_t, v1);
13358     gen_load_gpr(v2_t, v2);
13359 
13360     switch (op1) {
13361     case OPC_CMPU_EQ_QB_DSP:
13362         switch (op2) {
13363         case OPC_CMPU_EQ_QB:
13364             check_dsp(ctx);
13365             gen_helper_cmpu_eq_qb(v1_t, v2_t, cpu_env);
13366             break;
13367         case OPC_CMPU_LT_QB:
13368             check_dsp(ctx);
13369             gen_helper_cmpu_lt_qb(v1_t, v2_t, cpu_env);
13370             break;
13371         case OPC_CMPU_LE_QB:
13372             check_dsp(ctx);
13373             gen_helper_cmpu_le_qb(v1_t, v2_t, cpu_env);
13374             break;
13375         case OPC_CMPGU_EQ_QB:
13376             check_dsp(ctx);
13377             gen_helper_cmpgu_eq_qb(cpu_gpr[ret], v1_t, v2_t);
13378             break;
13379         case OPC_CMPGU_LT_QB:
13380             check_dsp(ctx);
13381             gen_helper_cmpgu_lt_qb(cpu_gpr[ret], v1_t, v2_t);
13382             break;
13383         case OPC_CMPGU_LE_QB:
13384             check_dsp(ctx);
13385             gen_helper_cmpgu_le_qb(cpu_gpr[ret], v1_t, v2_t);
13386             break;
13387         case OPC_CMPGDU_EQ_QB:
13388             check_dsp_r2(ctx);
13389             gen_helper_cmpgu_eq_qb(t1, v1_t, v2_t);
13390             tcg_gen_mov_tl(cpu_gpr[ret], t1);
13391             tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
13392             tcg_gen_shli_tl(t1, t1, 24);
13393             tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
13394             break;
13395         case OPC_CMPGDU_LT_QB:
13396             check_dsp_r2(ctx);
13397             gen_helper_cmpgu_lt_qb(t1, v1_t, v2_t);
13398             tcg_gen_mov_tl(cpu_gpr[ret], t1);
13399             tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
13400             tcg_gen_shli_tl(t1, t1, 24);
13401             tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
13402             break;
13403         case OPC_CMPGDU_LE_QB:
13404             check_dsp_r2(ctx);
13405             gen_helper_cmpgu_le_qb(t1, v1_t, v2_t);
13406             tcg_gen_mov_tl(cpu_gpr[ret], t1);
13407             tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
13408             tcg_gen_shli_tl(t1, t1, 24);
13409             tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
13410             break;
13411         case OPC_CMP_EQ_PH:
13412             check_dsp(ctx);
13413             gen_helper_cmp_eq_ph(v1_t, v2_t, cpu_env);
13414             break;
13415         case OPC_CMP_LT_PH:
13416             check_dsp(ctx);
13417             gen_helper_cmp_lt_ph(v1_t, v2_t, cpu_env);
13418             break;
13419         case OPC_CMP_LE_PH:
13420             check_dsp(ctx);
13421             gen_helper_cmp_le_ph(v1_t, v2_t, cpu_env);
13422             break;
13423         case OPC_PICK_QB:
13424             check_dsp(ctx);
13425             gen_helper_pick_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13426             break;
13427         case OPC_PICK_PH:
13428             check_dsp(ctx);
13429             gen_helper_pick_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13430             break;
13431         case OPC_PACKRL_PH:
13432             check_dsp(ctx);
13433             gen_helper_packrl_ph(cpu_gpr[ret], v1_t, v2_t);
13434             break;
13435         }
13436         break;
13437 #ifdef TARGET_MIPS64
13438     case OPC_CMPU_EQ_OB_DSP:
13439         switch (op2) {
13440         case OPC_CMP_EQ_PW:
13441             check_dsp(ctx);
13442             gen_helper_cmp_eq_pw(v1_t, v2_t, cpu_env);
13443             break;
13444         case OPC_CMP_LT_PW:
13445             check_dsp(ctx);
13446             gen_helper_cmp_lt_pw(v1_t, v2_t, cpu_env);
13447             break;
13448         case OPC_CMP_LE_PW:
13449             check_dsp(ctx);
13450             gen_helper_cmp_le_pw(v1_t, v2_t, cpu_env);
13451             break;
13452         case OPC_CMP_EQ_QH:
13453             check_dsp(ctx);
13454             gen_helper_cmp_eq_qh(v1_t, v2_t, cpu_env);
13455             break;
13456         case OPC_CMP_LT_QH:
13457             check_dsp(ctx);
13458             gen_helper_cmp_lt_qh(v1_t, v2_t, cpu_env);
13459             break;
13460         case OPC_CMP_LE_QH:
13461             check_dsp(ctx);
13462             gen_helper_cmp_le_qh(v1_t, v2_t, cpu_env);
13463             break;
13464         case OPC_CMPGDU_EQ_OB:
13465             check_dsp_r2(ctx);
13466             gen_helper_cmpgdu_eq_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13467             break;
13468         case OPC_CMPGDU_LT_OB:
13469             check_dsp_r2(ctx);
13470             gen_helper_cmpgdu_lt_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13471             break;
13472         case OPC_CMPGDU_LE_OB:
13473             check_dsp_r2(ctx);
13474             gen_helper_cmpgdu_le_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13475             break;
13476         case OPC_CMPGU_EQ_OB:
13477             check_dsp(ctx);
13478             gen_helper_cmpgu_eq_ob(cpu_gpr[ret], v1_t, v2_t);
13479             break;
13480         case OPC_CMPGU_LT_OB:
13481             check_dsp(ctx);
13482             gen_helper_cmpgu_lt_ob(cpu_gpr[ret], v1_t, v2_t);
13483             break;
13484         case OPC_CMPGU_LE_OB:
13485             check_dsp(ctx);
13486             gen_helper_cmpgu_le_ob(cpu_gpr[ret], v1_t, v2_t);
13487             break;
13488         case OPC_CMPU_EQ_OB:
13489             check_dsp(ctx);
13490             gen_helper_cmpu_eq_ob(v1_t, v2_t, cpu_env);
13491             break;
13492         case OPC_CMPU_LT_OB:
13493             check_dsp(ctx);
13494             gen_helper_cmpu_lt_ob(v1_t, v2_t, cpu_env);
13495             break;
13496         case OPC_CMPU_LE_OB:
13497             check_dsp(ctx);
13498             gen_helper_cmpu_le_ob(v1_t, v2_t, cpu_env);
13499             break;
13500         case OPC_PACKRL_PW:
13501             check_dsp(ctx);
13502             gen_helper_packrl_pw(cpu_gpr[ret], v1_t, v2_t);
13503             break;
13504         case OPC_PICK_OB:
13505             check_dsp(ctx);
13506             gen_helper_pick_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13507             break;
13508         case OPC_PICK_PW:
13509             check_dsp(ctx);
13510             gen_helper_pick_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13511             break;
13512         case OPC_PICK_QH:
13513             check_dsp(ctx);
13514             gen_helper_pick_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13515             break;
13516         }
13517         break;
13518 #endif
13519     }
13520 
13521     tcg_temp_free(t1);
13522     tcg_temp_free(v1_t);
13523     tcg_temp_free(v2_t);
13524 }
13525 
13526 static void gen_mipsdsp_append(CPUMIPSState *env, DisasContext *ctx,
13527                                uint32_t op1, int rt, int rs, int sa)
13528 {
13529     TCGv t0;
13530 
13531     check_dsp_r2(ctx);
13532 
13533     if (rt == 0) {
13534         /* Treat as NOP. */
13535         return;
13536     }
13537 
13538     t0 = tcg_temp_new();
13539     gen_load_gpr(t0, rs);
13540 
13541     switch (op1) {
13542     case OPC_APPEND_DSP:
13543         switch (MASK_APPEND(ctx->opcode)) {
13544         case OPC_APPEND:
13545             if (sa != 0) {
13546                 tcg_gen_deposit_tl(cpu_gpr[rt], t0, cpu_gpr[rt], sa, 32 - sa);
13547             }
13548             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
13549             break;
13550         case OPC_PREPEND:
13551             if (sa != 0) {
13552                 tcg_gen_ext32u_tl(cpu_gpr[rt], cpu_gpr[rt]);
13553                 tcg_gen_shri_tl(cpu_gpr[rt], cpu_gpr[rt], sa);
13554                 tcg_gen_shli_tl(t0, t0, 32 - sa);
13555                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
13556             }
13557             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
13558             break;
13559         case OPC_BALIGN:
13560             sa &= 3;
13561             if (sa != 0 && sa != 2) {
13562                 tcg_gen_shli_tl(cpu_gpr[rt], cpu_gpr[rt], 8 * sa);
13563                 tcg_gen_ext32u_tl(t0, t0);
13564                 tcg_gen_shri_tl(t0, t0, 8 * (4 - sa));
13565                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
13566             }
13567             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
13568             break;
13569         default:            /* Invalid */
13570             MIPS_INVAL("MASK APPEND");
13571             gen_reserved_instruction(ctx);
13572             break;
13573         }
13574         break;
13575 #ifdef TARGET_MIPS64
13576     case OPC_DAPPEND_DSP:
13577         switch (MASK_DAPPEND(ctx->opcode)) {
13578         case OPC_DAPPEND:
13579             if (sa != 0) {
13580                 tcg_gen_deposit_tl(cpu_gpr[rt], t0, cpu_gpr[rt], sa, 64 - sa);
13581             }
13582             break;
13583         case OPC_PREPENDD:
13584             tcg_gen_shri_tl(cpu_gpr[rt], cpu_gpr[rt], 0x20 | sa);
13585             tcg_gen_shli_tl(t0, t0, 64 - (0x20 | sa));
13586             tcg_gen_or_tl(cpu_gpr[rt], t0, t0);
13587             break;
13588         case OPC_PREPENDW:
13589             if (sa != 0) {
13590                 tcg_gen_shri_tl(cpu_gpr[rt], cpu_gpr[rt], sa);
13591                 tcg_gen_shli_tl(t0, t0, 64 - sa);
13592                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
13593             }
13594             break;
13595         case OPC_DBALIGN:
13596             sa &= 7;
13597             if (sa != 0 && sa != 2 && sa != 4) {
13598                 tcg_gen_shli_tl(cpu_gpr[rt], cpu_gpr[rt], 8 * sa);
13599                 tcg_gen_shri_tl(t0, t0, 8 * (8 - sa));
13600                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
13601             }
13602             break;
13603         default:            /* Invalid */
13604             MIPS_INVAL("MASK DAPPEND");
13605             gen_reserved_instruction(ctx);
13606             break;
13607         }
13608         break;
13609 #endif
13610     }
13611     tcg_temp_free(t0);
13612 }
13613 
13614 static void gen_mipsdsp_accinsn(DisasContext *ctx, uint32_t op1, uint32_t op2,
13615                                 int ret, int v1, int v2, int check_ret)
13616 
13617 {
13618     TCGv t0;
13619     TCGv t1;
13620     TCGv v1_t;
13621     TCGv v2_t;
13622     int16_t imm;
13623 
13624     if ((ret == 0) && (check_ret == 1)) {
13625         /* Treat as NOP. */
13626         return;
13627     }
13628 
13629     t0 = tcg_temp_new();
13630     t1 = tcg_temp_new();
13631     v1_t = tcg_temp_new();
13632     v2_t = tcg_temp_new();
13633 
13634     gen_load_gpr(v1_t, v1);
13635     gen_load_gpr(v2_t, v2);
13636 
13637     switch (op1) {
13638     case OPC_EXTR_W_DSP:
13639         check_dsp(ctx);
13640         switch (op2) {
13641         case OPC_EXTR_W:
13642             tcg_gen_movi_tl(t0, v2);
13643             tcg_gen_movi_tl(t1, v1);
13644             gen_helper_extr_w(cpu_gpr[ret], t0, t1, cpu_env);
13645             break;
13646         case OPC_EXTR_R_W:
13647             tcg_gen_movi_tl(t0, v2);
13648             tcg_gen_movi_tl(t1, v1);
13649             gen_helper_extr_r_w(cpu_gpr[ret], t0, t1, cpu_env);
13650             break;
13651         case OPC_EXTR_RS_W:
13652             tcg_gen_movi_tl(t0, v2);
13653             tcg_gen_movi_tl(t1, v1);
13654             gen_helper_extr_rs_w(cpu_gpr[ret], t0, t1, cpu_env);
13655             break;
13656         case OPC_EXTR_S_H:
13657             tcg_gen_movi_tl(t0, v2);
13658             tcg_gen_movi_tl(t1, v1);
13659             gen_helper_extr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
13660             break;
13661         case OPC_EXTRV_S_H:
13662             tcg_gen_movi_tl(t0, v2);
13663             gen_helper_extr_s_h(cpu_gpr[ret], t0, v1_t, cpu_env);
13664             break;
13665         case OPC_EXTRV_W:
13666             tcg_gen_movi_tl(t0, v2);
13667             gen_helper_extr_w(cpu_gpr[ret], t0, v1_t, cpu_env);
13668             break;
13669         case OPC_EXTRV_R_W:
13670             tcg_gen_movi_tl(t0, v2);
13671             gen_helper_extr_r_w(cpu_gpr[ret], t0, v1_t, cpu_env);
13672             break;
13673         case OPC_EXTRV_RS_W:
13674             tcg_gen_movi_tl(t0, v2);
13675             gen_helper_extr_rs_w(cpu_gpr[ret], t0, v1_t, cpu_env);
13676             break;
13677         case OPC_EXTP:
13678             tcg_gen_movi_tl(t0, v2);
13679             tcg_gen_movi_tl(t1, v1);
13680             gen_helper_extp(cpu_gpr[ret], t0, t1, cpu_env);
13681             break;
13682         case OPC_EXTPV:
13683             tcg_gen_movi_tl(t0, v2);
13684             gen_helper_extp(cpu_gpr[ret], t0, v1_t, cpu_env);
13685             break;
13686         case OPC_EXTPDP:
13687             tcg_gen_movi_tl(t0, v2);
13688             tcg_gen_movi_tl(t1, v1);
13689             gen_helper_extpdp(cpu_gpr[ret], t0, t1, cpu_env);
13690             break;
13691         case OPC_EXTPDPV:
13692             tcg_gen_movi_tl(t0, v2);
13693             gen_helper_extpdp(cpu_gpr[ret], t0, v1_t, cpu_env);
13694             break;
13695         case OPC_SHILO:
13696             imm = (ctx->opcode >> 20) & 0x3F;
13697             tcg_gen_movi_tl(t0, ret);
13698             tcg_gen_movi_tl(t1, imm);
13699             gen_helper_shilo(t0, t1, cpu_env);
13700             break;
13701         case OPC_SHILOV:
13702             tcg_gen_movi_tl(t0, ret);
13703             gen_helper_shilo(t0, v1_t, cpu_env);
13704             break;
13705         case OPC_MTHLIP:
13706             tcg_gen_movi_tl(t0, ret);
13707             gen_helper_mthlip(t0, v1_t, cpu_env);
13708             break;
13709         case OPC_WRDSP:
13710             imm = (ctx->opcode >> 11) & 0x3FF;
13711             tcg_gen_movi_tl(t0, imm);
13712             gen_helper_wrdsp(v1_t, t0, cpu_env);
13713             break;
13714         case OPC_RDDSP:
13715             imm = (ctx->opcode >> 16) & 0x03FF;
13716             tcg_gen_movi_tl(t0, imm);
13717             gen_helper_rddsp(cpu_gpr[ret], t0, cpu_env);
13718             break;
13719         }
13720         break;
13721 #ifdef TARGET_MIPS64
13722     case OPC_DEXTR_W_DSP:
13723         check_dsp(ctx);
13724         switch (op2) {
13725         case OPC_DMTHLIP:
13726             tcg_gen_movi_tl(t0, ret);
13727             gen_helper_dmthlip(v1_t, t0, cpu_env);
13728             break;
13729         case OPC_DSHILO:
13730             {
13731                 int shift = (ctx->opcode >> 19) & 0x7F;
13732                 int ac = (ctx->opcode >> 11) & 0x03;
13733                 tcg_gen_movi_tl(t0, shift);
13734                 tcg_gen_movi_tl(t1, ac);
13735                 gen_helper_dshilo(t0, t1, cpu_env);
13736                 break;
13737             }
13738         case OPC_DSHILOV:
13739             {
13740                 int ac = (ctx->opcode >> 11) & 0x03;
13741                 tcg_gen_movi_tl(t0, ac);
13742                 gen_helper_dshilo(v1_t, t0, cpu_env);
13743                 break;
13744             }
13745         case OPC_DEXTP:
13746             tcg_gen_movi_tl(t0, v2);
13747             tcg_gen_movi_tl(t1, v1);
13748 
13749             gen_helper_dextp(cpu_gpr[ret], t0, t1, cpu_env);
13750             break;
13751         case OPC_DEXTPV:
13752             tcg_gen_movi_tl(t0, v2);
13753             gen_helper_dextp(cpu_gpr[ret], t0, v1_t, cpu_env);
13754             break;
13755         case OPC_DEXTPDP:
13756             tcg_gen_movi_tl(t0, v2);
13757             tcg_gen_movi_tl(t1, v1);
13758             gen_helper_dextpdp(cpu_gpr[ret], t0, t1, cpu_env);
13759             break;
13760         case OPC_DEXTPDPV:
13761             tcg_gen_movi_tl(t0, v2);
13762             gen_helper_dextpdp(cpu_gpr[ret], t0, v1_t, cpu_env);
13763             break;
13764         case OPC_DEXTR_L:
13765             tcg_gen_movi_tl(t0, v2);
13766             tcg_gen_movi_tl(t1, v1);
13767             gen_helper_dextr_l(cpu_gpr[ret], t0, t1, cpu_env);
13768             break;
13769         case OPC_DEXTR_R_L:
13770             tcg_gen_movi_tl(t0, v2);
13771             tcg_gen_movi_tl(t1, v1);
13772             gen_helper_dextr_r_l(cpu_gpr[ret], t0, t1, cpu_env);
13773             break;
13774         case OPC_DEXTR_RS_L:
13775             tcg_gen_movi_tl(t0, v2);
13776             tcg_gen_movi_tl(t1, v1);
13777             gen_helper_dextr_rs_l(cpu_gpr[ret], t0, t1, cpu_env);
13778             break;
13779         case OPC_DEXTR_W:
13780             tcg_gen_movi_tl(t0, v2);
13781             tcg_gen_movi_tl(t1, v1);
13782             gen_helper_dextr_w(cpu_gpr[ret], t0, t1, cpu_env);
13783             break;
13784         case OPC_DEXTR_R_W:
13785             tcg_gen_movi_tl(t0, v2);
13786             tcg_gen_movi_tl(t1, v1);
13787             gen_helper_dextr_r_w(cpu_gpr[ret], t0, t1, cpu_env);
13788             break;
13789         case OPC_DEXTR_RS_W:
13790             tcg_gen_movi_tl(t0, v2);
13791             tcg_gen_movi_tl(t1, v1);
13792             gen_helper_dextr_rs_w(cpu_gpr[ret], t0, t1, cpu_env);
13793             break;
13794         case OPC_DEXTR_S_H:
13795             tcg_gen_movi_tl(t0, v2);
13796             tcg_gen_movi_tl(t1, v1);
13797             gen_helper_dextr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
13798             break;
13799         case OPC_DEXTRV_S_H:
13800             tcg_gen_movi_tl(t0, v2);
13801             tcg_gen_movi_tl(t1, v1);
13802             gen_helper_dextr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
13803             break;
13804         case OPC_DEXTRV_L:
13805             tcg_gen_movi_tl(t0, v2);
13806             gen_helper_dextr_l(cpu_gpr[ret], t0, v1_t, cpu_env);
13807             break;
13808         case OPC_DEXTRV_R_L:
13809             tcg_gen_movi_tl(t0, v2);
13810             gen_helper_dextr_r_l(cpu_gpr[ret], t0, v1_t, cpu_env);
13811             break;
13812         case OPC_DEXTRV_RS_L:
13813             tcg_gen_movi_tl(t0, v2);
13814             gen_helper_dextr_rs_l(cpu_gpr[ret], t0, v1_t, cpu_env);
13815             break;
13816         case OPC_DEXTRV_W:
13817             tcg_gen_movi_tl(t0, v2);
13818             gen_helper_dextr_w(cpu_gpr[ret], t0, v1_t, cpu_env);
13819             break;
13820         case OPC_DEXTRV_R_W:
13821             tcg_gen_movi_tl(t0, v2);
13822             gen_helper_dextr_r_w(cpu_gpr[ret], t0, v1_t, cpu_env);
13823             break;
13824         case OPC_DEXTRV_RS_W:
13825             tcg_gen_movi_tl(t0, v2);
13826             gen_helper_dextr_rs_w(cpu_gpr[ret], t0, v1_t, cpu_env);
13827             break;
13828         }
13829         break;
13830 #endif
13831     }
13832 
13833     tcg_temp_free(t0);
13834     tcg_temp_free(t1);
13835     tcg_temp_free(v1_t);
13836     tcg_temp_free(v2_t);
13837 }
13838 
13839 /* End MIPSDSP functions. */
13840 
13841 static void decode_opc_special_r6(CPUMIPSState *env, DisasContext *ctx)
13842 {
13843     int rs, rt, rd, sa;
13844     uint32_t op1, op2;
13845 
13846     rs = (ctx->opcode >> 21) & 0x1f;
13847     rt = (ctx->opcode >> 16) & 0x1f;
13848     rd = (ctx->opcode >> 11) & 0x1f;
13849     sa = (ctx->opcode >> 6) & 0x1f;
13850 
13851     op1 = MASK_SPECIAL(ctx->opcode);
13852     switch (op1) {
13853     case OPC_MULT:
13854     case OPC_MULTU:
13855     case OPC_DIV:
13856     case OPC_DIVU:
13857         op2 = MASK_R6_MULDIV(ctx->opcode);
13858         switch (op2) {
13859         case R6_OPC_MUL:
13860         case R6_OPC_MUH:
13861         case R6_OPC_MULU:
13862         case R6_OPC_MUHU:
13863         case R6_OPC_DIV:
13864         case R6_OPC_MOD:
13865         case R6_OPC_DIVU:
13866         case R6_OPC_MODU:
13867             gen_r6_muldiv(ctx, op2, rd, rs, rt);
13868             break;
13869         default:
13870             MIPS_INVAL("special_r6 muldiv");
13871             gen_reserved_instruction(ctx);
13872             break;
13873         }
13874         break;
13875     case OPC_SELEQZ:
13876     case OPC_SELNEZ:
13877         gen_cond_move(ctx, op1, rd, rs, rt);
13878         break;
13879     case R6_OPC_CLO:
13880     case R6_OPC_CLZ:
13881         if (rt == 0 && sa == 1) {
13882             /*
13883              * Major opcode and function field is shared with preR6 MFHI/MTHI.
13884              * We need additionally to check other fields.
13885              */
13886             gen_cl(ctx, op1, rd, rs);
13887         } else {
13888             gen_reserved_instruction(ctx);
13889         }
13890         break;
13891     case R6_OPC_SDBBP:
13892         if (is_uhi(extract32(ctx->opcode, 6, 20))) {
13893             gen_helper_do_semihosting(cpu_env);
13894         } else {
13895             if (ctx->hflags & MIPS_HFLAG_SBRI) {
13896                 gen_reserved_instruction(ctx);
13897             } else {
13898                 generate_exception_end(ctx, EXCP_DBp);
13899             }
13900         }
13901         break;
13902 #if defined(TARGET_MIPS64)
13903     case R6_OPC_DCLO:
13904     case R6_OPC_DCLZ:
13905         if (rt == 0 && sa == 1) {
13906             /*
13907              * Major opcode and function field is shared with preR6 MFHI/MTHI.
13908              * We need additionally to check other fields.
13909              */
13910             check_mips_64(ctx);
13911             gen_cl(ctx, op1, rd, rs);
13912         } else {
13913             gen_reserved_instruction(ctx);
13914         }
13915         break;
13916     case OPC_DMULT:
13917     case OPC_DMULTU:
13918     case OPC_DDIV:
13919     case OPC_DDIVU:
13920 
13921         op2 = MASK_R6_MULDIV(ctx->opcode);
13922         switch (op2) {
13923         case R6_OPC_DMUL:
13924         case R6_OPC_DMUH:
13925         case R6_OPC_DMULU:
13926         case R6_OPC_DMUHU:
13927         case R6_OPC_DDIV:
13928         case R6_OPC_DMOD:
13929         case R6_OPC_DDIVU:
13930         case R6_OPC_DMODU:
13931             check_mips_64(ctx);
13932             gen_r6_muldiv(ctx, op2, rd, rs, rt);
13933             break;
13934         default:
13935             MIPS_INVAL("special_r6 muldiv");
13936             gen_reserved_instruction(ctx);
13937             break;
13938         }
13939         break;
13940 #endif
13941     default:            /* Invalid */
13942         MIPS_INVAL("special_r6");
13943         gen_reserved_instruction(ctx);
13944         break;
13945     }
13946 }
13947 
13948 static void decode_opc_special_tx79(CPUMIPSState *env, DisasContext *ctx)
13949 {
13950     int rs = extract32(ctx->opcode, 21, 5);
13951     int rt = extract32(ctx->opcode, 16, 5);
13952     int rd = extract32(ctx->opcode, 11, 5);
13953     uint32_t op1 = MASK_SPECIAL(ctx->opcode);
13954 
13955     switch (op1) {
13956     case OPC_MOVN:         /* Conditional move */
13957     case OPC_MOVZ:
13958         gen_cond_move(ctx, op1, rd, rs, rt);
13959         break;
13960     case OPC_MFHI:          /* Move from HI/LO */
13961     case OPC_MFLO:
13962         gen_HILO(ctx, op1, 0, rd);
13963         break;
13964     case OPC_MTHI:
13965     case OPC_MTLO:          /* Move to HI/LO */
13966         gen_HILO(ctx, op1, 0, rs);
13967         break;
13968     case OPC_MULT:
13969     case OPC_MULTU:
13970         gen_mul_txx9(ctx, op1, rd, rs, rt);
13971         break;
13972     case OPC_DIV:
13973     case OPC_DIVU:
13974         gen_muldiv(ctx, op1, 0, rs, rt);
13975         break;
13976 #if defined(TARGET_MIPS64)
13977     case OPC_DMULT:
13978     case OPC_DMULTU:
13979     case OPC_DDIV:
13980     case OPC_DDIVU:
13981         check_insn_opc_user_only(ctx, INSN_R5900);
13982         gen_muldiv(ctx, op1, 0, rs, rt);
13983         break;
13984 #endif
13985     case OPC_JR:
13986         gen_compute_branch(ctx, op1, 4, rs, 0, 0, 4);
13987         break;
13988     default:            /* Invalid */
13989         MIPS_INVAL("special_tx79");
13990         gen_reserved_instruction(ctx);
13991         break;
13992     }
13993 }
13994 
13995 static void decode_opc_special_legacy(CPUMIPSState *env, DisasContext *ctx)
13996 {
13997     int rs, rt, rd;
13998     uint32_t op1;
13999 
14000     rs = (ctx->opcode >> 21) & 0x1f;
14001     rt = (ctx->opcode >> 16) & 0x1f;
14002     rd = (ctx->opcode >> 11) & 0x1f;
14003 
14004     op1 = MASK_SPECIAL(ctx->opcode);
14005     switch (op1) {
14006     case OPC_MOVN:         /* Conditional move */
14007     case OPC_MOVZ:
14008         check_insn(ctx, ISA_MIPS4 | ISA_MIPS_R1 |
14009                    INSN_LOONGSON2E | INSN_LOONGSON2F);
14010         gen_cond_move(ctx, op1, rd, rs, rt);
14011         break;
14012     case OPC_MFHI:          /* Move from HI/LO */
14013     case OPC_MFLO:
14014         gen_HILO(ctx, op1, rs & 3, rd);
14015         break;
14016     case OPC_MTHI:
14017     case OPC_MTLO:          /* Move to HI/LO */
14018         gen_HILO(ctx, op1, rd & 3, rs);
14019         break;
14020     case OPC_MOVCI:
14021         check_insn(ctx, ISA_MIPS4 | ISA_MIPS_R1);
14022         if (env->CP0_Config1 & (1 << CP0C1_FP)) {
14023             check_cp1_enabled(ctx);
14024             gen_movci(ctx, rd, rs, (ctx->opcode >> 18) & 0x7,
14025                       (ctx->opcode >> 16) & 1);
14026         } else {
14027             generate_exception_err(ctx, EXCP_CpU, 1);
14028         }
14029         break;
14030     case OPC_MULT:
14031     case OPC_MULTU:
14032         gen_muldiv(ctx, op1, rd & 3, rs, rt);
14033         break;
14034     case OPC_DIV:
14035     case OPC_DIVU:
14036         gen_muldiv(ctx, op1, 0, rs, rt);
14037         break;
14038 #if defined(TARGET_MIPS64)
14039     case OPC_DMULT:
14040     case OPC_DMULTU:
14041     case OPC_DDIV:
14042     case OPC_DDIVU:
14043         check_insn(ctx, ISA_MIPS3);
14044         check_mips_64(ctx);
14045         gen_muldiv(ctx, op1, 0, rs, rt);
14046         break;
14047 #endif
14048     case OPC_JR:
14049         gen_compute_branch(ctx, op1, 4, rs, 0, 0, 4);
14050         break;
14051     case OPC_SPIM:
14052 #ifdef MIPS_STRICT_STANDARD
14053         MIPS_INVAL("SPIM");
14054         gen_reserved_instruction(ctx);
14055 #else
14056         /* Implemented as RI exception for now. */
14057         MIPS_INVAL("spim (unofficial)");
14058         gen_reserved_instruction(ctx);
14059 #endif
14060         break;
14061     default:            /* Invalid */
14062         MIPS_INVAL("special_legacy");
14063         gen_reserved_instruction(ctx);
14064         break;
14065     }
14066 }
14067 
14068 static void decode_opc_special(CPUMIPSState *env, DisasContext *ctx)
14069 {
14070     int rs, rt, rd, sa;
14071     uint32_t op1;
14072 
14073     rs = (ctx->opcode >> 21) & 0x1f;
14074     rt = (ctx->opcode >> 16) & 0x1f;
14075     rd = (ctx->opcode >> 11) & 0x1f;
14076     sa = (ctx->opcode >> 6) & 0x1f;
14077 
14078     op1 = MASK_SPECIAL(ctx->opcode);
14079     switch (op1) {
14080     case OPC_SLL:          /* Shift with immediate */
14081         if (sa == 5 && rd == 0 &&
14082             rs == 0 && rt == 0) { /* PAUSE */
14083             if ((ctx->insn_flags & ISA_MIPS_R6) &&
14084                 (ctx->hflags & MIPS_HFLAG_BMASK)) {
14085                 gen_reserved_instruction(ctx);
14086                 break;
14087             }
14088         }
14089         /* Fallthrough */
14090     case OPC_SRA:
14091         gen_shift_imm(ctx, op1, rd, rt, sa);
14092         break;
14093     case OPC_SRL:
14094         switch ((ctx->opcode >> 21) & 0x1f) {
14095         case 1:
14096             /* rotr is decoded as srl on non-R2 CPUs */
14097             if (ctx->insn_flags & ISA_MIPS_R2) {
14098                 op1 = OPC_ROTR;
14099             }
14100             /* Fallthrough */
14101         case 0:
14102             gen_shift_imm(ctx, op1, rd, rt, sa);
14103             break;
14104         default:
14105             gen_reserved_instruction(ctx);
14106             break;
14107         }
14108         break;
14109     case OPC_ADD:
14110     case OPC_ADDU:
14111     case OPC_SUB:
14112     case OPC_SUBU:
14113         gen_arith(ctx, op1, rd, rs, rt);
14114         break;
14115     case OPC_SLLV:         /* Shifts */
14116     case OPC_SRAV:
14117         gen_shift(ctx, op1, rd, rs, rt);
14118         break;
14119     case OPC_SRLV:
14120         switch ((ctx->opcode >> 6) & 0x1f) {
14121         case 1:
14122             /* rotrv is decoded as srlv on non-R2 CPUs */
14123             if (ctx->insn_flags & ISA_MIPS_R2) {
14124                 op1 = OPC_ROTRV;
14125             }
14126             /* Fallthrough */
14127         case 0:
14128             gen_shift(ctx, op1, rd, rs, rt);
14129             break;
14130         default:
14131             gen_reserved_instruction(ctx);
14132             break;
14133         }
14134         break;
14135     case OPC_SLT:          /* Set on less than */
14136     case OPC_SLTU:
14137         gen_slt(ctx, op1, rd, rs, rt);
14138         break;
14139     case OPC_AND:          /* Logic*/
14140     case OPC_OR:
14141     case OPC_NOR:
14142     case OPC_XOR:
14143         gen_logic(ctx, op1, rd, rs, rt);
14144         break;
14145     case OPC_JALR:
14146         gen_compute_branch(ctx, op1, 4, rs, rd, sa, 4);
14147         break;
14148     case OPC_TGE: /* Traps */
14149     case OPC_TGEU:
14150     case OPC_TLT:
14151     case OPC_TLTU:
14152     case OPC_TEQ:
14153     case OPC_TNE:
14154         check_insn(ctx, ISA_MIPS2);
14155         gen_trap(ctx, op1, rs, rt, -1);
14156         break;
14157     case OPC_PMON:
14158         /* Pmon entry point, also R4010 selsl */
14159 #ifdef MIPS_STRICT_STANDARD
14160         MIPS_INVAL("PMON / selsl");
14161         gen_reserved_instruction(ctx);
14162 #else
14163         gen_helper_pmon(cpu_env, tcg_constant_i32(sa));
14164 #endif
14165         break;
14166     case OPC_SYSCALL:
14167         generate_exception_end(ctx, EXCP_SYSCALL);
14168         break;
14169     case OPC_BREAK:
14170         generate_exception_end(ctx, EXCP_BREAK);
14171         break;
14172     case OPC_SYNC:
14173         check_insn(ctx, ISA_MIPS2);
14174         gen_sync(extract32(ctx->opcode, 6, 5));
14175         break;
14176 
14177 #if defined(TARGET_MIPS64)
14178         /* MIPS64 specific opcodes */
14179     case OPC_DSLL:
14180     case OPC_DSRA:
14181     case OPC_DSLL32:
14182     case OPC_DSRA32:
14183         check_insn(ctx, ISA_MIPS3);
14184         check_mips_64(ctx);
14185         gen_shift_imm(ctx, op1, rd, rt, sa);
14186         break;
14187     case OPC_DSRL:
14188         switch ((ctx->opcode >> 21) & 0x1f) {
14189         case 1:
14190             /* drotr is decoded as dsrl on non-R2 CPUs */
14191             if (ctx->insn_flags & ISA_MIPS_R2) {
14192                 op1 = OPC_DROTR;
14193             }
14194             /* Fallthrough */
14195         case 0:
14196             check_insn(ctx, ISA_MIPS3);
14197             check_mips_64(ctx);
14198             gen_shift_imm(ctx, op1, rd, rt, sa);
14199             break;
14200         default:
14201             gen_reserved_instruction(ctx);
14202             break;
14203         }
14204         break;
14205     case OPC_DSRL32:
14206         switch ((ctx->opcode >> 21) & 0x1f) {
14207         case 1:
14208             /* drotr32 is decoded as dsrl32 on non-R2 CPUs */
14209             if (ctx->insn_flags & ISA_MIPS_R2) {
14210                 op1 = OPC_DROTR32;
14211             }
14212             /* Fallthrough */
14213         case 0:
14214             check_insn(ctx, ISA_MIPS3);
14215             check_mips_64(ctx);
14216             gen_shift_imm(ctx, op1, rd, rt, sa);
14217             break;
14218         default:
14219             gen_reserved_instruction(ctx);
14220             break;
14221         }
14222         break;
14223     case OPC_DADD:
14224     case OPC_DADDU:
14225     case OPC_DSUB:
14226     case OPC_DSUBU:
14227         check_insn(ctx, ISA_MIPS3);
14228         check_mips_64(ctx);
14229         gen_arith(ctx, op1, rd, rs, rt);
14230         break;
14231     case OPC_DSLLV:
14232     case OPC_DSRAV:
14233         check_insn(ctx, ISA_MIPS3);
14234         check_mips_64(ctx);
14235         gen_shift(ctx, op1, rd, rs, rt);
14236         break;
14237     case OPC_DSRLV:
14238         switch ((ctx->opcode >> 6) & 0x1f) {
14239         case 1:
14240             /* drotrv is decoded as dsrlv on non-R2 CPUs */
14241             if (ctx->insn_flags & ISA_MIPS_R2) {
14242                 op1 = OPC_DROTRV;
14243             }
14244             /* Fallthrough */
14245         case 0:
14246             check_insn(ctx, ISA_MIPS3);
14247             check_mips_64(ctx);
14248             gen_shift(ctx, op1, rd, rs, rt);
14249             break;
14250         default:
14251             gen_reserved_instruction(ctx);
14252             break;
14253         }
14254         break;
14255 #endif
14256     default:
14257         if (ctx->insn_flags & ISA_MIPS_R6) {
14258             decode_opc_special_r6(env, ctx);
14259         } else if (ctx->insn_flags & INSN_R5900) {
14260             decode_opc_special_tx79(env, ctx);
14261         } else {
14262             decode_opc_special_legacy(env, ctx);
14263         }
14264     }
14265 }
14266 
14267 
14268 static void decode_opc_special2_legacy(CPUMIPSState *env, DisasContext *ctx)
14269 {
14270     int rs, rt, rd;
14271     uint32_t op1;
14272 
14273     rs = (ctx->opcode >> 21) & 0x1f;
14274     rt = (ctx->opcode >> 16) & 0x1f;
14275     rd = (ctx->opcode >> 11) & 0x1f;
14276 
14277     op1 = MASK_SPECIAL2(ctx->opcode);
14278     switch (op1) {
14279     case OPC_MADD: /* Multiply and add/sub */
14280     case OPC_MADDU:
14281     case OPC_MSUB:
14282     case OPC_MSUBU:
14283         check_insn(ctx, ISA_MIPS_R1);
14284         gen_muldiv(ctx, op1, rd & 3, rs, rt);
14285         break;
14286     case OPC_MUL:
14287         gen_arith(ctx, op1, rd, rs, rt);
14288         break;
14289     case OPC_DIV_G_2F:
14290     case OPC_DIVU_G_2F:
14291     case OPC_MULT_G_2F:
14292     case OPC_MULTU_G_2F:
14293     case OPC_MOD_G_2F:
14294     case OPC_MODU_G_2F:
14295         check_insn(ctx, INSN_LOONGSON2F | ASE_LEXT);
14296         gen_loongson_integer(ctx, op1, rd, rs, rt);
14297         break;
14298     case OPC_CLO:
14299     case OPC_CLZ:
14300         check_insn(ctx, ISA_MIPS_R1);
14301         gen_cl(ctx, op1, rd, rs);
14302         break;
14303     case OPC_SDBBP:
14304         if (is_uhi(extract32(ctx->opcode, 6, 20))) {
14305             gen_helper_do_semihosting(cpu_env);
14306         } else {
14307             /*
14308              * XXX: not clear which exception should be raised
14309              *      when in debug mode...
14310              */
14311             check_insn(ctx, ISA_MIPS_R1);
14312             generate_exception_end(ctx, EXCP_DBp);
14313         }
14314         break;
14315 #if defined(TARGET_MIPS64)
14316     case OPC_DCLO:
14317     case OPC_DCLZ:
14318         check_insn(ctx, ISA_MIPS_R1);
14319         check_mips_64(ctx);
14320         gen_cl(ctx, op1, rd, rs);
14321         break;
14322     case OPC_DMULT_G_2F:
14323     case OPC_DMULTU_G_2F:
14324     case OPC_DDIV_G_2F:
14325     case OPC_DDIVU_G_2F:
14326     case OPC_DMOD_G_2F:
14327     case OPC_DMODU_G_2F:
14328         check_insn(ctx, INSN_LOONGSON2F | ASE_LEXT);
14329         gen_loongson_integer(ctx, op1, rd, rs, rt);
14330         break;
14331 #endif
14332     default:            /* Invalid */
14333         MIPS_INVAL("special2_legacy");
14334         gen_reserved_instruction(ctx);
14335         break;
14336     }
14337 }
14338 
14339 static void decode_opc_special3_r6(CPUMIPSState *env, DisasContext *ctx)
14340 {
14341     int rs, rt, rd, sa;
14342     uint32_t op1, op2;
14343     int16_t imm;
14344 
14345     rs = (ctx->opcode >> 21) & 0x1f;
14346     rt = (ctx->opcode >> 16) & 0x1f;
14347     rd = (ctx->opcode >> 11) & 0x1f;
14348     sa = (ctx->opcode >> 6) & 0x1f;
14349     imm = (int16_t)ctx->opcode >> 7;
14350 
14351     op1 = MASK_SPECIAL3(ctx->opcode);
14352     switch (op1) {
14353     case R6_OPC_PREF:
14354         if (rt >= 24) {
14355             /* hint codes 24-31 are reserved and signal RI */
14356             gen_reserved_instruction(ctx);
14357         }
14358         /* Treat as NOP. */
14359         break;
14360     case R6_OPC_CACHE:
14361         check_cp0_enabled(ctx);
14362         if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
14363             gen_cache_operation(ctx, rt, rs, imm);
14364         }
14365         break;
14366     case R6_OPC_SC:
14367         gen_st_cond(ctx, rt, rs, imm, MO_TESL, false);
14368         break;
14369     case R6_OPC_LL:
14370         gen_ld(ctx, op1, rt, rs, imm);
14371         break;
14372     case OPC_BSHFL:
14373         {
14374             if (rd == 0) {
14375                 /* Treat as NOP. */
14376                 break;
14377             }
14378             op2 = MASK_BSHFL(ctx->opcode);
14379             switch (op2) {
14380             case OPC_ALIGN:
14381             case OPC_ALIGN_1:
14382             case OPC_ALIGN_2:
14383             case OPC_ALIGN_3:
14384                 gen_align(ctx, 32, rd, rs, rt, sa & 3);
14385                 break;
14386             case OPC_BITSWAP:
14387                 gen_bitswap(ctx, op2, rd, rt);
14388                 break;
14389             }
14390         }
14391         break;
14392 #ifndef CONFIG_USER_ONLY
14393     case OPC_GINV:
14394         if (unlikely(ctx->gi <= 1)) {
14395             gen_reserved_instruction(ctx);
14396         }
14397         check_cp0_enabled(ctx);
14398         switch ((ctx->opcode >> 6) & 3) {
14399         case 0:    /* GINVI */
14400             /* Treat as NOP. */
14401             break;
14402         case 2:    /* GINVT */
14403             gen_helper_0e1i(ginvt, cpu_gpr[rs], extract32(ctx->opcode, 8, 2));
14404             break;
14405         default:
14406             gen_reserved_instruction(ctx);
14407             break;
14408         }
14409         break;
14410 #endif
14411 #if defined(TARGET_MIPS64)
14412     case R6_OPC_SCD:
14413         gen_st_cond(ctx, rt, rs, imm, MO_TEQ, false);
14414         break;
14415     case R6_OPC_LLD:
14416         gen_ld(ctx, op1, rt, rs, imm);
14417         break;
14418     case OPC_DBSHFL:
14419         check_mips_64(ctx);
14420         {
14421             if (rd == 0) {
14422                 /* Treat as NOP. */
14423                 break;
14424             }
14425             op2 = MASK_DBSHFL(ctx->opcode);
14426             switch (op2) {
14427             case OPC_DALIGN:
14428             case OPC_DALIGN_1:
14429             case OPC_DALIGN_2:
14430             case OPC_DALIGN_3:
14431             case OPC_DALIGN_4:
14432             case OPC_DALIGN_5:
14433             case OPC_DALIGN_6:
14434             case OPC_DALIGN_7:
14435                 gen_align(ctx, 64, rd, rs, rt, sa & 7);
14436                 break;
14437             case OPC_DBITSWAP:
14438                 gen_bitswap(ctx, op2, rd, rt);
14439                 break;
14440             }
14441 
14442         }
14443         break;
14444 #endif
14445     default:            /* Invalid */
14446         MIPS_INVAL("special3_r6");
14447         gen_reserved_instruction(ctx);
14448         break;
14449     }
14450 }
14451 
14452 static void decode_opc_special3_legacy(CPUMIPSState *env, DisasContext *ctx)
14453 {
14454     int rs, rt, rd;
14455     uint32_t op1, op2;
14456 
14457     rs = (ctx->opcode >> 21) & 0x1f;
14458     rt = (ctx->opcode >> 16) & 0x1f;
14459     rd = (ctx->opcode >> 11) & 0x1f;
14460 
14461     op1 = MASK_SPECIAL3(ctx->opcode);
14462     switch (op1) {
14463     case OPC_DIV_G_2E:
14464     case OPC_DIVU_G_2E:
14465     case OPC_MOD_G_2E:
14466     case OPC_MODU_G_2E:
14467     case OPC_MULT_G_2E:
14468     case OPC_MULTU_G_2E:
14469         /*
14470          * OPC_MULT_G_2E, OPC_ADDUH_QB_DSP, OPC_MUL_PH_DSP have
14471          * the same mask and op1.
14472          */
14473         if ((ctx->insn_flags & ASE_DSP_R2) && (op1 == OPC_MULT_G_2E)) {
14474             op2 = MASK_ADDUH_QB(ctx->opcode);
14475             switch (op2) {
14476             case OPC_ADDUH_QB:
14477             case OPC_ADDUH_R_QB:
14478             case OPC_ADDQH_PH:
14479             case OPC_ADDQH_R_PH:
14480             case OPC_ADDQH_W:
14481             case OPC_ADDQH_R_W:
14482             case OPC_SUBUH_QB:
14483             case OPC_SUBUH_R_QB:
14484             case OPC_SUBQH_PH:
14485             case OPC_SUBQH_R_PH:
14486             case OPC_SUBQH_W:
14487             case OPC_SUBQH_R_W:
14488                 gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
14489                 break;
14490             case OPC_MUL_PH:
14491             case OPC_MUL_S_PH:
14492             case OPC_MULQ_S_W:
14493             case OPC_MULQ_RS_W:
14494                 gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
14495                 break;
14496             default:
14497                 MIPS_INVAL("MASK ADDUH.QB");
14498                 gen_reserved_instruction(ctx);
14499                 break;
14500             }
14501         } else if (ctx->insn_flags & INSN_LOONGSON2E) {
14502             gen_loongson_integer(ctx, op1, rd, rs, rt);
14503         } else {
14504             gen_reserved_instruction(ctx);
14505         }
14506         break;
14507     case OPC_LX_DSP:
14508         op2 = MASK_LX(ctx->opcode);
14509         switch (op2) {
14510 #if defined(TARGET_MIPS64)
14511         case OPC_LDX:
14512 #endif
14513         case OPC_LBUX:
14514         case OPC_LHX:
14515         case OPC_LWX:
14516             gen_mipsdsp_ld(ctx, op2, rd, rs, rt);
14517             break;
14518         default:            /* Invalid */
14519             MIPS_INVAL("MASK LX");
14520             gen_reserved_instruction(ctx);
14521             break;
14522         }
14523         break;
14524     case OPC_ABSQ_S_PH_DSP:
14525         op2 = MASK_ABSQ_S_PH(ctx->opcode);
14526         switch (op2) {
14527         case OPC_ABSQ_S_QB:
14528         case OPC_ABSQ_S_PH:
14529         case OPC_ABSQ_S_W:
14530         case OPC_PRECEQ_W_PHL:
14531         case OPC_PRECEQ_W_PHR:
14532         case OPC_PRECEQU_PH_QBL:
14533         case OPC_PRECEQU_PH_QBR:
14534         case OPC_PRECEQU_PH_QBLA:
14535         case OPC_PRECEQU_PH_QBRA:
14536         case OPC_PRECEU_PH_QBL:
14537         case OPC_PRECEU_PH_QBR:
14538         case OPC_PRECEU_PH_QBLA:
14539         case OPC_PRECEU_PH_QBRA:
14540             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
14541             break;
14542         case OPC_BITREV:
14543         case OPC_REPL_QB:
14544         case OPC_REPLV_QB:
14545         case OPC_REPL_PH:
14546         case OPC_REPLV_PH:
14547             gen_mipsdsp_bitinsn(ctx, op1, op2, rd, rt);
14548             break;
14549         default:
14550             MIPS_INVAL("MASK ABSQ_S.PH");
14551             gen_reserved_instruction(ctx);
14552             break;
14553         }
14554         break;
14555     case OPC_ADDU_QB_DSP:
14556         op2 = MASK_ADDU_QB(ctx->opcode);
14557         switch (op2) {
14558         case OPC_ADDQ_PH:
14559         case OPC_ADDQ_S_PH:
14560         case OPC_ADDQ_S_W:
14561         case OPC_ADDU_QB:
14562         case OPC_ADDU_S_QB:
14563         case OPC_ADDU_PH:
14564         case OPC_ADDU_S_PH:
14565         case OPC_SUBQ_PH:
14566         case OPC_SUBQ_S_PH:
14567         case OPC_SUBQ_S_W:
14568         case OPC_SUBU_QB:
14569         case OPC_SUBU_S_QB:
14570         case OPC_SUBU_PH:
14571         case OPC_SUBU_S_PH:
14572         case OPC_ADDSC:
14573         case OPC_ADDWC:
14574         case OPC_MODSUB:
14575         case OPC_RADDU_W_QB:
14576             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
14577             break;
14578         case OPC_MULEU_S_PH_QBL:
14579         case OPC_MULEU_S_PH_QBR:
14580         case OPC_MULQ_RS_PH:
14581         case OPC_MULEQ_S_W_PHL:
14582         case OPC_MULEQ_S_W_PHR:
14583         case OPC_MULQ_S_PH:
14584             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
14585             break;
14586         default:            /* Invalid */
14587             MIPS_INVAL("MASK ADDU.QB");
14588             gen_reserved_instruction(ctx);
14589             break;
14590 
14591         }
14592         break;
14593     case OPC_CMPU_EQ_QB_DSP:
14594         op2 = MASK_CMPU_EQ_QB(ctx->opcode);
14595         switch (op2) {
14596         case OPC_PRECR_SRA_PH_W:
14597         case OPC_PRECR_SRA_R_PH_W:
14598             gen_mipsdsp_arith(ctx, op1, op2, rt, rs, rd);
14599             break;
14600         case OPC_PRECR_QB_PH:
14601         case OPC_PRECRQ_QB_PH:
14602         case OPC_PRECRQ_PH_W:
14603         case OPC_PRECRQ_RS_PH_W:
14604         case OPC_PRECRQU_S_QB_PH:
14605             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
14606             break;
14607         case OPC_CMPU_EQ_QB:
14608         case OPC_CMPU_LT_QB:
14609         case OPC_CMPU_LE_QB:
14610         case OPC_CMP_EQ_PH:
14611         case OPC_CMP_LT_PH:
14612         case OPC_CMP_LE_PH:
14613             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 0);
14614             break;
14615         case OPC_CMPGU_EQ_QB:
14616         case OPC_CMPGU_LT_QB:
14617         case OPC_CMPGU_LE_QB:
14618         case OPC_CMPGDU_EQ_QB:
14619         case OPC_CMPGDU_LT_QB:
14620         case OPC_CMPGDU_LE_QB:
14621         case OPC_PICK_QB:
14622         case OPC_PICK_PH:
14623         case OPC_PACKRL_PH:
14624             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 1);
14625             break;
14626         default:            /* Invalid */
14627             MIPS_INVAL("MASK CMPU.EQ.QB");
14628             gen_reserved_instruction(ctx);
14629             break;
14630         }
14631         break;
14632     case OPC_SHLL_QB_DSP:
14633         gen_mipsdsp_shift(ctx, op1, rd, rs, rt);
14634         break;
14635     case OPC_DPA_W_PH_DSP:
14636         op2 = MASK_DPA_W_PH(ctx->opcode);
14637         switch (op2) {
14638         case OPC_DPAU_H_QBL:
14639         case OPC_DPAU_H_QBR:
14640         case OPC_DPSU_H_QBL:
14641         case OPC_DPSU_H_QBR:
14642         case OPC_DPA_W_PH:
14643         case OPC_DPAX_W_PH:
14644         case OPC_DPAQ_S_W_PH:
14645         case OPC_DPAQX_S_W_PH:
14646         case OPC_DPAQX_SA_W_PH:
14647         case OPC_DPS_W_PH:
14648         case OPC_DPSX_W_PH:
14649         case OPC_DPSQ_S_W_PH:
14650         case OPC_DPSQX_S_W_PH:
14651         case OPC_DPSQX_SA_W_PH:
14652         case OPC_MULSAQ_S_W_PH:
14653         case OPC_DPAQ_SA_L_W:
14654         case OPC_DPSQ_SA_L_W:
14655         case OPC_MAQ_S_W_PHL:
14656         case OPC_MAQ_S_W_PHR:
14657         case OPC_MAQ_SA_W_PHL:
14658         case OPC_MAQ_SA_W_PHR:
14659         case OPC_MULSA_W_PH:
14660             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
14661             break;
14662         default:            /* Invalid */
14663             MIPS_INVAL("MASK DPAW.PH");
14664             gen_reserved_instruction(ctx);
14665             break;
14666         }
14667         break;
14668     case OPC_INSV_DSP:
14669         op2 = MASK_INSV(ctx->opcode);
14670         switch (op2) {
14671         case OPC_INSV:
14672             check_dsp(ctx);
14673             {
14674                 TCGv t0, t1;
14675 
14676                 if (rt == 0) {
14677                     break;
14678                 }
14679 
14680                 t0 = tcg_temp_new();
14681                 t1 = tcg_temp_new();
14682 
14683                 gen_load_gpr(t0, rt);
14684                 gen_load_gpr(t1, rs);
14685 
14686                 gen_helper_insv(cpu_gpr[rt], cpu_env, t1, t0);
14687 
14688                 tcg_temp_free(t0);
14689                 tcg_temp_free(t1);
14690                 break;
14691             }
14692         default:            /* Invalid */
14693             MIPS_INVAL("MASK INSV");
14694             gen_reserved_instruction(ctx);
14695             break;
14696         }
14697         break;
14698     case OPC_APPEND_DSP:
14699         gen_mipsdsp_append(env, ctx, op1, rt, rs, rd);
14700         break;
14701     case OPC_EXTR_W_DSP:
14702         op2 = MASK_EXTR_W(ctx->opcode);
14703         switch (op2) {
14704         case OPC_EXTR_W:
14705         case OPC_EXTR_R_W:
14706         case OPC_EXTR_RS_W:
14707         case OPC_EXTR_S_H:
14708         case OPC_EXTRV_S_H:
14709         case OPC_EXTRV_W:
14710         case OPC_EXTRV_R_W:
14711         case OPC_EXTRV_RS_W:
14712         case OPC_EXTP:
14713         case OPC_EXTPV:
14714         case OPC_EXTPDP:
14715         case OPC_EXTPDPV:
14716             gen_mipsdsp_accinsn(ctx, op1, op2, rt, rs, rd, 1);
14717             break;
14718         case OPC_RDDSP:
14719             gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 1);
14720             break;
14721         case OPC_SHILO:
14722         case OPC_SHILOV:
14723         case OPC_MTHLIP:
14724         case OPC_WRDSP:
14725             gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 0);
14726             break;
14727         default:            /* Invalid */
14728             MIPS_INVAL("MASK EXTR.W");
14729             gen_reserved_instruction(ctx);
14730             break;
14731         }
14732         break;
14733 #if defined(TARGET_MIPS64)
14734     case OPC_DDIV_G_2E:
14735     case OPC_DDIVU_G_2E:
14736     case OPC_DMULT_G_2E:
14737     case OPC_DMULTU_G_2E:
14738     case OPC_DMOD_G_2E:
14739     case OPC_DMODU_G_2E:
14740         check_insn(ctx, INSN_LOONGSON2E);
14741         gen_loongson_integer(ctx, op1, rd, rs, rt);
14742         break;
14743     case OPC_ABSQ_S_QH_DSP:
14744         op2 = MASK_ABSQ_S_QH(ctx->opcode);
14745         switch (op2) {
14746         case OPC_PRECEQ_L_PWL:
14747         case OPC_PRECEQ_L_PWR:
14748         case OPC_PRECEQ_PW_QHL:
14749         case OPC_PRECEQ_PW_QHR:
14750         case OPC_PRECEQ_PW_QHLA:
14751         case OPC_PRECEQ_PW_QHRA:
14752         case OPC_PRECEQU_QH_OBL:
14753         case OPC_PRECEQU_QH_OBR:
14754         case OPC_PRECEQU_QH_OBLA:
14755         case OPC_PRECEQU_QH_OBRA:
14756         case OPC_PRECEU_QH_OBL:
14757         case OPC_PRECEU_QH_OBR:
14758         case OPC_PRECEU_QH_OBLA:
14759         case OPC_PRECEU_QH_OBRA:
14760         case OPC_ABSQ_S_OB:
14761         case OPC_ABSQ_S_PW:
14762         case OPC_ABSQ_S_QH:
14763             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
14764             break;
14765         case OPC_REPL_OB:
14766         case OPC_REPL_PW:
14767         case OPC_REPL_QH:
14768         case OPC_REPLV_OB:
14769         case OPC_REPLV_PW:
14770         case OPC_REPLV_QH:
14771             gen_mipsdsp_bitinsn(ctx, op1, op2, rd, rt);
14772             break;
14773         default:            /* Invalid */
14774             MIPS_INVAL("MASK ABSQ_S.QH");
14775             gen_reserved_instruction(ctx);
14776             break;
14777         }
14778         break;
14779     case OPC_ADDU_OB_DSP:
14780         op2 = MASK_ADDU_OB(ctx->opcode);
14781         switch (op2) {
14782         case OPC_RADDU_L_OB:
14783         case OPC_SUBQ_PW:
14784         case OPC_SUBQ_S_PW:
14785         case OPC_SUBQ_QH:
14786         case OPC_SUBQ_S_QH:
14787         case OPC_SUBU_OB:
14788         case OPC_SUBU_S_OB:
14789         case OPC_SUBU_QH:
14790         case OPC_SUBU_S_QH:
14791         case OPC_SUBUH_OB:
14792         case OPC_SUBUH_R_OB:
14793         case OPC_ADDQ_PW:
14794         case OPC_ADDQ_S_PW:
14795         case OPC_ADDQ_QH:
14796         case OPC_ADDQ_S_QH:
14797         case OPC_ADDU_OB:
14798         case OPC_ADDU_S_OB:
14799         case OPC_ADDU_QH:
14800         case OPC_ADDU_S_QH:
14801         case OPC_ADDUH_OB:
14802         case OPC_ADDUH_R_OB:
14803             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
14804             break;
14805         case OPC_MULEQ_S_PW_QHL:
14806         case OPC_MULEQ_S_PW_QHR:
14807         case OPC_MULEU_S_QH_OBL:
14808         case OPC_MULEU_S_QH_OBR:
14809         case OPC_MULQ_RS_QH:
14810             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
14811             break;
14812         default:            /* Invalid */
14813             MIPS_INVAL("MASK ADDU.OB");
14814             gen_reserved_instruction(ctx);
14815             break;
14816         }
14817         break;
14818     case OPC_CMPU_EQ_OB_DSP:
14819         op2 = MASK_CMPU_EQ_OB(ctx->opcode);
14820         switch (op2) {
14821         case OPC_PRECR_SRA_QH_PW:
14822         case OPC_PRECR_SRA_R_QH_PW:
14823             /* Return value is rt. */
14824             gen_mipsdsp_arith(ctx, op1, op2, rt, rs, rd);
14825             break;
14826         case OPC_PRECR_OB_QH:
14827         case OPC_PRECRQ_OB_QH:
14828         case OPC_PRECRQ_PW_L:
14829         case OPC_PRECRQ_QH_PW:
14830         case OPC_PRECRQ_RS_QH_PW:
14831         case OPC_PRECRQU_S_OB_QH:
14832             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
14833             break;
14834         case OPC_CMPU_EQ_OB:
14835         case OPC_CMPU_LT_OB:
14836         case OPC_CMPU_LE_OB:
14837         case OPC_CMP_EQ_QH:
14838         case OPC_CMP_LT_QH:
14839         case OPC_CMP_LE_QH:
14840         case OPC_CMP_EQ_PW:
14841         case OPC_CMP_LT_PW:
14842         case OPC_CMP_LE_PW:
14843             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 0);
14844             break;
14845         case OPC_CMPGDU_EQ_OB:
14846         case OPC_CMPGDU_LT_OB:
14847         case OPC_CMPGDU_LE_OB:
14848         case OPC_CMPGU_EQ_OB:
14849         case OPC_CMPGU_LT_OB:
14850         case OPC_CMPGU_LE_OB:
14851         case OPC_PACKRL_PW:
14852         case OPC_PICK_OB:
14853         case OPC_PICK_PW:
14854         case OPC_PICK_QH:
14855             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 1);
14856             break;
14857         default:            /* Invalid */
14858             MIPS_INVAL("MASK CMPU_EQ.OB");
14859             gen_reserved_instruction(ctx);
14860             break;
14861         }
14862         break;
14863     case OPC_DAPPEND_DSP:
14864         gen_mipsdsp_append(env, ctx, op1, rt, rs, rd);
14865         break;
14866     case OPC_DEXTR_W_DSP:
14867         op2 = MASK_DEXTR_W(ctx->opcode);
14868         switch (op2) {
14869         case OPC_DEXTP:
14870         case OPC_DEXTPDP:
14871         case OPC_DEXTPDPV:
14872         case OPC_DEXTPV:
14873         case OPC_DEXTR_L:
14874         case OPC_DEXTR_R_L:
14875         case OPC_DEXTR_RS_L:
14876         case OPC_DEXTR_W:
14877         case OPC_DEXTR_R_W:
14878         case OPC_DEXTR_RS_W:
14879         case OPC_DEXTR_S_H:
14880         case OPC_DEXTRV_L:
14881         case OPC_DEXTRV_R_L:
14882         case OPC_DEXTRV_RS_L:
14883         case OPC_DEXTRV_S_H:
14884         case OPC_DEXTRV_W:
14885         case OPC_DEXTRV_R_W:
14886         case OPC_DEXTRV_RS_W:
14887             gen_mipsdsp_accinsn(ctx, op1, op2, rt, rs, rd, 1);
14888             break;
14889         case OPC_DMTHLIP:
14890         case OPC_DSHILO:
14891         case OPC_DSHILOV:
14892             gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 0);
14893             break;
14894         default:            /* Invalid */
14895             MIPS_INVAL("MASK EXTR.W");
14896             gen_reserved_instruction(ctx);
14897             break;
14898         }
14899         break;
14900     case OPC_DPAQ_W_QH_DSP:
14901         op2 = MASK_DPAQ_W_QH(ctx->opcode);
14902         switch (op2) {
14903         case OPC_DPAU_H_OBL:
14904         case OPC_DPAU_H_OBR:
14905         case OPC_DPSU_H_OBL:
14906         case OPC_DPSU_H_OBR:
14907         case OPC_DPA_W_QH:
14908         case OPC_DPAQ_S_W_QH:
14909         case OPC_DPS_W_QH:
14910         case OPC_DPSQ_S_W_QH:
14911         case OPC_MULSAQ_S_W_QH:
14912         case OPC_DPAQ_SA_L_PW:
14913         case OPC_DPSQ_SA_L_PW:
14914         case OPC_MULSAQ_S_L_PW:
14915             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
14916             break;
14917         case OPC_MAQ_S_W_QHLL:
14918         case OPC_MAQ_S_W_QHLR:
14919         case OPC_MAQ_S_W_QHRL:
14920         case OPC_MAQ_S_W_QHRR:
14921         case OPC_MAQ_SA_W_QHLL:
14922         case OPC_MAQ_SA_W_QHLR:
14923         case OPC_MAQ_SA_W_QHRL:
14924         case OPC_MAQ_SA_W_QHRR:
14925         case OPC_MAQ_S_L_PWL:
14926         case OPC_MAQ_S_L_PWR:
14927         case OPC_DMADD:
14928         case OPC_DMADDU:
14929         case OPC_DMSUB:
14930         case OPC_DMSUBU:
14931             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
14932             break;
14933         default:            /* Invalid */
14934             MIPS_INVAL("MASK DPAQ.W.QH");
14935             gen_reserved_instruction(ctx);
14936             break;
14937         }
14938         break;
14939     case OPC_DINSV_DSP:
14940         op2 = MASK_INSV(ctx->opcode);
14941         switch (op2) {
14942         case OPC_DINSV:
14943         {
14944             TCGv t0, t1;
14945 
14946             check_dsp(ctx);
14947 
14948             if (rt == 0) {
14949                 break;
14950             }
14951 
14952             t0 = tcg_temp_new();
14953             t1 = tcg_temp_new();
14954 
14955             gen_load_gpr(t0, rt);
14956             gen_load_gpr(t1, rs);
14957 
14958             gen_helper_dinsv(cpu_gpr[rt], cpu_env, t1, t0);
14959 
14960             tcg_temp_free(t0);
14961             tcg_temp_free(t1);
14962             break;
14963         }
14964         default:            /* Invalid */
14965             MIPS_INVAL("MASK DINSV");
14966             gen_reserved_instruction(ctx);
14967             break;
14968         }
14969         break;
14970     case OPC_SHLL_OB_DSP:
14971         gen_mipsdsp_shift(ctx, op1, rd, rs, rt);
14972         break;
14973 #endif
14974     default:            /* Invalid */
14975         MIPS_INVAL("special3_legacy");
14976         gen_reserved_instruction(ctx);
14977         break;
14978     }
14979 }
14980 
14981 
14982 #if defined(TARGET_MIPS64)
14983 
14984 static void decode_mmi(CPUMIPSState *env, DisasContext *ctx)
14985 {
14986     uint32_t opc = MASK_MMI(ctx->opcode);
14987     int rs = extract32(ctx->opcode, 21, 5);
14988     int rt = extract32(ctx->opcode, 16, 5);
14989     int rd = extract32(ctx->opcode, 11, 5);
14990 
14991     switch (opc) {
14992     case MMI_OPC_MULT1:
14993     case MMI_OPC_MULTU1:
14994     case MMI_OPC_MADD:
14995     case MMI_OPC_MADDU:
14996     case MMI_OPC_MADD1:
14997     case MMI_OPC_MADDU1:
14998         gen_mul_txx9(ctx, opc, rd, rs, rt);
14999         break;
15000     case MMI_OPC_DIV1:
15001     case MMI_OPC_DIVU1:
15002         gen_div1_tx79(ctx, opc, rs, rt);
15003         break;
15004     default:
15005         MIPS_INVAL("TX79 MMI class");
15006         gen_reserved_instruction(ctx);
15007         break;
15008     }
15009 }
15010 
15011 static void gen_mmi_sq(DisasContext *ctx, int base, int rt, int offset)
15012 {
15013     gen_reserved_instruction(ctx);    /* TODO: MMI_OPC_SQ */
15014 }
15015 
15016 /*
15017  * The TX79-specific instruction Store Quadword
15018  *
15019  * +--------+-------+-------+------------------------+
15020  * | 011111 |  base |   rt  |           offset       | SQ
15021  * +--------+-------+-------+------------------------+
15022  *      6       5       5                 16
15023  *
15024  * has the same opcode as the Read Hardware Register instruction
15025  *
15026  * +--------+-------+-------+-------+-------+--------+
15027  * | 011111 | 00000 |   rt  |   rd  | 00000 | 111011 | RDHWR
15028  * +--------+-------+-------+-------+-------+--------+
15029  *      6       5       5       5       5        6
15030  *
15031  * that is required, trapped and emulated by the Linux kernel. However, all
15032  * RDHWR encodings yield address error exceptions on the TX79 since the SQ
15033  * offset is odd. Therefore all valid SQ instructions can execute normally.
15034  * In user mode, QEMU must verify the upper and lower 11 bits to distinguish
15035  * between SQ and RDHWR, as the Linux kernel does.
15036  */
15037 static void decode_mmi_sq(CPUMIPSState *env, DisasContext *ctx)
15038 {
15039     int base = extract32(ctx->opcode, 21, 5);
15040     int rt = extract32(ctx->opcode, 16, 5);
15041     int offset = extract32(ctx->opcode, 0, 16);
15042 
15043 #ifdef CONFIG_USER_ONLY
15044     uint32_t op1 = MASK_SPECIAL3(ctx->opcode);
15045     uint32_t op2 = extract32(ctx->opcode, 6, 5);
15046 
15047     if (base == 0 && op2 == 0 && op1 == OPC_RDHWR) {
15048         int rd = extract32(ctx->opcode, 11, 5);
15049 
15050         gen_rdhwr(ctx, rt, rd, 0);
15051         return;
15052     }
15053 #endif
15054 
15055     gen_mmi_sq(ctx, base, rt, offset);
15056 }
15057 
15058 #endif
15059 
15060 static void decode_opc_special3(CPUMIPSState *env, DisasContext *ctx)
15061 {
15062     int rs, rt, rd, sa;
15063     uint32_t op1, op2;
15064     int16_t imm;
15065 
15066     rs = (ctx->opcode >> 21) & 0x1f;
15067     rt = (ctx->opcode >> 16) & 0x1f;
15068     rd = (ctx->opcode >> 11) & 0x1f;
15069     sa = (ctx->opcode >> 6) & 0x1f;
15070     imm = sextract32(ctx->opcode, 7, 9);
15071 
15072     op1 = MASK_SPECIAL3(ctx->opcode);
15073 
15074     /*
15075      * EVA loads and stores overlap Loongson 2E instructions decoded by
15076      * decode_opc_special3_legacy(), so be careful to allow their decoding when
15077      * EVA is absent.
15078      */
15079     if (ctx->eva) {
15080         switch (op1) {
15081         case OPC_LWLE:
15082         case OPC_LWRE:
15083         case OPC_LBUE:
15084         case OPC_LHUE:
15085         case OPC_LBE:
15086         case OPC_LHE:
15087         case OPC_LLE:
15088         case OPC_LWE:
15089             check_cp0_enabled(ctx);
15090             gen_ld(ctx, op1, rt, rs, imm);
15091             return;
15092         case OPC_SWLE:
15093         case OPC_SWRE:
15094         case OPC_SBE:
15095         case OPC_SHE:
15096         case OPC_SWE:
15097             check_cp0_enabled(ctx);
15098             gen_st(ctx, op1, rt, rs, imm);
15099             return;
15100         case OPC_SCE:
15101             check_cp0_enabled(ctx);
15102             gen_st_cond(ctx, rt, rs, imm, MO_TESL, true);
15103             return;
15104         case OPC_CACHEE:
15105             check_eva(ctx);
15106             check_cp0_enabled(ctx);
15107             if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
15108                 gen_cache_operation(ctx, rt, rs, imm);
15109             }
15110             return;
15111         case OPC_PREFE:
15112             check_cp0_enabled(ctx);
15113             /* Treat as NOP. */
15114             return;
15115         }
15116     }
15117 
15118     switch (op1) {
15119     case OPC_EXT:
15120     case OPC_INS:
15121         check_insn(ctx, ISA_MIPS_R2);
15122         gen_bitops(ctx, op1, rt, rs, sa, rd);
15123         break;
15124     case OPC_BSHFL:
15125         op2 = MASK_BSHFL(ctx->opcode);
15126         switch (op2) {
15127         case OPC_ALIGN:
15128         case OPC_ALIGN_1:
15129         case OPC_ALIGN_2:
15130         case OPC_ALIGN_3:
15131         case OPC_BITSWAP:
15132             check_insn(ctx, ISA_MIPS_R6);
15133             decode_opc_special3_r6(env, ctx);
15134             break;
15135         default:
15136             check_insn(ctx, ISA_MIPS_R2);
15137             gen_bshfl(ctx, op2, rt, rd);
15138             break;
15139         }
15140         break;
15141 #if defined(TARGET_MIPS64)
15142     case OPC_DEXTM:
15143     case OPC_DEXTU:
15144     case OPC_DEXT:
15145     case OPC_DINSM:
15146     case OPC_DINSU:
15147     case OPC_DINS:
15148         check_insn(ctx, ISA_MIPS_R2);
15149         check_mips_64(ctx);
15150         gen_bitops(ctx, op1, rt, rs, sa, rd);
15151         break;
15152     case OPC_DBSHFL:
15153         op2 = MASK_DBSHFL(ctx->opcode);
15154         switch (op2) {
15155         case OPC_DALIGN:
15156         case OPC_DALIGN_1:
15157         case OPC_DALIGN_2:
15158         case OPC_DALIGN_3:
15159         case OPC_DALIGN_4:
15160         case OPC_DALIGN_5:
15161         case OPC_DALIGN_6:
15162         case OPC_DALIGN_7:
15163         case OPC_DBITSWAP:
15164             check_insn(ctx, ISA_MIPS_R6);
15165             decode_opc_special3_r6(env, ctx);
15166             break;
15167         default:
15168             check_insn(ctx, ISA_MIPS_R2);
15169             check_mips_64(ctx);
15170             op2 = MASK_DBSHFL(ctx->opcode);
15171             gen_bshfl(ctx, op2, rt, rd);
15172             break;
15173         }
15174         break;
15175 #endif
15176     case OPC_RDHWR:
15177         gen_rdhwr(ctx, rt, rd, extract32(ctx->opcode, 6, 3));
15178         break;
15179     case OPC_FORK:
15180         check_mt(ctx);
15181         {
15182             TCGv t0 = tcg_temp_new();
15183             TCGv t1 = tcg_temp_new();
15184 
15185             gen_load_gpr(t0, rt);
15186             gen_load_gpr(t1, rs);
15187             gen_helper_fork(t0, t1);
15188             tcg_temp_free(t0);
15189             tcg_temp_free(t1);
15190         }
15191         break;
15192     case OPC_YIELD:
15193         check_mt(ctx);
15194         {
15195             TCGv t0 = tcg_temp_new();
15196 
15197             gen_load_gpr(t0, rs);
15198             gen_helper_yield(t0, cpu_env, t0);
15199             gen_store_gpr(t0, rd);
15200             tcg_temp_free(t0);
15201         }
15202         break;
15203     default:
15204         if (ctx->insn_flags & ISA_MIPS_R6) {
15205             decode_opc_special3_r6(env, ctx);
15206         } else {
15207             decode_opc_special3_legacy(env, ctx);
15208         }
15209     }
15210 }
15211 
15212 static bool decode_opc_legacy(CPUMIPSState *env, DisasContext *ctx)
15213 {
15214     int32_t offset;
15215     int rs, rt, rd, sa;
15216     uint32_t op, op1;
15217     int16_t imm;
15218 
15219     op = MASK_OP_MAJOR(ctx->opcode);
15220     rs = (ctx->opcode >> 21) & 0x1f;
15221     rt = (ctx->opcode >> 16) & 0x1f;
15222     rd = (ctx->opcode >> 11) & 0x1f;
15223     sa = (ctx->opcode >> 6) & 0x1f;
15224     imm = (int16_t)ctx->opcode;
15225     switch (op) {
15226     case OPC_SPECIAL:
15227         decode_opc_special(env, ctx);
15228         break;
15229     case OPC_SPECIAL2:
15230 #if defined(TARGET_MIPS64)
15231         if ((ctx->insn_flags & INSN_R5900) && (ctx->insn_flags & ASE_MMI)) {
15232             decode_mmi(env, ctx);
15233             break;
15234         }
15235 #endif
15236         if (TARGET_LONG_BITS == 32 && (ctx->insn_flags & ASE_MXU)) {
15237             if (MASK_SPECIAL2(ctx->opcode) == OPC_MUL) {
15238                 gen_arith(ctx, OPC_MUL, rd, rs, rt);
15239             } else {
15240                 decode_ase_mxu(ctx, ctx->opcode);
15241             }
15242             break;
15243         }
15244         decode_opc_special2_legacy(env, ctx);
15245         break;
15246     case OPC_SPECIAL3:
15247 #if defined(TARGET_MIPS64)
15248         if (ctx->insn_flags & INSN_R5900) {
15249             decode_mmi_sq(env, ctx);    /* MMI_OPC_SQ */
15250         } else {
15251             decode_opc_special3(env, ctx);
15252         }
15253 #else
15254         decode_opc_special3(env, ctx);
15255 #endif
15256         break;
15257     case OPC_REGIMM:
15258         op1 = MASK_REGIMM(ctx->opcode);
15259         switch (op1) {
15260         case OPC_BLTZL: /* REGIMM branches */
15261         case OPC_BGEZL:
15262         case OPC_BLTZALL:
15263         case OPC_BGEZALL:
15264             check_insn(ctx, ISA_MIPS2);
15265             check_insn_opc_removed(ctx, ISA_MIPS_R6);
15266             /* Fallthrough */
15267         case OPC_BLTZ:
15268         case OPC_BGEZ:
15269             gen_compute_branch(ctx, op1, 4, rs, -1, imm << 2, 4);
15270             break;
15271         case OPC_BLTZAL:
15272         case OPC_BGEZAL:
15273             if (ctx->insn_flags & ISA_MIPS_R6) {
15274                 if (rs == 0) {
15275                     /* OPC_NAL, OPC_BAL */
15276                     gen_compute_branch(ctx, op1, 4, 0, -1, imm << 2, 4);
15277                 } else {
15278                     gen_reserved_instruction(ctx);
15279                 }
15280             } else {
15281                 gen_compute_branch(ctx, op1, 4, rs, -1, imm << 2, 4);
15282             }
15283             break;
15284         case OPC_TGEI: /* REGIMM traps */
15285         case OPC_TGEIU:
15286         case OPC_TLTI:
15287         case OPC_TLTIU:
15288         case OPC_TEQI:
15289 
15290         case OPC_TNEI:
15291             check_insn(ctx, ISA_MIPS2);
15292             check_insn_opc_removed(ctx, ISA_MIPS_R6);
15293             gen_trap(ctx, op1, rs, -1, imm);
15294             break;
15295         case OPC_SIGRIE:
15296             check_insn(ctx, ISA_MIPS_R6);
15297             gen_reserved_instruction(ctx);
15298             break;
15299         case OPC_SYNCI:
15300             check_insn(ctx, ISA_MIPS_R2);
15301             /*
15302              * Break the TB to be able to sync copied instructions
15303              * immediately.
15304              */
15305             ctx->base.is_jmp = DISAS_STOP;
15306             break;
15307         case OPC_BPOSGE32:    /* MIPS DSP branch */
15308 #if defined(TARGET_MIPS64)
15309         case OPC_BPOSGE64:
15310 #endif
15311             check_dsp(ctx);
15312             gen_compute_branch(ctx, op1, 4, -1, -2, (int32_t)imm << 2, 4);
15313             break;
15314 #if defined(TARGET_MIPS64)
15315         case OPC_DAHI:
15316             check_insn(ctx, ISA_MIPS_R6);
15317             check_mips_64(ctx);
15318             if (rs != 0) {
15319                 tcg_gen_addi_tl(cpu_gpr[rs], cpu_gpr[rs], (int64_t)imm << 32);
15320             }
15321             break;
15322         case OPC_DATI:
15323             check_insn(ctx, ISA_MIPS_R6);
15324             check_mips_64(ctx);
15325             if (rs != 0) {
15326                 tcg_gen_addi_tl(cpu_gpr[rs], cpu_gpr[rs], (int64_t)imm << 48);
15327             }
15328             break;
15329 #endif
15330         default:            /* Invalid */
15331             MIPS_INVAL("regimm");
15332             gen_reserved_instruction(ctx);
15333             break;
15334         }
15335         break;
15336     case OPC_CP0:
15337         check_cp0_enabled(ctx);
15338         op1 = MASK_CP0(ctx->opcode);
15339         switch (op1) {
15340         case OPC_MFC0:
15341         case OPC_MTC0:
15342         case OPC_MFTR:
15343         case OPC_MTTR:
15344         case OPC_MFHC0:
15345         case OPC_MTHC0:
15346 #if defined(TARGET_MIPS64)
15347         case OPC_DMFC0:
15348         case OPC_DMTC0:
15349 #endif
15350 #ifndef CONFIG_USER_ONLY
15351             gen_cp0(env, ctx, op1, rt, rd);
15352 #endif /* !CONFIG_USER_ONLY */
15353             break;
15354         case OPC_C0:
15355         case OPC_C0_1:
15356         case OPC_C0_2:
15357         case OPC_C0_3:
15358         case OPC_C0_4:
15359         case OPC_C0_5:
15360         case OPC_C0_6:
15361         case OPC_C0_7:
15362         case OPC_C0_8:
15363         case OPC_C0_9:
15364         case OPC_C0_A:
15365         case OPC_C0_B:
15366         case OPC_C0_C:
15367         case OPC_C0_D:
15368         case OPC_C0_E:
15369         case OPC_C0_F:
15370 #ifndef CONFIG_USER_ONLY
15371             gen_cp0(env, ctx, MASK_C0(ctx->opcode), rt, rd);
15372 #endif /* !CONFIG_USER_ONLY */
15373             break;
15374         case OPC_MFMC0:
15375 #ifndef CONFIG_USER_ONLY
15376             {
15377                 uint32_t op2;
15378                 TCGv t0 = tcg_temp_new();
15379 
15380                 op2 = MASK_MFMC0(ctx->opcode);
15381                 switch (op2) {
15382                 case OPC_DMT:
15383                     check_cp0_mt(ctx);
15384                     gen_helper_dmt(t0);
15385                     gen_store_gpr(t0, rt);
15386                     break;
15387                 case OPC_EMT:
15388                     check_cp0_mt(ctx);
15389                     gen_helper_emt(t0);
15390                     gen_store_gpr(t0, rt);
15391                     break;
15392                 case OPC_DVPE:
15393                     check_cp0_mt(ctx);
15394                     gen_helper_dvpe(t0, cpu_env);
15395                     gen_store_gpr(t0, rt);
15396                     break;
15397                 case OPC_EVPE:
15398                     check_cp0_mt(ctx);
15399                     gen_helper_evpe(t0, cpu_env);
15400                     gen_store_gpr(t0, rt);
15401                     break;
15402                 case OPC_DVP:
15403                     check_insn(ctx, ISA_MIPS_R6);
15404                     if (ctx->vp) {
15405                         gen_helper_dvp(t0, cpu_env);
15406                         gen_store_gpr(t0, rt);
15407                     }
15408                     break;
15409                 case OPC_EVP:
15410                     check_insn(ctx, ISA_MIPS_R6);
15411                     if (ctx->vp) {
15412                         gen_helper_evp(t0, cpu_env);
15413                         gen_store_gpr(t0, rt);
15414                     }
15415                     break;
15416                 case OPC_DI:
15417                     check_insn(ctx, ISA_MIPS_R2);
15418                     save_cpu_state(ctx, 1);
15419                     gen_helper_di(t0, cpu_env);
15420                     gen_store_gpr(t0, rt);
15421                     /*
15422                      * Stop translation as we may have switched
15423                      * the execution mode.
15424                      */
15425                     ctx->base.is_jmp = DISAS_STOP;
15426                     break;
15427                 case OPC_EI:
15428                     check_insn(ctx, ISA_MIPS_R2);
15429                     save_cpu_state(ctx, 1);
15430                     gen_helper_ei(t0, cpu_env);
15431                     gen_store_gpr(t0, rt);
15432                     /*
15433                      * DISAS_STOP isn't sufficient, we need to ensure we break
15434                      * out of translated code to check for pending interrupts.
15435                      */
15436                     gen_save_pc(ctx->base.pc_next + 4);
15437                     ctx->base.is_jmp = DISAS_EXIT;
15438                     break;
15439                 default:            /* Invalid */
15440                     MIPS_INVAL("mfmc0");
15441                     gen_reserved_instruction(ctx);
15442                     break;
15443                 }
15444                 tcg_temp_free(t0);
15445             }
15446 #endif /* !CONFIG_USER_ONLY */
15447             break;
15448         case OPC_RDPGPR:
15449             check_insn(ctx, ISA_MIPS_R2);
15450             gen_load_srsgpr(rt, rd);
15451             break;
15452         case OPC_WRPGPR:
15453             check_insn(ctx, ISA_MIPS_R2);
15454             gen_store_srsgpr(rt, rd);
15455             break;
15456         default:
15457             MIPS_INVAL("cp0");
15458             gen_reserved_instruction(ctx);
15459             break;
15460         }
15461         break;
15462     case OPC_BOVC: /* OPC_BEQZALC, OPC_BEQC, OPC_ADDI */
15463         if (ctx->insn_flags & ISA_MIPS_R6) {
15464             /* OPC_BOVC, OPC_BEQZALC, OPC_BEQC */
15465             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
15466         } else {
15467             /* OPC_ADDI */
15468             /* Arithmetic with immediate opcode */
15469             gen_arith_imm(ctx, op, rt, rs, imm);
15470         }
15471         break;
15472     case OPC_ADDIU:
15473          gen_arith_imm(ctx, op, rt, rs, imm);
15474          break;
15475     case OPC_SLTI: /* Set on less than with immediate opcode */
15476     case OPC_SLTIU:
15477          gen_slt_imm(ctx, op, rt, rs, imm);
15478          break;
15479     case OPC_ANDI: /* Arithmetic with immediate opcode */
15480     case OPC_LUI: /* OPC_AUI */
15481     case OPC_ORI:
15482     case OPC_XORI:
15483          gen_logic_imm(ctx, op, rt, rs, imm);
15484          break;
15485     case OPC_J: /* Jump */
15486     case OPC_JAL:
15487          offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
15488          gen_compute_branch(ctx, op, 4, rs, rt, offset, 4);
15489          break;
15490     /* Branch */
15491     case OPC_BLEZC: /* OPC_BGEZC, OPC_BGEC, OPC_BLEZL */
15492         if (ctx->insn_flags & ISA_MIPS_R6) {
15493             if (rt == 0) {
15494                 gen_reserved_instruction(ctx);
15495                 break;
15496             }
15497             /* OPC_BLEZC, OPC_BGEZC, OPC_BGEC */
15498             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
15499         } else {
15500             /* OPC_BLEZL */
15501             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
15502         }
15503         break;
15504     case OPC_BGTZC: /* OPC_BLTZC, OPC_BLTC, OPC_BGTZL */
15505         if (ctx->insn_flags & ISA_MIPS_R6) {
15506             if (rt == 0) {
15507                 gen_reserved_instruction(ctx);
15508                 break;
15509             }
15510             /* OPC_BGTZC, OPC_BLTZC, OPC_BLTC */
15511             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
15512         } else {
15513             /* OPC_BGTZL */
15514             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
15515         }
15516         break;
15517     case OPC_BLEZALC: /* OPC_BGEZALC, OPC_BGEUC, OPC_BLEZ */
15518         if (rt == 0) {
15519             /* OPC_BLEZ */
15520             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
15521         } else {
15522             check_insn(ctx, ISA_MIPS_R6);
15523             /* OPC_BLEZALC, OPC_BGEZALC, OPC_BGEUC */
15524             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
15525         }
15526         break;
15527     case OPC_BGTZALC: /* OPC_BLTZALC, OPC_BLTUC, OPC_BGTZ */
15528         if (rt == 0) {
15529             /* OPC_BGTZ */
15530             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
15531         } else {
15532             check_insn(ctx, ISA_MIPS_R6);
15533             /* OPC_BGTZALC, OPC_BLTZALC, OPC_BLTUC */
15534             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
15535         }
15536         break;
15537     case OPC_BEQL:
15538     case OPC_BNEL:
15539         check_insn(ctx, ISA_MIPS2);
15540          check_insn_opc_removed(ctx, ISA_MIPS_R6);
15541         /* Fallthrough */
15542     case OPC_BEQ:
15543     case OPC_BNE:
15544          gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
15545          break;
15546     case OPC_LL: /* Load and stores */
15547         check_insn(ctx, ISA_MIPS2);
15548         if (ctx->insn_flags & INSN_R5900) {
15549             check_insn_opc_user_only(ctx, INSN_R5900);
15550         }
15551         /* Fallthrough */
15552     case OPC_LWL:
15553     case OPC_LWR:
15554     case OPC_LB:
15555     case OPC_LH:
15556     case OPC_LW:
15557     case OPC_LWPC:
15558     case OPC_LBU:
15559     case OPC_LHU:
15560          gen_ld(ctx, op, rt, rs, imm);
15561          break;
15562     case OPC_SWL:
15563     case OPC_SWR:
15564     case OPC_SB:
15565     case OPC_SH:
15566     case OPC_SW:
15567          gen_st(ctx, op, rt, rs, imm);
15568          break;
15569     case OPC_SC:
15570         check_insn(ctx, ISA_MIPS2);
15571         if (ctx->insn_flags & INSN_R5900) {
15572             check_insn_opc_user_only(ctx, INSN_R5900);
15573         }
15574         gen_st_cond(ctx, rt, rs, imm, MO_TESL, false);
15575         break;
15576     case OPC_CACHE:
15577         check_cp0_enabled(ctx);
15578         check_insn(ctx, ISA_MIPS3 | ISA_MIPS_R1);
15579         if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
15580             gen_cache_operation(ctx, rt, rs, imm);
15581         }
15582         /* Treat as NOP. */
15583         break;
15584     case OPC_PREF:
15585         check_insn(ctx, ISA_MIPS4 | ISA_MIPS_R1 | INSN_R5900);
15586         /* Treat as NOP. */
15587         break;
15588 
15589     /* Floating point (COP1). */
15590     case OPC_LWC1:
15591     case OPC_LDC1:
15592     case OPC_SWC1:
15593     case OPC_SDC1:
15594         gen_cop1_ldst(ctx, op, rt, rs, imm);
15595         break;
15596 
15597     case OPC_CP1:
15598         op1 = MASK_CP1(ctx->opcode);
15599 
15600         switch (op1) {
15601         case OPC_MFHC1:
15602         case OPC_MTHC1:
15603             check_cp1_enabled(ctx);
15604             check_insn(ctx, ISA_MIPS_R2);
15605             /* fall through */
15606         case OPC_MFC1:
15607         case OPC_CFC1:
15608         case OPC_MTC1:
15609         case OPC_CTC1:
15610             check_cp1_enabled(ctx);
15611             gen_cp1(ctx, op1, rt, rd);
15612             break;
15613 #if defined(TARGET_MIPS64)
15614         case OPC_DMFC1:
15615         case OPC_DMTC1:
15616             check_cp1_enabled(ctx);
15617             check_insn(ctx, ISA_MIPS3);
15618             check_mips_64(ctx);
15619             gen_cp1(ctx, op1, rt, rd);
15620             break;
15621 #endif
15622         case OPC_BC1EQZ: /* OPC_BC1ANY2 */
15623             check_cp1_enabled(ctx);
15624             if (ctx->insn_flags & ISA_MIPS_R6) {
15625                 /* OPC_BC1EQZ */
15626                 gen_compute_branch1_r6(ctx, MASK_CP1(ctx->opcode),
15627                                        rt, imm << 2, 4);
15628             } else {
15629                 /* OPC_BC1ANY2 */
15630                 check_cop1x(ctx);
15631                 check_insn(ctx, ASE_MIPS3D);
15632                 gen_compute_branch1(ctx, MASK_BC1(ctx->opcode),
15633                                     (rt >> 2) & 0x7, imm << 2);
15634             }
15635             break;
15636         case OPC_BC1NEZ:
15637             check_cp1_enabled(ctx);
15638             check_insn(ctx, ISA_MIPS_R6);
15639             gen_compute_branch1_r6(ctx, MASK_CP1(ctx->opcode),
15640                                    rt, imm << 2, 4);
15641             break;
15642         case OPC_BC1ANY4:
15643             check_cp1_enabled(ctx);
15644             check_insn_opc_removed(ctx, ISA_MIPS_R6);
15645             check_cop1x(ctx);
15646             check_insn(ctx, ASE_MIPS3D);
15647             /* fall through */
15648         case OPC_BC1:
15649             check_cp1_enabled(ctx);
15650             check_insn_opc_removed(ctx, ISA_MIPS_R6);
15651             gen_compute_branch1(ctx, MASK_BC1(ctx->opcode),
15652                                 (rt >> 2) & 0x7, imm << 2);
15653             break;
15654         case OPC_PS_FMT:
15655             check_ps(ctx);
15656             /* fall through */
15657         case OPC_S_FMT:
15658         case OPC_D_FMT:
15659             check_cp1_enabled(ctx);
15660             gen_farith(ctx, ctx->opcode & FOP(0x3f, 0x1f), rt, rd, sa,
15661                        (imm >> 8) & 0x7);
15662             break;
15663         case OPC_W_FMT:
15664         case OPC_L_FMT:
15665         {
15666             int r6_op = ctx->opcode & FOP(0x3f, 0x1f);
15667             check_cp1_enabled(ctx);
15668             if (ctx->insn_flags & ISA_MIPS_R6) {
15669                 switch (r6_op) {
15670                 case R6_OPC_CMP_AF_S:
15671                 case R6_OPC_CMP_UN_S:
15672                 case R6_OPC_CMP_EQ_S:
15673                 case R6_OPC_CMP_UEQ_S:
15674                 case R6_OPC_CMP_LT_S:
15675                 case R6_OPC_CMP_ULT_S:
15676                 case R6_OPC_CMP_LE_S:
15677                 case R6_OPC_CMP_ULE_S:
15678                 case R6_OPC_CMP_SAF_S:
15679                 case R6_OPC_CMP_SUN_S:
15680                 case R6_OPC_CMP_SEQ_S:
15681                 case R6_OPC_CMP_SEUQ_S:
15682                 case R6_OPC_CMP_SLT_S:
15683                 case R6_OPC_CMP_SULT_S:
15684                 case R6_OPC_CMP_SLE_S:
15685                 case R6_OPC_CMP_SULE_S:
15686                 case R6_OPC_CMP_OR_S:
15687                 case R6_OPC_CMP_UNE_S:
15688                 case R6_OPC_CMP_NE_S:
15689                 case R6_OPC_CMP_SOR_S:
15690                 case R6_OPC_CMP_SUNE_S:
15691                 case R6_OPC_CMP_SNE_S:
15692                     gen_r6_cmp_s(ctx, ctx->opcode & 0x1f, rt, rd, sa);
15693                     break;
15694                 case R6_OPC_CMP_AF_D:
15695                 case R6_OPC_CMP_UN_D:
15696                 case R6_OPC_CMP_EQ_D:
15697                 case R6_OPC_CMP_UEQ_D:
15698                 case R6_OPC_CMP_LT_D:
15699                 case R6_OPC_CMP_ULT_D:
15700                 case R6_OPC_CMP_LE_D:
15701                 case R6_OPC_CMP_ULE_D:
15702                 case R6_OPC_CMP_SAF_D:
15703                 case R6_OPC_CMP_SUN_D:
15704                 case R6_OPC_CMP_SEQ_D:
15705                 case R6_OPC_CMP_SEUQ_D:
15706                 case R6_OPC_CMP_SLT_D:
15707                 case R6_OPC_CMP_SULT_D:
15708                 case R6_OPC_CMP_SLE_D:
15709                 case R6_OPC_CMP_SULE_D:
15710                 case R6_OPC_CMP_OR_D:
15711                 case R6_OPC_CMP_UNE_D:
15712                 case R6_OPC_CMP_NE_D:
15713                 case R6_OPC_CMP_SOR_D:
15714                 case R6_OPC_CMP_SUNE_D:
15715                 case R6_OPC_CMP_SNE_D:
15716                     gen_r6_cmp_d(ctx, ctx->opcode & 0x1f, rt, rd, sa);
15717                     break;
15718                 default:
15719                     gen_farith(ctx, ctx->opcode & FOP(0x3f, 0x1f),
15720                                rt, rd, sa, (imm >> 8) & 0x7);
15721 
15722                     break;
15723                 }
15724             } else {
15725                 gen_farith(ctx, ctx->opcode & FOP(0x3f, 0x1f), rt, rd, sa,
15726                            (imm >> 8) & 0x7);
15727             }
15728             break;
15729         }
15730         default:
15731             MIPS_INVAL("cp1");
15732             gen_reserved_instruction(ctx);
15733             break;
15734         }
15735         break;
15736 
15737     /* Compact branches [R6] and COP2 [non-R6] */
15738     case OPC_BC: /* OPC_LWC2 */
15739     case OPC_BALC: /* OPC_SWC2 */
15740         if (ctx->insn_flags & ISA_MIPS_R6) {
15741             /* OPC_BC, OPC_BALC */
15742             gen_compute_compact_branch(ctx, op, 0, 0,
15743                                        sextract32(ctx->opcode << 2, 0, 28));
15744         } else if (ctx->insn_flags & ASE_LEXT) {
15745             gen_loongson_lswc2(ctx, rt, rs, rd);
15746         } else {
15747             /* OPC_LWC2, OPC_SWC2 */
15748             /* COP2: Not implemented. */
15749             generate_exception_err(ctx, EXCP_CpU, 2);
15750         }
15751         break;
15752     case OPC_BEQZC: /* OPC_JIC, OPC_LDC2 */
15753     case OPC_BNEZC: /* OPC_JIALC, OPC_SDC2 */
15754         if (ctx->insn_flags & ISA_MIPS_R6) {
15755             if (rs != 0) {
15756                 /* OPC_BEQZC, OPC_BNEZC */
15757                 gen_compute_compact_branch(ctx, op, rs, 0,
15758                                            sextract32(ctx->opcode << 2, 0, 23));
15759             } else {
15760                 /* OPC_JIC, OPC_JIALC */
15761                 gen_compute_compact_branch(ctx, op, 0, rt, imm);
15762             }
15763         } else if (ctx->insn_flags & ASE_LEXT) {
15764             gen_loongson_lsdc2(ctx, rt, rs, rd);
15765         } else {
15766             /* OPC_LWC2, OPC_SWC2 */
15767             /* COP2: Not implemented. */
15768             generate_exception_err(ctx, EXCP_CpU, 2);
15769         }
15770         break;
15771     case OPC_CP2:
15772         check_insn(ctx, ASE_LMMI);
15773         /* Note that these instructions use different fields.  */
15774         gen_loongson_multimedia(ctx, sa, rd, rt);
15775         break;
15776 
15777     case OPC_CP3:
15778         if (ctx->CP0_Config1 & (1 << CP0C1_FP)) {
15779             check_cp1_enabled(ctx);
15780             op1 = MASK_CP3(ctx->opcode);
15781             switch (op1) {
15782             case OPC_LUXC1:
15783             case OPC_SUXC1:
15784                 check_insn(ctx, ISA_MIPS5 | ISA_MIPS_R2);
15785                 /* Fallthrough */
15786             case OPC_LWXC1:
15787             case OPC_LDXC1:
15788             case OPC_SWXC1:
15789             case OPC_SDXC1:
15790                 check_insn(ctx, ISA_MIPS4 | ISA_MIPS_R2);
15791                 gen_flt3_ldst(ctx, op1, sa, rd, rs, rt);
15792                 break;
15793             case OPC_PREFX:
15794                 check_insn(ctx, ISA_MIPS4 | ISA_MIPS_R2);
15795                 /* Treat as NOP. */
15796                 break;
15797             case OPC_ALNV_PS:
15798                 check_insn(ctx, ISA_MIPS5 | ISA_MIPS_R2);
15799                 /* Fallthrough */
15800             case OPC_MADD_S:
15801             case OPC_MADD_D:
15802             case OPC_MADD_PS:
15803             case OPC_MSUB_S:
15804             case OPC_MSUB_D:
15805             case OPC_MSUB_PS:
15806             case OPC_NMADD_S:
15807             case OPC_NMADD_D:
15808             case OPC_NMADD_PS:
15809             case OPC_NMSUB_S:
15810             case OPC_NMSUB_D:
15811             case OPC_NMSUB_PS:
15812                 check_insn(ctx, ISA_MIPS4 | ISA_MIPS_R2);
15813                 gen_flt3_arith(ctx, op1, sa, rs, rd, rt);
15814                 break;
15815             default:
15816                 MIPS_INVAL("cp3");
15817                 gen_reserved_instruction(ctx);
15818                 break;
15819             }
15820         } else {
15821             generate_exception_err(ctx, EXCP_CpU, 1);
15822         }
15823         break;
15824 
15825 #if defined(TARGET_MIPS64)
15826     /* MIPS64 opcodes */
15827     case OPC_LLD:
15828         if (ctx->insn_flags & INSN_R5900) {
15829             check_insn_opc_user_only(ctx, INSN_R5900);
15830         }
15831         /* fall through */
15832     case OPC_LDL:
15833     case OPC_LDR:
15834     case OPC_LWU:
15835     case OPC_LD:
15836         check_insn(ctx, ISA_MIPS3);
15837         check_mips_64(ctx);
15838         gen_ld(ctx, op, rt, rs, imm);
15839         break;
15840     case OPC_SDL:
15841     case OPC_SDR:
15842     case OPC_SD:
15843         check_insn(ctx, ISA_MIPS3);
15844         check_mips_64(ctx);
15845         gen_st(ctx, op, rt, rs, imm);
15846         break;
15847     case OPC_SCD:
15848         check_insn(ctx, ISA_MIPS3);
15849         if (ctx->insn_flags & INSN_R5900) {
15850             check_insn_opc_user_only(ctx, INSN_R5900);
15851         }
15852         check_mips_64(ctx);
15853         gen_st_cond(ctx, rt, rs, imm, MO_TEQ, false);
15854         break;
15855     case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC, OPC_DADDI */
15856         if (ctx->insn_flags & ISA_MIPS_R6) {
15857             /* OPC_BNVC, OPC_BNEZALC, OPC_BNEC */
15858             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
15859         } else {
15860             /* OPC_DADDI */
15861             check_insn(ctx, ISA_MIPS3);
15862             check_mips_64(ctx);
15863             gen_arith_imm(ctx, op, rt, rs, imm);
15864         }
15865         break;
15866     case OPC_DADDIU:
15867         check_insn(ctx, ISA_MIPS3);
15868         check_mips_64(ctx);
15869         gen_arith_imm(ctx, op, rt, rs, imm);
15870         break;
15871 #else
15872     case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC */
15873         if (ctx->insn_flags & ISA_MIPS_R6) {
15874             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
15875         } else {
15876             MIPS_INVAL("major opcode");
15877             gen_reserved_instruction(ctx);
15878         }
15879         break;
15880 #endif
15881     case OPC_DAUI: /* OPC_JALX */
15882         if (ctx->insn_flags & ISA_MIPS_R6) {
15883 #if defined(TARGET_MIPS64)
15884             /* OPC_DAUI */
15885             check_mips_64(ctx);
15886             if (rs == 0) {
15887                 generate_exception(ctx, EXCP_RI);
15888             } else if (rt != 0) {
15889                 TCGv t0 = tcg_temp_new();
15890                 gen_load_gpr(t0, rs);
15891                 tcg_gen_addi_tl(cpu_gpr[rt], t0, imm << 16);
15892                 tcg_temp_free(t0);
15893             }
15894 #else
15895             gen_reserved_instruction(ctx);
15896             MIPS_INVAL("major opcode");
15897 #endif
15898         } else {
15899             /* OPC_JALX */
15900             check_insn(ctx, ASE_MIPS16 | ASE_MICROMIPS);
15901             offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
15902             gen_compute_branch(ctx, op, 4, rs, rt, offset, 4);
15903         }
15904         break;
15905     case OPC_MDMX:
15906         /* MDMX: Not implemented. */
15907         break;
15908     case OPC_PCREL:
15909         check_insn(ctx, ISA_MIPS_R6);
15910         gen_pcrel(ctx, ctx->opcode, ctx->base.pc_next, rs);
15911         break;
15912     default:            /* Invalid */
15913         MIPS_INVAL("major opcode");
15914         return false;
15915     }
15916     return true;
15917 }
15918 
15919 static void decode_opc(CPUMIPSState *env, DisasContext *ctx)
15920 {
15921     /* make sure instructions are on a word boundary */
15922     if (ctx->base.pc_next & 0x3) {
15923         env->CP0_BadVAddr = ctx->base.pc_next;
15924         generate_exception_err(ctx, EXCP_AdEL, EXCP_INST_NOTAVAIL);
15925         return;
15926     }
15927 
15928     /* Handle blikely not taken case */
15929     if ((ctx->hflags & MIPS_HFLAG_BMASK_BASE) == MIPS_HFLAG_BL) {
15930         TCGLabel *l1 = gen_new_label();
15931 
15932         tcg_gen_brcondi_tl(TCG_COND_NE, bcond, 0, l1);
15933         tcg_gen_movi_i32(hflags, ctx->hflags & ~MIPS_HFLAG_BMASK);
15934         gen_goto_tb(ctx, 1, ctx->base.pc_next + 4);
15935         gen_set_label(l1);
15936     }
15937 
15938     /* Transition to the auto-generated decoder.  */
15939 
15940     /* Vendor specific extensions */
15941     if (cpu_supports_isa(env, INSN_R5900) && decode_ext_txx9(ctx, ctx->opcode)) {
15942         return;
15943     }
15944     if (cpu_supports_isa(env, INSN_VR54XX) && decode_ext_vr54xx(ctx, ctx->opcode)) {
15945         return;
15946     }
15947 
15948     /* ISA extensions */
15949     if (ase_msa_available(env) && decode_ase_msa(ctx, ctx->opcode)) {
15950         return;
15951     }
15952 
15953     /* ISA (from latest to oldest) */
15954     if (cpu_supports_isa(env, ISA_MIPS_R6) && decode_isa_rel6(ctx, ctx->opcode)) {
15955         return;
15956     }
15957 
15958     if (decode_opc_legacy(env, ctx)) {
15959         return;
15960     }
15961 
15962     gen_reserved_instruction(ctx);
15963 }
15964 
15965 static void mips_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
15966 {
15967     DisasContext *ctx = container_of(dcbase, DisasContext, base);
15968     CPUMIPSState *env = cs->env_ptr;
15969 
15970     ctx->page_start = ctx->base.pc_first & TARGET_PAGE_MASK;
15971     ctx->saved_pc = -1;
15972     ctx->insn_flags = env->insn_flags;
15973     ctx->CP0_Config0 = env->CP0_Config0;
15974     ctx->CP0_Config1 = env->CP0_Config1;
15975     ctx->CP0_Config2 = env->CP0_Config2;
15976     ctx->CP0_Config3 = env->CP0_Config3;
15977     ctx->CP0_Config5 = env->CP0_Config5;
15978     ctx->btarget = 0;
15979     ctx->kscrexist = (env->CP0_Config4 >> CP0C4_KScrExist) & 0xff;
15980     ctx->rxi = (env->CP0_Config3 >> CP0C3_RXI) & 1;
15981     ctx->ie = (env->CP0_Config4 >> CP0C4_IE) & 3;
15982     ctx->bi = (env->CP0_Config3 >> CP0C3_BI) & 1;
15983     ctx->bp = (env->CP0_Config3 >> CP0C3_BP) & 1;
15984     ctx->PAMask = env->PAMask;
15985     ctx->mvh = (env->CP0_Config5 >> CP0C5_MVH) & 1;
15986     ctx->eva = (env->CP0_Config5 >> CP0C5_EVA) & 1;
15987     ctx->sc = (env->CP0_Config3 >> CP0C3_SC) & 1;
15988     ctx->CP0_LLAddr_shift = env->CP0_LLAddr_shift;
15989     ctx->cmgcr = (env->CP0_Config3 >> CP0C3_CMGCR) & 1;
15990     /* Restore delay slot state from the tb context.  */
15991     ctx->hflags = (uint32_t)ctx->base.tb->flags; /* FIXME: maybe use 64 bits? */
15992     ctx->ulri = (env->CP0_Config3 >> CP0C3_ULRI) & 1;
15993     ctx->ps = ((env->active_fpu.fcr0 >> FCR0_PS) & 1) ||
15994              (env->insn_flags & (INSN_LOONGSON2E | INSN_LOONGSON2F));
15995     ctx->vp = (env->CP0_Config5 >> CP0C5_VP) & 1;
15996     ctx->mrp = (env->CP0_Config5 >> CP0C5_MRP) & 1;
15997     ctx->nan2008 = (env->active_fpu.fcr31 >> FCR31_NAN2008) & 1;
15998     ctx->abs2008 = (env->active_fpu.fcr31 >> FCR31_ABS2008) & 1;
15999     ctx->mi = (env->CP0_Config5 >> CP0C5_MI) & 1;
16000     ctx->gi = (env->CP0_Config5 >> CP0C5_GI) & 3;
16001     restore_cpu_state(env, ctx);
16002 #ifdef CONFIG_USER_ONLY
16003         ctx->mem_idx = MIPS_HFLAG_UM;
16004 #else
16005         ctx->mem_idx = hflags_mmu_index(ctx->hflags);
16006 #endif
16007     ctx->default_tcg_memop_mask = (ctx->insn_flags & (ISA_MIPS_R6 |
16008                                   INSN_LOONGSON3A)) ? MO_UNALN : MO_ALIGN;
16009 
16010     /*
16011      * Execute a branch and its delay slot as a single instruction.
16012      * This is what GDB expects and is consistent with what the
16013      * hardware does (e.g. if a delay slot instruction faults, the
16014      * reported PC is the PC of the branch).
16015      */
16016     if (ctx->base.singlestep_enabled && (ctx->hflags & MIPS_HFLAG_BMASK)) {
16017         ctx->base.max_insns = 2;
16018     }
16019 
16020     LOG_DISAS("\ntb %p idx %d hflags %04x\n", ctx->base.tb, ctx->mem_idx,
16021               ctx->hflags);
16022 }
16023 
16024 static void mips_tr_tb_start(DisasContextBase *dcbase, CPUState *cs)
16025 {
16026 }
16027 
16028 static void mips_tr_insn_start(DisasContextBase *dcbase, CPUState *cs)
16029 {
16030     DisasContext *ctx = container_of(dcbase, DisasContext, base);
16031 
16032     tcg_gen_insn_start(ctx->base.pc_next, ctx->hflags & MIPS_HFLAG_BMASK,
16033                        ctx->btarget);
16034 }
16035 
16036 static void mips_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs)
16037 {
16038     CPUMIPSState *env = cs->env_ptr;
16039     DisasContext *ctx = container_of(dcbase, DisasContext, base);
16040     int insn_bytes;
16041     int is_slot;
16042 
16043     is_slot = ctx->hflags & MIPS_HFLAG_BMASK;
16044     if (ctx->insn_flags & ISA_NANOMIPS32) {
16045         ctx->opcode = translator_lduw(env, &ctx->base, ctx->base.pc_next);
16046         insn_bytes = decode_isa_nanomips(env, ctx);
16047     } else if (!(ctx->hflags & MIPS_HFLAG_M16)) {
16048         ctx->opcode = translator_ldl(env, &ctx->base, ctx->base.pc_next);
16049         insn_bytes = 4;
16050         decode_opc(env, ctx);
16051     } else if (ctx->insn_flags & ASE_MICROMIPS) {
16052         ctx->opcode = translator_lduw(env, &ctx->base, ctx->base.pc_next);
16053         insn_bytes = decode_isa_micromips(env, ctx);
16054     } else if (ctx->insn_flags & ASE_MIPS16) {
16055         ctx->opcode = translator_lduw(env, &ctx->base, ctx->base.pc_next);
16056         insn_bytes = decode_ase_mips16e(env, ctx);
16057     } else {
16058         gen_reserved_instruction(ctx);
16059         g_assert(ctx->base.is_jmp == DISAS_NORETURN);
16060         return;
16061     }
16062 
16063     if (ctx->hflags & MIPS_HFLAG_BMASK) {
16064         if (!(ctx->hflags & (MIPS_HFLAG_BDS16 | MIPS_HFLAG_BDS32 |
16065                              MIPS_HFLAG_FBNSLOT))) {
16066             /*
16067              * Force to generate branch as there is neither delay nor
16068              * forbidden slot.
16069              */
16070             is_slot = 1;
16071         }
16072         if ((ctx->hflags & MIPS_HFLAG_M16) &&
16073             (ctx->hflags & MIPS_HFLAG_FBNSLOT)) {
16074             /*
16075              * Force to generate branch as microMIPS R6 doesn't restrict
16076              * branches in the forbidden slot.
16077              */
16078             is_slot = 1;
16079         }
16080     }
16081     if (is_slot) {
16082         gen_branch(ctx, insn_bytes);
16083     }
16084     ctx->base.pc_next += insn_bytes;
16085 
16086     if (ctx->base.is_jmp != DISAS_NEXT) {
16087         return;
16088     }
16089 
16090     /*
16091      * End the TB on (most) page crossings.
16092      * See mips_tr_init_disas_context about single-stepping a branch
16093      * together with its delay slot.
16094      */
16095     if (ctx->base.pc_next - ctx->page_start >= TARGET_PAGE_SIZE
16096         && !ctx->base.singlestep_enabled) {
16097         ctx->base.is_jmp = DISAS_TOO_MANY;
16098     }
16099 }
16100 
16101 static void mips_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
16102 {
16103     DisasContext *ctx = container_of(dcbase, DisasContext, base);
16104 
16105     switch (ctx->base.is_jmp) {
16106     case DISAS_STOP:
16107         gen_save_pc(ctx->base.pc_next);
16108         tcg_gen_lookup_and_goto_ptr();
16109         break;
16110     case DISAS_NEXT:
16111     case DISAS_TOO_MANY:
16112         save_cpu_state(ctx, 0);
16113         gen_goto_tb(ctx, 0, ctx->base.pc_next);
16114         break;
16115     case DISAS_EXIT:
16116         tcg_gen_exit_tb(NULL, 0);
16117         break;
16118     case DISAS_NORETURN:
16119         break;
16120     default:
16121         g_assert_not_reached();
16122     }
16123 }
16124 
16125 static void mips_tr_disas_log(const DisasContextBase *dcbase, CPUState *cs)
16126 {
16127     qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first));
16128     log_target_disas(cs, dcbase->pc_first, dcbase->tb->size);
16129 }
16130 
16131 static const TranslatorOps mips_tr_ops = {
16132     .init_disas_context = mips_tr_init_disas_context,
16133     .tb_start           = mips_tr_tb_start,
16134     .insn_start         = mips_tr_insn_start,
16135     .translate_insn     = mips_tr_translate_insn,
16136     .tb_stop            = mips_tr_tb_stop,
16137     .disas_log          = mips_tr_disas_log,
16138 };
16139 
16140 void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns)
16141 {
16142     DisasContext ctx;
16143 
16144     translator_loop(&mips_tr_ops, &ctx.base, cs, tb, max_insns);
16145 }
16146 
16147 void mips_tcg_init(void)
16148 {
16149     int i;
16150 
16151     cpu_gpr[0] = NULL;
16152     for (i = 1; i < 32; i++)
16153         cpu_gpr[i] = tcg_global_mem_new(cpu_env,
16154                                         offsetof(CPUMIPSState,
16155                                                  active_tc.gpr[i]),
16156                                         regnames[i]);
16157 #if defined(TARGET_MIPS64)
16158     cpu_gpr_hi[0] = NULL;
16159 
16160     for (unsigned i = 1; i < 32; i++) {
16161         g_autofree char *rname = g_strdup_printf("%s[hi]", regnames[i]);
16162 
16163         cpu_gpr_hi[i] = tcg_global_mem_new_i64(cpu_env,
16164                                                offsetof(CPUMIPSState,
16165                                                         active_tc.gpr_hi[i]),
16166                                                rname);
16167     }
16168 #endif /* !TARGET_MIPS64 */
16169     for (i = 0; i < 32; i++) {
16170         int off = offsetof(CPUMIPSState, active_fpu.fpr[i].wr.d[0]);
16171 
16172         fpu_f64[i] = tcg_global_mem_new_i64(cpu_env, off, fregnames[i]);
16173     }
16174     msa_translate_init();
16175     cpu_PC = tcg_global_mem_new(cpu_env,
16176                                 offsetof(CPUMIPSState, active_tc.PC), "PC");
16177     for (i = 0; i < MIPS_DSP_ACC; i++) {
16178         cpu_HI[i] = tcg_global_mem_new(cpu_env,
16179                                        offsetof(CPUMIPSState, active_tc.HI[i]),
16180                                        regnames_HI[i]);
16181         cpu_LO[i] = tcg_global_mem_new(cpu_env,
16182                                        offsetof(CPUMIPSState, active_tc.LO[i]),
16183                                        regnames_LO[i]);
16184     }
16185     cpu_dspctrl = tcg_global_mem_new(cpu_env,
16186                                      offsetof(CPUMIPSState,
16187                                               active_tc.DSPControl),
16188                                      "DSPControl");
16189     bcond = tcg_global_mem_new(cpu_env,
16190                                offsetof(CPUMIPSState, bcond), "bcond");
16191     btarget = tcg_global_mem_new(cpu_env,
16192                                  offsetof(CPUMIPSState, btarget), "btarget");
16193     hflags = tcg_global_mem_new_i32(cpu_env,
16194                                     offsetof(CPUMIPSState, hflags), "hflags");
16195 
16196     fpu_fcr0 = tcg_global_mem_new_i32(cpu_env,
16197                                       offsetof(CPUMIPSState, active_fpu.fcr0),
16198                                       "fcr0");
16199     fpu_fcr31 = tcg_global_mem_new_i32(cpu_env,
16200                                        offsetof(CPUMIPSState, active_fpu.fcr31),
16201                                        "fcr31");
16202     cpu_lladdr = tcg_global_mem_new(cpu_env, offsetof(CPUMIPSState, lladdr),
16203                                     "lladdr");
16204     cpu_llval = tcg_global_mem_new(cpu_env, offsetof(CPUMIPSState, llval),
16205                                    "llval");
16206 
16207     if (TARGET_LONG_BITS == 32) {
16208         mxu_translate_init();
16209     }
16210 }
16211 
16212 void restore_state_to_opc(CPUMIPSState *env, TranslationBlock *tb,
16213                           target_ulong *data)
16214 {
16215     env->active_tc.PC = data[0];
16216     env->hflags &= ~MIPS_HFLAG_BMASK;
16217     env->hflags |= data[1];
16218     switch (env->hflags & MIPS_HFLAG_BMASK_BASE) {
16219     case MIPS_HFLAG_BR:
16220         break;
16221     case MIPS_HFLAG_BC:
16222     case MIPS_HFLAG_BL:
16223     case MIPS_HFLAG_B:
16224         env->btarget = data[2];
16225         break;
16226     }
16227 }
16228