xref: /openbmc/qemu/target/mips/tcg/translate.c (revision e3bcf57c1a3c498fe7bd1f18744614a802d8859a)
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 "trace-tcg.h"
36 #include "exec/translator.h"
37 #include "exec/log.h"
38 #include "qemu/qemu-print.h"
39 #include "fpu_helper.h"
40 #include "translate.h"
41 
42 /*
43  * Many sysemu-only helpers are not reachable for user-only.
44  * Define stub generators here, so that we need not either sprinkle
45  * ifdefs through the translator, nor provide the helper function.
46  */
47 #define STUB_HELPER(NAME, ...) \
48     static inline void gen_helper_##NAME(__VA_ARGS__) \
49     { g_assert_not_reached(); }
50 
51 #ifdef CONFIG_USER_ONLY
52 STUB_HELPER(cache, TCGv_env env, TCGv val, TCGv_i32 reg)
53 #endif
54 
55 enum {
56     /* indirect opcode tables */
57     OPC_SPECIAL  = (0x00 << 26),
58     OPC_REGIMM   = (0x01 << 26),
59     OPC_CP0      = (0x10 << 26),
60     OPC_CP2      = (0x12 << 26),
61     OPC_CP3      = (0x13 << 26),
62     OPC_SPECIAL2 = (0x1C << 26),
63     OPC_SPECIAL3 = (0x1F << 26),
64     /* arithmetic with immediate */
65     OPC_ADDI     = (0x08 << 26),
66     OPC_ADDIU    = (0x09 << 26),
67     OPC_SLTI     = (0x0A << 26),
68     OPC_SLTIU    = (0x0B << 26),
69     /* logic with immediate */
70     OPC_ANDI     = (0x0C << 26),
71     OPC_ORI      = (0x0D << 26),
72     OPC_XORI     = (0x0E << 26),
73     OPC_LUI      = (0x0F << 26),
74     /* arithmetic with immediate */
75     OPC_DADDI    = (0x18 << 26),
76     OPC_DADDIU   = (0x19 << 26),
77     /* Jump and branches */
78     OPC_J        = (0x02 << 26),
79     OPC_JAL      = (0x03 << 26),
80     OPC_BEQ      = (0x04 << 26),  /* Unconditional if rs = rt = 0 (B) */
81     OPC_BEQL     = (0x14 << 26),
82     OPC_BNE      = (0x05 << 26),
83     OPC_BNEL     = (0x15 << 26),
84     OPC_BLEZ     = (0x06 << 26),
85     OPC_BLEZL    = (0x16 << 26),
86     OPC_BGTZ     = (0x07 << 26),
87     OPC_BGTZL    = (0x17 << 26),
88     OPC_JALX     = (0x1D << 26),
89     OPC_DAUI     = (0x1D << 26),
90     /* Load and stores */
91     OPC_LDL      = (0x1A << 26),
92     OPC_LDR      = (0x1B << 26),
93     OPC_LB       = (0x20 << 26),
94     OPC_LH       = (0x21 << 26),
95     OPC_LWL      = (0x22 << 26),
96     OPC_LW       = (0x23 << 26),
97     OPC_LWPC     = OPC_LW | 0x5,
98     OPC_LBU      = (0x24 << 26),
99     OPC_LHU      = (0x25 << 26),
100     OPC_LWR      = (0x26 << 26),
101     OPC_LWU      = (0x27 << 26),
102     OPC_SB       = (0x28 << 26),
103     OPC_SH       = (0x29 << 26),
104     OPC_SWL      = (0x2A << 26),
105     OPC_SW       = (0x2B << 26),
106     OPC_SDL      = (0x2C << 26),
107     OPC_SDR      = (0x2D << 26),
108     OPC_SWR      = (0x2E << 26),
109     OPC_LL       = (0x30 << 26),
110     OPC_LLD      = (0x34 << 26),
111     OPC_LD       = (0x37 << 26),
112     OPC_LDPC     = OPC_LD | 0x5,
113     OPC_SC       = (0x38 << 26),
114     OPC_SCD      = (0x3C << 26),
115     OPC_SD       = (0x3F << 26),
116     /* Floating point load/store */
117     OPC_LWC1     = (0x31 << 26),
118     OPC_LWC2     = (0x32 << 26),
119     OPC_LDC1     = (0x35 << 26),
120     OPC_LDC2     = (0x36 << 26),
121     OPC_SWC1     = (0x39 << 26),
122     OPC_SWC2     = (0x3A << 26),
123     OPC_SDC1     = (0x3D << 26),
124     OPC_SDC2     = (0x3E << 26),
125     /* Compact Branches */
126     OPC_BLEZALC  = (0x06 << 26),
127     OPC_BGEZALC  = (0x06 << 26),
128     OPC_BGEUC    = (0x06 << 26),
129     OPC_BGTZALC  = (0x07 << 26),
130     OPC_BLTZALC  = (0x07 << 26),
131     OPC_BLTUC    = (0x07 << 26),
132     OPC_BOVC     = (0x08 << 26),
133     OPC_BEQZALC  = (0x08 << 26),
134     OPC_BEQC     = (0x08 << 26),
135     OPC_BLEZC    = (0x16 << 26),
136     OPC_BGEZC    = (0x16 << 26),
137     OPC_BGEC     = (0x16 << 26),
138     OPC_BGTZC    = (0x17 << 26),
139     OPC_BLTZC    = (0x17 << 26),
140     OPC_BLTC     = (0x17 << 26),
141     OPC_BNVC     = (0x18 << 26),
142     OPC_BNEZALC  = (0x18 << 26),
143     OPC_BNEC     = (0x18 << 26),
144     OPC_BC       = (0x32 << 26),
145     OPC_BEQZC    = (0x36 << 26),
146     OPC_JIC      = (0x36 << 26),
147     OPC_BALC     = (0x3A << 26),
148     OPC_BNEZC    = (0x3E << 26),
149     OPC_JIALC    = (0x3E << 26),
150     /* MDMX ASE specific */
151     OPC_MDMX     = (0x1E << 26),
152     /* Cache and prefetch */
153     OPC_CACHE    = (0x2F << 26),
154     OPC_PREF     = (0x33 << 26),
155     /* PC-relative address computation / loads */
156     OPC_PCREL    = (0x3B << 26),
157 };
158 
159 /* PC-relative address computation / loads  */
160 #define MASK_OPC_PCREL_TOP2BITS(op) (MASK_OP_MAJOR(op) | (op & (3 << 19)))
161 #define MASK_OPC_PCREL_TOP5BITS(op) (MASK_OP_MAJOR(op) | (op & (0x1f << 16)))
162 enum {
163     /* Instructions determined by bits 19 and 20 */
164     OPC_ADDIUPC = OPC_PCREL | (0 << 19),
165     R6_OPC_LWPC = OPC_PCREL | (1 << 19),
166     OPC_LWUPC   = OPC_PCREL | (2 << 19),
167 
168     /* Instructions determined by bits 16 ... 20 */
169     OPC_AUIPC   = OPC_PCREL | (0x1e << 16),
170     OPC_ALUIPC  = OPC_PCREL | (0x1f << 16),
171 
172     /* Other */
173     R6_OPC_LDPC = OPC_PCREL | (6 << 18),
174 };
175 
176 /* MIPS special opcodes */
177 #define MASK_SPECIAL(op)            (MASK_OP_MAJOR(op) | (op & 0x3F))
178 
179 enum {
180     /* Shifts */
181     OPC_SLL      = 0x00 | OPC_SPECIAL,
182     /* NOP is SLL r0, r0, 0   */
183     /* SSNOP is SLL r0, r0, 1 */
184     /* EHB is SLL r0, r0, 3 */
185     OPC_SRL      = 0x02 | OPC_SPECIAL, /* also ROTR */
186     OPC_ROTR     = OPC_SRL | (1 << 21),
187     OPC_SRA      = 0x03 | OPC_SPECIAL,
188     OPC_SLLV     = 0x04 | OPC_SPECIAL,
189     OPC_SRLV     = 0x06 | OPC_SPECIAL, /* also ROTRV */
190     OPC_ROTRV    = OPC_SRLV | (1 << 6),
191     OPC_SRAV     = 0x07 | OPC_SPECIAL,
192     OPC_DSLLV    = 0x14 | OPC_SPECIAL,
193     OPC_DSRLV    = 0x16 | OPC_SPECIAL, /* also DROTRV */
194     OPC_DROTRV   = OPC_DSRLV | (1 << 6),
195     OPC_DSRAV    = 0x17 | OPC_SPECIAL,
196     OPC_DSLL     = 0x38 | OPC_SPECIAL,
197     OPC_DSRL     = 0x3A | OPC_SPECIAL, /* also DROTR */
198     OPC_DROTR    = OPC_DSRL | (1 << 21),
199     OPC_DSRA     = 0x3B | OPC_SPECIAL,
200     OPC_DSLL32   = 0x3C | OPC_SPECIAL,
201     OPC_DSRL32   = 0x3E | OPC_SPECIAL, /* also DROTR32 */
202     OPC_DROTR32  = OPC_DSRL32 | (1 << 21),
203     OPC_DSRA32   = 0x3F | OPC_SPECIAL,
204     /* Multiplication / division */
205     OPC_MULT     = 0x18 | OPC_SPECIAL,
206     OPC_MULTU    = 0x19 | OPC_SPECIAL,
207     OPC_DIV      = 0x1A | OPC_SPECIAL,
208     OPC_DIVU     = 0x1B | OPC_SPECIAL,
209     OPC_DMULT    = 0x1C | OPC_SPECIAL,
210     OPC_DMULTU   = 0x1D | OPC_SPECIAL,
211     OPC_DDIV     = 0x1E | OPC_SPECIAL,
212     OPC_DDIVU    = 0x1F | OPC_SPECIAL,
213 
214     /* 2 registers arithmetic / logic */
215     OPC_ADD      = 0x20 | OPC_SPECIAL,
216     OPC_ADDU     = 0x21 | OPC_SPECIAL,
217     OPC_SUB      = 0x22 | OPC_SPECIAL,
218     OPC_SUBU     = 0x23 | OPC_SPECIAL,
219     OPC_AND      = 0x24 | OPC_SPECIAL,
220     OPC_OR       = 0x25 | OPC_SPECIAL,
221     OPC_XOR      = 0x26 | OPC_SPECIAL,
222     OPC_NOR      = 0x27 | OPC_SPECIAL,
223     OPC_SLT      = 0x2A | OPC_SPECIAL,
224     OPC_SLTU     = 0x2B | OPC_SPECIAL,
225     OPC_DADD     = 0x2C | OPC_SPECIAL,
226     OPC_DADDU    = 0x2D | OPC_SPECIAL,
227     OPC_DSUB     = 0x2E | OPC_SPECIAL,
228     OPC_DSUBU    = 0x2F | OPC_SPECIAL,
229     /* Jumps */
230     OPC_JR       = 0x08 | OPC_SPECIAL, /* Also JR.HB */
231     OPC_JALR     = 0x09 | OPC_SPECIAL, /* Also JALR.HB */
232     /* Traps */
233     OPC_TGE      = 0x30 | OPC_SPECIAL,
234     OPC_TGEU     = 0x31 | OPC_SPECIAL,
235     OPC_TLT      = 0x32 | OPC_SPECIAL,
236     OPC_TLTU     = 0x33 | OPC_SPECIAL,
237     OPC_TEQ      = 0x34 | OPC_SPECIAL,
238     OPC_TNE      = 0x36 | OPC_SPECIAL,
239     /* HI / LO registers load & stores */
240     OPC_MFHI     = 0x10 | OPC_SPECIAL,
241     OPC_MTHI     = 0x11 | OPC_SPECIAL,
242     OPC_MFLO     = 0x12 | OPC_SPECIAL,
243     OPC_MTLO     = 0x13 | OPC_SPECIAL,
244     /* Conditional moves */
245     OPC_MOVZ     = 0x0A | OPC_SPECIAL,
246     OPC_MOVN     = 0x0B | OPC_SPECIAL,
247 
248     OPC_SELEQZ   = 0x35 | OPC_SPECIAL,
249     OPC_SELNEZ   = 0x37 | OPC_SPECIAL,
250 
251     OPC_MOVCI    = 0x01 | OPC_SPECIAL,
252 
253     /* Special */
254     OPC_PMON     = 0x05 | OPC_SPECIAL, /* unofficial */
255     OPC_SYSCALL  = 0x0C | OPC_SPECIAL,
256     OPC_BREAK    = 0x0D | OPC_SPECIAL,
257     OPC_SPIM     = 0x0E | OPC_SPECIAL, /* unofficial */
258     OPC_SYNC     = 0x0F | OPC_SPECIAL,
259 
260     OPC_SPECIAL28_RESERVED = 0x28 | OPC_SPECIAL,
261     OPC_SPECIAL29_RESERVED = 0x29 | OPC_SPECIAL,
262     OPC_SPECIAL39_RESERVED = 0x39 | OPC_SPECIAL,
263     OPC_SPECIAL3D_RESERVED = 0x3D | OPC_SPECIAL,
264 };
265 
266 /*
267  * R6 Multiply and Divide instructions have the same opcode
268  * and function field as legacy OPC_MULT[U]/OPC_DIV[U]
269  */
270 #define MASK_R6_MULDIV(op)          (MASK_SPECIAL(op) | (op & (0x7ff)))
271 
272 enum {
273     R6_OPC_MUL   = OPC_MULT  | (2 << 6),
274     R6_OPC_MUH   = OPC_MULT  | (3 << 6),
275     R6_OPC_MULU  = OPC_MULTU | (2 << 6),
276     R6_OPC_MUHU  = OPC_MULTU | (3 << 6),
277     R6_OPC_DIV   = OPC_DIV   | (2 << 6),
278     R6_OPC_MOD   = OPC_DIV   | (3 << 6),
279     R6_OPC_DIVU  = OPC_DIVU  | (2 << 6),
280     R6_OPC_MODU  = OPC_DIVU  | (3 << 6),
281 
282     R6_OPC_DMUL   = OPC_DMULT  | (2 << 6),
283     R6_OPC_DMUH   = OPC_DMULT  | (3 << 6),
284     R6_OPC_DMULU  = OPC_DMULTU | (2 << 6),
285     R6_OPC_DMUHU  = OPC_DMULTU | (3 << 6),
286     R6_OPC_DDIV   = OPC_DDIV   | (2 << 6),
287     R6_OPC_DMOD   = OPC_DDIV   | (3 << 6),
288     R6_OPC_DDIVU  = OPC_DDIVU  | (2 << 6),
289     R6_OPC_DMODU  = OPC_DDIVU  | (3 << 6),
290 
291     R6_OPC_CLZ      = 0x10 | OPC_SPECIAL,
292     R6_OPC_CLO      = 0x11 | OPC_SPECIAL,
293     R6_OPC_DCLZ     = 0x12 | OPC_SPECIAL,
294     R6_OPC_DCLO     = 0x13 | OPC_SPECIAL,
295     R6_OPC_SDBBP    = 0x0e | OPC_SPECIAL,
296 };
297 
298 /* Multiplication variants of the vr54xx. */
299 #define MASK_MUL_VR54XX(op)         (MASK_SPECIAL(op) | (op & (0x1F << 6)))
300 
301 enum {
302     OPC_VR54XX_MULS    = (0x03 << 6) | OPC_MULT,
303     OPC_VR54XX_MULSU   = (0x03 << 6) | OPC_MULTU,
304     OPC_VR54XX_MACC    = (0x05 << 6) | OPC_MULT,
305     OPC_VR54XX_MACCU   = (0x05 << 6) | OPC_MULTU,
306     OPC_VR54XX_MSAC    = (0x07 << 6) | OPC_MULT,
307     OPC_VR54XX_MSACU   = (0x07 << 6) | OPC_MULTU,
308     OPC_VR54XX_MULHI   = (0x09 << 6) | OPC_MULT,
309     OPC_VR54XX_MULHIU  = (0x09 << 6) | OPC_MULTU,
310     OPC_VR54XX_MULSHI  = (0x0B << 6) | OPC_MULT,
311     OPC_VR54XX_MULSHIU = (0x0B << 6) | OPC_MULTU,
312     OPC_VR54XX_MACCHI  = (0x0D << 6) | OPC_MULT,
313     OPC_VR54XX_MACCHIU = (0x0D << 6) | OPC_MULTU,
314     OPC_VR54XX_MSACHI  = (0x0F << 6) | OPC_MULT,
315     OPC_VR54XX_MSACHIU = (0x0F << 6) | OPC_MULTU,
316 };
317 
318 /* REGIMM (rt field) opcodes */
319 #define MASK_REGIMM(op)             (MASK_OP_MAJOR(op) | (op & (0x1F << 16)))
320 
321 enum {
322     OPC_BLTZ     = (0x00 << 16) | OPC_REGIMM,
323     OPC_BLTZL    = (0x02 << 16) | OPC_REGIMM,
324     OPC_BGEZ     = (0x01 << 16) | OPC_REGIMM,
325     OPC_BGEZL    = (0x03 << 16) | OPC_REGIMM,
326     OPC_BLTZAL   = (0x10 << 16) | OPC_REGIMM,
327     OPC_BLTZALL  = (0x12 << 16) | OPC_REGIMM,
328     OPC_BGEZAL   = (0x11 << 16) | OPC_REGIMM,
329     OPC_BGEZALL  = (0x13 << 16) | OPC_REGIMM,
330     OPC_TGEI     = (0x08 << 16) | OPC_REGIMM,
331     OPC_TGEIU    = (0x09 << 16) | OPC_REGIMM,
332     OPC_TLTI     = (0x0A << 16) | OPC_REGIMM,
333     OPC_TLTIU    = (0x0B << 16) | OPC_REGIMM,
334     OPC_TEQI     = (0x0C << 16) | OPC_REGIMM,
335     OPC_TNEI     = (0x0E << 16) | OPC_REGIMM,
336     OPC_SIGRIE   = (0x17 << 16) | OPC_REGIMM,
337     OPC_SYNCI    = (0x1F << 16) | OPC_REGIMM,
338 
339     OPC_DAHI     = (0x06 << 16) | OPC_REGIMM,
340     OPC_DATI     = (0x1e << 16) | OPC_REGIMM,
341 };
342 
343 /* Special2 opcodes */
344 #define MASK_SPECIAL2(op)           (MASK_OP_MAJOR(op) | (op & 0x3F))
345 
346 enum {
347     /* Multiply & xxx operations */
348     OPC_MADD     = 0x00 | OPC_SPECIAL2,
349     OPC_MADDU    = 0x01 | OPC_SPECIAL2,
350     OPC_MUL      = 0x02 | OPC_SPECIAL2,
351     OPC_MSUB     = 0x04 | OPC_SPECIAL2,
352     OPC_MSUBU    = 0x05 | OPC_SPECIAL2,
353     /* Loongson 2F */
354     OPC_MULT_G_2F   = 0x10 | OPC_SPECIAL2,
355     OPC_DMULT_G_2F  = 0x11 | OPC_SPECIAL2,
356     OPC_MULTU_G_2F  = 0x12 | OPC_SPECIAL2,
357     OPC_DMULTU_G_2F = 0x13 | OPC_SPECIAL2,
358     OPC_DIV_G_2F    = 0x14 | OPC_SPECIAL2,
359     OPC_DDIV_G_2F   = 0x15 | OPC_SPECIAL2,
360     OPC_DIVU_G_2F   = 0x16 | OPC_SPECIAL2,
361     OPC_DDIVU_G_2F  = 0x17 | OPC_SPECIAL2,
362     OPC_MOD_G_2F    = 0x1c | OPC_SPECIAL2,
363     OPC_DMOD_G_2F   = 0x1d | OPC_SPECIAL2,
364     OPC_MODU_G_2F   = 0x1e | OPC_SPECIAL2,
365     OPC_DMODU_G_2F  = 0x1f | OPC_SPECIAL2,
366     /* Misc */
367     OPC_CLZ      = 0x20 | OPC_SPECIAL2,
368     OPC_CLO      = 0x21 | OPC_SPECIAL2,
369     OPC_DCLZ     = 0x24 | OPC_SPECIAL2,
370     OPC_DCLO     = 0x25 | OPC_SPECIAL2,
371     /* Special */
372     OPC_SDBBP    = 0x3F | OPC_SPECIAL2,
373 };
374 
375 /* Special3 opcodes */
376 #define MASK_SPECIAL3(op)           (MASK_OP_MAJOR(op) | (op & 0x3F))
377 
378 enum {
379     OPC_EXT      = 0x00 | OPC_SPECIAL3,
380     OPC_DEXTM    = 0x01 | OPC_SPECIAL3,
381     OPC_DEXTU    = 0x02 | OPC_SPECIAL3,
382     OPC_DEXT     = 0x03 | OPC_SPECIAL3,
383     OPC_INS      = 0x04 | OPC_SPECIAL3,
384     OPC_DINSM    = 0x05 | OPC_SPECIAL3,
385     OPC_DINSU    = 0x06 | OPC_SPECIAL3,
386     OPC_DINS     = 0x07 | OPC_SPECIAL3,
387     OPC_FORK     = 0x08 | OPC_SPECIAL3,
388     OPC_YIELD    = 0x09 | OPC_SPECIAL3,
389     OPC_BSHFL    = 0x20 | OPC_SPECIAL3,
390     OPC_DBSHFL   = 0x24 | OPC_SPECIAL3,
391     OPC_RDHWR    = 0x3B | OPC_SPECIAL3,
392     OPC_GINV     = 0x3D | OPC_SPECIAL3,
393 
394     /* Loongson 2E */
395     OPC_MULT_G_2E   = 0x18 | OPC_SPECIAL3,
396     OPC_MULTU_G_2E  = 0x19 | OPC_SPECIAL3,
397     OPC_DIV_G_2E    = 0x1A | OPC_SPECIAL3,
398     OPC_DIVU_G_2E   = 0x1B | OPC_SPECIAL3,
399     OPC_DMULT_G_2E  = 0x1C | OPC_SPECIAL3,
400     OPC_DMULTU_G_2E = 0x1D | OPC_SPECIAL3,
401     OPC_DDIV_G_2E   = 0x1E | OPC_SPECIAL3,
402     OPC_DDIVU_G_2E  = 0x1F | OPC_SPECIAL3,
403     OPC_MOD_G_2E    = 0x22 | OPC_SPECIAL3,
404     OPC_MODU_G_2E   = 0x23 | OPC_SPECIAL3,
405     OPC_DMOD_G_2E   = 0x26 | OPC_SPECIAL3,
406     OPC_DMODU_G_2E  = 0x27 | OPC_SPECIAL3,
407 
408     /* MIPS DSP Load */
409     OPC_LX_DSP         = 0x0A | OPC_SPECIAL3,
410     /* MIPS DSP Arithmetic */
411     OPC_ADDU_QB_DSP    = 0x10 | OPC_SPECIAL3,
412     OPC_ADDU_OB_DSP    = 0x14 | OPC_SPECIAL3,
413     OPC_ABSQ_S_PH_DSP  = 0x12 | OPC_SPECIAL3,
414     OPC_ABSQ_S_QH_DSP  = 0x16 | OPC_SPECIAL3,
415     /* OPC_ADDUH_QB_DSP is same as OPC_MULT_G_2E.  */
416     /* OPC_ADDUH_QB_DSP   = 0x18 | OPC_SPECIAL3,  */
417     OPC_CMPU_EQ_QB_DSP = 0x11 | OPC_SPECIAL3,
418     OPC_CMPU_EQ_OB_DSP = 0x15 | OPC_SPECIAL3,
419     /* MIPS DSP GPR-Based Shift Sub-class */
420     OPC_SHLL_QB_DSP    = 0x13 | OPC_SPECIAL3,
421     OPC_SHLL_OB_DSP    = 0x17 | OPC_SPECIAL3,
422     /* MIPS DSP Multiply Sub-class insns */
423     /* OPC_MUL_PH_DSP is same as OPC_ADDUH_QB_DSP.  */
424     /* OPC_MUL_PH_DSP     = 0x18 | OPC_SPECIAL3,  */
425     OPC_DPA_W_PH_DSP   = 0x30 | OPC_SPECIAL3,
426     OPC_DPAQ_W_QH_DSP  = 0x34 | OPC_SPECIAL3,
427     /* DSP Bit/Manipulation Sub-class */
428     OPC_INSV_DSP       = 0x0C | OPC_SPECIAL3,
429     OPC_DINSV_DSP      = 0x0D | OPC_SPECIAL3,
430     /* MIPS DSP Append Sub-class */
431     OPC_APPEND_DSP     = 0x31 | OPC_SPECIAL3,
432     OPC_DAPPEND_DSP    = 0x35 | OPC_SPECIAL3,
433     /* MIPS DSP Accumulator and DSPControl Access Sub-class */
434     OPC_EXTR_W_DSP     = 0x38 | OPC_SPECIAL3,
435     OPC_DEXTR_W_DSP    = 0x3C | OPC_SPECIAL3,
436 
437     /* EVA */
438     OPC_LWLE           = 0x19 | OPC_SPECIAL3,
439     OPC_LWRE           = 0x1A | OPC_SPECIAL3,
440     OPC_CACHEE         = 0x1B | OPC_SPECIAL3,
441     OPC_SBE            = 0x1C | OPC_SPECIAL3,
442     OPC_SHE            = 0x1D | OPC_SPECIAL3,
443     OPC_SCE            = 0x1E | OPC_SPECIAL3,
444     OPC_SWE            = 0x1F | OPC_SPECIAL3,
445     OPC_SWLE           = 0x21 | OPC_SPECIAL3,
446     OPC_SWRE           = 0x22 | OPC_SPECIAL3,
447     OPC_PREFE          = 0x23 | OPC_SPECIAL3,
448     OPC_LBUE           = 0x28 | OPC_SPECIAL3,
449     OPC_LHUE           = 0x29 | OPC_SPECIAL3,
450     OPC_LBE            = 0x2C | OPC_SPECIAL3,
451     OPC_LHE            = 0x2D | OPC_SPECIAL3,
452     OPC_LLE            = 0x2E | OPC_SPECIAL3,
453     OPC_LWE            = 0x2F | OPC_SPECIAL3,
454 
455     /* R6 */
456     R6_OPC_PREF        = 0x35 | OPC_SPECIAL3,
457     R6_OPC_CACHE       = 0x25 | OPC_SPECIAL3,
458     R6_OPC_LL          = 0x36 | OPC_SPECIAL3,
459     R6_OPC_SC          = 0x26 | OPC_SPECIAL3,
460     R6_OPC_LLD         = 0x37 | OPC_SPECIAL3,
461     R6_OPC_SCD         = 0x27 | OPC_SPECIAL3,
462 };
463 
464 /* Loongson EXT load/store quad word opcodes */
465 #define MASK_LOONGSON_GSLSQ(op)           (MASK_OP_MAJOR(op) | (op & 0x8020))
466 enum {
467     OPC_GSLQ        = 0x0020 | OPC_LWC2,
468     OPC_GSLQC1      = 0x8020 | OPC_LWC2,
469     OPC_GSSHFL      = OPC_LWC2,
470     OPC_GSSQ        = 0x0020 | OPC_SWC2,
471     OPC_GSSQC1      = 0x8020 | OPC_SWC2,
472     OPC_GSSHFS      = OPC_SWC2,
473 };
474 
475 /* Loongson EXT shifted load/store opcodes */
476 #define MASK_LOONGSON_GSSHFLS(op)         (MASK_OP_MAJOR(op) | (op & 0xc03f))
477 enum {
478     OPC_GSLWLC1     = 0x4 | OPC_GSSHFL,
479     OPC_GSLWRC1     = 0x5 | OPC_GSSHFL,
480     OPC_GSLDLC1     = 0x6 | OPC_GSSHFL,
481     OPC_GSLDRC1     = 0x7 | OPC_GSSHFL,
482     OPC_GSSWLC1     = 0x4 | OPC_GSSHFS,
483     OPC_GSSWRC1     = 0x5 | OPC_GSSHFS,
484     OPC_GSSDLC1     = 0x6 | OPC_GSSHFS,
485     OPC_GSSDRC1     = 0x7 | OPC_GSSHFS,
486 };
487 
488 /* Loongson EXT LDC2/SDC2 opcodes */
489 #define MASK_LOONGSON_LSDC2(op)           (MASK_OP_MAJOR(op) | (op & 0x7))
490 
491 enum {
492     OPC_GSLBX      = 0x0 | OPC_LDC2,
493     OPC_GSLHX      = 0x1 | OPC_LDC2,
494     OPC_GSLWX      = 0x2 | OPC_LDC2,
495     OPC_GSLDX      = 0x3 | OPC_LDC2,
496     OPC_GSLWXC1    = 0x6 | OPC_LDC2,
497     OPC_GSLDXC1    = 0x7 | OPC_LDC2,
498     OPC_GSSBX      = 0x0 | OPC_SDC2,
499     OPC_GSSHX      = 0x1 | OPC_SDC2,
500     OPC_GSSWX      = 0x2 | OPC_SDC2,
501     OPC_GSSDX      = 0x3 | OPC_SDC2,
502     OPC_GSSWXC1    = 0x6 | OPC_SDC2,
503     OPC_GSSDXC1    = 0x7 | OPC_SDC2,
504 };
505 
506 /* BSHFL opcodes */
507 #define MASK_BSHFL(op)              (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
508 
509 enum {
510     OPC_WSBH      = (0x02 << 6) | OPC_BSHFL,
511     OPC_SEB       = (0x10 << 6) | OPC_BSHFL,
512     OPC_SEH       = (0x18 << 6) | OPC_BSHFL,
513     OPC_ALIGN     = (0x08 << 6) | OPC_BSHFL, /* 010.bp (010.00 to 010.11) */
514     OPC_ALIGN_1   = (0x09 << 6) | OPC_BSHFL,
515     OPC_ALIGN_2   = (0x0A << 6) | OPC_BSHFL,
516     OPC_ALIGN_3   = (0x0B << 6) | OPC_BSHFL,
517     OPC_BITSWAP   = (0x00 << 6) | OPC_BSHFL  /* 00000 */
518 };
519 
520 /* DBSHFL opcodes */
521 #define MASK_DBSHFL(op)             (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
522 
523 enum {
524     OPC_DSBH       = (0x02 << 6) | OPC_DBSHFL,
525     OPC_DSHD       = (0x05 << 6) | OPC_DBSHFL,
526     OPC_DALIGN     = (0x08 << 6) | OPC_DBSHFL, /* 01.bp (01.000 to 01.111) */
527     OPC_DALIGN_1   = (0x09 << 6) | OPC_DBSHFL,
528     OPC_DALIGN_2   = (0x0A << 6) | OPC_DBSHFL,
529     OPC_DALIGN_3   = (0x0B << 6) | OPC_DBSHFL,
530     OPC_DALIGN_4   = (0x0C << 6) | OPC_DBSHFL,
531     OPC_DALIGN_5   = (0x0D << 6) | OPC_DBSHFL,
532     OPC_DALIGN_6   = (0x0E << 6) | OPC_DBSHFL,
533     OPC_DALIGN_7   = (0x0F << 6) | OPC_DBSHFL,
534     OPC_DBITSWAP   = (0x00 << 6) | OPC_DBSHFL, /* 00000 */
535 };
536 
537 /* MIPS DSP REGIMM opcodes */
538 enum {
539     OPC_BPOSGE32 = (0x1C << 16) | OPC_REGIMM,
540     OPC_BPOSGE64 = (0x1D << 16) | OPC_REGIMM,
541 };
542 
543 #define MASK_LX(op)                 (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
544 /* MIPS DSP Load */
545 enum {
546     OPC_LBUX = (0x06 << 6) | OPC_LX_DSP,
547     OPC_LHX  = (0x04 << 6) | OPC_LX_DSP,
548     OPC_LWX  = (0x00 << 6) | OPC_LX_DSP,
549     OPC_LDX = (0x08 << 6) | OPC_LX_DSP,
550 };
551 
552 #define MASK_ADDU_QB(op)            (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
553 enum {
554     /* MIPS DSP Arithmetic Sub-class */
555     OPC_ADDQ_PH        = (0x0A << 6) | OPC_ADDU_QB_DSP,
556     OPC_ADDQ_S_PH      = (0x0E << 6) | OPC_ADDU_QB_DSP,
557     OPC_ADDQ_S_W       = (0x16 << 6) | OPC_ADDU_QB_DSP,
558     OPC_ADDU_QB        = (0x00 << 6) | OPC_ADDU_QB_DSP,
559     OPC_ADDU_S_QB      = (0x04 << 6) | OPC_ADDU_QB_DSP,
560     OPC_ADDU_PH        = (0x08 << 6) | OPC_ADDU_QB_DSP,
561     OPC_ADDU_S_PH      = (0x0C << 6) | OPC_ADDU_QB_DSP,
562     OPC_SUBQ_PH        = (0x0B << 6) | OPC_ADDU_QB_DSP,
563     OPC_SUBQ_S_PH      = (0x0F << 6) | OPC_ADDU_QB_DSP,
564     OPC_SUBQ_S_W       = (0x17 << 6) | OPC_ADDU_QB_DSP,
565     OPC_SUBU_QB        = (0x01 << 6) | OPC_ADDU_QB_DSP,
566     OPC_SUBU_S_QB      = (0x05 << 6) | OPC_ADDU_QB_DSP,
567     OPC_SUBU_PH        = (0x09 << 6) | OPC_ADDU_QB_DSP,
568     OPC_SUBU_S_PH      = (0x0D << 6) | OPC_ADDU_QB_DSP,
569     OPC_ADDSC          = (0x10 << 6) | OPC_ADDU_QB_DSP,
570     OPC_ADDWC          = (0x11 << 6) | OPC_ADDU_QB_DSP,
571     OPC_MODSUB         = (0x12 << 6) | OPC_ADDU_QB_DSP,
572     OPC_RADDU_W_QB     = (0x14 << 6) | OPC_ADDU_QB_DSP,
573     /* MIPS DSP Multiply Sub-class insns */
574     OPC_MULEU_S_PH_QBL = (0x06 << 6) | OPC_ADDU_QB_DSP,
575     OPC_MULEU_S_PH_QBR = (0x07 << 6) | OPC_ADDU_QB_DSP,
576     OPC_MULQ_RS_PH     = (0x1F << 6) | OPC_ADDU_QB_DSP,
577     OPC_MULEQ_S_W_PHL  = (0x1C << 6) | OPC_ADDU_QB_DSP,
578     OPC_MULEQ_S_W_PHR  = (0x1D << 6) | OPC_ADDU_QB_DSP,
579     OPC_MULQ_S_PH      = (0x1E << 6) | OPC_ADDU_QB_DSP,
580 };
581 
582 #define OPC_ADDUH_QB_DSP OPC_MULT_G_2E
583 #define MASK_ADDUH_QB(op)           (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
584 enum {
585     /* MIPS DSP Arithmetic Sub-class */
586     OPC_ADDUH_QB   = (0x00 << 6) | OPC_ADDUH_QB_DSP,
587     OPC_ADDUH_R_QB = (0x02 << 6) | OPC_ADDUH_QB_DSP,
588     OPC_ADDQH_PH   = (0x08 << 6) | OPC_ADDUH_QB_DSP,
589     OPC_ADDQH_R_PH = (0x0A << 6) | OPC_ADDUH_QB_DSP,
590     OPC_ADDQH_W    = (0x10 << 6) | OPC_ADDUH_QB_DSP,
591     OPC_ADDQH_R_W  = (0x12 << 6) | OPC_ADDUH_QB_DSP,
592     OPC_SUBUH_QB   = (0x01 << 6) | OPC_ADDUH_QB_DSP,
593     OPC_SUBUH_R_QB = (0x03 << 6) | OPC_ADDUH_QB_DSP,
594     OPC_SUBQH_PH   = (0x09 << 6) | OPC_ADDUH_QB_DSP,
595     OPC_SUBQH_R_PH = (0x0B << 6) | OPC_ADDUH_QB_DSP,
596     OPC_SUBQH_W    = (0x11 << 6) | OPC_ADDUH_QB_DSP,
597     OPC_SUBQH_R_W  = (0x13 << 6) | OPC_ADDUH_QB_DSP,
598     /* MIPS DSP Multiply Sub-class insns */
599     OPC_MUL_PH     = (0x0C << 6) | OPC_ADDUH_QB_DSP,
600     OPC_MUL_S_PH   = (0x0E << 6) | OPC_ADDUH_QB_DSP,
601     OPC_MULQ_S_W   = (0x16 << 6) | OPC_ADDUH_QB_DSP,
602     OPC_MULQ_RS_W  = (0x17 << 6) | OPC_ADDUH_QB_DSP,
603 };
604 
605 #define MASK_ABSQ_S_PH(op)          (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
606 enum {
607     /* MIPS DSP Arithmetic Sub-class */
608     OPC_ABSQ_S_QB       = (0x01 << 6) | OPC_ABSQ_S_PH_DSP,
609     OPC_ABSQ_S_PH       = (0x09 << 6) | OPC_ABSQ_S_PH_DSP,
610     OPC_ABSQ_S_W        = (0x11 << 6) | OPC_ABSQ_S_PH_DSP,
611     OPC_PRECEQ_W_PHL    = (0x0C << 6) | OPC_ABSQ_S_PH_DSP,
612     OPC_PRECEQ_W_PHR    = (0x0D << 6) | OPC_ABSQ_S_PH_DSP,
613     OPC_PRECEQU_PH_QBL  = (0x04 << 6) | OPC_ABSQ_S_PH_DSP,
614     OPC_PRECEQU_PH_QBR  = (0x05 << 6) | OPC_ABSQ_S_PH_DSP,
615     OPC_PRECEQU_PH_QBLA = (0x06 << 6) | OPC_ABSQ_S_PH_DSP,
616     OPC_PRECEQU_PH_QBRA = (0x07 << 6) | OPC_ABSQ_S_PH_DSP,
617     OPC_PRECEU_PH_QBL   = (0x1C << 6) | OPC_ABSQ_S_PH_DSP,
618     OPC_PRECEU_PH_QBR   = (0x1D << 6) | OPC_ABSQ_S_PH_DSP,
619     OPC_PRECEU_PH_QBLA  = (0x1E << 6) | OPC_ABSQ_S_PH_DSP,
620     OPC_PRECEU_PH_QBRA  = (0x1F << 6) | OPC_ABSQ_S_PH_DSP,
621     /* DSP Bit/Manipulation Sub-class */
622     OPC_BITREV          = (0x1B << 6) | OPC_ABSQ_S_PH_DSP,
623     OPC_REPL_QB         = (0x02 << 6) | OPC_ABSQ_S_PH_DSP,
624     OPC_REPLV_QB        = (0x03 << 6) | OPC_ABSQ_S_PH_DSP,
625     OPC_REPL_PH         = (0x0A << 6) | OPC_ABSQ_S_PH_DSP,
626     OPC_REPLV_PH        = (0x0B << 6) | OPC_ABSQ_S_PH_DSP,
627 };
628 
629 #define MASK_CMPU_EQ_QB(op)         (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
630 enum {
631     /* MIPS DSP Arithmetic Sub-class */
632     OPC_PRECR_QB_PH      = (0x0D << 6) | OPC_CMPU_EQ_QB_DSP,
633     OPC_PRECRQ_QB_PH     = (0x0C << 6) | OPC_CMPU_EQ_QB_DSP,
634     OPC_PRECR_SRA_PH_W   = (0x1E << 6) | OPC_CMPU_EQ_QB_DSP,
635     OPC_PRECR_SRA_R_PH_W = (0x1F << 6) | OPC_CMPU_EQ_QB_DSP,
636     OPC_PRECRQ_PH_W      = (0x14 << 6) | OPC_CMPU_EQ_QB_DSP,
637     OPC_PRECRQ_RS_PH_W   = (0x15 << 6) | OPC_CMPU_EQ_QB_DSP,
638     OPC_PRECRQU_S_QB_PH  = (0x0F << 6) | OPC_CMPU_EQ_QB_DSP,
639     /* DSP Compare-Pick Sub-class */
640     OPC_CMPU_EQ_QB       = (0x00 << 6) | OPC_CMPU_EQ_QB_DSP,
641     OPC_CMPU_LT_QB       = (0x01 << 6) | OPC_CMPU_EQ_QB_DSP,
642     OPC_CMPU_LE_QB       = (0x02 << 6) | OPC_CMPU_EQ_QB_DSP,
643     OPC_CMPGU_EQ_QB      = (0x04 << 6) | OPC_CMPU_EQ_QB_DSP,
644     OPC_CMPGU_LT_QB      = (0x05 << 6) | OPC_CMPU_EQ_QB_DSP,
645     OPC_CMPGU_LE_QB      = (0x06 << 6) | OPC_CMPU_EQ_QB_DSP,
646     OPC_CMPGDU_EQ_QB     = (0x18 << 6) | OPC_CMPU_EQ_QB_DSP,
647     OPC_CMPGDU_LT_QB     = (0x19 << 6) | OPC_CMPU_EQ_QB_DSP,
648     OPC_CMPGDU_LE_QB     = (0x1A << 6) | OPC_CMPU_EQ_QB_DSP,
649     OPC_CMP_EQ_PH        = (0x08 << 6) | OPC_CMPU_EQ_QB_DSP,
650     OPC_CMP_LT_PH        = (0x09 << 6) | OPC_CMPU_EQ_QB_DSP,
651     OPC_CMP_LE_PH        = (0x0A << 6) | OPC_CMPU_EQ_QB_DSP,
652     OPC_PICK_QB          = (0x03 << 6) | OPC_CMPU_EQ_QB_DSP,
653     OPC_PICK_PH          = (0x0B << 6) | OPC_CMPU_EQ_QB_DSP,
654     OPC_PACKRL_PH        = (0x0E << 6) | OPC_CMPU_EQ_QB_DSP,
655 };
656 
657 #define MASK_SHLL_QB(op)            (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
658 enum {
659     /* MIPS DSP GPR-Based Shift Sub-class */
660     OPC_SHLL_QB    = (0x00 << 6) | OPC_SHLL_QB_DSP,
661     OPC_SHLLV_QB   = (0x02 << 6) | OPC_SHLL_QB_DSP,
662     OPC_SHLL_PH    = (0x08 << 6) | OPC_SHLL_QB_DSP,
663     OPC_SHLLV_PH   = (0x0A << 6) | OPC_SHLL_QB_DSP,
664     OPC_SHLL_S_PH  = (0x0C << 6) | OPC_SHLL_QB_DSP,
665     OPC_SHLLV_S_PH = (0x0E << 6) | OPC_SHLL_QB_DSP,
666     OPC_SHLL_S_W   = (0x14 << 6) | OPC_SHLL_QB_DSP,
667     OPC_SHLLV_S_W  = (0x16 << 6) | OPC_SHLL_QB_DSP,
668     OPC_SHRL_QB    = (0x01 << 6) | OPC_SHLL_QB_DSP,
669     OPC_SHRLV_QB   = (0x03 << 6) | OPC_SHLL_QB_DSP,
670     OPC_SHRL_PH    = (0x19 << 6) | OPC_SHLL_QB_DSP,
671     OPC_SHRLV_PH   = (0x1B << 6) | OPC_SHLL_QB_DSP,
672     OPC_SHRA_QB    = (0x04 << 6) | OPC_SHLL_QB_DSP,
673     OPC_SHRA_R_QB  = (0x05 << 6) | OPC_SHLL_QB_DSP,
674     OPC_SHRAV_QB   = (0x06 << 6) | OPC_SHLL_QB_DSP,
675     OPC_SHRAV_R_QB = (0x07 << 6) | OPC_SHLL_QB_DSP,
676     OPC_SHRA_PH    = (0x09 << 6) | OPC_SHLL_QB_DSP,
677     OPC_SHRAV_PH   = (0x0B << 6) | OPC_SHLL_QB_DSP,
678     OPC_SHRA_R_PH  = (0x0D << 6) | OPC_SHLL_QB_DSP,
679     OPC_SHRAV_R_PH = (0x0F << 6) | OPC_SHLL_QB_DSP,
680     OPC_SHRA_R_W   = (0x15 << 6) | OPC_SHLL_QB_DSP,
681     OPC_SHRAV_R_W  = (0x17 << 6) | OPC_SHLL_QB_DSP,
682 };
683 
684 #define MASK_DPA_W_PH(op)           (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
685 enum {
686     /* MIPS DSP Multiply Sub-class insns */
687     OPC_DPAU_H_QBL    = (0x03 << 6) | OPC_DPA_W_PH_DSP,
688     OPC_DPAU_H_QBR    = (0x07 << 6) | OPC_DPA_W_PH_DSP,
689     OPC_DPSU_H_QBL    = (0x0B << 6) | OPC_DPA_W_PH_DSP,
690     OPC_DPSU_H_QBR    = (0x0F << 6) | OPC_DPA_W_PH_DSP,
691     OPC_DPA_W_PH      = (0x00 << 6) | OPC_DPA_W_PH_DSP,
692     OPC_DPAX_W_PH     = (0x08 << 6) | OPC_DPA_W_PH_DSP,
693     OPC_DPAQ_S_W_PH   = (0x04 << 6) | OPC_DPA_W_PH_DSP,
694     OPC_DPAQX_S_W_PH  = (0x18 << 6) | OPC_DPA_W_PH_DSP,
695     OPC_DPAQX_SA_W_PH = (0x1A << 6) | OPC_DPA_W_PH_DSP,
696     OPC_DPS_W_PH      = (0x01 << 6) | OPC_DPA_W_PH_DSP,
697     OPC_DPSX_W_PH     = (0x09 << 6) | OPC_DPA_W_PH_DSP,
698     OPC_DPSQ_S_W_PH   = (0x05 << 6) | OPC_DPA_W_PH_DSP,
699     OPC_DPSQX_S_W_PH  = (0x19 << 6) | OPC_DPA_W_PH_DSP,
700     OPC_DPSQX_SA_W_PH = (0x1B << 6) | OPC_DPA_W_PH_DSP,
701     OPC_MULSAQ_S_W_PH = (0x06 << 6) | OPC_DPA_W_PH_DSP,
702     OPC_DPAQ_SA_L_W   = (0x0C << 6) | OPC_DPA_W_PH_DSP,
703     OPC_DPSQ_SA_L_W   = (0x0D << 6) | OPC_DPA_W_PH_DSP,
704     OPC_MAQ_S_W_PHL   = (0x14 << 6) | OPC_DPA_W_PH_DSP,
705     OPC_MAQ_S_W_PHR   = (0x16 << 6) | OPC_DPA_W_PH_DSP,
706     OPC_MAQ_SA_W_PHL  = (0x10 << 6) | OPC_DPA_W_PH_DSP,
707     OPC_MAQ_SA_W_PHR  = (0x12 << 6) | OPC_DPA_W_PH_DSP,
708     OPC_MULSA_W_PH    = (0x02 << 6) | OPC_DPA_W_PH_DSP,
709 };
710 
711 #define MASK_INSV(op)               (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
712 enum {
713     /* DSP Bit/Manipulation Sub-class */
714     OPC_INSV = (0x00 << 6) | OPC_INSV_DSP,
715 };
716 
717 #define MASK_APPEND(op)             (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
718 enum {
719     /* MIPS DSP Append Sub-class */
720     OPC_APPEND  = (0x00 << 6) | OPC_APPEND_DSP,
721     OPC_PREPEND = (0x01 << 6) | OPC_APPEND_DSP,
722     OPC_BALIGN  = (0x10 << 6) | OPC_APPEND_DSP,
723 };
724 
725 #define MASK_EXTR_W(op)             (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
726 enum {
727     /* MIPS DSP Accumulator and DSPControl Access Sub-class */
728     OPC_EXTR_W     = (0x00 << 6) | OPC_EXTR_W_DSP,
729     OPC_EXTR_R_W   = (0x04 << 6) | OPC_EXTR_W_DSP,
730     OPC_EXTR_RS_W  = (0x06 << 6) | OPC_EXTR_W_DSP,
731     OPC_EXTR_S_H   = (0x0E << 6) | OPC_EXTR_W_DSP,
732     OPC_EXTRV_S_H  = (0x0F << 6) | OPC_EXTR_W_DSP,
733     OPC_EXTRV_W    = (0x01 << 6) | OPC_EXTR_W_DSP,
734     OPC_EXTRV_R_W  = (0x05 << 6) | OPC_EXTR_W_DSP,
735     OPC_EXTRV_RS_W = (0x07 << 6) | OPC_EXTR_W_DSP,
736     OPC_EXTP       = (0x02 << 6) | OPC_EXTR_W_DSP,
737     OPC_EXTPV      = (0x03 << 6) | OPC_EXTR_W_DSP,
738     OPC_EXTPDP     = (0x0A << 6) | OPC_EXTR_W_DSP,
739     OPC_EXTPDPV    = (0x0B << 6) | OPC_EXTR_W_DSP,
740     OPC_SHILO      = (0x1A << 6) | OPC_EXTR_W_DSP,
741     OPC_SHILOV     = (0x1B << 6) | OPC_EXTR_W_DSP,
742     OPC_MTHLIP     = (0x1F << 6) | OPC_EXTR_W_DSP,
743     OPC_WRDSP      = (0x13 << 6) | OPC_EXTR_W_DSP,
744     OPC_RDDSP      = (0x12 << 6) | OPC_EXTR_W_DSP,
745 };
746 
747 #define MASK_ABSQ_S_QH(op)          (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
748 enum {
749     /* MIPS DSP Arithmetic Sub-class */
750     OPC_PRECEQ_L_PWL    = (0x14 << 6) | OPC_ABSQ_S_QH_DSP,
751     OPC_PRECEQ_L_PWR    = (0x15 << 6) | OPC_ABSQ_S_QH_DSP,
752     OPC_PRECEQ_PW_QHL   = (0x0C << 6) | OPC_ABSQ_S_QH_DSP,
753     OPC_PRECEQ_PW_QHR   = (0x0D << 6) | OPC_ABSQ_S_QH_DSP,
754     OPC_PRECEQ_PW_QHLA  = (0x0E << 6) | OPC_ABSQ_S_QH_DSP,
755     OPC_PRECEQ_PW_QHRA  = (0x0F << 6) | OPC_ABSQ_S_QH_DSP,
756     OPC_PRECEQU_QH_OBL  = (0x04 << 6) | OPC_ABSQ_S_QH_DSP,
757     OPC_PRECEQU_QH_OBR  = (0x05 << 6) | OPC_ABSQ_S_QH_DSP,
758     OPC_PRECEQU_QH_OBLA = (0x06 << 6) | OPC_ABSQ_S_QH_DSP,
759     OPC_PRECEQU_QH_OBRA = (0x07 << 6) | OPC_ABSQ_S_QH_DSP,
760     OPC_PRECEU_QH_OBL   = (0x1C << 6) | OPC_ABSQ_S_QH_DSP,
761     OPC_PRECEU_QH_OBR   = (0x1D << 6) | OPC_ABSQ_S_QH_DSP,
762     OPC_PRECEU_QH_OBLA  = (0x1E << 6) | OPC_ABSQ_S_QH_DSP,
763     OPC_PRECEU_QH_OBRA  = (0x1F << 6) | OPC_ABSQ_S_QH_DSP,
764     OPC_ABSQ_S_OB       = (0x01 << 6) | OPC_ABSQ_S_QH_DSP,
765     OPC_ABSQ_S_PW       = (0x11 << 6) | OPC_ABSQ_S_QH_DSP,
766     OPC_ABSQ_S_QH       = (0x09 << 6) | OPC_ABSQ_S_QH_DSP,
767     /* DSP Bit/Manipulation Sub-class */
768     OPC_REPL_OB         = (0x02 << 6) | OPC_ABSQ_S_QH_DSP,
769     OPC_REPL_PW         = (0x12 << 6) | OPC_ABSQ_S_QH_DSP,
770     OPC_REPL_QH         = (0x0A << 6) | OPC_ABSQ_S_QH_DSP,
771     OPC_REPLV_OB        = (0x03 << 6) | OPC_ABSQ_S_QH_DSP,
772     OPC_REPLV_PW        = (0x13 << 6) | OPC_ABSQ_S_QH_DSP,
773     OPC_REPLV_QH        = (0x0B << 6) | OPC_ABSQ_S_QH_DSP,
774 };
775 
776 #define MASK_ADDU_OB(op)            (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
777 enum {
778     /* MIPS DSP Multiply Sub-class insns */
779     OPC_MULEQ_S_PW_QHL = (0x1C << 6) | OPC_ADDU_OB_DSP,
780     OPC_MULEQ_S_PW_QHR = (0x1D << 6) | OPC_ADDU_OB_DSP,
781     OPC_MULEU_S_QH_OBL = (0x06 << 6) | OPC_ADDU_OB_DSP,
782     OPC_MULEU_S_QH_OBR = (0x07 << 6) | OPC_ADDU_OB_DSP,
783     OPC_MULQ_RS_QH     = (0x1F << 6) | OPC_ADDU_OB_DSP,
784     /* MIPS DSP Arithmetic Sub-class */
785     OPC_RADDU_L_OB     = (0x14 << 6) | OPC_ADDU_OB_DSP,
786     OPC_SUBQ_PW        = (0x13 << 6) | OPC_ADDU_OB_DSP,
787     OPC_SUBQ_S_PW      = (0x17 << 6) | OPC_ADDU_OB_DSP,
788     OPC_SUBQ_QH        = (0x0B << 6) | OPC_ADDU_OB_DSP,
789     OPC_SUBQ_S_QH      = (0x0F << 6) | OPC_ADDU_OB_DSP,
790     OPC_SUBU_OB        = (0x01 << 6) | OPC_ADDU_OB_DSP,
791     OPC_SUBU_S_OB      = (0x05 << 6) | OPC_ADDU_OB_DSP,
792     OPC_SUBU_QH        = (0x09 << 6) | OPC_ADDU_OB_DSP,
793     OPC_SUBU_S_QH      = (0x0D << 6) | OPC_ADDU_OB_DSP,
794     OPC_SUBUH_OB       = (0x19 << 6) | OPC_ADDU_OB_DSP,
795     OPC_SUBUH_R_OB     = (0x1B << 6) | OPC_ADDU_OB_DSP,
796     OPC_ADDQ_PW        = (0x12 << 6) | OPC_ADDU_OB_DSP,
797     OPC_ADDQ_S_PW      = (0x16 << 6) | OPC_ADDU_OB_DSP,
798     OPC_ADDQ_QH        = (0x0A << 6) | OPC_ADDU_OB_DSP,
799     OPC_ADDQ_S_QH      = (0x0E << 6) | OPC_ADDU_OB_DSP,
800     OPC_ADDU_OB        = (0x00 << 6) | OPC_ADDU_OB_DSP,
801     OPC_ADDU_S_OB      = (0x04 << 6) | OPC_ADDU_OB_DSP,
802     OPC_ADDU_QH        = (0x08 << 6) | OPC_ADDU_OB_DSP,
803     OPC_ADDU_S_QH      = (0x0C << 6) | OPC_ADDU_OB_DSP,
804     OPC_ADDUH_OB       = (0x18 << 6) | OPC_ADDU_OB_DSP,
805     OPC_ADDUH_R_OB     = (0x1A << 6) | OPC_ADDU_OB_DSP,
806 };
807 
808 #define MASK_CMPU_EQ_OB(op)         (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
809 enum {
810     /* DSP Compare-Pick Sub-class */
811     OPC_CMP_EQ_PW         = (0x10 << 6) | OPC_CMPU_EQ_OB_DSP,
812     OPC_CMP_LT_PW         = (0x11 << 6) | OPC_CMPU_EQ_OB_DSP,
813     OPC_CMP_LE_PW         = (0x12 << 6) | OPC_CMPU_EQ_OB_DSP,
814     OPC_CMP_EQ_QH         = (0x08 << 6) | OPC_CMPU_EQ_OB_DSP,
815     OPC_CMP_LT_QH         = (0x09 << 6) | OPC_CMPU_EQ_OB_DSP,
816     OPC_CMP_LE_QH         = (0x0A << 6) | OPC_CMPU_EQ_OB_DSP,
817     OPC_CMPGDU_EQ_OB      = (0x18 << 6) | OPC_CMPU_EQ_OB_DSP,
818     OPC_CMPGDU_LT_OB      = (0x19 << 6) | OPC_CMPU_EQ_OB_DSP,
819     OPC_CMPGDU_LE_OB      = (0x1A << 6) | OPC_CMPU_EQ_OB_DSP,
820     OPC_CMPGU_EQ_OB       = (0x04 << 6) | OPC_CMPU_EQ_OB_DSP,
821     OPC_CMPGU_LT_OB       = (0x05 << 6) | OPC_CMPU_EQ_OB_DSP,
822     OPC_CMPGU_LE_OB       = (0x06 << 6) | OPC_CMPU_EQ_OB_DSP,
823     OPC_CMPU_EQ_OB        = (0x00 << 6) | OPC_CMPU_EQ_OB_DSP,
824     OPC_CMPU_LT_OB        = (0x01 << 6) | OPC_CMPU_EQ_OB_DSP,
825     OPC_CMPU_LE_OB        = (0x02 << 6) | OPC_CMPU_EQ_OB_DSP,
826     OPC_PACKRL_PW         = (0x0E << 6) | OPC_CMPU_EQ_OB_DSP,
827     OPC_PICK_OB           = (0x03 << 6) | OPC_CMPU_EQ_OB_DSP,
828     OPC_PICK_PW           = (0x13 << 6) | OPC_CMPU_EQ_OB_DSP,
829     OPC_PICK_QH           = (0x0B << 6) | OPC_CMPU_EQ_OB_DSP,
830     /* MIPS DSP Arithmetic Sub-class */
831     OPC_PRECR_OB_QH       = (0x0D << 6) | OPC_CMPU_EQ_OB_DSP,
832     OPC_PRECR_SRA_QH_PW   = (0x1E << 6) | OPC_CMPU_EQ_OB_DSP,
833     OPC_PRECR_SRA_R_QH_PW = (0x1F << 6) | OPC_CMPU_EQ_OB_DSP,
834     OPC_PRECRQ_OB_QH      = (0x0C << 6) | OPC_CMPU_EQ_OB_DSP,
835     OPC_PRECRQ_PW_L       = (0x1C << 6) | OPC_CMPU_EQ_OB_DSP,
836     OPC_PRECRQ_QH_PW      = (0x14 << 6) | OPC_CMPU_EQ_OB_DSP,
837     OPC_PRECRQ_RS_QH_PW   = (0x15 << 6) | OPC_CMPU_EQ_OB_DSP,
838     OPC_PRECRQU_S_OB_QH   = (0x0F << 6) | OPC_CMPU_EQ_OB_DSP,
839 };
840 
841 #define MASK_DAPPEND(op)            (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
842 enum {
843     /* DSP Append Sub-class */
844     OPC_DAPPEND  = (0x00 << 6) | OPC_DAPPEND_DSP,
845     OPC_PREPENDD = (0x03 << 6) | OPC_DAPPEND_DSP,
846     OPC_PREPENDW = (0x01 << 6) | OPC_DAPPEND_DSP,
847     OPC_DBALIGN  = (0x10 << 6) | OPC_DAPPEND_DSP,
848 };
849 
850 #define MASK_DEXTR_W(op)            (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
851 enum {
852     /* MIPS DSP Accumulator and DSPControl Access Sub-class */
853     OPC_DMTHLIP     = (0x1F << 6) | OPC_DEXTR_W_DSP,
854     OPC_DSHILO      = (0x1A << 6) | OPC_DEXTR_W_DSP,
855     OPC_DEXTP       = (0x02 << 6) | OPC_DEXTR_W_DSP,
856     OPC_DEXTPDP     = (0x0A << 6) | OPC_DEXTR_W_DSP,
857     OPC_DEXTPDPV    = (0x0B << 6) | OPC_DEXTR_W_DSP,
858     OPC_DEXTPV      = (0x03 << 6) | OPC_DEXTR_W_DSP,
859     OPC_DEXTR_L     = (0x10 << 6) | OPC_DEXTR_W_DSP,
860     OPC_DEXTR_R_L   = (0x14 << 6) | OPC_DEXTR_W_DSP,
861     OPC_DEXTR_RS_L  = (0x16 << 6) | OPC_DEXTR_W_DSP,
862     OPC_DEXTR_W     = (0x00 << 6) | OPC_DEXTR_W_DSP,
863     OPC_DEXTR_R_W   = (0x04 << 6) | OPC_DEXTR_W_DSP,
864     OPC_DEXTR_RS_W  = (0x06 << 6) | OPC_DEXTR_W_DSP,
865     OPC_DEXTR_S_H   = (0x0E << 6) | OPC_DEXTR_W_DSP,
866     OPC_DEXTRV_L    = (0x11 << 6) | OPC_DEXTR_W_DSP,
867     OPC_DEXTRV_R_L  = (0x15 << 6) | OPC_DEXTR_W_DSP,
868     OPC_DEXTRV_RS_L = (0x17 << 6) | OPC_DEXTR_W_DSP,
869     OPC_DEXTRV_S_H  = (0x0F << 6) | OPC_DEXTR_W_DSP,
870     OPC_DEXTRV_W    = (0x01 << 6) | OPC_DEXTR_W_DSP,
871     OPC_DEXTRV_R_W  = (0x05 << 6) | OPC_DEXTR_W_DSP,
872     OPC_DEXTRV_RS_W = (0x07 << 6) | OPC_DEXTR_W_DSP,
873     OPC_DSHILOV     = (0x1B << 6) | OPC_DEXTR_W_DSP,
874 };
875 
876 #define MASK_DINSV(op)              (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
877 enum {
878     /* DSP Bit/Manipulation Sub-class */
879     OPC_DINSV = (0x00 << 6) | OPC_DINSV_DSP,
880 };
881 
882 #define MASK_DPAQ_W_QH(op)          (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
883 enum {
884     /* MIPS DSP Multiply Sub-class insns */
885     OPC_DMADD         = (0x19 << 6) | OPC_DPAQ_W_QH_DSP,
886     OPC_DMADDU        = (0x1D << 6) | OPC_DPAQ_W_QH_DSP,
887     OPC_DMSUB         = (0x1B << 6) | OPC_DPAQ_W_QH_DSP,
888     OPC_DMSUBU        = (0x1F << 6) | OPC_DPAQ_W_QH_DSP,
889     OPC_DPA_W_QH      = (0x00 << 6) | OPC_DPAQ_W_QH_DSP,
890     OPC_DPAQ_S_W_QH   = (0x04 << 6) | OPC_DPAQ_W_QH_DSP,
891     OPC_DPAQ_SA_L_PW  = (0x0C << 6) | OPC_DPAQ_W_QH_DSP,
892     OPC_DPAU_H_OBL    = (0x03 << 6) | OPC_DPAQ_W_QH_DSP,
893     OPC_DPAU_H_OBR    = (0x07 << 6) | OPC_DPAQ_W_QH_DSP,
894     OPC_DPS_W_QH      = (0x01 << 6) | OPC_DPAQ_W_QH_DSP,
895     OPC_DPSQ_S_W_QH   = (0x05 << 6) | OPC_DPAQ_W_QH_DSP,
896     OPC_DPSQ_SA_L_PW  = (0x0D << 6) | OPC_DPAQ_W_QH_DSP,
897     OPC_DPSU_H_OBL    = (0x0B << 6) | OPC_DPAQ_W_QH_DSP,
898     OPC_DPSU_H_OBR    = (0x0F << 6) | OPC_DPAQ_W_QH_DSP,
899     OPC_MAQ_S_L_PWL   = (0x1C << 6) | OPC_DPAQ_W_QH_DSP,
900     OPC_MAQ_S_L_PWR   = (0x1E << 6) | OPC_DPAQ_W_QH_DSP,
901     OPC_MAQ_S_W_QHLL  = (0x14 << 6) | OPC_DPAQ_W_QH_DSP,
902     OPC_MAQ_SA_W_QHLL = (0x10 << 6) | OPC_DPAQ_W_QH_DSP,
903     OPC_MAQ_S_W_QHLR  = (0x15 << 6) | OPC_DPAQ_W_QH_DSP,
904     OPC_MAQ_SA_W_QHLR = (0x11 << 6) | OPC_DPAQ_W_QH_DSP,
905     OPC_MAQ_S_W_QHRL  = (0x16 << 6) | OPC_DPAQ_W_QH_DSP,
906     OPC_MAQ_SA_W_QHRL = (0x12 << 6) | OPC_DPAQ_W_QH_DSP,
907     OPC_MAQ_S_W_QHRR  = (0x17 << 6) | OPC_DPAQ_W_QH_DSP,
908     OPC_MAQ_SA_W_QHRR = (0x13 << 6) | OPC_DPAQ_W_QH_DSP,
909     OPC_MULSAQ_S_L_PW = (0x0E << 6) | OPC_DPAQ_W_QH_DSP,
910     OPC_MULSAQ_S_W_QH = (0x06 << 6) | OPC_DPAQ_W_QH_DSP,
911 };
912 
913 #define MASK_SHLL_OB(op)            (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
914 enum {
915     /* MIPS DSP GPR-Based Shift Sub-class */
916     OPC_SHLL_PW    = (0x10 << 6) | OPC_SHLL_OB_DSP,
917     OPC_SHLL_S_PW  = (0x14 << 6) | OPC_SHLL_OB_DSP,
918     OPC_SHLLV_OB   = (0x02 << 6) | OPC_SHLL_OB_DSP,
919     OPC_SHLLV_PW   = (0x12 << 6) | OPC_SHLL_OB_DSP,
920     OPC_SHLLV_S_PW = (0x16 << 6) | OPC_SHLL_OB_DSP,
921     OPC_SHLLV_QH   = (0x0A << 6) | OPC_SHLL_OB_DSP,
922     OPC_SHLLV_S_QH = (0x0E << 6) | OPC_SHLL_OB_DSP,
923     OPC_SHRA_PW    = (0x11 << 6) | OPC_SHLL_OB_DSP,
924     OPC_SHRA_R_PW  = (0x15 << 6) | OPC_SHLL_OB_DSP,
925     OPC_SHRAV_OB   = (0x06 << 6) | OPC_SHLL_OB_DSP,
926     OPC_SHRAV_R_OB = (0x07 << 6) | OPC_SHLL_OB_DSP,
927     OPC_SHRAV_PW   = (0x13 << 6) | OPC_SHLL_OB_DSP,
928     OPC_SHRAV_R_PW = (0x17 << 6) | OPC_SHLL_OB_DSP,
929     OPC_SHRAV_QH   = (0x0B << 6) | OPC_SHLL_OB_DSP,
930     OPC_SHRAV_R_QH = (0x0F << 6) | OPC_SHLL_OB_DSP,
931     OPC_SHRLV_OB   = (0x03 << 6) | OPC_SHLL_OB_DSP,
932     OPC_SHRLV_QH   = (0x1B << 6) | OPC_SHLL_OB_DSP,
933     OPC_SHLL_OB    = (0x00 << 6) | OPC_SHLL_OB_DSP,
934     OPC_SHLL_QH    = (0x08 << 6) | OPC_SHLL_OB_DSP,
935     OPC_SHLL_S_QH  = (0x0C << 6) | OPC_SHLL_OB_DSP,
936     OPC_SHRA_OB    = (0x04 << 6) | OPC_SHLL_OB_DSP,
937     OPC_SHRA_R_OB  = (0x05 << 6) | OPC_SHLL_OB_DSP,
938     OPC_SHRA_QH    = (0x09 << 6) | OPC_SHLL_OB_DSP,
939     OPC_SHRA_R_QH  = (0x0D << 6) | OPC_SHLL_OB_DSP,
940     OPC_SHRL_OB    = (0x01 << 6) | OPC_SHLL_OB_DSP,
941     OPC_SHRL_QH    = (0x19 << 6) | OPC_SHLL_OB_DSP,
942 };
943 
944 /* Coprocessor 0 (rs field) */
945 #define MASK_CP0(op)                (MASK_OP_MAJOR(op) | (op & (0x1F << 21)))
946 
947 enum {
948     OPC_MFC0     = (0x00 << 21) | OPC_CP0,
949     OPC_DMFC0    = (0x01 << 21) | OPC_CP0,
950     OPC_MFHC0    = (0x02 << 21) | OPC_CP0,
951     OPC_MTC0     = (0x04 << 21) | OPC_CP0,
952     OPC_DMTC0    = (0x05 << 21) | OPC_CP0,
953     OPC_MTHC0    = (0x06 << 21) | OPC_CP0,
954     OPC_MFTR     = (0x08 << 21) | OPC_CP0,
955     OPC_RDPGPR   = (0x0A << 21) | OPC_CP0,
956     OPC_MFMC0    = (0x0B << 21) | OPC_CP0,
957     OPC_MTTR     = (0x0C << 21) | OPC_CP0,
958     OPC_WRPGPR   = (0x0E << 21) | OPC_CP0,
959     OPC_C0       = (0x10 << 21) | OPC_CP0,
960     OPC_C0_1     = (0x11 << 21) | OPC_CP0,
961     OPC_C0_2     = (0x12 << 21) | OPC_CP0,
962     OPC_C0_3     = (0x13 << 21) | OPC_CP0,
963     OPC_C0_4     = (0x14 << 21) | OPC_CP0,
964     OPC_C0_5     = (0x15 << 21) | OPC_CP0,
965     OPC_C0_6     = (0x16 << 21) | OPC_CP0,
966     OPC_C0_7     = (0x17 << 21) | OPC_CP0,
967     OPC_C0_8     = (0x18 << 21) | OPC_CP0,
968     OPC_C0_9     = (0x19 << 21) | OPC_CP0,
969     OPC_C0_A     = (0x1A << 21) | OPC_CP0,
970     OPC_C0_B     = (0x1B << 21) | OPC_CP0,
971     OPC_C0_C     = (0x1C << 21) | OPC_CP0,
972     OPC_C0_D     = (0x1D << 21) | OPC_CP0,
973     OPC_C0_E     = (0x1E << 21) | OPC_CP0,
974     OPC_C0_F     = (0x1F << 21) | OPC_CP0,
975 };
976 
977 /* MFMC0 opcodes */
978 #define MASK_MFMC0(op)              (MASK_CP0(op) | (op & 0xFFFF))
979 
980 enum {
981     OPC_DMT      = 0x01 | (0 << 5) | (0x0F << 6) | (0x01 << 11) | OPC_MFMC0,
982     OPC_EMT      = 0x01 | (1 << 5) | (0x0F << 6) | (0x01 << 11) | OPC_MFMC0,
983     OPC_DVPE     = 0x01 | (0 << 5) | OPC_MFMC0,
984     OPC_EVPE     = 0x01 | (1 << 5) | OPC_MFMC0,
985     OPC_DI       = (0 << 5) | (0x0C << 11) | OPC_MFMC0,
986     OPC_EI       = (1 << 5) | (0x0C << 11) | OPC_MFMC0,
987     OPC_DVP      = 0x04 | (0 << 3) | (1 << 5) | (0 << 11) | OPC_MFMC0,
988     OPC_EVP      = 0x04 | (0 << 3) | (0 << 5) | (0 << 11) | OPC_MFMC0,
989 };
990 
991 /* Coprocessor 0 (with rs == C0) */
992 #define MASK_C0(op)                 (MASK_CP0(op) | (op & 0x3F))
993 
994 enum {
995     OPC_TLBR     = 0x01 | OPC_C0,
996     OPC_TLBWI    = 0x02 | OPC_C0,
997     OPC_TLBINV   = 0x03 | OPC_C0,
998     OPC_TLBINVF  = 0x04 | OPC_C0,
999     OPC_TLBWR    = 0x06 | OPC_C0,
1000     OPC_TLBP     = 0x08 | OPC_C0,
1001     OPC_RFE      = 0x10 | OPC_C0,
1002     OPC_ERET     = 0x18 | OPC_C0,
1003     OPC_DERET    = 0x1F | OPC_C0,
1004     OPC_WAIT     = 0x20 | OPC_C0,
1005 };
1006 
1007 #define MASK_CP2(op)                (MASK_OP_MAJOR(op) | (op & (0x1F << 21)))
1008 
1009 enum {
1010     OPC_MFC2    = (0x00 << 21) | OPC_CP2,
1011     OPC_DMFC2   = (0x01 << 21) | OPC_CP2,
1012     OPC_CFC2    = (0x02 << 21) | OPC_CP2,
1013     OPC_MFHC2   = (0x03 << 21) | OPC_CP2,
1014     OPC_MTC2    = (0x04 << 21) | OPC_CP2,
1015     OPC_DMTC2   = (0x05 << 21) | OPC_CP2,
1016     OPC_CTC2    = (0x06 << 21) | OPC_CP2,
1017     OPC_MTHC2   = (0x07 << 21) | OPC_CP2,
1018     OPC_BC2     = (0x08 << 21) | OPC_CP2,
1019     OPC_BC2EQZ  = (0x09 << 21) | OPC_CP2,
1020     OPC_BC2NEZ  = (0x0D << 21) | OPC_CP2,
1021 };
1022 
1023 #define MASK_LMMI(op)    (MASK_OP_MAJOR(op) | (op & (0x1F << 21)) | (op & 0x1F))
1024 
1025 enum {
1026     OPC_PADDSH      = (24 << 21) | (0x00) | OPC_CP2,
1027     OPC_PADDUSH     = (25 << 21) | (0x00) | OPC_CP2,
1028     OPC_PADDH       = (26 << 21) | (0x00) | OPC_CP2,
1029     OPC_PADDW       = (27 << 21) | (0x00) | OPC_CP2,
1030     OPC_PADDSB      = (28 << 21) | (0x00) | OPC_CP2,
1031     OPC_PADDUSB     = (29 << 21) | (0x00) | OPC_CP2,
1032     OPC_PADDB       = (30 << 21) | (0x00) | OPC_CP2,
1033     OPC_PADDD       = (31 << 21) | (0x00) | OPC_CP2,
1034 
1035     OPC_PSUBSH      = (24 << 21) | (0x01) | OPC_CP2,
1036     OPC_PSUBUSH     = (25 << 21) | (0x01) | OPC_CP2,
1037     OPC_PSUBH       = (26 << 21) | (0x01) | OPC_CP2,
1038     OPC_PSUBW       = (27 << 21) | (0x01) | OPC_CP2,
1039     OPC_PSUBSB      = (28 << 21) | (0x01) | OPC_CP2,
1040     OPC_PSUBUSB     = (29 << 21) | (0x01) | OPC_CP2,
1041     OPC_PSUBB       = (30 << 21) | (0x01) | OPC_CP2,
1042     OPC_PSUBD       = (31 << 21) | (0x01) | OPC_CP2,
1043 
1044     OPC_PSHUFH      = (24 << 21) | (0x02) | OPC_CP2,
1045     OPC_PACKSSWH    = (25 << 21) | (0x02) | OPC_CP2,
1046     OPC_PACKSSHB    = (26 << 21) | (0x02) | OPC_CP2,
1047     OPC_PACKUSHB    = (27 << 21) | (0x02) | OPC_CP2,
1048     OPC_XOR_CP2     = (28 << 21) | (0x02) | OPC_CP2,
1049     OPC_NOR_CP2     = (29 << 21) | (0x02) | OPC_CP2,
1050     OPC_AND_CP2     = (30 << 21) | (0x02) | OPC_CP2,
1051     OPC_PANDN       = (31 << 21) | (0x02) | OPC_CP2,
1052 
1053     OPC_PUNPCKLHW   = (24 << 21) | (0x03) | OPC_CP2,
1054     OPC_PUNPCKHHW   = (25 << 21) | (0x03) | OPC_CP2,
1055     OPC_PUNPCKLBH   = (26 << 21) | (0x03) | OPC_CP2,
1056     OPC_PUNPCKHBH   = (27 << 21) | (0x03) | OPC_CP2,
1057     OPC_PINSRH_0    = (28 << 21) | (0x03) | OPC_CP2,
1058     OPC_PINSRH_1    = (29 << 21) | (0x03) | OPC_CP2,
1059     OPC_PINSRH_2    = (30 << 21) | (0x03) | OPC_CP2,
1060     OPC_PINSRH_3    = (31 << 21) | (0x03) | OPC_CP2,
1061 
1062     OPC_PAVGH       = (24 << 21) | (0x08) | OPC_CP2,
1063     OPC_PAVGB       = (25 << 21) | (0x08) | OPC_CP2,
1064     OPC_PMAXSH      = (26 << 21) | (0x08) | OPC_CP2,
1065     OPC_PMINSH      = (27 << 21) | (0x08) | OPC_CP2,
1066     OPC_PMAXUB      = (28 << 21) | (0x08) | OPC_CP2,
1067     OPC_PMINUB      = (29 << 21) | (0x08) | OPC_CP2,
1068 
1069     OPC_PCMPEQW     = (24 << 21) | (0x09) | OPC_CP2,
1070     OPC_PCMPGTW     = (25 << 21) | (0x09) | OPC_CP2,
1071     OPC_PCMPEQH     = (26 << 21) | (0x09) | OPC_CP2,
1072     OPC_PCMPGTH     = (27 << 21) | (0x09) | OPC_CP2,
1073     OPC_PCMPEQB     = (28 << 21) | (0x09) | OPC_CP2,
1074     OPC_PCMPGTB     = (29 << 21) | (0x09) | OPC_CP2,
1075 
1076     OPC_PSLLW       = (24 << 21) | (0x0A) | OPC_CP2,
1077     OPC_PSLLH       = (25 << 21) | (0x0A) | OPC_CP2,
1078     OPC_PMULLH      = (26 << 21) | (0x0A) | OPC_CP2,
1079     OPC_PMULHH      = (27 << 21) | (0x0A) | OPC_CP2,
1080     OPC_PMULUW      = (28 << 21) | (0x0A) | OPC_CP2,
1081     OPC_PMULHUH     = (29 << 21) | (0x0A) | OPC_CP2,
1082 
1083     OPC_PSRLW       = (24 << 21) | (0x0B) | OPC_CP2,
1084     OPC_PSRLH       = (25 << 21) | (0x0B) | OPC_CP2,
1085     OPC_PSRAW       = (26 << 21) | (0x0B) | OPC_CP2,
1086     OPC_PSRAH       = (27 << 21) | (0x0B) | OPC_CP2,
1087     OPC_PUNPCKLWD   = (28 << 21) | (0x0B) | OPC_CP2,
1088     OPC_PUNPCKHWD   = (29 << 21) | (0x0B) | OPC_CP2,
1089 
1090     OPC_ADDU_CP2    = (24 << 21) | (0x0C) | OPC_CP2,
1091     OPC_OR_CP2      = (25 << 21) | (0x0C) | OPC_CP2,
1092     OPC_ADD_CP2     = (26 << 21) | (0x0C) | OPC_CP2,
1093     OPC_DADD_CP2    = (27 << 21) | (0x0C) | OPC_CP2,
1094     OPC_SEQU_CP2    = (28 << 21) | (0x0C) | OPC_CP2,
1095     OPC_SEQ_CP2     = (29 << 21) | (0x0C) | OPC_CP2,
1096 
1097     OPC_SUBU_CP2    = (24 << 21) | (0x0D) | OPC_CP2,
1098     OPC_PASUBUB     = (25 << 21) | (0x0D) | OPC_CP2,
1099     OPC_SUB_CP2     = (26 << 21) | (0x0D) | OPC_CP2,
1100     OPC_DSUB_CP2    = (27 << 21) | (0x0D) | OPC_CP2,
1101     OPC_SLTU_CP2    = (28 << 21) | (0x0D) | OPC_CP2,
1102     OPC_SLT_CP2     = (29 << 21) | (0x0D) | OPC_CP2,
1103 
1104     OPC_SLL_CP2     = (24 << 21) | (0x0E) | OPC_CP2,
1105     OPC_DSLL_CP2    = (25 << 21) | (0x0E) | OPC_CP2,
1106     OPC_PEXTRH      = (26 << 21) | (0x0E) | OPC_CP2,
1107     OPC_PMADDHW     = (27 << 21) | (0x0E) | OPC_CP2,
1108     OPC_SLEU_CP2    = (28 << 21) | (0x0E) | OPC_CP2,
1109     OPC_SLE_CP2     = (29 << 21) | (0x0E) | OPC_CP2,
1110 
1111     OPC_SRL_CP2     = (24 << 21) | (0x0F) | OPC_CP2,
1112     OPC_DSRL_CP2    = (25 << 21) | (0x0F) | OPC_CP2,
1113     OPC_SRA_CP2     = (26 << 21) | (0x0F) | OPC_CP2,
1114     OPC_DSRA_CP2    = (27 << 21) | (0x0F) | OPC_CP2,
1115     OPC_BIADD       = (28 << 21) | (0x0F) | OPC_CP2,
1116     OPC_PMOVMSKB    = (29 << 21) | (0x0F) | OPC_CP2,
1117 };
1118 
1119 
1120 #define MASK_CP3(op)                (MASK_OP_MAJOR(op) | (op & 0x3F))
1121 
1122 enum {
1123     OPC_LWXC1       = 0x00 | OPC_CP3,
1124     OPC_LDXC1       = 0x01 | OPC_CP3,
1125     OPC_LUXC1       = 0x05 | OPC_CP3,
1126     OPC_SWXC1       = 0x08 | OPC_CP3,
1127     OPC_SDXC1       = 0x09 | OPC_CP3,
1128     OPC_SUXC1       = 0x0D | OPC_CP3,
1129     OPC_PREFX       = 0x0F | OPC_CP3,
1130     OPC_ALNV_PS     = 0x1E | OPC_CP3,
1131     OPC_MADD_S      = 0x20 | OPC_CP3,
1132     OPC_MADD_D      = 0x21 | OPC_CP3,
1133     OPC_MADD_PS     = 0x26 | OPC_CP3,
1134     OPC_MSUB_S      = 0x28 | OPC_CP3,
1135     OPC_MSUB_D      = 0x29 | OPC_CP3,
1136     OPC_MSUB_PS     = 0x2E | OPC_CP3,
1137     OPC_NMADD_S     = 0x30 | OPC_CP3,
1138     OPC_NMADD_D     = 0x31 | OPC_CP3,
1139     OPC_NMADD_PS    = 0x36 | OPC_CP3,
1140     OPC_NMSUB_S     = 0x38 | OPC_CP3,
1141     OPC_NMSUB_D     = 0x39 | OPC_CP3,
1142     OPC_NMSUB_PS    = 0x3E | OPC_CP3,
1143 };
1144 
1145 /*
1146  *     MMI (MultiMedia Instruction) encodings
1147  *     ======================================
1148  *
1149  * MMI instructions encoding table keys:
1150  *
1151  *     *   This code is reserved for future use. An attempt to execute it
1152  *         causes a Reserved Instruction exception.
1153  *     %   This code indicates an instruction class. The instruction word
1154  *         must be further decoded by examining additional tables that show
1155  *         the values for other instruction fields.
1156  *     #   This code is reserved for the unsupported instructions DMULT,
1157  *         DMULTU, DDIV, DDIVU, LL, LLD, SC, SCD, LWC2 and SWC2. An attempt
1158  *         to execute it causes a Reserved Instruction exception.
1159  *
1160  * MMI instructions encoded by opcode field (MMI, LQ, SQ):
1161  *
1162  *  31    26                                        0
1163  * +--------+----------------------------------------+
1164  * | opcode |                                        |
1165  * +--------+----------------------------------------+
1166  *
1167  *   opcode  bits 28..26
1168  *     bits |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7
1169  *   31..29 |  000  |  001  |  010  |  011  |  100  |  101  |  110  |  111
1170  *   -------+-------+-------+-------+-------+-------+-------+-------+-------
1171  *    0 000 |SPECIAL| REGIMM|   J   |  JAL  |  BEQ  |  BNE  |  BLEZ |  BGTZ
1172  *    1 001 |  ADDI | ADDIU |  SLTI | SLTIU |  ANDI |  ORI  |  XORI |  LUI
1173  *    2 010 |  COP0 |  COP1 |   *   |   *   |  BEQL |  BNEL | BLEZL | BGTZL
1174  *    3 011 | DADDI | DADDIU|  LDL  |  LDR  |  MMI% |   *   |   LQ  |   SQ
1175  *    4 100 |   LB  |   LH  |  LWL  |   LW  |  LBU  |  LHU  |  LWR  |  LWU
1176  *    5 101 |   SB  |   SH  |  SWL  |   SW  |  SDL  |  SDR  |  SWR  | CACHE
1177  *    6 110 |   #   |  LWC1 |   #   |  PREF |   #   |  LDC1 |   #   |   LD
1178  *    7 111 |   #   |  SWC1 |   #   |   *   |   #   |  SDC1 |   #   |   SD
1179  */
1180 
1181 enum {
1182     MMI_OPC_CLASS_MMI = 0x1C << 26,    /* Same as OPC_SPECIAL2 */
1183     MMI_OPC_LQ        = 0x1E << 26,    /* Same as OPC_MSA */
1184     MMI_OPC_SQ        = 0x1F << 26,    /* Same as OPC_SPECIAL3 */
1185 };
1186 
1187 /*
1188  * MMI instructions with opcode field = MMI:
1189  *
1190  *  31    26                                 5      0
1191  * +--------+-------------------------------+--------+
1192  * |   MMI  |                               |function|
1193  * +--------+-------------------------------+--------+
1194  *
1195  * function  bits 2..0
1196  *     bits |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7
1197  *     5..3 |  000  |  001  |  010  |  011  |  100  |  101  |  110  |  111
1198  *   -------+-------+-------+-------+-------+-------+-------+-------+-------
1199  *    0 000 |  MADD | MADDU |   *   |   *   | PLZCW |   *   |   *   |   *
1200  *    1 001 | MMI0% | MMI2% |   *   |   *   |   *   |   *   |   *   |   *
1201  *    2 010 | MFHI1 | MTHI1 | MFLO1 | MTLO1 |   *   |   *   |   *   |   *
1202  *    3 011 | MULT1 | MULTU1|  DIV1 | DIVU1 |   *   |   *   |   *   |   *
1203  *    4 100 | MADD1 | MADDU1|   *   |   *   |   *   |   *   |   *   |   *
1204  *    5 101 | MMI1% | MMI3% |   *   |   *   |   *   |   *   |   *   |   *
1205  *    6 110 | PMFHL | PMTHL |   *   |   *   | PSLLH |   *   | PSRLH | PSRAH
1206  *    7 111 |   *   |   *   |   *   |   *   | PSLLW |   *   | PSRLW | PSRAW
1207  */
1208 
1209 #define MASK_MMI(op) (MASK_OP_MAJOR(op) | ((op) & 0x3F))
1210 enum {
1211     MMI_OPC_MADD       = 0x00 | MMI_OPC_CLASS_MMI, /* Same as OPC_MADD */
1212     MMI_OPC_MADDU      = 0x01 | MMI_OPC_CLASS_MMI, /* Same as OPC_MADDU */
1213     MMI_OPC_MULT1      = 0x18 | MMI_OPC_CLASS_MMI, /* Same minor as OPC_MULT */
1214     MMI_OPC_MULTU1     = 0x19 | MMI_OPC_CLASS_MMI, /* Same min. as OPC_MULTU */
1215     MMI_OPC_DIV1       = 0x1A | MMI_OPC_CLASS_MMI, /* Same minor as OPC_DIV  */
1216     MMI_OPC_DIVU1      = 0x1B | MMI_OPC_CLASS_MMI, /* Same minor as OPC_DIVU */
1217     MMI_OPC_MADD1      = 0x20 | MMI_OPC_CLASS_MMI,
1218     MMI_OPC_MADDU1     = 0x21 | MMI_OPC_CLASS_MMI,
1219 };
1220 
1221 /* global register indices */
1222 TCGv cpu_gpr[32], cpu_PC;
1223 /*
1224  * For CPUs using 128-bit GPR registers, we put the lower halves in cpu_gpr[])
1225  * and the upper halves in cpu_gpr_hi[].
1226  */
1227 TCGv_i64 cpu_gpr_hi[32];
1228 TCGv cpu_HI[MIPS_DSP_ACC], cpu_LO[MIPS_DSP_ACC];
1229 static TCGv cpu_dspctrl, btarget;
1230 TCGv bcond;
1231 static TCGv cpu_lladdr, cpu_llval;
1232 static TCGv_i32 hflags;
1233 TCGv_i32 fpu_fcr0, fpu_fcr31;
1234 TCGv_i64 fpu_f64[32];
1235 
1236 #include "exec/gen-icount.h"
1237 
1238 #define gen_helper_0e0i(name, arg) do {                           \
1239     TCGv_i32 helper_tmp = tcg_const_i32(arg);                     \
1240     gen_helper_##name(cpu_env, helper_tmp);                       \
1241     tcg_temp_free_i32(helper_tmp);                                \
1242     } while (0)
1243 
1244 #define gen_helper_0e1i(name, arg1, arg2) do {                    \
1245     TCGv_i32 helper_tmp = tcg_const_i32(arg2);                    \
1246     gen_helper_##name(cpu_env, arg1, helper_tmp);                 \
1247     tcg_temp_free_i32(helper_tmp);                                \
1248     } while (0)
1249 
1250 #define gen_helper_1e0i(name, ret, arg1) do {                     \
1251     TCGv_i32 helper_tmp = tcg_const_i32(arg1);                    \
1252     gen_helper_##name(ret, cpu_env, helper_tmp);                  \
1253     tcg_temp_free_i32(helper_tmp);                                \
1254     } while (0)
1255 
1256 #define gen_helper_1e1i(name, ret, arg1, arg2) do {               \
1257     TCGv_i32 helper_tmp = tcg_const_i32(arg2);                    \
1258     gen_helper_##name(ret, cpu_env, arg1, helper_tmp);            \
1259     tcg_temp_free_i32(helper_tmp);                                \
1260     } while (0)
1261 
1262 #define gen_helper_0e2i(name, arg1, arg2, arg3) do {              \
1263     TCGv_i32 helper_tmp = tcg_const_i32(arg3);                    \
1264     gen_helper_##name(cpu_env, arg1, arg2, helper_tmp);           \
1265     tcg_temp_free_i32(helper_tmp);                                \
1266     } while (0)
1267 
1268 #define gen_helper_1e2i(name, ret, arg1, arg2, arg3) do {         \
1269     TCGv_i32 helper_tmp = tcg_const_i32(arg3);                    \
1270     gen_helper_##name(ret, cpu_env, arg1, arg2, helper_tmp);      \
1271     tcg_temp_free_i32(helper_tmp);                                \
1272     } while (0)
1273 
1274 #define gen_helper_0e3i(name, arg1, arg2, arg3, arg4) do {        \
1275     TCGv_i32 helper_tmp = tcg_const_i32(arg4);                    \
1276     gen_helper_##name(cpu_env, arg1, arg2, arg3, helper_tmp);     \
1277     tcg_temp_free_i32(helper_tmp);                                \
1278     } while (0)
1279 
1280 #define DISAS_STOP       DISAS_TARGET_0
1281 #define DISAS_EXIT       DISAS_TARGET_1
1282 
1283 static const char regnames_HI[][4] = {
1284     "HI0", "HI1", "HI2", "HI3",
1285 };
1286 
1287 static const char regnames_LO[][4] = {
1288     "LO0", "LO1", "LO2", "LO3",
1289 };
1290 
1291 /* General purpose registers moves. */
1292 void gen_load_gpr(TCGv t, int reg)
1293 {
1294     if (reg == 0) {
1295         tcg_gen_movi_tl(t, 0);
1296     } else {
1297         tcg_gen_mov_tl(t, cpu_gpr[reg]);
1298     }
1299 }
1300 
1301 void gen_store_gpr(TCGv t, int reg)
1302 {
1303     if (reg != 0) {
1304         tcg_gen_mov_tl(cpu_gpr[reg], t);
1305     }
1306 }
1307 
1308 #if defined(TARGET_MIPS64)
1309 void gen_load_gpr_hi(TCGv_i64 t, int reg)
1310 {
1311     if (reg == 0) {
1312         tcg_gen_movi_i64(t, 0);
1313     } else {
1314         tcg_gen_mov_i64(t, cpu_gpr_hi[reg]);
1315     }
1316 }
1317 
1318 void gen_store_gpr_hi(TCGv_i64 t, int reg)
1319 {
1320     if (reg != 0) {
1321         tcg_gen_mov_i64(cpu_gpr_hi[reg], t);
1322     }
1323 }
1324 #endif /* TARGET_MIPS64 */
1325 
1326 /* Moves to/from shadow registers. */
1327 static inline void gen_load_srsgpr(int from, int to)
1328 {
1329     TCGv t0 = tcg_temp_new();
1330 
1331     if (from == 0) {
1332         tcg_gen_movi_tl(t0, 0);
1333     } else {
1334         TCGv_i32 t2 = tcg_temp_new_i32();
1335         TCGv_ptr addr = tcg_temp_new_ptr();
1336 
1337         tcg_gen_ld_i32(t2, cpu_env, offsetof(CPUMIPSState, CP0_SRSCtl));
1338         tcg_gen_shri_i32(t2, t2, CP0SRSCtl_PSS);
1339         tcg_gen_andi_i32(t2, t2, 0xf);
1340         tcg_gen_muli_i32(t2, t2, sizeof(target_ulong) * 32);
1341         tcg_gen_ext_i32_ptr(addr, t2);
1342         tcg_gen_add_ptr(addr, cpu_env, addr);
1343 
1344         tcg_gen_ld_tl(t0, addr, sizeof(target_ulong) * from);
1345         tcg_temp_free_ptr(addr);
1346         tcg_temp_free_i32(t2);
1347     }
1348     gen_store_gpr(t0, to);
1349     tcg_temp_free(t0);
1350 }
1351 
1352 static inline void gen_store_srsgpr(int from, int to)
1353 {
1354     if (to != 0) {
1355         TCGv t0 = tcg_temp_new();
1356         TCGv_i32 t2 = tcg_temp_new_i32();
1357         TCGv_ptr addr = tcg_temp_new_ptr();
1358 
1359         gen_load_gpr(t0, from);
1360         tcg_gen_ld_i32(t2, cpu_env, offsetof(CPUMIPSState, CP0_SRSCtl));
1361         tcg_gen_shri_i32(t2, t2, CP0SRSCtl_PSS);
1362         tcg_gen_andi_i32(t2, t2, 0xf);
1363         tcg_gen_muli_i32(t2, t2, sizeof(target_ulong) * 32);
1364         tcg_gen_ext_i32_ptr(addr, t2);
1365         tcg_gen_add_ptr(addr, cpu_env, addr);
1366 
1367         tcg_gen_st_tl(t0, addr, sizeof(target_ulong) * to);
1368         tcg_temp_free_ptr(addr);
1369         tcg_temp_free_i32(t2);
1370         tcg_temp_free(t0);
1371     }
1372 }
1373 
1374 /* Tests */
1375 static inline void gen_save_pc(target_ulong pc)
1376 {
1377     tcg_gen_movi_tl(cpu_PC, pc);
1378 }
1379 
1380 static inline void save_cpu_state(DisasContext *ctx, int do_save_pc)
1381 {
1382     LOG_DISAS("hflags %08x saved %08x\n", ctx->hflags, ctx->saved_hflags);
1383     if (do_save_pc && ctx->base.pc_next != ctx->saved_pc) {
1384         gen_save_pc(ctx->base.pc_next);
1385         ctx->saved_pc = ctx->base.pc_next;
1386     }
1387     if (ctx->hflags != ctx->saved_hflags) {
1388         tcg_gen_movi_i32(hflags, ctx->hflags);
1389         ctx->saved_hflags = ctx->hflags;
1390         switch (ctx->hflags & MIPS_HFLAG_BMASK_BASE) {
1391         case MIPS_HFLAG_BR:
1392             break;
1393         case MIPS_HFLAG_BC:
1394         case MIPS_HFLAG_BL:
1395         case MIPS_HFLAG_B:
1396             tcg_gen_movi_tl(btarget, ctx->btarget);
1397             break;
1398         }
1399     }
1400 }
1401 
1402 static inline void restore_cpu_state(CPUMIPSState *env, DisasContext *ctx)
1403 {
1404     ctx->saved_hflags = ctx->hflags;
1405     switch (ctx->hflags & MIPS_HFLAG_BMASK_BASE) {
1406     case MIPS_HFLAG_BR:
1407         break;
1408     case MIPS_HFLAG_BC:
1409     case MIPS_HFLAG_BL:
1410     case MIPS_HFLAG_B:
1411         ctx->btarget = env->btarget;
1412         break;
1413     }
1414 }
1415 
1416 void generate_exception_err(DisasContext *ctx, int excp, int err)
1417 {
1418     TCGv_i32 texcp = tcg_const_i32(excp);
1419     TCGv_i32 terr = tcg_const_i32(err);
1420     save_cpu_state(ctx, 1);
1421     gen_helper_raise_exception_err(cpu_env, texcp, terr);
1422     tcg_temp_free_i32(terr);
1423     tcg_temp_free_i32(texcp);
1424     ctx->base.is_jmp = DISAS_NORETURN;
1425 }
1426 
1427 void generate_exception(DisasContext *ctx, int excp)
1428 {
1429     gen_helper_0e0i(raise_exception, excp);
1430 }
1431 
1432 void generate_exception_end(DisasContext *ctx, int excp)
1433 {
1434     generate_exception_err(ctx, excp, 0);
1435 }
1436 
1437 void gen_reserved_instruction(DisasContext *ctx)
1438 {
1439     generate_exception_end(ctx, EXCP_RI);
1440 }
1441 
1442 /* Floating point register moves. */
1443 void gen_load_fpr32(DisasContext *ctx, TCGv_i32 t, int reg)
1444 {
1445     if (ctx->hflags & MIPS_HFLAG_FRE) {
1446         generate_exception(ctx, EXCP_RI);
1447     }
1448     tcg_gen_extrl_i64_i32(t, fpu_f64[reg]);
1449 }
1450 
1451 void gen_store_fpr32(DisasContext *ctx, TCGv_i32 t, int reg)
1452 {
1453     TCGv_i64 t64;
1454     if (ctx->hflags & MIPS_HFLAG_FRE) {
1455         generate_exception(ctx, EXCP_RI);
1456     }
1457     t64 = tcg_temp_new_i64();
1458     tcg_gen_extu_i32_i64(t64, t);
1459     tcg_gen_deposit_i64(fpu_f64[reg], fpu_f64[reg], t64, 0, 32);
1460     tcg_temp_free_i64(t64);
1461 }
1462 
1463 static void gen_load_fpr32h(DisasContext *ctx, TCGv_i32 t, int reg)
1464 {
1465     if (ctx->hflags & MIPS_HFLAG_F64) {
1466         tcg_gen_extrh_i64_i32(t, fpu_f64[reg]);
1467     } else {
1468         gen_load_fpr32(ctx, t, reg | 1);
1469     }
1470 }
1471 
1472 static void gen_store_fpr32h(DisasContext *ctx, TCGv_i32 t, int reg)
1473 {
1474     if (ctx->hflags & MIPS_HFLAG_F64) {
1475         TCGv_i64 t64 = tcg_temp_new_i64();
1476         tcg_gen_extu_i32_i64(t64, t);
1477         tcg_gen_deposit_i64(fpu_f64[reg], fpu_f64[reg], t64, 32, 32);
1478         tcg_temp_free_i64(t64);
1479     } else {
1480         gen_store_fpr32(ctx, t, reg | 1);
1481     }
1482 }
1483 
1484 void gen_load_fpr64(DisasContext *ctx, TCGv_i64 t, int reg)
1485 {
1486     if (ctx->hflags & MIPS_HFLAG_F64) {
1487         tcg_gen_mov_i64(t, fpu_f64[reg]);
1488     } else {
1489         tcg_gen_concat32_i64(t, fpu_f64[reg & ~1], fpu_f64[reg | 1]);
1490     }
1491 }
1492 
1493 void gen_store_fpr64(DisasContext *ctx, TCGv_i64 t, int reg)
1494 {
1495     if (ctx->hflags & MIPS_HFLAG_F64) {
1496         tcg_gen_mov_i64(fpu_f64[reg], t);
1497     } else {
1498         TCGv_i64 t0;
1499         tcg_gen_deposit_i64(fpu_f64[reg & ~1], fpu_f64[reg & ~1], t, 0, 32);
1500         t0 = tcg_temp_new_i64();
1501         tcg_gen_shri_i64(t0, t, 32);
1502         tcg_gen_deposit_i64(fpu_f64[reg | 1], fpu_f64[reg | 1], t0, 0, 32);
1503         tcg_temp_free_i64(t0);
1504     }
1505 }
1506 
1507 int get_fp_bit(int cc)
1508 {
1509     if (cc) {
1510         return 24 + cc;
1511     } else {
1512         return 23;
1513     }
1514 }
1515 
1516 /* Addresses computation */
1517 void gen_op_addr_add(DisasContext *ctx, TCGv ret, TCGv arg0, TCGv arg1)
1518 {
1519     tcg_gen_add_tl(ret, arg0, arg1);
1520 
1521 #if defined(TARGET_MIPS64)
1522     if (ctx->hflags & MIPS_HFLAG_AWRAP) {
1523         tcg_gen_ext32s_i64(ret, ret);
1524     }
1525 #endif
1526 }
1527 
1528 static inline void gen_op_addr_addi(DisasContext *ctx, TCGv ret, TCGv base,
1529                                     target_long ofs)
1530 {
1531     tcg_gen_addi_tl(ret, base, ofs);
1532 
1533 #if defined(TARGET_MIPS64)
1534     if (ctx->hflags & MIPS_HFLAG_AWRAP) {
1535         tcg_gen_ext32s_i64(ret, ret);
1536     }
1537 #endif
1538 }
1539 
1540 /* Addresses computation (translation time) */
1541 static target_long addr_add(DisasContext *ctx, target_long base,
1542                             target_long offset)
1543 {
1544     target_long sum = base + offset;
1545 
1546 #if defined(TARGET_MIPS64)
1547     if (ctx->hflags & MIPS_HFLAG_AWRAP) {
1548         sum = (int32_t)sum;
1549     }
1550 #endif
1551     return sum;
1552 }
1553 
1554 /* Sign-extract the low 32-bits to a target_long.  */
1555 void gen_move_low32(TCGv ret, TCGv_i64 arg)
1556 {
1557 #if defined(TARGET_MIPS64)
1558     tcg_gen_ext32s_i64(ret, arg);
1559 #else
1560     tcg_gen_extrl_i64_i32(ret, arg);
1561 #endif
1562 }
1563 
1564 /* Sign-extract the high 32-bits to a target_long.  */
1565 void gen_move_high32(TCGv ret, TCGv_i64 arg)
1566 {
1567 #if defined(TARGET_MIPS64)
1568     tcg_gen_sari_i64(ret, arg, 32);
1569 #else
1570     tcg_gen_extrh_i64_i32(ret, arg);
1571 #endif
1572 }
1573 
1574 bool check_cp0_enabled(DisasContext *ctx)
1575 {
1576     if (unlikely(!(ctx->hflags & MIPS_HFLAG_CP0))) {
1577         generate_exception_end(ctx, EXCP_CpU);
1578         return false;
1579     }
1580     return true;
1581 }
1582 
1583 void check_cp1_enabled(DisasContext *ctx)
1584 {
1585     if (unlikely(!(ctx->hflags & MIPS_HFLAG_FPU))) {
1586         generate_exception_err(ctx, EXCP_CpU, 1);
1587     }
1588 }
1589 
1590 /*
1591  * Verify that the processor is running with COP1X instructions enabled.
1592  * This is associated with the nabla symbol in the MIPS32 and MIPS64
1593  * opcode tables.
1594  */
1595 void check_cop1x(DisasContext *ctx)
1596 {
1597     if (unlikely(!(ctx->hflags & MIPS_HFLAG_COP1X))) {
1598         gen_reserved_instruction(ctx);
1599     }
1600 }
1601 
1602 /*
1603  * Verify that the processor is running with 64-bit floating-point
1604  * operations enabled.
1605  */
1606 void check_cp1_64bitmode(DisasContext *ctx)
1607 {
1608     if (unlikely(~ctx->hflags & (MIPS_HFLAG_F64 | MIPS_HFLAG_COP1X))) {
1609         gen_reserved_instruction(ctx);
1610     }
1611 }
1612 
1613 /*
1614  * Verify if floating point register is valid; an operation is not defined
1615  * if bit 0 of any register specification is set and the FR bit in the
1616  * Status register equals zero, since the register numbers specify an
1617  * even-odd pair of adjacent coprocessor general registers. When the FR bit
1618  * in the Status register equals one, both even and odd register numbers
1619  * are valid. This limitation exists only for 64 bit wide (d,l,ps) registers.
1620  *
1621  * Multiple 64 bit wide registers can be checked by calling
1622  * gen_op_cp1_registers(freg1 | freg2 | ... | fregN);
1623  */
1624 void check_cp1_registers(DisasContext *ctx, int regs)
1625 {
1626     if (unlikely(!(ctx->hflags & MIPS_HFLAG_F64) && (regs & 1))) {
1627         gen_reserved_instruction(ctx);
1628     }
1629 }
1630 
1631 /*
1632  * Verify that the processor is running with DSP instructions enabled.
1633  * This is enabled by CP0 Status register MX(24) bit.
1634  */
1635 static inline void check_dsp(DisasContext *ctx)
1636 {
1637     if (unlikely(!(ctx->hflags & MIPS_HFLAG_DSP))) {
1638         if (ctx->insn_flags & ASE_DSP) {
1639             generate_exception_end(ctx, EXCP_DSPDIS);
1640         } else {
1641             gen_reserved_instruction(ctx);
1642         }
1643     }
1644 }
1645 
1646 static inline void check_dsp_r2(DisasContext *ctx)
1647 {
1648     if (unlikely(!(ctx->hflags & MIPS_HFLAG_DSP_R2))) {
1649         if (ctx->insn_flags & ASE_DSP) {
1650             generate_exception_end(ctx, EXCP_DSPDIS);
1651         } else {
1652             gen_reserved_instruction(ctx);
1653         }
1654     }
1655 }
1656 
1657 static inline void check_dsp_r3(DisasContext *ctx)
1658 {
1659     if (unlikely(!(ctx->hflags & MIPS_HFLAG_DSP_R3))) {
1660         if (ctx->insn_flags & ASE_DSP) {
1661             generate_exception_end(ctx, EXCP_DSPDIS);
1662         } else {
1663             gen_reserved_instruction(ctx);
1664         }
1665     }
1666 }
1667 
1668 /*
1669  * This code generates a "reserved instruction" exception if the
1670  * CPU does not support the instruction set corresponding to flags.
1671  */
1672 void check_insn(DisasContext *ctx, uint64_t flags)
1673 {
1674     if (unlikely(!(ctx->insn_flags & flags))) {
1675         gen_reserved_instruction(ctx);
1676     }
1677 }
1678 
1679 /*
1680  * This code generates a "reserved instruction" exception if the
1681  * CPU has corresponding flag set which indicates that the instruction
1682  * has been removed.
1683  */
1684 static inline void check_insn_opc_removed(DisasContext *ctx, uint64_t flags)
1685 {
1686     if (unlikely(ctx->insn_flags & flags)) {
1687         gen_reserved_instruction(ctx);
1688     }
1689 }
1690 
1691 /*
1692  * The Linux kernel traps certain reserved instruction exceptions to
1693  * emulate the corresponding instructions. QEMU is the kernel in user
1694  * mode, so those traps are emulated by accepting the instructions.
1695  *
1696  * A reserved instruction exception is generated for flagged CPUs if
1697  * QEMU runs in system mode.
1698  */
1699 static inline void check_insn_opc_user_only(DisasContext *ctx, uint64_t flags)
1700 {
1701 #ifndef CONFIG_USER_ONLY
1702     check_insn_opc_removed(ctx, flags);
1703 #endif
1704 }
1705 
1706 /*
1707  * This code generates a "reserved instruction" exception if the
1708  * CPU does not support 64-bit paired-single (PS) floating point data type.
1709  */
1710 static inline void check_ps(DisasContext *ctx)
1711 {
1712     if (unlikely(!ctx->ps)) {
1713         generate_exception(ctx, EXCP_RI);
1714     }
1715     check_cp1_64bitmode(ctx);
1716 }
1717 
1718 /*
1719  * This code generates a "reserved instruction" exception if cpu is not
1720  * 64-bit or 64-bit instructions are not enabled.
1721  */
1722 void check_mips_64(DisasContext *ctx)
1723 {
1724     if (unlikely((TARGET_LONG_BITS != 64) || !(ctx->hflags & MIPS_HFLAG_64))) {
1725         gen_reserved_instruction(ctx);
1726     }
1727 }
1728 
1729 #ifndef CONFIG_USER_ONLY
1730 static inline void check_mvh(DisasContext *ctx)
1731 {
1732     if (unlikely(!ctx->mvh)) {
1733         generate_exception(ctx, EXCP_RI);
1734     }
1735 }
1736 #endif
1737 
1738 /*
1739  * This code generates a "reserved instruction" exception if the
1740  * Config5 XNP bit is set.
1741  */
1742 static inline void check_xnp(DisasContext *ctx)
1743 {
1744     if (unlikely(ctx->CP0_Config5 & (1 << CP0C5_XNP))) {
1745         gen_reserved_instruction(ctx);
1746     }
1747 }
1748 
1749 #ifndef CONFIG_USER_ONLY
1750 /*
1751  * This code generates a "reserved instruction" exception if the
1752  * Config3 PW bit is NOT set.
1753  */
1754 static inline void check_pw(DisasContext *ctx)
1755 {
1756     if (unlikely(!(ctx->CP0_Config3 & (1 << CP0C3_PW)))) {
1757         gen_reserved_instruction(ctx);
1758     }
1759 }
1760 #endif
1761 
1762 /*
1763  * This code generates a "reserved instruction" exception if the
1764  * Config3 MT bit is NOT set.
1765  */
1766 static inline void check_mt(DisasContext *ctx)
1767 {
1768     if (unlikely(!(ctx->CP0_Config3 & (1 << CP0C3_MT)))) {
1769         gen_reserved_instruction(ctx);
1770     }
1771 }
1772 
1773 #ifndef CONFIG_USER_ONLY
1774 /*
1775  * This code generates a "coprocessor unusable" exception if CP0 is not
1776  * available, and, if that is not the case, generates a "reserved instruction"
1777  * exception if the Config5 MT bit is NOT set. This is needed for availability
1778  * control of some of MT ASE instructions.
1779  */
1780 static inline void check_cp0_mt(DisasContext *ctx)
1781 {
1782     if (unlikely(!(ctx->hflags & MIPS_HFLAG_CP0))) {
1783         generate_exception_end(ctx, EXCP_CpU);
1784     } else {
1785         if (unlikely(!(ctx->CP0_Config3 & (1 << CP0C3_MT)))) {
1786             gen_reserved_instruction(ctx);
1787         }
1788     }
1789 }
1790 #endif
1791 
1792 /*
1793  * This code generates a "reserved instruction" exception if the
1794  * Config5 NMS bit is set.
1795  */
1796 static inline void check_nms(DisasContext *ctx)
1797 {
1798     if (unlikely(ctx->CP0_Config5 & (1 << CP0C5_NMS))) {
1799         gen_reserved_instruction(ctx);
1800     }
1801 }
1802 
1803 /*
1804  * This code generates a "reserved instruction" exception if the
1805  * Config5 NMS bit is set, and Config1 DL, Config1 IL, Config2 SL,
1806  * Config2 TL, and Config5 L2C are unset.
1807  */
1808 static inline void check_nms_dl_il_sl_tl_l2c(DisasContext *ctx)
1809 {
1810     if (unlikely((ctx->CP0_Config5 & (1 << CP0C5_NMS)) &&
1811                  !(ctx->CP0_Config1 & (1 << CP0C1_DL)) &&
1812                  !(ctx->CP0_Config1 & (1 << CP0C1_IL)) &&
1813                  !(ctx->CP0_Config2 & (1 << CP0C2_SL)) &&
1814                  !(ctx->CP0_Config2 & (1 << CP0C2_TL)) &&
1815                  !(ctx->CP0_Config5 & (1 << CP0C5_L2C)))) {
1816         gen_reserved_instruction(ctx);
1817     }
1818 }
1819 
1820 /*
1821  * This code generates a "reserved instruction" exception if the
1822  * Config5 EVA bit is NOT set.
1823  */
1824 static inline void check_eva(DisasContext *ctx)
1825 {
1826     if (unlikely(!(ctx->CP0_Config5 & (1 << CP0C5_EVA)))) {
1827         gen_reserved_instruction(ctx);
1828     }
1829 }
1830 
1831 
1832 /*
1833  * Define small wrappers for gen_load_fpr* so that we have a uniform
1834  * calling interface for 32 and 64-bit FPRs.  No sense in changing
1835  * all callers for gen_load_fpr32 when we need the CTX parameter for
1836  * this one use.
1837  */
1838 #define gen_ldcmp_fpr32(ctx, x, y) gen_load_fpr32(ctx, x, y)
1839 #define gen_ldcmp_fpr64(ctx, x, y) gen_load_fpr64(ctx, x, y)
1840 #define FOP_CONDS(type, abs, fmt, ifmt, bits)                                 \
1841 static inline void gen_cmp ## type ## _ ## fmt(DisasContext *ctx, int n,      \
1842                                                int ft, int fs, int cc)        \
1843 {                                                                             \
1844     TCGv_i##bits fp0 = tcg_temp_new_i##bits();                                \
1845     TCGv_i##bits fp1 = tcg_temp_new_i##bits();                                \
1846     switch (ifmt) {                                                           \
1847     case FMT_PS:                                                              \
1848         check_ps(ctx);                                                        \
1849         break;                                                                \
1850     case FMT_D:                                                               \
1851         if (abs) {                                                            \
1852             check_cop1x(ctx);                                                 \
1853         }                                                                     \
1854         check_cp1_registers(ctx, fs | ft);                                    \
1855         break;                                                                \
1856     case FMT_S:                                                               \
1857         if (abs) {                                                            \
1858             check_cop1x(ctx);                                                 \
1859         }                                                                     \
1860         break;                                                                \
1861     }                                                                         \
1862     gen_ldcmp_fpr##bits(ctx, fp0, fs);                                        \
1863     gen_ldcmp_fpr##bits(ctx, fp1, ft);                                        \
1864     switch (n) {                                                              \
1865     case  0:                                                                  \
1866         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _f, fp0, fp1, cc);         \
1867     break;                                                                    \
1868     case  1:                                                                  \
1869         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _un, fp0, fp1, cc);        \
1870     break;                                                                    \
1871     case  2:                                                                  \
1872         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _eq, fp0, fp1, cc);        \
1873     break;                                                                    \
1874     case  3:                                                                  \
1875         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ueq, fp0, fp1, cc);       \
1876     break;                                                                    \
1877     case  4:                                                                  \
1878         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _olt, fp0, fp1, cc);       \
1879     break;                                                                    \
1880     case  5:                                                                  \
1881         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ult, fp0, fp1, cc);       \
1882     break;                                                                    \
1883     case  6:                                                                  \
1884         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ole, fp0, fp1, cc);       \
1885     break;                                                                    \
1886     case  7:                                                                  \
1887         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ule, fp0, fp1, cc);       \
1888     break;                                                                    \
1889     case  8:                                                                  \
1890         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _sf, fp0, fp1, cc);        \
1891     break;                                                                    \
1892     case  9:                                                                  \
1893         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngle, fp0, fp1, cc);      \
1894     break;                                                                    \
1895     case 10:                                                                  \
1896         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _seq, fp0, fp1, cc);       \
1897     break;                                                                    \
1898     case 11:                                                                  \
1899         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngl, fp0, fp1, cc);       \
1900     break;                                                                    \
1901     case 12:                                                                  \
1902         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _lt, fp0, fp1, cc);        \
1903     break;                                                                    \
1904     case 13:                                                                  \
1905         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _nge, fp0, fp1, cc);       \
1906     break;                                                                    \
1907     case 14:                                                                  \
1908         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _le, fp0, fp1, cc);        \
1909     break;                                                                    \
1910     case 15:                                                                  \
1911         gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngt, fp0, fp1, cc);       \
1912     break;                                                                    \
1913     default:                                                                  \
1914         abort();                                                              \
1915     }                                                                         \
1916     tcg_temp_free_i##bits(fp0);                                               \
1917     tcg_temp_free_i##bits(fp1);                                               \
1918 }
1919 
1920 FOP_CONDS(, 0, d, FMT_D, 64)
1921 FOP_CONDS(abs, 1, d, FMT_D, 64)
1922 FOP_CONDS(, 0, s, FMT_S, 32)
1923 FOP_CONDS(abs, 1, s, FMT_S, 32)
1924 FOP_CONDS(, 0, ps, FMT_PS, 64)
1925 FOP_CONDS(abs, 1, ps, FMT_PS, 64)
1926 #undef FOP_CONDS
1927 
1928 #define FOP_CONDNS(fmt, ifmt, bits, STORE)                              \
1929 static inline void gen_r6_cmp_ ## fmt(DisasContext *ctx, int n,         \
1930                                       int ft, int fs, int fd)           \
1931 {                                                                       \
1932     TCGv_i ## bits fp0 = tcg_temp_new_i ## bits();                      \
1933     TCGv_i ## bits fp1 = tcg_temp_new_i ## bits();                      \
1934     if (ifmt == FMT_D) {                                                \
1935         check_cp1_registers(ctx, fs | ft | fd);                         \
1936     }                                                                   \
1937     gen_ldcmp_fpr ## bits(ctx, fp0, fs);                                \
1938     gen_ldcmp_fpr ## bits(ctx, fp1, ft);                                \
1939     switch (n) {                                                        \
1940     case  0:                                                            \
1941         gen_helper_r6_cmp_ ## fmt ## _af(fp0, cpu_env, fp0, fp1);       \
1942         break;                                                          \
1943     case  1:                                                            \
1944         gen_helper_r6_cmp_ ## fmt ## _un(fp0, cpu_env, fp0, fp1);       \
1945         break;                                                          \
1946     case  2:                                                            \
1947         gen_helper_r6_cmp_ ## fmt ## _eq(fp0, cpu_env, fp0, fp1);       \
1948         break;                                                          \
1949     case  3:                                                            \
1950         gen_helper_r6_cmp_ ## fmt ## _ueq(fp0, cpu_env, fp0, fp1);      \
1951         break;                                                          \
1952     case  4:                                                            \
1953         gen_helper_r6_cmp_ ## fmt ## _lt(fp0, cpu_env, fp0, fp1);       \
1954         break;                                                          \
1955     case  5:                                                            \
1956         gen_helper_r6_cmp_ ## fmt ## _ult(fp0, cpu_env, fp0, fp1);      \
1957         break;                                                          \
1958     case  6:                                                            \
1959         gen_helper_r6_cmp_ ## fmt ## _le(fp0, cpu_env, fp0, fp1);       \
1960         break;                                                          \
1961     case  7:                                                            \
1962         gen_helper_r6_cmp_ ## fmt ## _ule(fp0, cpu_env, fp0, fp1);      \
1963         break;                                                          \
1964     case  8:                                                            \
1965         gen_helper_r6_cmp_ ## fmt ## _saf(fp0, cpu_env, fp0, fp1);      \
1966         break;                                                          \
1967     case  9:                                                            \
1968         gen_helper_r6_cmp_ ## fmt ## _sun(fp0, cpu_env, fp0, fp1);      \
1969         break;                                                          \
1970     case 10:                                                            \
1971         gen_helper_r6_cmp_ ## fmt ## _seq(fp0, cpu_env, fp0, fp1);      \
1972         break;                                                          \
1973     case 11:                                                            \
1974         gen_helper_r6_cmp_ ## fmt ## _sueq(fp0, cpu_env, fp0, fp1);     \
1975         break;                                                          \
1976     case 12:                                                            \
1977         gen_helper_r6_cmp_ ## fmt ## _slt(fp0, cpu_env, fp0, fp1);      \
1978         break;                                                          \
1979     case 13:                                                            \
1980         gen_helper_r6_cmp_ ## fmt ## _sult(fp0, cpu_env, fp0, fp1);     \
1981         break;                                                          \
1982     case 14:                                                            \
1983         gen_helper_r6_cmp_ ## fmt ## _sle(fp0, cpu_env, fp0, fp1);      \
1984         break;                                                          \
1985     case 15:                                                            \
1986         gen_helper_r6_cmp_ ## fmt ## _sule(fp0, cpu_env, fp0, fp1);     \
1987         break;                                                          \
1988     case 17:                                                            \
1989         gen_helper_r6_cmp_ ## fmt ## _or(fp0, cpu_env, fp0, fp1);       \
1990         break;                                                          \
1991     case 18:                                                            \
1992         gen_helper_r6_cmp_ ## fmt ## _une(fp0, cpu_env, fp0, fp1);      \
1993         break;                                                          \
1994     case 19:                                                            \
1995         gen_helper_r6_cmp_ ## fmt ## _ne(fp0, cpu_env, fp0, fp1);       \
1996         break;                                                          \
1997     case 25:                                                            \
1998         gen_helper_r6_cmp_ ## fmt ## _sor(fp0, cpu_env, fp0, fp1);      \
1999         break;                                                          \
2000     case 26:                                                            \
2001         gen_helper_r6_cmp_ ## fmt ## _sune(fp0, cpu_env, fp0, fp1);     \
2002         break;                                                          \
2003     case 27:                                                            \
2004         gen_helper_r6_cmp_ ## fmt ## _sne(fp0, cpu_env, fp0, fp1);      \
2005         break;                                                          \
2006     default:                                                            \
2007         abort();                                                        \
2008     }                                                                   \
2009     STORE;                                                              \
2010     tcg_temp_free_i ## bits(fp0);                                       \
2011     tcg_temp_free_i ## bits(fp1);                                       \
2012 }
2013 
2014 FOP_CONDNS(d, FMT_D, 64, gen_store_fpr64(ctx, fp0, fd))
2015 FOP_CONDNS(s, FMT_S, 32, gen_store_fpr32(ctx, fp0, fd))
2016 #undef FOP_CONDNS
2017 #undef gen_ldcmp_fpr32
2018 #undef gen_ldcmp_fpr64
2019 
2020 /* load/store instructions. */
2021 #ifdef CONFIG_USER_ONLY
2022 #define OP_LD_ATOMIC(insn, fname)                                          \
2023 static inline void op_ld_##insn(TCGv ret, TCGv arg1, int mem_idx,          \
2024                                 DisasContext *ctx)                         \
2025 {                                                                          \
2026     TCGv t0 = tcg_temp_new();                                              \
2027     tcg_gen_mov_tl(t0, arg1);                                              \
2028     tcg_gen_qemu_##fname(ret, arg1, ctx->mem_idx);                         \
2029     tcg_gen_st_tl(t0, cpu_env, offsetof(CPUMIPSState, lladdr));            \
2030     tcg_gen_st_tl(ret, cpu_env, offsetof(CPUMIPSState, llval));            \
2031     tcg_temp_free(t0);                                                     \
2032 }
2033 #else
2034 #define OP_LD_ATOMIC(insn, fname)                                          \
2035 static inline void op_ld_##insn(TCGv ret, TCGv arg1, int mem_idx,          \
2036                                 DisasContext *ctx)                         \
2037 {                                                                          \
2038     gen_helper_1e1i(insn, ret, arg1, mem_idx);                             \
2039 }
2040 #endif
2041 OP_LD_ATOMIC(ll, ld32s);
2042 #if defined(TARGET_MIPS64)
2043 OP_LD_ATOMIC(lld, ld64);
2044 #endif
2045 #undef OP_LD_ATOMIC
2046 
2047 void gen_base_offset_addr(DisasContext *ctx, TCGv addr, int base, int offset)
2048 {
2049     if (base == 0) {
2050         tcg_gen_movi_tl(addr, offset);
2051     } else if (offset == 0) {
2052         gen_load_gpr(addr, base);
2053     } else {
2054         tcg_gen_movi_tl(addr, offset);
2055         gen_op_addr_add(ctx, addr, cpu_gpr[base], addr);
2056     }
2057 }
2058 
2059 static target_ulong pc_relative_pc(DisasContext *ctx)
2060 {
2061     target_ulong pc = ctx->base.pc_next;
2062 
2063     if (ctx->hflags & MIPS_HFLAG_BMASK) {
2064         int branch_bytes = ctx->hflags & MIPS_HFLAG_BDS16 ? 2 : 4;
2065 
2066         pc -= branch_bytes;
2067     }
2068 
2069     pc &= ~(target_ulong)3;
2070     return pc;
2071 }
2072 
2073 /* Load */
2074 static void gen_ld(DisasContext *ctx, uint32_t opc,
2075                    int rt, int base, int offset)
2076 {
2077     TCGv t0, t1, t2;
2078     int mem_idx = ctx->mem_idx;
2079 
2080     if (rt == 0 && ctx->insn_flags & (INSN_LOONGSON2E | INSN_LOONGSON2F |
2081                                       INSN_LOONGSON3A)) {
2082         /*
2083          * Loongson CPU uses a load to zero register for prefetch.
2084          * We emulate it as a NOP. On other CPU we must perform the
2085          * actual memory access.
2086          */
2087         return;
2088     }
2089 
2090     t0 = tcg_temp_new();
2091     gen_base_offset_addr(ctx, t0, base, offset);
2092 
2093     switch (opc) {
2094 #if defined(TARGET_MIPS64)
2095     case OPC_LWU:
2096         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEUL |
2097                            ctx->default_tcg_memop_mask);
2098         gen_store_gpr(t0, rt);
2099         break;
2100     case OPC_LD:
2101         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEQ |
2102                            ctx->default_tcg_memop_mask);
2103         gen_store_gpr(t0, rt);
2104         break;
2105     case OPC_LLD:
2106     case R6_OPC_LLD:
2107         op_ld_lld(t0, t0, mem_idx, ctx);
2108         gen_store_gpr(t0, rt);
2109         break;
2110     case OPC_LDL:
2111         t1 = tcg_temp_new();
2112         /*
2113          * Do a byte access to possibly trigger a page
2114          * fault with the unaligned address.
2115          */
2116         tcg_gen_qemu_ld_tl(t1, t0, mem_idx, MO_UB);
2117         tcg_gen_andi_tl(t1, t0, 7);
2118 #ifndef TARGET_WORDS_BIGENDIAN
2119         tcg_gen_xori_tl(t1, t1, 7);
2120 #endif
2121         tcg_gen_shli_tl(t1, t1, 3);
2122         tcg_gen_andi_tl(t0, t0, ~7);
2123         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEQ);
2124         tcg_gen_shl_tl(t0, t0, t1);
2125         t2 = tcg_const_tl(-1);
2126         tcg_gen_shl_tl(t2, t2, t1);
2127         gen_load_gpr(t1, rt);
2128         tcg_gen_andc_tl(t1, t1, t2);
2129         tcg_temp_free(t2);
2130         tcg_gen_or_tl(t0, t0, t1);
2131         tcg_temp_free(t1);
2132         gen_store_gpr(t0, rt);
2133         break;
2134     case OPC_LDR:
2135         t1 = tcg_temp_new();
2136         /*
2137          * Do a byte access to possibly trigger a page
2138          * fault with the unaligned address.
2139          */
2140         tcg_gen_qemu_ld_tl(t1, t0, mem_idx, MO_UB);
2141         tcg_gen_andi_tl(t1, t0, 7);
2142 #ifdef TARGET_WORDS_BIGENDIAN
2143         tcg_gen_xori_tl(t1, t1, 7);
2144 #endif
2145         tcg_gen_shli_tl(t1, t1, 3);
2146         tcg_gen_andi_tl(t0, t0, ~7);
2147         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEQ);
2148         tcg_gen_shr_tl(t0, t0, t1);
2149         tcg_gen_xori_tl(t1, t1, 63);
2150         t2 = tcg_const_tl(0xfffffffffffffffeull);
2151         tcg_gen_shl_tl(t2, t2, t1);
2152         gen_load_gpr(t1, rt);
2153         tcg_gen_and_tl(t1, t1, t2);
2154         tcg_temp_free(t2);
2155         tcg_gen_or_tl(t0, t0, t1);
2156         tcg_temp_free(t1);
2157         gen_store_gpr(t0, rt);
2158         break;
2159     case OPC_LDPC:
2160         t1 = tcg_const_tl(pc_relative_pc(ctx));
2161         gen_op_addr_add(ctx, t0, t0, t1);
2162         tcg_temp_free(t1);
2163         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEQ);
2164         gen_store_gpr(t0, rt);
2165         break;
2166 #endif
2167     case OPC_LWPC:
2168         t1 = tcg_const_tl(pc_relative_pc(ctx));
2169         gen_op_addr_add(ctx, t0, t0, t1);
2170         tcg_temp_free(t1);
2171         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TESL);
2172         gen_store_gpr(t0, rt);
2173         break;
2174     case OPC_LWE:
2175         mem_idx = MIPS_HFLAG_UM;
2176         /* fall through */
2177     case OPC_LW:
2178         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TESL |
2179                            ctx->default_tcg_memop_mask);
2180         gen_store_gpr(t0, rt);
2181         break;
2182     case OPC_LHE:
2183         mem_idx = MIPS_HFLAG_UM;
2184         /* fall through */
2185     case OPC_LH:
2186         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TESW |
2187                            ctx->default_tcg_memop_mask);
2188         gen_store_gpr(t0, rt);
2189         break;
2190     case OPC_LHUE:
2191         mem_idx = MIPS_HFLAG_UM;
2192         /* fall through */
2193     case OPC_LHU:
2194         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEUW |
2195                            ctx->default_tcg_memop_mask);
2196         gen_store_gpr(t0, rt);
2197         break;
2198     case OPC_LBE:
2199         mem_idx = MIPS_HFLAG_UM;
2200         /* fall through */
2201     case OPC_LB:
2202         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_SB);
2203         gen_store_gpr(t0, rt);
2204         break;
2205     case OPC_LBUE:
2206         mem_idx = MIPS_HFLAG_UM;
2207         /* fall through */
2208     case OPC_LBU:
2209         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_UB);
2210         gen_store_gpr(t0, rt);
2211         break;
2212     case OPC_LWLE:
2213         mem_idx = MIPS_HFLAG_UM;
2214         /* fall through */
2215     case OPC_LWL:
2216         t1 = tcg_temp_new();
2217         /*
2218          * Do a byte access to possibly trigger a page
2219          * fault with the unaligned address.
2220          */
2221         tcg_gen_qemu_ld_tl(t1, t0, mem_idx, MO_UB);
2222         tcg_gen_andi_tl(t1, t0, 3);
2223 #ifndef TARGET_WORDS_BIGENDIAN
2224         tcg_gen_xori_tl(t1, t1, 3);
2225 #endif
2226         tcg_gen_shli_tl(t1, t1, 3);
2227         tcg_gen_andi_tl(t0, t0, ~3);
2228         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEUL);
2229         tcg_gen_shl_tl(t0, t0, t1);
2230         t2 = tcg_const_tl(-1);
2231         tcg_gen_shl_tl(t2, t2, t1);
2232         gen_load_gpr(t1, rt);
2233         tcg_gen_andc_tl(t1, t1, t2);
2234         tcg_temp_free(t2);
2235         tcg_gen_or_tl(t0, t0, t1);
2236         tcg_temp_free(t1);
2237         tcg_gen_ext32s_tl(t0, t0);
2238         gen_store_gpr(t0, rt);
2239         break;
2240     case OPC_LWRE:
2241         mem_idx = MIPS_HFLAG_UM;
2242         /* fall through */
2243     case OPC_LWR:
2244         t1 = tcg_temp_new();
2245         /*
2246          * Do a byte access to possibly trigger a page
2247          * fault with the unaligned address.
2248          */
2249         tcg_gen_qemu_ld_tl(t1, t0, mem_idx, MO_UB);
2250         tcg_gen_andi_tl(t1, t0, 3);
2251 #ifdef TARGET_WORDS_BIGENDIAN
2252         tcg_gen_xori_tl(t1, t1, 3);
2253 #endif
2254         tcg_gen_shli_tl(t1, t1, 3);
2255         tcg_gen_andi_tl(t0, t0, ~3);
2256         tcg_gen_qemu_ld_tl(t0, t0, mem_idx, MO_TEUL);
2257         tcg_gen_shr_tl(t0, t0, t1);
2258         tcg_gen_xori_tl(t1, t1, 31);
2259         t2 = tcg_const_tl(0xfffffffeull);
2260         tcg_gen_shl_tl(t2, t2, t1);
2261         gen_load_gpr(t1, rt);
2262         tcg_gen_and_tl(t1, t1, t2);
2263         tcg_temp_free(t2);
2264         tcg_gen_or_tl(t0, t0, t1);
2265         tcg_temp_free(t1);
2266         tcg_gen_ext32s_tl(t0, t0);
2267         gen_store_gpr(t0, rt);
2268         break;
2269     case OPC_LLE:
2270         mem_idx = MIPS_HFLAG_UM;
2271         /* fall through */
2272     case OPC_LL:
2273     case R6_OPC_LL:
2274         op_ld_ll(t0, t0, mem_idx, ctx);
2275         gen_store_gpr(t0, rt);
2276         break;
2277     }
2278     tcg_temp_free(t0);
2279 }
2280 
2281 static void gen_llwp(DisasContext *ctx, uint32_t base, int16_t offset,
2282                     uint32_t reg1, uint32_t reg2)
2283 {
2284     TCGv taddr = tcg_temp_new();
2285     TCGv_i64 tval = tcg_temp_new_i64();
2286     TCGv tmp1 = tcg_temp_new();
2287     TCGv tmp2 = tcg_temp_new();
2288 
2289     gen_base_offset_addr(ctx, taddr, base, offset);
2290     tcg_gen_qemu_ld64(tval, taddr, ctx->mem_idx);
2291 #ifdef TARGET_WORDS_BIGENDIAN
2292     tcg_gen_extr_i64_tl(tmp2, tmp1, tval);
2293 #else
2294     tcg_gen_extr_i64_tl(tmp1, tmp2, tval);
2295 #endif
2296     gen_store_gpr(tmp1, reg1);
2297     tcg_temp_free(tmp1);
2298     gen_store_gpr(tmp2, reg2);
2299     tcg_temp_free(tmp2);
2300     tcg_gen_st_i64(tval, cpu_env, offsetof(CPUMIPSState, llval_wp));
2301     tcg_temp_free_i64(tval);
2302     tcg_gen_st_tl(taddr, cpu_env, offsetof(CPUMIPSState, lladdr));
2303     tcg_temp_free(taddr);
2304 }
2305 
2306 /* Store */
2307 static void gen_st(DisasContext *ctx, uint32_t opc, int rt,
2308                    int base, int offset)
2309 {
2310     TCGv t0 = tcg_temp_new();
2311     TCGv t1 = tcg_temp_new();
2312     int mem_idx = ctx->mem_idx;
2313 
2314     gen_base_offset_addr(ctx, t0, base, offset);
2315     gen_load_gpr(t1, rt);
2316     switch (opc) {
2317 #if defined(TARGET_MIPS64)
2318     case OPC_SD:
2319         tcg_gen_qemu_st_tl(t1, t0, mem_idx, MO_TEQ |
2320                            ctx->default_tcg_memop_mask);
2321         break;
2322     case OPC_SDL:
2323         gen_helper_0e2i(sdl, t1, t0, mem_idx);
2324         break;
2325     case OPC_SDR:
2326         gen_helper_0e2i(sdr, t1, t0, mem_idx);
2327         break;
2328 #endif
2329     case OPC_SWE:
2330         mem_idx = MIPS_HFLAG_UM;
2331         /* fall through */
2332     case OPC_SW:
2333         tcg_gen_qemu_st_tl(t1, t0, mem_idx, MO_TEUL |
2334                            ctx->default_tcg_memop_mask);
2335         break;
2336     case OPC_SHE:
2337         mem_idx = MIPS_HFLAG_UM;
2338         /* fall through */
2339     case OPC_SH:
2340         tcg_gen_qemu_st_tl(t1, t0, mem_idx, MO_TEUW |
2341                            ctx->default_tcg_memop_mask);
2342         break;
2343     case OPC_SBE:
2344         mem_idx = MIPS_HFLAG_UM;
2345         /* fall through */
2346     case OPC_SB:
2347         tcg_gen_qemu_st_tl(t1, t0, mem_idx, MO_8);
2348         break;
2349     case OPC_SWLE:
2350         mem_idx = MIPS_HFLAG_UM;
2351         /* fall through */
2352     case OPC_SWL:
2353         gen_helper_0e2i(swl, t1, t0, mem_idx);
2354         break;
2355     case OPC_SWRE:
2356         mem_idx = MIPS_HFLAG_UM;
2357         /* fall through */
2358     case OPC_SWR:
2359         gen_helper_0e2i(swr, t1, t0, mem_idx);
2360         break;
2361     }
2362     tcg_temp_free(t0);
2363     tcg_temp_free(t1);
2364 }
2365 
2366 
2367 /* Store conditional */
2368 static void gen_st_cond(DisasContext *ctx, int rt, int base, int offset,
2369                         MemOp tcg_mo, bool eva)
2370 {
2371     TCGv addr, t0, val;
2372     TCGLabel *l1 = gen_new_label();
2373     TCGLabel *done = gen_new_label();
2374 
2375     t0 = tcg_temp_new();
2376     addr = tcg_temp_new();
2377     /* compare the address against that of the preceding LL */
2378     gen_base_offset_addr(ctx, addr, base, offset);
2379     tcg_gen_brcond_tl(TCG_COND_EQ, addr, cpu_lladdr, l1);
2380     tcg_temp_free(addr);
2381     tcg_gen_movi_tl(t0, 0);
2382     gen_store_gpr(t0, rt);
2383     tcg_gen_br(done);
2384 
2385     gen_set_label(l1);
2386     /* generate cmpxchg */
2387     val = tcg_temp_new();
2388     gen_load_gpr(val, rt);
2389     tcg_gen_atomic_cmpxchg_tl(t0, cpu_lladdr, cpu_llval, val,
2390                               eva ? MIPS_HFLAG_UM : ctx->mem_idx, tcg_mo);
2391     tcg_gen_setcond_tl(TCG_COND_EQ, t0, t0, cpu_llval);
2392     gen_store_gpr(t0, rt);
2393     tcg_temp_free(val);
2394 
2395     gen_set_label(done);
2396     tcg_temp_free(t0);
2397 }
2398 
2399 
2400 static void gen_scwp(DisasContext *ctx, uint32_t base, int16_t offset,
2401                     uint32_t reg1, uint32_t reg2, bool eva)
2402 {
2403     TCGv taddr = tcg_temp_local_new();
2404     TCGv lladdr = tcg_temp_local_new();
2405     TCGv_i64 tval = tcg_temp_new_i64();
2406     TCGv_i64 llval = tcg_temp_new_i64();
2407     TCGv_i64 val = tcg_temp_new_i64();
2408     TCGv tmp1 = tcg_temp_new();
2409     TCGv tmp2 = tcg_temp_new();
2410     TCGLabel *lab_fail = gen_new_label();
2411     TCGLabel *lab_done = gen_new_label();
2412 
2413     gen_base_offset_addr(ctx, taddr, base, offset);
2414 
2415     tcg_gen_ld_tl(lladdr, cpu_env, offsetof(CPUMIPSState, lladdr));
2416     tcg_gen_brcond_tl(TCG_COND_NE, taddr, lladdr, lab_fail);
2417 
2418     gen_load_gpr(tmp1, reg1);
2419     gen_load_gpr(tmp2, reg2);
2420 
2421 #ifdef TARGET_WORDS_BIGENDIAN
2422     tcg_gen_concat_tl_i64(tval, tmp2, tmp1);
2423 #else
2424     tcg_gen_concat_tl_i64(tval, tmp1, tmp2);
2425 #endif
2426 
2427     tcg_gen_ld_i64(llval, cpu_env, offsetof(CPUMIPSState, llval_wp));
2428     tcg_gen_atomic_cmpxchg_i64(val, taddr, llval, tval,
2429                                eva ? MIPS_HFLAG_UM : ctx->mem_idx, MO_64);
2430     if (reg1 != 0) {
2431         tcg_gen_movi_tl(cpu_gpr[reg1], 1);
2432     }
2433     tcg_gen_brcond_i64(TCG_COND_EQ, val, llval, lab_done);
2434 
2435     gen_set_label(lab_fail);
2436 
2437     if (reg1 != 0) {
2438         tcg_gen_movi_tl(cpu_gpr[reg1], 0);
2439     }
2440     gen_set_label(lab_done);
2441     tcg_gen_movi_tl(lladdr, -1);
2442     tcg_gen_st_tl(lladdr, cpu_env, offsetof(CPUMIPSState, lladdr));
2443 }
2444 
2445 /* Load and store */
2446 static void gen_flt_ldst(DisasContext *ctx, uint32_t opc, int ft,
2447                          TCGv t0)
2448 {
2449     /*
2450      * Don't do NOP if destination is zero: we must perform the actual
2451      * memory access.
2452      */
2453     switch (opc) {
2454     case OPC_LWC1:
2455         {
2456             TCGv_i32 fp0 = tcg_temp_new_i32();
2457             tcg_gen_qemu_ld_i32(fp0, t0, ctx->mem_idx, MO_TESL |
2458                                 ctx->default_tcg_memop_mask);
2459             gen_store_fpr32(ctx, fp0, ft);
2460             tcg_temp_free_i32(fp0);
2461         }
2462         break;
2463     case OPC_SWC1:
2464         {
2465             TCGv_i32 fp0 = tcg_temp_new_i32();
2466             gen_load_fpr32(ctx, fp0, ft);
2467             tcg_gen_qemu_st_i32(fp0, t0, ctx->mem_idx, MO_TEUL |
2468                                 ctx->default_tcg_memop_mask);
2469             tcg_temp_free_i32(fp0);
2470         }
2471         break;
2472     case OPC_LDC1:
2473         {
2474             TCGv_i64 fp0 = tcg_temp_new_i64();
2475             tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ |
2476                                 ctx->default_tcg_memop_mask);
2477             gen_store_fpr64(ctx, fp0, ft);
2478             tcg_temp_free_i64(fp0);
2479         }
2480         break;
2481     case OPC_SDC1:
2482         {
2483             TCGv_i64 fp0 = tcg_temp_new_i64();
2484             gen_load_fpr64(ctx, fp0, ft);
2485             tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ |
2486                                 ctx->default_tcg_memop_mask);
2487             tcg_temp_free_i64(fp0);
2488         }
2489         break;
2490     default:
2491         MIPS_INVAL("flt_ldst");
2492         gen_reserved_instruction(ctx);
2493         break;
2494     }
2495 }
2496 
2497 static void gen_cop1_ldst(DisasContext *ctx, uint32_t op, int rt,
2498                           int rs, int16_t imm)
2499 {
2500     TCGv t0 = tcg_temp_new();
2501 
2502     if (ctx->CP0_Config1 & (1 << CP0C1_FP)) {
2503         check_cp1_enabled(ctx);
2504         switch (op) {
2505         case OPC_LDC1:
2506         case OPC_SDC1:
2507             check_insn(ctx, ISA_MIPS2);
2508             /* Fallthrough */
2509         default:
2510             gen_base_offset_addr(ctx, t0, rs, imm);
2511             gen_flt_ldst(ctx, op, rt, t0);
2512         }
2513     } else {
2514         generate_exception_err(ctx, EXCP_CpU, 1);
2515     }
2516     tcg_temp_free(t0);
2517 }
2518 
2519 /* Arithmetic with immediate operand */
2520 static void gen_arith_imm(DisasContext *ctx, uint32_t opc,
2521                           int rt, int rs, int imm)
2522 {
2523     target_ulong uimm = (target_long)imm; /* Sign extend to 32/64 bits */
2524 
2525     if (rt == 0 && opc != OPC_ADDI && opc != OPC_DADDI) {
2526         /*
2527          * If no destination, treat it as a NOP.
2528          * For addi, we must generate the overflow exception when needed.
2529          */
2530         return;
2531     }
2532     switch (opc) {
2533     case OPC_ADDI:
2534         {
2535             TCGv t0 = tcg_temp_local_new();
2536             TCGv t1 = tcg_temp_new();
2537             TCGv t2 = tcg_temp_new();
2538             TCGLabel *l1 = gen_new_label();
2539 
2540             gen_load_gpr(t1, rs);
2541             tcg_gen_addi_tl(t0, t1, uimm);
2542             tcg_gen_ext32s_tl(t0, t0);
2543 
2544             tcg_gen_xori_tl(t1, t1, ~uimm);
2545             tcg_gen_xori_tl(t2, t0, uimm);
2546             tcg_gen_and_tl(t1, t1, t2);
2547             tcg_temp_free(t2);
2548             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2549             tcg_temp_free(t1);
2550             /* operands of same sign, result different sign */
2551             generate_exception(ctx, EXCP_OVERFLOW);
2552             gen_set_label(l1);
2553             tcg_gen_ext32s_tl(t0, t0);
2554             gen_store_gpr(t0, rt);
2555             tcg_temp_free(t0);
2556         }
2557         break;
2558     case OPC_ADDIU:
2559         if (rs != 0) {
2560             tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2561             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
2562         } else {
2563             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
2564         }
2565         break;
2566 #if defined(TARGET_MIPS64)
2567     case OPC_DADDI:
2568         {
2569             TCGv t0 = tcg_temp_local_new();
2570             TCGv t1 = tcg_temp_new();
2571             TCGv t2 = tcg_temp_new();
2572             TCGLabel *l1 = gen_new_label();
2573 
2574             gen_load_gpr(t1, rs);
2575             tcg_gen_addi_tl(t0, t1, uimm);
2576 
2577             tcg_gen_xori_tl(t1, t1, ~uimm);
2578             tcg_gen_xori_tl(t2, t0, uimm);
2579             tcg_gen_and_tl(t1, t1, t2);
2580             tcg_temp_free(t2);
2581             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2582             tcg_temp_free(t1);
2583             /* operands of same sign, result different sign */
2584             generate_exception(ctx, EXCP_OVERFLOW);
2585             gen_set_label(l1);
2586             gen_store_gpr(t0, rt);
2587             tcg_temp_free(t0);
2588         }
2589         break;
2590     case OPC_DADDIU:
2591         if (rs != 0) {
2592             tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2593         } else {
2594             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
2595         }
2596         break;
2597 #endif
2598     }
2599 }
2600 
2601 /* Logic with immediate operand */
2602 static void gen_logic_imm(DisasContext *ctx, uint32_t opc,
2603                           int rt, int rs, int16_t imm)
2604 {
2605     target_ulong uimm;
2606 
2607     if (rt == 0) {
2608         /* If no destination, treat it as a NOP. */
2609         return;
2610     }
2611     uimm = (uint16_t)imm;
2612     switch (opc) {
2613     case OPC_ANDI:
2614         if (likely(rs != 0)) {
2615             tcg_gen_andi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2616         } else {
2617             tcg_gen_movi_tl(cpu_gpr[rt], 0);
2618         }
2619         break;
2620     case OPC_ORI:
2621         if (rs != 0) {
2622             tcg_gen_ori_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2623         } else {
2624             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
2625         }
2626         break;
2627     case OPC_XORI:
2628         if (likely(rs != 0)) {
2629             tcg_gen_xori_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2630         } else {
2631             tcg_gen_movi_tl(cpu_gpr[rt], uimm);
2632         }
2633         break;
2634     case OPC_LUI:
2635         if (rs != 0 && (ctx->insn_flags & ISA_MIPS_R6)) {
2636             /* OPC_AUI */
2637             tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], imm << 16);
2638             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
2639         } else {
2640             tcg_gen_movi_tl(cpu_gpr[rt], imm << 16);
2641         }
2642         break;
2643 
2644     default:
2645         break;
2646     }
2647 }
2648 
2649 /* Set on less than with immediate operand */
2650 static void gen_slt_imm(DisasContext *ctx, uint32_t opc,
2651                         int rt, int rs, int16_t imm)
2652 {
2653     target_ulong uimm = (target_long)imm; /* Sign extend to 32/64 bits */
2654     TCGv t0;
2655 
2656     if (rt == 0) {
2657         /* If no destination, treat it as a NOP. */
2658         return;
2659     }
2660     t0 = tcg_temp_new();
2661     gen_load_gpr(t0, rs);
2662     switch (opc) {
2663     case OPC_SLTI:
2664         tcg_gen_setcondi_tl(TCG_COND_LT, cpu_gpr[rt], t0, uimm);
2665         break;
2666     case OPC_SLTIU:
2667         tcg_gen_setcondi_tl(TCG_COND_LTU, cpu_gpr[rt], t0, uimm);
2668         break;
2669     }
2670     tcg_temp_free(t0);
2671 }
2672 
2673 /* Shifts with immediate operand */
2674 static void gen_shift_imm(DisasContext *ctx, uint32_t opc,
2675                           int rt, int rs, int16_t imm)
2676 {
2677     target_ulong uimm = ((uint16_t)imm) & 0x1f;
2678     TCGv t0;
2679 
2680     if (rt == 0) {
2681         /* If no destination, treat it as a NOP. */
2682         return;
2683     }
2684 
2685     t0 = tcg_temp_new();
2686     gen_load_gpr(t0, rs);
2687     switch (opc) {
2688     case OPC_SLL:
2689         tcg_gen_shli_tl(t0, t0, uimm);
2690         tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
2691         break;
2692     case OPC_SRA:
2693         tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm);
2694         break;
2695     case OPC_SRL:
2696         if (uimm != 0) {
2697             tcg_gen_ext32u_tl(t0, t0);
2698             tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm);
2699         } else {
2700             tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
2701         }
2702         break;
2703     case OPC_ROTR:
2704         if (uimm != 0) {
2705             TCGv_i32 t1 = tcg_temp_new_i32();
2706 
2707             tcg_gen_trunc_tl_i32(t1, t0);
2708             tcg_gen_rotri_i32(t1, t1, uimm);
2709             tcg_gen_ext_i32_tl(cpu_gpr[rt], t1);
2710             tcg_temp_free_i32(t1);
2711         } else {
2712             tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
2713         }
2714         break;
2715 #if defined(TARGET_MIPS64)
2716     case OPC_DSLL:
2717         tcg_gen_shli_tl(cpu_gpr[rt], t0, uimm);
2718         break;
2719     case OPC_DSRA:
2720         tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm);
2721         break;
2722     case OPC_DSRL:
2723         tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm);
2724         break;
2725     case OPC_DROTR:
2726         if (uimm != 0) {
2727             tcg_gen_rotri_tl(cpu_gpr[rt], t0, uimm);
2728         } else {
2729             tcg_gen_mov_tl(cpu_gpr[rt], t0);
2730         }
2731         break;
2732     case OPC_DSLL32:
2733         tcg_gen_shli_tl(cpu_gpr[rt], t0, uimm + 32);
2734         break;
2735     case OPC_DSRA32:
2736         tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm + 32);
2737         break;
2738     case OPC_DSRL32:
2739         tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm + 32);
2740         break;
2741     case OPC_DROTR32:
2742         tcg_gen_rotri_tl(cpu_gpr[rt], t0, uimm + 32);
2743         break;
2744 #endif
2745     }
2746     tcg_temp_free(t0);
2747 }
2748 
2749 /* Arithmetic */
2750 static void gen_arith(DisasContext *ctx, uint32_t opc,
2751                       int rd, int rs, int rt)
2752 {
2753     if (rd == 0 && opc != OPC_ADD && opc != OPC_SUB
2754        && opc != OPC_DADD && opc != OPC_DSUB) {
2755         /*
2756          * If no destination, treat it as a NOP.
2757          * For add & sub, we must generate the overflow exception when needed.
2758          */
2759         return;
2760     }
2761 
2762     switch (opc) {
2763     case OPC_ADD:
2764         {
2765             TCGv t0 = tcg_temp_local_new();
2766             TCGv t1 = tcg_temp_new();
2767             TCGv t2 = tcg_temp_new();
2768             TCGLabel *l1 = gen_new_label();
2769 
2770             gen_load_gpr(t1, rs);
2771             gen_load_gpr(t2, rt);
2772             tcg_gen_add_tl(t0, t1, t2);
2773             tcg_gen_ext32s_tl(t0, t0);
2774             tcg_gen_xor_tl(t1, t1, t2);
2775             tcg_gen_xor_tl(t2, t0, t2);
2776             tcg_gen_andc_tl(t1, t2, t1);
2777             tcg_temp_free(t2);
2778             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2779             tcg_temp_free(t1);
2780             /* operands of same sign, result different sign */
2781             generate_exception(ctx, EXCP_OVERFLOW);
2782             gen_set_label(l1);
2783             gen_store_gpr(t0, rd);
2784             tcg_temp_free(t0);
2785         }
2786         break;
2787     case OPC_ADDU:
2788         if (rs != 0 && rt != 0) {
2789             tcg_gen_add_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2790             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2791         } else if (rs == 0 && rt != 0) {
2792             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
2793         } else if (rs != 0 && rt == 0) {
2794             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2795         } else {
2796             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2797         }
2798         break;
2799     case OPC_SUB:
2800         {
2801             TCGv t0 = tcg_temp_local_new();
2802             TCGv t1 = tcg_temp_new();
2803             TCGv t2 = tcg_temp_new();
2804             TCGLabel *l1 = gen_new_label();
2805 
2806             gen_load_gpr(t1, rs);
2807             gen_load_gpr(t2, rt);
2808             tcg_gen_sub_tl(t0, t1, t2);
2809             tcg_gen_ext32s_tl(t0, t0);
2810             tcg_gen_xor_tl(t2, t1, t2);
2811             tcg_gen_xor_tl(t1, t0, t1);
2812             tcg_gen_and_tl(t1, t1, t2);
2813             tcg_temp_free(t2);
2814             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2815             tcg_temp_free(t1);
2816             /*
2817              * operands of different sign, first operand and the result
2818              * of different sign
2819              */
2820             generate_exception(ctx, EXCP_OVERFLOW);
2821             gen_set_label(l1);
2822             gen_store_gpr(t0, rd);
2823             tcg_temp_free(t0);
2824         }
2825         break;
2826     case OPC_SUBU:
2827         if (rs != 0 && rt != 0) {
2828             tcg_gen_sub_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2829             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2830         } else if (rs == 0 && rt != 0) {
2831             tcg_gen_neg_tl(cpu_gpr[rd], cpu_gpr[rt]);
2832             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2833         } else if (rs != 0 && rt == 0) {
2834             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2835         } else {
2836             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2837         }
2838         break;
2839 #if defined(TARGET_MIPS64)
2840     case OPC_DADD:
2841         {
2842             TCGv t0 = tcg_temp_local_new();
2843             TCGv t1 = tcg_temp_new();
2844             TCGv t2 = tcg_temp_new();
2845             TCGLabel *l1 = gen_new_label();
2846 
2847             gen_load_gpr(t1, rs);
2848             gen_load_gpr(t2, rt);
2849             tcg_gen_add_tl(t0, t1, t2);
2850             tcg_gen_xor_tl(t1, t1, t2);
2851             tcg_gen_xor_tl(t2, t0, t2);
2852             tcg_gen_andc_tl(t1, t2, t1);
2853             tcg_temp_free(t2);
2854             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2855             tcg_temp_free(t1);
2856             /* operands of same sign, result different sign */
2857             generate_exception(ctx, EXCP_OVERFLOW);
2858             gen_set_label(l1);
2859             gen_store_gpr(t0, rd);
2860             tcg_temp_free(t0);
2861         }
2862         break;
2863     case OPC_DADDU:
2864         if (rs != 0 && rt != 0) {
2865             tcg_gen_add_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2866         } else if (rs == 0 && rt != 0) {
2867             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
2868         } else if (rs != 0 && rt == 0) {
2869             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2870         } else {
2871             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2872         }
2873         break;
2874     case OPC_DSUB:
2875         {
2876             TCGv t0 = tcg_temp_local_new();
2877             TCGv t1 = tcg_temp_new();
2878             TCGv t2 = tcg_temp_new();
2879             TCGLabel *l1 = gen_new_label();
2880 
2881             gen_load_gpr(t1, rs);
2882             gen_load_gpr(t2, rt);
2883             tcg_gen_sub_tl(t0, t1, t2);
2884             tcg_gen_xor_tl(t2, t1, t2);
2885             tcg_gen_xor_tl(t1, t0, t1);
2886             tcg_gen_and_tl(t1, t1, t2);
2887             tcg_temp_free(t2);
2888             tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2889             tcg_temp_free(t1);
2890             /*
2891              * Operands of different sign, first operand and result different
2892              * sign.
2893              */
2894             generate_exception(ctx, EXCP_OVERFLOW);
2895             gen_set_label(l1);
2896             gen_store_gpr(t0, rd);
2897             tcg_temp_free(t0);
2898         }
2899         break;
2900     case OPC_DSUBU:
2901         if (rs != 0 && rt != 0) {
2902             tcg_gen_sub_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2903         } else if (rs == 0 && rt != 0) {
2904             tcg_gen_neg_tl(cpu_gpr[rd], cpu_gpr[rt]);
2905         } else if (rs != 0 && rt == 0) {
2906             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2907         } else {
2908             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2909         }
2910         break;
2911 #endif
2912     case OPC_MUL:
2913         if (likely(rs != 0 && rt != 0)) {
2914             tcg_gen_mul_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2915             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2916         } else {
2917             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2918         }
2919         break;
2920     }
2921 }
2922 
2923 /* Conditional move */
2924 static void gen_cond_move(DisasContext *ctx, uint32_t opc,
2925                           int rd, int rs, int rt)
2926 {
2927     TCGv t0, t1, t2;
2928 
2929     if (rd == 0) {
2930         /* If no destination, treat it as a NOP. */
2931         return;
2932     }
2933 
2934     t0 = tcg_temp_new();
2935     gen_load_gpr(t0, rt);
2936     t1 = tcg_const_tl(0);
2937     t2 = tcg_temp_new();
2938     gen_load_gpr(t2, rs);
2939     switch (opc) {
2940     case OPC_MOVN:
2941         tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr[rd], t0, t1, t2, cpu_gpr[rd]);
2942         break;
2943     case OPC_MOVZ:
2944         tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr[rd], t0, t1, t2, cpu_gpr[rd]);
2945         break;
2946     case OPC_SELNEZ:
2947         tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr[rd], t0, t1, t2, t1);
2948         break;
2949     case OPC_SELEQZ:
2950         tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr[rd], t0, t1, t2, t1);
2951         break;
2952     }
2953     tcg_temp_free(t2);
2954     tcg_temp_free(t1);
2955     tcg_temp_free(t0);
2956 }
2957 
2958 /* Logic */
2959 static void gen_logic(DisasContext *ctx, uint32_t opc,
2960                       int rd, int rs, int rt)
2961 {
2962     if (rd == 0) {
2963         /* If no destination, treat it as a NOP. */
2964         return;
2965     }
2966 
2967     switch (opc) {
2968     case OPC_AND:
2969         if (likely(rs != 0 && rt != 0)) {
2970             tcg_gen_and_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2971         } else {
2972             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2973         }
2974         break;
2975     case OPC_NOR:
2976         if (rs != 0 && rt != 0) {
2977             tcg_gen_nor_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2978         } else if (rs == 0 && rt != 0) {
2979             tcg_gen_not_tl(cpu_gpr[rd], cpu_gpr[rt]);
2980         } else if (rs != 0 && rt == 0) {
2981             tcg_gen_not_tl(cpu_gpr[rd], cpu_gpr[rs]);
2982         } else {
2983             tcg_gen_movi_tl(cpu_gpr[rd], ~((target_ulong)0));
2984         }
2985         break;
2986     case OPC_OR:
2987         if (likely(rs != 0 && rt != 0)) {
2988             tcg_gen_or_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2989         } else if (rs == 0 && rt != 0) {
2990             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
2991         } else if (rs != 0 && rt == 0) {
2992             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2993         } else {
2994             tcg_gen_movi_tl(cpu_gpr[rd], 0);
2995         }
2996         break;
2997     case OPC_XOR:
2998         if (likely(rs != 0 && rt != 0)) {
2999             tcg_gen_xor_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
3000         } else if (rs == 0 && rt != 0) {
3001             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
3002         } else if (rs != 0 && rt == 0) {
3003             tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
3004         } else {
3005             tcg_gen_movi_tl(cpu_gpr[rd], 0);
3006         }
3007         break;
3008     }
3009 }
3010 
3011 /* Set on lower than */
3012 static void gen_slt(DisasContext *ctx, uint32_t opc,
3013                     int rd, int rs, int rt)
3014 {
3015     TCGv t0, t1;
3016 
3017     if (rd == 0) {
3018         /* If no destination, treat it as a NOP. */
3019         return;
3020     }
3021 
3022     t0 = tcg_temp_new();
3023     t1 = tcg_temp_new();
3024     gen_load_gpr(t0, rs);
3025     gen_load_gpr(t1, rt);
3026     switch (opc) {
3027     case OPC_SLT:
3028         tcg_gen_setcond_tl(TCG_COND_LT, cpu_gpr[rd], t0, t1);
3029         break;
3030     case OPC_SLTU:
3031         tcg_gen_setcond_tl(TCG_COND_LTU, cpu_gpr[rd], t0, t1);
3032         break;
3033     }
3034     tcg_temp_free(t0);
3035     tcg_temp_free(t1);
3036 }
3037 
3038 /* Shifts */
3039 static void gen_shift(DisasContext *ctx, uint32_t opc,
3040                       int rd, int rs, int rt)
3041 {
3042     TCGv t0, t1;
3043 
3044     if (rd == 0) {
3045         /*
3046          * If no destination, treat it as a NOP.
3047          * For add & sub, we must generate the overflow exception when needed.
3048          */
3049         return;
3050     }
3051 
3052     t0 = tcg_temp_new();
3053     t1 = tcg_temp_new();
3054     gen_load_gpr(t0, rs);
3055     gen_load_gpr(t1, rt);
3056     switch (opc) {
3057     case OPC_SLLV:
3058         tcg_gen_andi_tl(t0, t0, 0x1f);
3059         tcg_gen_shl_tl(t0, t1, t0);
3060         tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
3061         break;
3062     case OPC_SRAV:
3063         tcg_gen_andi_tl(t0, t0, 0x1f);
3064         tcg_gen_sar_tl(cpu_gpr[rd], t1, t0);
3065         break;
3066     case OPC_SRLV:
3067         tcg_gen_ext32u_tl(t1, t1);
3068         tcg_gen_andi_tl(t0, t0, 0x1f);
3069         tcg_gen_shr_tl(t0, t1, t0);
3070         tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
3071         break;
3072     case OPC_ROTRV:
3073         {
3074             TCGv_i32 t2 = tcg_temp_new_i32();
3075             TCGv_i32 t3 = tcg_temp_new_i32();
3076 
3077             tcg_gen_trunc_tl_i32(t2, t0);
3078             tcg_gen_trunc_tl_i32(t3, t1);
3079             tcg_gen_andi_i32(t2, t2, 0x1f);
3080             tcg_gen_rotr_i32(t2, t3, t2);
3081             tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
3082             tcg_temp_free_i32(t2);
3083             tcg_temp_free_i32(t3);
3084         }
3085         break;
3086 #if defined(TARGET_MIPS64)
3087     case OPC_DSLLV:
3088         tcg_gen_andi_tl(t0, t0, 0x3f);
3089         tcg_gen_shl_tl(cpu_gpr[rd], t1, t0);
3090         break;
3091     case OPC_DSRAV:
3092         tcg_gen_andi_tl(t0, t0, 0x3f);
3093         tcg_gen_sar_tl(cpu_gpr[rd], t1, t0);
3094         break;
3095     case OPC_DSRLV:
3096         tcg_gen_andi_tl(t0, t0, 0x3f);
3097         tcg_gen_shr_tl(cpu_gpr[rd], t1, t0);
3098         break;
3099     case OPC_DROTRV:
3100         tcg_gen_andi_tl(t0, t0, 0x3f);
3101         tcg_gen_rotr_tl(cpu_gpr[rd], t1, t0);
3102         break;
3103 #endif
3104     }
3105     tcg_temp_free(t0);
3106     tcg_temp_free(t1);
3107 }
3108 
3109 /* Arithmetic on HI/LO registers */
3110 static void gen_HILO(DisasContext *ctx, uint32_t opc, int acc, int reg)
3111 {
3112     if (reg == 0 && (opc == OPC_MFHI || opc == OPC_MFLO)) {
3113         /* Treat as NOP. */
3114         return;
3115     }
3116 
3117     if (acc != 0) {
3118         check_dsp(ctx);
3119     }
3120 
3121     switch (opc) {
3122     case OPC_MFHI:
3123 #if defined(TARGET_MIPS64)
3124         if (acc != 0) {
3125             tcg_gen_ext32s_tl(cpu_gpr[reg], cpu_HI[acc]);
3126         } else
3127 #endif
3128         {
3129             tcg_gen_mov_tl(cpu_gpr[reg], cpu_HI[acc]);
3130         }
3131         break;
3132     case OPC_MFLO:
3133 #if defined(TARGET_MIPS64)
3134         if (acc != 0) {
3135             tcg_gen_ext32s_tl(cpu_gpr[reg], cpu_LO[acc]);
3136         } else
3137 #endif
3138         {
3139             tcg_gen_mov_tl(cpu_gpr[reg], cpu_LO[acc]);
3140         }
3141         break;
3142     case OPC_MTHI:
3143         if (reg != 0) {
3144 #if defined(TARGET_MIPS64)
3145             if (acc != 0) {
3146                 tcg_gen_ext32s_tl(cpu_HI[acc], cpu_gpr[reg]);
3147             } else
3148 #endif
3149             {
3150                 tcg_gen_mov_tl(cpu_HI[acc], cpu_gpr[reg]);
3151             }
3152         } else {
3153             tcg_gen_movi_tl(cpu_HI[acc], 0);
3154         }
3155         break;
3156     case OPC_MTLO:
3157         if (reg != 0) {
3158 #if defined(TARGET_MIPS64)
3159             if (acc != 0) {
3160                 tcg_gen_ext32s_tl(cpu_LO[acc], cpu_gpr[reg]);
3161             } else
3162 #endif
3163             {
3164                 tcg_gen_mov_tl(cpu_LO[acc], cpu_gpr[reg]);
3165             }
3166         } else {
3167             tcg_gen_movi_tl(cpu_LO[acc], 0);
3168         }
3169         break;
3170     }
3171 }
3172 
3173 static inline void gen_r6_ld(target_long addr, int reg, int memidx,
3174                              MemOp memop)
3175 {
3176     TCGv t0 = tcg_const_tl(addr);
3177     tcg_gen_qemu_ld_tl(t0, t0, memidx, memop);
3178     gen_store_gpr(t0, reg);
3179     tcg_temp_free(t0);
3180 }
3181 
3182 static inline void gen_pcrel(DisasContext *ctx, int opc, target_ulong pc,
3183                              int rs)
3184 {
3185     target_long offset;
3186     target_long addr;
3187 
3188     switch (MASK_OPC_PCREL_TOP2BITS(opc)) {
3189     case OPC_ADDIUPC:
3190         if (rs != 0) {
3191             offset = sextract32(ctx->opcode << 2, 0, 21);
3192             addr = addr_add(ctx, pc, offset);
3193             tcg_gen_movi_tl(cpu_gpr[rs], addr);
3194         }
3195         break;
3196     case R6_OPC_LWPC:
3197         offset = sextract32(ctx->opcode << 2, 0, 21);
3198         addr = addr_add(ctx, pc, offset);
3199         gen_r6_ld(addr, rs, ctx->mem_idx, MO_TESL);
3200         break;
3201 #if defined(TARGET_MIPS64)
3202     case OPC_LWUPC:
3203         check_mips_64(ctx);
3204         offset = sextract32(ctx->opcode << 2, 0, 21);
3205         addr = addr_add(ctx, pc, offset);
3206         gen_r6_ld(addr, rs, ctx->mem_idx, MO_TEUL);
3207         break;
3208 #endif
3209     default:
3210         switch (MASK_OPC_PCREL_TOP5BITS(opc)) {
3211         case OPC_AUIPC:
3212             if (rs != 0) {
3213                 offset = sextract32(ctx->opcode, 0, 16) << 16;
3214                 addr = addr_add(ctx, pc, offset);
3215                 tcg_gen_movi_tl(cpu_gpr[rs], addr);
3216             }
3217             break;
3218         case OPC_ALUIPC:
3219             if (rs != 0) {
3220                 offset = sextract32(ctx->opcode, 0, 16) << 16;
3221                 addr = ~0xFFFF & addr_add(ctx, pc, offset);
3222                 tcg_gen_movi_tl(cpu_gpr[rs], addr);
3223             }
3224             break;
3225 #if defined(TARGET_MIPS64)
3226         case R6_OPC_LDPC: /* bits 16 and 17 are part of immediate */
3227         case R6_OPC_LDPC + (1 << 16):
3228         case R6_OPC_LDPC + (2 << 16):
3229         case R6_OPC_LDPC + (3 << 16):
3230             check_mips_64(ctx);
3231             offset = sextract32(ctx->opcode << 3, 0, 21);
3232             addr = addr_add(ctx, (pc & ~0x7), offset);
3233             gen_r6_ld(addr, rs, ctx->mem_idx, MO_TEQ);
3234             break;
3235 #endif
3236         default:
3237             MIPS_INVAL("OPC_PCREL");
3238             gen_reserved_instruction(ctx);
3239             break;
3240         }
3241         break;
3242     }
3243 }
3244 
3245 static void gen_r6_muldiv(DisasContext *ctx, int opc, int rd, int rs, int rt)
3246 {
3247     TCGv t0, t1;
3248 
3249     if (rd == 0) {
3250         /* Treat as NOP. */
3251         return;
3252     }
3253 
3254     t0 = tcg_temp_new();
3255     t1 = tcg_temp_new();
3256 
3257     gen_load_gpr(t0, rs);
3258     gen_load_gpr(t1, rt);
3259 
3260     switch (opc) {
3261     case R6_OPC_DIV:
3262         {
3263             TCGv t2 = tcg_temp_new();
3264             TCGv t3 = tcg_temp_new();
3265             tcg_gen_ext32s_tl(t0, t0);
3266             tcg_gen_ext32s_tl(t1, t1);
3267             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, INT_MIN);
3268             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1);
3269             tcg_gen_and_tl(t2, t2, t3);
3270             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3271             tcg_gen_or_tl(t2, t2, t3);
3272             tcg_gen_movi_tl(t3, 0);
3273             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3274             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
3275             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3276             tcg_temp_free(t3);
3277             tcg_temp_free(t2);
3278         }
3279         break;
3280     case R6_OPC_MOD:
3281         {
3282             TCGv t2 = tcg_temp_new();
3283             TCGv t3 = tcg_temp_new();
3284             tcg_gen_ext32s_tl(t0, t0);
3285             tcg_gen_ext32s_tl(t1, t1);
3286             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, INT_MIN);
3287             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1);
3288             tcg_gen_and_tl(t2, t2, t3);
3289             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3290             tcg_gen_or_tl(t2, t2, t3);
3291             tcg_gen_movi_tl(t3, 0);
3292             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3293             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
3294             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3295             tcg_temp_free(t3);
3296             tcg_temp_free(t2);
3297         }
3298         break;
3299     case R6_OPC_DIVU:
3300         {
3301             TCGv t2 = tcg_const_tl(0);
3302             TCGv t3 = tcg_const_tl(1);
3303             tcg_gen_ext32u_tl(t0, t0);
3304             tcg_gen_ext32u_tl(t1, t1);
3305             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3306             tcg_gen_divu_tl(cpu_gpr[rd], t0, t1);
3307             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3308             tcg_temp_free(t3);
3309             tcg_temp_free(t2);
3310         }
3311         break;
3312     case R6_OPC_MODU:
3313         {
3314             TCGv t2 = tcg_const_tl(0);
3315             TCGv t3 = tcg_const_tl(1);
3316             tcg_gen_ext32u_tl(t0, t0);
3317             tcg_gen_ext32u_tl(t1, t1);
3318             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3319             tcg_gen_remu_tl(cpu_gpr[rd], t0, t1);
3320             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3321             tcg_temp_free(t3);
3322             tcg_temp_free(t2);
3323         }
3324         break;
3325     case R6_OPC_MUL:
3326         {
3327             TCGv_i32 t2 = tcg_temp_new_i32();
3328             TCGv_i32 t3 = tcg_temp_new_i32();
3329             tcg_gen_trunc_tl_i32(t2, t0);
3330             tcg_gen_trunc_tl_i32(t3, t1);
3331             tcg_gen_mul_i32(t2, t2, t3);
3332             tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
3333             tcg_temp_free_i32(t2);
3334             tcg_temp_free_i32(t3);
3335         }
3336         break;
3337     case R6_OPC_MUH:
3338         {
3339             TCGv_i32 t2 = tcg_temp_new_i32();
3340             TCGv_i32 t3 = tcg_temp_new_i32();
3341             tcg_gen_trunc_tl_i32(t2, t0);
3342             tcg_gen_trunc_tl_i32(t3, t1);
3343             tcg_gen_muls2_i32(t2, t3, t2, t3);
3344             tcg_gen_ext_i32_tl(cpu_gpr[rd], t3);
3345             tcg_temp_free_i32(t2);
3346             tcg_temp_free_i32(t3);
3347         }
3348         break;
3349     case R6_OPC_MULU:
3350         {
3351             TCGv_i32 t2 = tcg_temp_new_i32();
3352             TCGv_i32 t3 = tcg_temp_new_i32();
3353             tcg_gen_trunc_tl_i32(t2, t0);
3354             tcg_gen_trunc_tl_i32(t3, t1);
3355             tcg_gen_mul_i32(t2, t2, t3);
3356             tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
3357             tcg_temp_free_i32(t2);
3358             tcg_temp_free_i32(t3);
3359         }
3360         break;
3361     case R6_OPC_MUHU:
3362         {
3363             TCGv_i32 t2 = tcg_temp_new_i32();
3364             TCGv_i32 t3 = tcg_temp_new_i32();
3365             tcg_gen_trunc_tl_i32(t2, t0);
3366             tcg_gen_trunc_tl_i32(t3, t1);
3367             tcg_gen_mulu2_i32(t2, t3, t2, t3);
3368             tcg_gen_ext_i32_tl(cpu_gpr[rd], t3);
3369             tcg_temp_free_i32(t2);
3370             tcg_temp_free_i32(t3);
3371         }
3372         break;
3373 #if defined(TARGET_MIPS64)
3374     case R6_OPC_DDIV:
3375         {
3376             TCGv t2 = tcg_temp_new();
3377             TCGv t3 = tcg_temp_new();
3378             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, -1LL << 63);
3379             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1LL);
3380             tcg_gen_and_tl(t2, t2, t3);
3381             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3382             tcg_gen_or_tl(t2, t2, t3);
3383             tcg_gen_movi_tl(t3, 0);
3384             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3385             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
3386             tcg_temp_free(t3);
3387             tcg_temp_free(t2);
3388         }
3389         break;
3390     case R6_OPC_DMOD:
3391         {
3392             TCGv t2 = tcg_temp_new();
3393             TCGv t3 = tcg_temp_new();
3394             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, -1LL << 63);
3395             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1LL);
3396             tcg_gen_and_tl(t2, t2, t3);
3397             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3398             tcg_gen_or_tl(t2, t2, t3);
3399             tcg_gen_movi_tl(t3, 0);
3400             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3401             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
3402             tcg_temp_free(t3);
3403             tcg_temp_free(t2);
3404         }
3405         break;
3406     case R6_OPC_DDIVU:
3407         {
3408             TCGv t2 = tcg_const_tl(0);
3409             TCGv t3 = tcg_const_tl(1);
3410             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3411             tcg_gen_divu_i64(cpu_gpr[rd], t0, t1);
3412             tcg_temp_free(t3);
3413             tcg_temp_free(t2);
3414         }
3415         break;
3416     case R6_OPC_DMODU:
3417         {
3418             TCGv t2 = tcg_const_tl(0);
3419             TCGv t3 = tcg_const_tl(1);
3420             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3421             tcg_gen_remu_i64(cpu_gpr[rd], t0, t1);
3422             tcg_temp_free(t3);
3423             tcg_temp_free(t2);
3424         }
3425         break;
3426     case R6_OPC_DMUL:
3427         tcg_gen_mul_i64(cpu_gpr[rd], t0, t1);
3428         break;
3429     case R6_OPC_DMUH:
3430         {
3431             TCGv t2 = tcg_temp_new();
3432             tcg_gen_muls2_i64(t2, cpu_gpr[rd], t0, t1);
3433             tcg_temp_free(t2);
3434         }
3435         break;
3436     case R6_OPC_DMULU:
3437         tcg_gen_mul_i64(cpu_gpr[rd], t0, t1);
3438         break;
3439     case R6_OPC_DMUHU:
3440         {
3441             TCGv t2 = tcg_temp_new();
3442             tcg_gen_mulu2_i64(t2, cpu_gpr[rd], t0, t1);
3443             tcg_temp_free(t2);
3444         }
3445         break;
3446 #endif
3447     default:
3448         MIPS_INVAL("r6 mul/div");
3449         gen_reserved_instruction(ctx);
3450         goto out;
3451     }
3452  out:
3453     tcg_temp_free(t0);
3454     tcg_temp_free(t1);
3455 }
3456 
3457 #if defined(TARGET_MIPS64)
3458 static void gen_div1_tx79(DisasContext *ctx, uint32_t opc, int rs, int rt)
3459 {
3460     TCGv t0, t1;
3461 
3462     t0 = tcg_temp_new();
3463     t1 = tcg_temp_new();
3464 
3465     gen_load_gpr(t0, rs);
3466     gen_load_gpr(t1, rt);
3467 
3468     switch (opc) {
3469     case MMI_OPC_DIV1:
3470         {
3471             TCGv t2 = tcg_temp_new();
3472             TCGv t3 = tcg_temp_new();
3473             tcg_gen_ext32s_tl(t0, t0);
3474             tcg_gen_ext32s_tl(t1, t1);
3475             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, INT_MIN);
3476             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1);
3477             tcg_gen_and_tl(t2, t2, t3);
3478             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3479             tcg_gen_or_tl(t2, t2, t3);
3480             tcg_gen_movi_tl(t3, 0);
3481             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3482             tcg_gen_div_tl(cpu_LO[1], t0, t1);
3483             tcg_gen_rem_tl(cpu_HI[1], t0, t1);
3484             tcg_gen_ext32s_tl(cpu_LO[1], cpu_LO[1]);
3485             tcg_gen_ext32s_tl(cpu_HI[1], cpu_HI[1]);
3486             tcg_temp_free(t3);
3487             tcg_temp_free(t2);
3488         }
3489         break;
3490     case MMI_OPC_DIVU1:
3491         {
3492             TCGv t2 = tcg_const_tl(0);
3493             TCGv t3 = tcg_const_tl(1);
3494             tcg_gen_ext32u_tl(t0, t0);
3495             tcg_gen_ext32u_tl(t1, t1);
3496             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3497             tcg_gen_divu_tl(cpu_LO[1], t0, t1);
3498             tcg_gen_remu_tl(cpu_HI[1], t0, t1);
3499             tcg_gen_ext32s_tl(cpu_LO[1], cpu_LO[1]);
3500             tcg_gen_ext32s_tl(cpu_HI[1], cpu_HI[1]);
3501             tcg_temp_free(t3);
3502             tcg_temp_free(t2);
3503         }
3504         break;
3505     default:
3506         MIPS_INVAL("div1 TX79");
3507         gen_reserved_instruction(ctx);
3508         goto out;
3509     }
3510  out:
3511     tcg_temp_free(t0);
3512     tcg_temp_free(t1);
3513 }
3514 #endif
3515 
3516 static void gen_muldiv(DisasContext *ctx, uint32_t opc,
3517                        int acc, int rs, int rt)
3518 {
3519     TCGv t0, t1;
3520 
3521     t0 = tcg_temp_new();
3522     t1 = tcg_temp_new();
3523 
3524     gen_load_gpr(t0, rs);
3525     gen_load_gpr(t1, rt);
3526 
3527     if (acc != 0) {
3528         check_dsp(ctx);
3529     }
3530 
3531     switch (opc) {
3532     case OPC_DIV:
3533         {
3534             TCGv t2 = tcg_temp_new();
3535             TCGv t3 = tcg_temp_new();
3536             tcg_gen_ext32s_tl(t0, t0);
3537             tcg_gen_ext32s_tl(t1, t1);
3538             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, INT_MIN);
3539             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1);
3540             tcg_gen_and_tl(t2, t2, t3);
3541             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3542             tcg_gen_or_tl(t2, t2, t3);
3543             tcg_gen_movi_tl(t3, 0);
3544             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3545             tcg_gen_div_tl(cpu_LO[acc], t0, t1);
3546             tcg_gen_rem_tl(cpu_HI[acc], t0, t1);
3547             tcg_gen_ext32s_tl(cpu_LO[acc], cpu_LO[acc]);
3548             tcg_gen_ext32s_tl(cpu_HI[acc], cpu_HI[acc]);
3549             tcg_temp_free(t3);
3550             tcg_temp_free(t2);
3551         }
3552         break;
3553     case OPC_DIVU:
3554         {
3555             TCGv t2 = tcg_const_tl(0);
3556             TCGv t3 = tcg_const_tl(1);
3557             tcg_gen_ext32u_tl(t0, t0);
3558             tcg_gen_ext32u_tl(t1, t1);
3559             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3560             tcg_gen_divu_tl(cpu_LO[acc], t0, t1);
3561             tcg_gen_remu_tl(cpu_HI[acc], t0, t1);
3562             tcg_gen_ext32s_tl(cpu_LO[acc], cpu_LO[acc]);
3563             tcg_gen_ext32s_tl(cpu_HI[acc], cpu_HI[acc]);
3564             tcg_temp_free(t3);
3565             tcg_temp_free(t2);
3566         }
3567         break;
3568     case OPC_MULT:
3569         {
3570             TCGv_i32 t2 = tcg_temp_new_i32();
3571             TCGv_i32 t3 = tcg_temp_new_i32();
3572             tcg_gen_trunc_tl_i32(t2, t0);
3573             tcg_gen_trunc_tl_i32(t3, t1);
3574             tcg_gen_muls2_i32(t2, t3, t2, t3);
3575             tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
3576             tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
3577             tcg_temp_free_i32(t2);
3578             tcg_temp_free_i32(t3);
3579         }
3580         break;
3581     case OPC_MULTU:
3582         {
3583             TCGv_i32 t2 = tcg_temp_new_i32();
3584             TCGv_i32 t3 = tcg_temp_new_i32();
3585             tcg_gen_trunc_tl_i32(t2, t0);
3586             tcg_gen_trunc_tl_i32(t3, t1);
3587             tcg_gen_mulu2_i32(t2, t3, t2, t3);
3588             tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
3589             tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
3590             tcg_temp_free_i32(t2);
3591             tcg_temp_free_i32(t3);
3592         }
3593         break;
3594 #if defined(TARGET_MIPS64)
3595     case OPC_DDIV:
3596         {
3597             TCGv t2 = tcg_temp_new();
3598             TCGv t3 = tcg_temp_new();
3599             tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, -1LL << 63);
3600             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1LL);
3601             tcg_gen_and_tl(t2, t2, t3);
3602             tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
3603             tcg_gen_or_tl(t2, t2, t3);
3604             tcg_gen_movi_tl(t3, 0);
3605             tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
3606             tcg_gen_div_tl(cpu_LO[acc], t0, t1);
3607             tcg_gen_rem_tl(cpu_HI[acc], t0, t1);
3608             tcg_temp_free(t3);
3609             tcg_temp_free(t2);
3610         }
3611         break;
3612     case OPC_DDIVU:
3613         {
3614             TCGv t2 = tcg_const_tl(0);
3615             TCGv t3 = tcg_const_tl(1);
3616             tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
3617             tcg_gen_divu_i64(cpu_LO[acc], t0, t1);
3618             tcg_gen_remu_i64(cpu_HI[acc], t0, t1);
3619             tcg_temp_free(t3);
3620             tcg_temp_free(t2);
3621         }
3622         break;
3623     case OPC_DMULT:
3624         tcg_gen_muls2_i64(cpu_LO[acc], cpu_HI[acc], t0, t1);
3625         break;
3626     case OPC_DMULTU:
3627         tcg_gen_mulu2_i64(cpu_LO[acc], cpu_HI[acc], t0, t1);
3628         break;
3629 #endif
3630     case OPC_MADD:
3631         {
3632             TCGv_i64 t2 = tcg_temp_new_i64();
3633             TCGv_i64 t3 = tcg_temp_new_i64();
3634 
3635             tcg_gen_ext_tl_i64(t2, t0);
3636             tcg_gen_ext_tl_i64(t3, t1);
3637             tcg_gen_mul_i64(t2, t2, t3);
3638             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
3639             tcg_gen_add_i64(t2, t2, t3);
3640             tcg_temp_free_i64(t3);
3641             gen_move_low32(cpu_LO[acc], t2);
3642             gen_move_high32(cpu_HI[acc], t2);
3643             tcg_temp_free_i64(t2);
3644         }
3645         break;
3646     case OPC_MADDU:
3647         {
3648             TCGv_i64 t2 = tcg_temp_new_i64();
3649             TCGv_i64 t3 = tcg_temp_new_i64();
3650 
3651             tcg_gen_ext32u_tl(t0, t0);
3652             tcg_gen_ext32u_tl(t1, t1);
3653             tcg_gen_extu_tl_i64(t2, t0);
3654             tcg_gen_extu_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             tcg_temp_free_i64(t2);
3662         }
3663         break;
3664     case OPC_MSUB:
3665         {
3666             TCGv_i64 t2 = tcg_temp_new_i64();
3667             TCGv_i64 t3 = tcg_temp_new_i64();
3668 
3669             tcg_gen_ext_tl_i64(t2, t0);
3670             tcg_gen_ext_tl_i64(t3, t1);
3671             tcg_gen_mul_i64(t2, t2, t3);
3672             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
3673             tcg_gen_sub_i64(t2, t3, t2);
3674             tcg_temp_free_i64(t3);
3675             gen_move_low32(cpu_LO[acc], t2);
3676             gen_move_high32(cpu_HI[acc], t2);
3677             tcg_temp_free_i64(t2);
3678         }
3679         break;
3680     case OPC_MSUBU:
3681         {
3682             TCGv_i64 t2 = tcg_temp_new_i64();
3683             TCGv_i64 t3 = tcg_temp_new_i64();
3684 
3685             tcg_gen_ext32u_tl(t0, t0);
3686             tcg_gen_ext32u_tl(t1, t1);
3687             tcg_gen_extu_tl_i64(t2, t0);
3688             tcg_gen_extu_tl_i64(t3, t1);
3689             tcg_gen_mul_i64(t2, t2, t3);
3690             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
3691             tcg_gen_sub_i64(t2, t3, t2);
3692             tcg_temp_free_i64(t3);
3693             gen_move_low32(cpu_LO[acc], t2);
3694             gen_move_high32(cpu_HI[acc], t2);
3695             tcg_temp_free_i64(t2);
3696         }
3697         break;
3698     default:
3699         MIPS_INVAL("mul/div");
3700         gen_reserved_instruction(ctx);
3701         goto out;
3702     }
3703  out:
3704     tcg_temp_free(t0);
3705     tcg_temp_free(t1);
3706 }
3707 
3708 /*
3709  * These MULT[U] and MADD[U] instructions implemented in for example
3710  * the Toshiba/Sony R5900 and the Toshiba TX19, TX39 and TX79 core
3711  * architectures are special three-operand variants with the syntax
3712  *
3713  *     MULT[U][1] rd, rs, rt
3714  *
3715  * such that
3716  *
3717  *     (rd, LO, HI) <- rs * rt
3718  *
3719  * and
3720  *
3721  *     MADD[U][1] rd, rs, rt
3722  *
3723  * such that
3724  *
3725  *     (rd, LO, HI) <- (LO, HI) + rs * rt
3726  *
3727  * where the low-order 32-bits of the result is placed into both the
3728  * GPR rd and the special register LO. The high-order 32-bits of the
3729  * result is placed into the special register HI.
3730  *
3731  * If the GPR rd is omitted in assembly language, it is taken to be 0,
3732  * which is the zero register that always reads as 0.
3733  */
3734 static void gen_mul_txx9(DisasContext *ctx, uint32_t opc,
3735                          int rd, int rs, int rt)
3736 {
3737     TCGv t0 = tcg_temp_new();
3738     TCGv t1 = tcg_temp_new();
3739     int acc = 0;
3740 
3741     gen_load_gpr(t0, rs);
3742     gen_load_gpr(t1, rt);
3743 
3744     switch (opc) {
3745     case MMI_OPC_MULT1:
3746         acc = 1;
3747         /* Fall through */
3748     case OPC_MULT:
3749         {
3750             TCGv_i32 t2 = tcg_temp_new_i32();
3751             TCGv_i32 t3 = tcg_temp_new_i32();
3752             tcg_gen_trunc_tl_i32(t2, t0);
3753             tcg_gen_trunc_tl_i32(t3, t1);
3754             tcg_gen_muls2_i32(t2, t3, t2, t3);
3755             if (rd) {
3756                 tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
3757             }
3758             tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
3759             tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
3760             tcg_temp_free_i32(t2);
3761             tcg_temp_free_i32(t3);
3762         }
3763         break;
3764     case MMI_OPC_MULTU1:
3765         acc = 1;
3766         /* Fall through */
3767     case OPC_MULTU:
3768         {
3769             TCGv_i32 t2 = tcg_temp_new_i32();
3770             TCGv_i32 t3 = tcg_temp_new_i32();
3771             tcg_gen_trunc_tl_i32(t2, t0);
3772             tcg_gen_trunc_tl_i32(t3, t1);
3773             tcg_gen_mulu2_i32(t2, t3, t2, t3);
3774             if (rd) {
3775                 tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
3776             }
3777             tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
3778             tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
3779             tcg_temp_free_i32(t2);
3780             tcg_temp_free_i32(t3);
3781         }
3782         break;
3783     case MMI_OPC_MADD1:
3784         acc = 1;
3785         /* Fall through */
3786     case MMI_OPC_MADD:
3787         {
3788             TCGv_i64 t2 = tcg_temp_new_i64();
3789             TCGv_i64 t3 = tcg_temp_new_i64();
3790 
3791             tcg_gen_ext_tl_i64(t2, t0);
3792             tcg_gen_ext_tl_i64(t3, t1);
3793             tcg_gen_mul_i64(t2, t2, t3);
3794             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
3795             tcg_gen_add_i64(t2, t2, t3);
3796             tcg_temp_free_i64(t3);
3797             gen_move_low32(cpu_LO[acc], t2);
3798             gen_move_high32(cpu_HI[acc], t2);
3799             if (rd) {
3800                 gen_move_low32(cpu_gpr[rd], t2);
3801             }
3802             tcg_temp_free_i64(t2);
3803         }
3804         break;
3805     case MMI_OPC_MADDU1:
3806         acc = 1;
3807         /* Fall through */
3808     case MMI_OPC_MADDU:
3809         {
3810             TCGv_i64 t2 = tcg_temp_new_i64();
3811             TCGv_i64 t3 = tcg_temp_new_i64();
3812 
3813             tcg_gen_ext32u_tl(t0, t0);
3814             tcg_gen_ext32u_tl(t1, t1);
3815             tcg_gen_extu_tl_i64(t2, t0);
3816             tcg_gen_extu_tl_i64(t3, t1);
3817             tcg_gen_mul_i64(t2, t2, t3);
3818             tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
3819             tcg_gen_add_i64(t2, t2, t3);
3820             tcg_temp_free_i64(t3);
3821             gen_move_low32(cpu_LO[acc], t2);
3822             gen_move_high32(cpu_HI[acc], t2);
3823             if (rd) {
3824                 gen_move_low32(cpu_gpr[rd], t2);
3825             }
3826             tcg_temp_free_i64(t2);
3827         }
3828         break;
3829     default:
3830         MIPS_INVAL("mul/madd TXx9");
3831         gen_reserved_instruction(ctx);
3832         goto out;
3833     }
3834 
3835  out:
3836     tcg_temp_free(t0);
3837     tcg_temp_free(t1);
3838 }
3839 
3840 static void gen_mul_vr54xx(DisasContext *ctx, uint32_t opc,
3841                            int rd, int rs, int rt)
3842 {
3843     TCGv t0 = tcg_temp_new();
3844     TCGv t1 = tcg_temp_new();
3845 
3846     gen_load_gpr(t0, rs);
3847     gen_load_gpr(t1, rt);
3848 
3849     switch (opc) {
3850     case OPC_VR54XX_MULS:
3851         gen_helper_muls(t0, cpu_env, t0, t1);
3852         break;
3853     case OPC_VR54XX_MULSU:
3854         gen_helper_mulsu(t0, cpu_env, t0, t1);
3855         break;
3856     case OPC_VR54XX_MACC:
3857         gen_helper_macc(t0, cpu_env, t0, t1);
3858         break;
3859     case OPC_VR54XX_MACCU:
3860         gen_helper_maccu(t0, cpu_env, t0, t1);
3861         break;
3862     case OPC_VR54XX_MSAC:
3863         gen_helper_msac(t0, cpu_env, t0, t1);
3864         break;
3865     case OPC_VR54XX_MSACU:
3866         gen_helper_msacu(t0, cpu_env, t0, t1);
3867         break;
3868     case OPC_VR54XX_MULHI:
3869         gen_helper_mulhi(t0, cpu_env, t0, t1);
3870         break;
3871     case OPC_VR54XX_MULHIU:
3872         gen_helper_mulhiu(t0, cpu_env, t0, t1);
3873         break;
3874     case OPC_VR54XX_MULSHI:
3875         gen_helper_mulshi(t0, cpu_env, t0, t1);
3876         break;
3877     case OPC_VR54XX_MULSHIU:
3878         gen_helper_mulshiu(t0, cpu_env, t0, t1);
3879         break;
3880     case OPC_VR54XX_MACCHI:
3881         gen_helper_macchi(t0, cpu_env, t0, t1);
3882         break;
3883     case OPC_VR54XX_MACCHIU:
3884         gen_helper_macchiu(t0, cpu_env, t0, t1);
3885         break;
3886     case OPC_VR54XX_MSACHI:
3887         gen_helper_msachi(t0, cpu_env, t0, t1);
3888         break;
3889     case OPC_VR54XX_MSACHIU:
3890         gen_helper_msachiu(t0, cpu_env, t0, t1);
3891         break;
3892     default:
3893         MIPS_INVAL("mul vr54xx");
3894         gen_reserved_instruction(ctx);
3895         goto out;
3896     }
3897     gen_store_gpr(t0, rd);
3898 
3899  out:
3900     tcg_temp_free(t0);
3901     tcg_temp_free(t1);
3902 }
3903 
3904 static void gen_cl(DisasContext *ctx, uint32_t opc,
3905                    int rd, int rs)
3906 {
3907     TCGv t0;
3908 
3909     if (rd == 0) {
3910         /* Treat as NOP. */
3911         return;
3912     }
3913     t0 = cpu_gpr[rd];
3914     gen_load_gpr(t0, rs);
3915 
3916     switch (opc) {
3917     case OPC_CLO:
3918     case R6_OPC_CLO:
3919 #if defined(TARGET_MIPS64)
3920     case OPC_DCLO:
3921     case R6_OPC_DCLO:
3922 #endif
3923         tcg_gen_not_tl(t0, t0);
3924         break;
3925     }
3926 
3927     switch (opc) {
3928     case OPC_CLO:
3929     case R6_OPC_CLO:
3930     case OPC_CLZ:
3931     case R6_OPC_CLZ:
3932         tcg_gen_ext32u_tl(t0, t0);
3933         tcg_gen_clzi_tl(t0, t0, TARGET_LONG_BITS);
3934         tcg_gen_subi_tl(t0, t0, TARGET_LONG_BITS - 32);
3935         break;
3936 #if defined(TARGET_MIPS64)
3937     case OPC_DCLO:
3938     case R6_OPC_DCLO:
3939     case OPC_DCLZ:
3940     case R6_OPC_DCLZ:
3941         tcg_gen_clzi_i64(t0, t0, 64);
3942         break;
3943 #endif
3944     }
3945 }
3946 
3947 /* Godson integer instructions */
3948 static void gen_loongson_integer(DisasContext *ctx, uint32_t opc,
3949                                  int rd, int rs, int rt)
3950 {
3951     TCGv t0, t1;
3952 
3953     if (rd == 0) {
3954         /* Treat as NOP. */
3955         return;
3956     }
3957 
3958     switch (opc) {
3959     case OPC_MULT_G_2E:
3960     case OPC_MULT_G_2F:
3961     case OPC_MULTU_G_2E:
3962     case OPC_MULTU_G_2F:
3963 #if defined(TARGET_MIPS64)
3964     case OPC_DMULT_G_2E:
3965     case OPC_DMULT_G_2F:
3966     case OPC_DMULTU_G_2E:
3967     case OPC_DMULTU_G_2F:
3968 #endif
3969         t0 = tcg_temp_new();
3970         t1 = tcg_temp_new();
3971         break;
3972     default:
3973         t0 = tcg_temp_local_new();
3974         t1 = tcg_temp_local_new();
3975         break;
3976     }
3977 
3978     gen_load_gpr(t0, rs);
3979     gen_load_gpr(t1, rt);
3980 
3981     switch (opc) {
3982     case OPC_MULT_G_2E:
3983     case OPC_MULT_G_2F:
3984         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3985         tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3986         break;
3987     case OPC_MULTU_G_2E:
3988     case OPC_MULTU_G_2F:
3989         tcg_gen_ext32u_tl(t0, t0);
3990         tcg_gen_ext32u_tl(t1, t1);
3991         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3992         tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3993         break;
3994     case OPC_DIV_G_2E:
3995     case OPC_DIV_G_2F:
3996         {
3997             TCGLabel *l1 = gen_new_label();
3998             TCGLabel *l2 = gen_new_label();
3999             TCGLabel *l3 = gen_new_label();
4000             tcg_gen_ext32s_tl(t0, t0);
4001             tcg_gen_ext32s_tl(t1, t1);
4002             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
4003             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4004             tcg_gen_br(l3);
4005             gen_set_label(l1);
4006             tcg_gen_brcondi_tl(TCG_COND_NE, t0, INT_MIN, l2);
4007             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1, l2);
4008             tcg_gen_mov_tl(cpu_gpr[rd], t0);
4009             tcg_gen_br(l3);
4010             gen_set_label(l2);
4011             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
4012             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
4013             gen_set_label(l3);
4014         }
4015         break;
4016     case OPC_DIVU_G_2E:
4017     case OPC_DIVU_G_2F:
4018         {
4019             TCGLabel *l1 = gen_new_label();
4020             TCGLabel *l2 = gen_new_label();
4021             tcg_gen_ext32u_tl(t0, t0);
4022             tcg_gen_ext32u_tl(t1, t1);
4023             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
4024             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4025             tcg_gen_br(l2);
4026             gen_set_label(l1);
4027             tcg_gen_divu_tl(cpu_gpr[rd], t0, t1);
4028             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
4029             gen_set_label(l2);
4030         }
4031         break;
4032     case OPC_MOD_G_2E:
4033     case OPC_MOD_G_2F:
4034         {
4035             TCGLabel *l1 = gen_new_label();
4036             TCGLabel *l2 = gen_new_label();
4037             TCGLabel *l3 = gen_new_label();
4038             tcg_gen_ext32u_tl(t0, t0);
4039             tcg_gen_ext32u_tl(t1, t1);
4040             tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
4041             tcg_gen_brcondi_tl(TCG_COND_NE, t0, INT_MIN, l2);
4042             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1, l2);
4043             gen_set_label(l1);
4044             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4045             tcg_gen_br(l3);
4046             gen_set_label(l2);
4047             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
4048             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
4049             gen_set_label(l3);
4050         }
4051         break;
4052     case OPC_MODU_G_2E:
4053     case OPC_MODU_G_2F:
4054         {
4055             TCGLabel *l1 = gen_new_label();
4056             TCGLabel *l2 = gen_new_label();
4057             tcg_gen_ext32u_tl(t0, t0);
4058             tcg_gen_ext32u_tl(t1, t1);
4059             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
4060             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4061             tcg_gen_br(l2);
4062             gen_set_label(l1);
4063             tcg_gen_remu_tl(cpu_gpr[rd], t0, t1);
4064             tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
4065             gen_set_label(l2);
4066         }
4067         break;
4068 #if defined(TARGET_MIPS64)
4069     case OPC_DMULT_G_2E:
4070     case OPC_DMULT_G_2F:
4071         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
4072         break;
4073     case OPC_DMULTU_G_2E:
4074     case OPC_DMULTU_G_2F:
4075         tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
4076         break;
4077     case OPC_DDIV_G_2E:
4078     case OPC_DDIV_G_2F:
4079         {
4080             TCGLabel *l1 = gen_new_label();
4081             TCGLabel *l2 = gen_new_label();
4082             TCGLabel *l3 = gen_new_label();
4083             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
4084             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4085             tcg_gen_br(l3);
4086             gen_set_label(l1);
4087             tcg_gen_brcondi_tl(TCG_COND_NE, t0, -1LL << 63, l2);
4088             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1LL, l2);
4089             tcg_gen_mov_tl(cpu_gpr[rd], t0);
4090             tcg_gen_br(l3);
4091             gen_set_label(l2);
4092             tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
4093             gen_set_label(l3);
4094         }
4095         break;
4096     case OPC_DDIVU_G_2E:
4097     case OPC_DDIVU_G_2F:
4098         {
4099             TCGLabel *l1 = gen_new_label();
4100             TCGLabel *l2 = gen_new_label();
4101             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
4102             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4103             tcg_gen_br(l2);
4104             gen_set_label(l1);
4105             tcg_gen_divu_tl(cpu_gpr[rd], t0, t1);
4106             gen_set_label(l2);
4107         }
4108         break;
4109     case OPC_DMOD_G_2E:
4110     case OPC_DMOD_G_2F:
4111         {
4112             TCGLabel *l1 = gen_new_label();
4113             TCGLabel *l2 = gen_new_label();
4114             TCGLabel *l3 = gen_new_label();
4115             tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
4116             tcg_gen_brcondi_tl(TCG_COND_NE, t0, -1LL << 63, l2);
4117             tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1LL, l2);
4118             gen_set_label(l1);
4119             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4120             tcg_gen_br(l3);
4121             gen_set_label(l2);
4122             tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
4123             gen_set_label(l3);
4124         }
4125         break;
4126     case OPC_DMODU_G_2E:
4127     case OPC_DMODU_G_2F:
4128         {
4129             TCGLabel *l1 = gen_new_label();
4130             TCGLabel *l2 = gen_new_label();
4131             tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
4132             tcg_gen_movi_tl(cpu_gpr[rd], 0);
4133             tcg_gen_br(l2);
4134             gen_set_label(l1);
4135             tcg_gen_remu_tl(cpu_gpr[rd], t0, t1);
4136             gen_set_label(l2);
4137         }
4138         break;
4139 #endif
4140     }
4141 
4142     tcg_temp_free(t0);
4143     tcg_temp_free(t1);
4144 }
4145 
4146 /* Loongson multimedia instructions */
4147 static void gen_loongson_multimedia(DisasContext *ctx, int rd, int rs, int rt)
4148 {
4149     uint32_t opc, shift_max;
4150     TCGv_i64 t0, t1;
4151     TCGCond cond;
4152 
4153     opc = MASK_LMMI(ctx->opcode);
4154     switch (opc) {
4155     case OPC_ADD_CP2:
4156     case OPC_SUB_CP2:
4157     case OPC_DADD_CP2:
4158     case OPC_DSUB_CP2:
4159         t0 = tcg_temp_local_new_i64();
4160         t1 = tcg_temp_local_new_i64();
4161         break;
4162     default:
4163         t0 = tcg_temp_new_i64();
4164         t1 = tcg_temp_new_i64();
4165         break;
4166     }
4167 
4168     check_cp1_enabled(ctx);
4169     gen_load_fpr64(ctx, t0, rs);
4170     gen_load_fpr64(ctx, t1, rt);
4171 
4172     switch (opc) {
4173     case OPC_PADDSH:
4174         gen_helper_paddsh(t0, t0, t1);
4175         break;
4176     case OPC_PADDUSH:
4177         gen_helper_paddush(t0, t0, t1);
4178         break;
4179     case OPC_PADDH:
4180         gen_helper_paddh(t0, t0, t1);
4181         break;
4182     case OPC_PADDW:
4183         gen_helper_paddw(t0, t0, t1);
4184         break;
4185     case OPC_PADDSB:
4186         gen_helper_paddsb(t0, t0, t1);
4187         break;
4188     case OPC_PADDUSB:
4189         gen_helper_paddusb(t0, t0, t1);
4190         break;
4191     case OPC_PADDB:
4192         gen_helper_paddb(t0, t0, t1);
4193         break;
4194 
4195     case OPC_PSUBSH:
4196         gen_helper_psubsh(t0, t0, t1);
4197         break;
4198     case OPC_PSUBUSH:
4199         gen_helper_psubush(t0, t0, t1);
4200         break;
4201     case OPC_PSUBH:
4202         gen_helper_psubh(t0, t0, t1);
4203         break;
4204     case OPC_PSUBW:
4205         gen_helper_psubw(t0, t0, t1);
4206         break;
4207     case OPC_PSUBSB:
4208         gen_helper_psubsb(t0, t0, t1);
4209         break;
4210     case OPC_PSUBUSB:
4211         gen_helper_psubusb(t0, t0, t1);
4212         break;
4213     case OPC_PSUBB:
4214         gen_helper_psubb(t0, t0, t1);
4215         break;
4216 
4217     case OPC_PSHUFH:
4218         gen_helper_pshufh(t0, t0, t1);
4219         break;
4220     case OPC_PACKSSWH:
4221         gen_helper_packsswh(t0, t0, t1);
4222         break;
4223     case OPC_PACKSSHB:
4224         gen_helper_packsshb(t0, t0, t1);
4225         break;
4226     case OPC_PACKUSHB:
4227         gen_helper_packushb(t0, t0, t1);
4228         break;
4229 
4230     case OPC_PUNPCKLHW:
4231         gen_helper_punpcklhw(t0, t0, t1);
4232         break;
4233     case OPC_PUNPCKHHW:
4234         gen_helper_punpckhhw(t0, t0, t1);
4235         break;
4236     case OPC_PUNPCKLBH:
4237         gen_helper_punpcklbh(t0, t0, t1);
4238         break;
4239     case OPC_PUNPCKHBH:
4240         gen_helper_punpckhbh(t0, t0, t1);
4241         break;
4242     case OPC_PUNPCKLWD:
4243         gen_helper_punpcklwd(t0, t0, t1);
4244         break;
4245     case OPC_PUNPCKHWD:
4246         gen_helper_punpckhwd(t0, t0, t1);
4247         break;
4248 
4249     case OPC_PAVGH:
4250         gen_helper_pavgh(t0, t0, t1);
4251         break;
4252     case OPC_PAVGB:
4253         gen_helper_pavgb(t0, t0, t1);
4254         break;
4255     case OPC_PMAXSH:
4256         gen_helper_pmaxsh(t0, t0, t1);
4257         break;
4258     case OPC_PMINSH:
4259         gen_helper_pminsh(t0, t0, t1);
4260         break;
4261     case OPC_PMAXUB:
4262         gen_helper_pmaxub(t0, t0, t1);
4263         break;
4264     case OPC_PMINUB:
4265         gen_helper_pminub(t0, t0, t1);
4266         break;
4267 
4268     case OPC_PCMPEQW:
4269         gen_helper_pcmpeqw(t0, t0, t1);
4270         break;
4271     case OPC_PCMPGTW:
4272         gen_helper_pcmpgtw(t0, t0, t1);
4273         break;
4274     case OPC_PCMPEQH:
4275         gen_helper_pcmpeqh(t0, t0, t1);
4276         break;
4277     case OPC_PCMPGTH:
4278         gen_helper_pcmpgth(t0, t0, t1);
4279         break;
4280     case OPC_PCMPEQB:
4281         gen_helper_pcmpeqb(t0, t0, t1);
4282         break;
4283     case OPC_PCMPGTB:
4284         gen_helper_pcmpgtb(t0, t0, t1);
4285         break;
4286 
4287     case OPC_PSLLW:
4288         gen_helper_psllw(t0, t0, t1);
4289         break;
4290     case OPC_PSLLH:
4291         gen_helper_psllh(t0, t0, t1);
4292         break;
4293     case OPC_PSRLW:
4294         gen_helper_psrlw(t0, t0, t1);
4295         break;
4296     case OPC_PSRLH:
4297         gen_helper_psrlh(t0, t0, t1);
4298         break;
4299     case OPC_PSRAW:
4300         gen_helper_psraw(t0, t0, t1);
4301         break;
4302     case OPC_PSRAH:
4303         gen_helper_psrah(t0, t0, t1);
4304         break;
4305 
4306     case OPC_PMULLH:
4307         gen_helper_pmullh(t0, t0, t1);
4308         break;
4309     case OPC_PMULHH:
4310         gen_helper_pmulhh(t0, t0, t1);
4311         break;
4312     case OPC_PMULHUH:
4313         gen_helper_pmulhuh(t0, t0, t1);
4314         break;
4315     case OPC_PMADDHW:
4316         gen_helper_pmaddhw(t0, t0, t1);
4317         break;
4318 
4319     case OPC_PASUBUB:
4320         gen_helper_pasubub(t0, t0, t1);
4321         break;
4322     case OPC_BIADD:
4323         gen_helper_biadd(t0, t0);
4324         break;
4325     case OPC_PMOVMSKB:
4326         gen_helper_pmovmskb(t0, t0);
4327         break;
4328 
4329     case OPC_PADDD:
4330         tcg_gen_add_i64(t0, t0, t1);
4331         break;
4332     case OPC_PSUBD:
4333         tcg_gen_sub_i64(t0, t0, t1);
4334         break;
4335     case OPC_XOR_CP2:
4336         tcg_gen_xor_i64(t0, t0, t1);
4337         break;
4338     case OPC_NOR_CP2:
4339         tcg_gen_nor_i64(t0, t0, t1);
4340         break;
4341     case OPC_AND_CP2:
4342         tcg_gen_and_i64(t0, t0, t1);
4343         break;
4344     case OPC_OR_CP2:
4345         tcg_gen_or_i64(t0, t0, t1);
4346         break;
4347 
4348     case OPC_PANDN:
4349         tcg_gen_andc_i64(t0, t1, t0);
4350         break;
4351 
4352     case OPC_PINSRH_0:
4353         tcg_gen_deposit_i64(t0, t0, t1, 0, 16);
4354         break;
4355     case OPC_PINSRH_1:
4356         tcg_gen_deposit_i64(t0, t0, t1, 16, 16);
4357         break;
4358     case OPC_PINSRH_2:
4359         tcg_gen_deposit_i64(t0, t0, t1, 32, 16);
4360         break;
4361     case OPC_PINSRH_3:
4362         tcg_gen_deposit_i64(t0, t0, t1, 48, 16);
4363         break;
4364 
4365     case OPC_PEXTRH:
4366         tcg_gen_andi_i64(t1, t1, 3);
4367         tcg_gen_shli_i64(t1, t1, 4);
4368         tcg_gen_shr_i64(t0, t0, t1);
4369         tcg_gen_ext16u_i64(t0, t0);
4370         break;
4371 
4372     case OPC_ADDU_CP2:
4373         tcg_gen_add_i64(t0, t0, t1);
4374         tcg_gen_ext32s_i64(t0, t0);
4375         break;
4376     case OPC_SUBU_CP2:
4377         tcg_gen_sub_i64(t0, t0, t1);
4378         tcg_gen_ext32s_i64(t0, t0);
4379         break;
4380 
4381     case OPC_SLL_CP2:
4382         shift_max = 32;
4383         goto do_shift;
4384     case OPC_SRL_CP2:
4385         shift_max = 32;
4386         goto do_shift;
4387     case OPC_SRA_CP2:
4388         shift_max = 32;
4389         goto do_shift;
4390     case OPC_DSLL_CP2:
4391         shift_max = 64;
4392         goto do_shift;
4393     case OPC_DSRL_CP2:
4394         shift_max = 64;
4395         goto do_shift;
4396     case OPC_DSRA_CP2:
4397         shift_max = 64;
4398         goto do_shift;
4399     do_shift:
4400         /* Make sure shift count isn't TCG undefined behaviour.  */
4401         tcg_gen_andi_i64(t1, t1, shift_max - 1);
4402 
4403         switch (opc) {
4404         case OPC_SLL_CP2:
4405         case OPC_DSLL_CP2:
4406             tcg_gen_shl_i64(t0, t0, t1);
4407             break;
4408         case OPC_SRA_CP2:
4409         case OPC_DSRA_CP2:
4410             /*
4411              * Since SRA is UndefinedResult without sign-extended inputs,
4412              * we can treat SRA and DSRA the same.
4413              */
4414             tcg_gen_sar_i64(t0, t0, t1);
4415             break;
4416         case OPC_SRL_CP2:
4417             /* We want to shift in zeros for SRL; zero-extend first.  */
4418             tcg_gen_ext32u_i64(t0, t0);
4419             /* FALLTHRU */
4420         case OPC_DSRL_CP2:
4421             tcg_gen_shr_i64(t0, t0, t1);
4422             break;
4423         }
4424 
4425         if (shift_max == 32) {
4426             tcg_gen_ext32s_i64(t0, t0);
4427         }
4428 
4429         /* Shifts larger than MAX produce zero.  */
4430         tcg_gen_setcondi_i64(TCG_COND_LTU, t1, t1, shift_max);
4431         tcg_gen_neg_i64(t1, t1);
4432         tcg_gen_and_i64(t0, t0, t1);
4433         break;
4434 
4435     case OPC_ADD_CP2:
4436     case OPC_DADD_CP2:
4437         {
4438             TCGv_i64 t2 = tcg_temp_new_i64();
4439             TCGLabel *lab = gen_new_label();
4440 
4441             tcg_gen_mov_i64(t2, t0);
4442             tcg_gen_add_i64(t0, t1, t2);
4443             if (opc == OPC_ADD_CP2) {
4444                 tcg_gen_ext32s_i64(t0, t0);
4445             }
4446             tcg_gen_xor_i64(t1, t1, t2);
4447             tcg_gen_xor_i64(t2, t2, t0);
4448             tcg_gen_andc_i64(t1, t2, t1);
4449             tcg_temp_free_i64(t2);
4450             tcg_gen_brcondi_i64(TCG_COND_GE, t1, 0, lab);
4451             generate_exception(ctx, EXCP_OVERFLOW);
4452             gen_set_label(lab);
4453             break;
4454         }
4455 
4456     case OPC_SUB_CP2:
4457     case OPC_DSUB_CP2:
4458         {
4459             TCGv_i64 t2 = tcg_temp_new_i64();
4460             TCGLabel *lab = gen_new_label();
4461 
4462             tcg_gen_mov_i64(t2, t0);
4463             tcg_gen_sub_i64(t0, t1, t2);
4464             if (opc == OPC_SUB_CP2) {
4465                 tcg_gen_ext32s_i64(t0, t0);
4466             }
4467             tcg_gen_xor_i64(t1, t1, t2);
4468             tcg_gen_xor_i64(t2, t2, t0);
4469             tcg_gen_and_i64(t1, t1, t2);
4470             tcg_temp_free_i64(t2);
4471             tcg_gen_brcondi_i64(TCG_COND_GE, t1, 0, lab);
4472             generate_exception(ctx, EXCP_OVERFLOW);
4473             gen_set_label(lab);
4474             break;
4475         }
4476 
4477     case OPC_PMULUW:
4478         tcg_gen_ext32u_i64(t0, t0);
4479         tcg_gen_ext32u_i64(t1, t1);
4480         tcg_gen_mul_i64(t0, t0, t1);
4481         break;
4482 
4483     case OPC_SEQU_CP2:
4484     case OPC_SEQ_CP2:
4485         cond = TCG_COND_EQ;
4486         goto do_cc_cond;
4487         break;
4488     case OPC_SLTU_CP2:
4489         cond = TCG_COND_LTU;
4490         goto do_cc_cond;
4491         break;
4492     case OPC_SLT_CP2:
4493         cond = TCG_COND_LT;
4494         goto do_cc_cond;
4495         break;
4496     case OPC_SLEU_CP2:
4497         cond = TCG_COND_LEU;
4498         goto do_cc_cond;
4499         break;
4500     case OPC_SLE_CP2:
4501         cond = TCG_COND_LE;
4502     do_cc_cond:
4503         {
4504             int cc = (ctx->opcode >> 8) & 0x7;
4505             TCGv_i64 t64 = tcg_temp_new_i64();
4506             TCGv_i32 t32 = tcg_temp_new_i32();
4507 
4508             tcg_gen_setcond_i64(cond, t64, t0, t1);
4509             tcg_gen_extrl_i64_i32(t32, t64);
4510             tcg_gen_deposit_i32(fpu_fcr31, fpu_fcr31, t32,
4511                                 get_fp_bit(cc), 1);
4512 
4513             tcg_temp_free_i32(t32);
4514             tcg_temp_free_i64(t64);
4515         }
4516         goto no_rd;
4517         break;
4518     default:
4519         MIPS_INVAL("loongson_cp2");
4520         gen_reserved_instruction(ctx);
4521         return;
4522     }
4523 
4524     gen_store_fpr64(ctx, t0, rd);
4525 
4526 no_rd:
4527     tcg_temp_free_i64(t0);
4528     tcg_temp_free_i64(t1);
4529 }
4530 
4531 static void gen_loongson_lswc2(DisasContext *ctx, int rt,
4532                                int rs, int rd)
4533 {
4534     TCGv t0, t1, t2;
4535     TCGv_i32 fp0;
4536 #if defined(TARGET_MIPS64)
4537     int lsq_rt1 = ctx->opcode & 0x1f;
4538     int lsq_offset = sextract32(ctx->opcode, 6, 9) << 4;
4539 #endif
4540     int shf_offset = sextract32(ctx->opcode, 6, 8);
4541 
4542     t0 = tcg_temp_new();
4543 
4544     switch (MASK_LOONGSON_GSLSQ(ctx->opcode)) {
4545 #if defined(TARGET_MIPS64)
4546     case OPC_GSLQ:
4547         t1 = tcg_temp_new();
4548         gen_base_offset_addr(ctx, t0, rs, lsq_offset);
4549         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TEQ |
4550                            ctx->default_tcg_memop_mask);
4551         gen_base_offset_addr(ctx, t0, rs, lsq_offset + 8);
4552         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ |
4553                            ctx->default_tcg_memop_mask);
4554         gen_store_gpr(t1, rt);
4555         gen_store_gpr(t0, lsq_rt1);
4556         tcg_temp_free(t1);
4557         break;
4558     case OPC_GSLQC1:
4559         check_cp1_enabled(ctx);
4560         t1 = tcg_temp_new();
4561         gen_base_offset_addr(ctx, t0, rs, lsq_offset);
4562         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TEQ |
4563                            ctx->default_tcg_memop_mask);
4564         gen_base_offset_addr(ctx, t0, rs, lsq_offset + 8);
4565         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ |
4566                            ctx->default_tcg_memop_mask);
4567         gen_store_fpr64(ctx, t1, rt);
4568         gen_store_fpr64(ctx, t0, lsq_rt1);
4569         tcg_temp_free(t1);
4570         break;
4571     case OPC_GSSQ:
4572         t1 = tcg_temp_new();
4573         gen_base_offset_addr(ctx, t0, rs, lsq_offset);
4574         gen_load_gpr(t1, rt);
4575         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ |
4576                            ctx->default_tcg_memop_mask);
4577         gen_base_offset_addr(ctx, t0, rs, lsq_offset + 8);
4578         gen_load_gpr(t1, lsq_rt1);
4579         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ |
4580                            ctx->default_tcg_memop_mask);
4581         tcg_temp_free(t1);
4582         break;
4583     case OPC_GSSQC1:
4584         check_cp1_enabled(ctx);
4585         t1 = tcg_temp_new();
4586         gen_base_offset_addr(ctx, t0, rs, lsq_offset);
4587         gen_load_fpr64(ctx, t1, rt);
4588         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ |
4589                            ctx->default_tcg_memop_mask);
4590         gen_base_offset_addr(ctx, t0, rs, lsq_offset + 8);
4591         gen_load_fpr64(ctx, t1, lsq_rt1);
4592         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ |
4593                            ctx->default_tcg_memop_mask);
4594         tcg_temp_free(t1);
4595         break;
4596 #endif
4597     case OPC_GSSHFL:
4598         switch (MASK_LOONGSON_GSSHFLS(ctx->opcode)) {
4599         case OPC_GSLWLC1:
4600             check_cp1_enabled(ctx);
4601             gen_base_offset_addr(ctx, t0, rs, shf_offset);
4602             t1 = tcg_temp_new();
4603             tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_UB);
4604             tcg_gen_andi_tl(t1, t0, 3);
4605 #ifndef TARGET_WORDS_BIGENDIAN
4606             tcg_gen_xori_tl(t1, t1, 3);
4607 #endif
4608             tcg_gen_shli_tl(t1, t1, 3);
4609             tcg_gen_andi_tl(t0, t0, ~3);
4610             tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEUL);
4611             tcg_gen_shl_tl(t0, t0, t1);
4612             t2 = tcg_const_tl(-1);
4613             tcg_gen_shl_tl(t2, t2, t1);
4614             fp0 = tcg_temp_new_i32();
4615             gen_load_fpr32(ctx, fp0, rt);
4616             tcg_gen_ext_i32_tl(t1, fp0);
4617             tcg_gen_andc_tl(t1, t1, t2);
4618             tcg_temp_free(t2);
4619             tcg_gen_or_tl(t0, t0, t1);
4620             tcg_temp_free(t1);
4621 #if defined(TARGET_MIPS64)
4622             tcg_gen_extrl_i64_i32(fp0, t0);
4623 #else
4624             tcg_gen_ext32s_tl(fp0, t0);
4625 #endif
4626             gen_store_fpr32(ctx, fp0, rt);
4627             tcg_temp_free_i32(fp0);
4628             break;
4629         case OPC_GSLWRC1:
4630             check_cp1_enabled(ctx);
4631             gen_base_offset_addr(ctx, t0, rs, shf_offset);
4632             t1 = tcg_temp_new();
4633             tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_UB);
4634             tcg_gen_andi_tl(t1, t0, 3);
4635 #ifdef TARGET_WORDS_BIGENDIAN
4636             tcg_gen_xori_tl(t1, t1, 3);
4637 #endif
4638             tcg_gen_shli_tl(t1, t1, 3);
4639             tcg_gen_andi_tl(t0, t0, ~3);
4640             tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEUL);
4641             tcg_gen_shr_tl(t0, t0, t1);
4642             tcg_gen_xori_tl(t1, t1, 31);
4643             t2 = tcg_const_tl(0xfffffffeull);
4644             tcg_gen_shl_tl(t2, t2, t1);
4645             fp0 = tcg_temp_new_i32();
4646             gen_load_fpr32(ctx, fp0, rt);
4647             tcg_gen_ext_i32_tl(t1, fp0);
4648             tcg_gen_and_tl(t1, t1, t2);
4649             tcg_temp_free(t2);
4650             tcg_gen_or_tl(t0, t0, t1);
4651             tcg_temp_free(t1);
4652 #if defined(TARGET_MIPS64)
4653             tcg_gen_extrl_i64_i32(fp0, t0);
4654 #else
4655             tcg_gen_ext32s_tl(fp0, t0);
4656 #endif
4657             gen_store_fpr32(ctx, fp0, rt);
4658             tcg_temp_free_i32(fp0);
4659             break;
4660 #if defined(TARGET_MIPS64)
4661         case OPC_GSLDLC1:
4662             check_cp1_enabled(ctx);
4663             gen_base_offset_addr(ctx, t0, rs, shf_offset);
4664             t1 = tcg_temp_new();
4665             tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_UB);
4666             tcg_gen_andi_tl(t1, t0, 7);
4667 #ifndef TARGET_WORDS_BIGENDIAN
4668             tcg_gen_xori_tl(t1, t1, 7);
4669 #endif
4670             tcg_gen_shli_tl(t1, t1, 3);
4671             tcg_gen_andi_tl(t0, t0, ~7);
4672             tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ);
4673             tcg_gen_shl_tl(t0, t0, t1);
4674             t2 = tcg_const_tl(-1);
4675             tcg_gen_shl_tl(t2, t2, t1);
4676             gen_load_fpr64(ctx, t1, rt);
4677             tcg_gen_andc_tl(t1, t1, t2);
4678             tcg_temp_free(t2);
4679             tcg_gen_or_tl(t0, t0, t1);
4680             tcg_temp_free(t1);
4681             gen_store_fpr64(ctx, t0, rt);
4682             break;
4683         case OPC_GSLDRC1:
4684             check_cp1_enabled(ctx);
4685             gen_base_offset_addr(ctx, t0, rs, shf_offset);
4686             t1 = tcg_temp_new();
4687             tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_UB);
4688             tcg_gen_andi_tl(t1, t0, 7);
4689 #ifdef TARGET_WORDS_BIGENDIAN
4690             tcg_gen_xori_tl(t1, t1, 7);
4691 #endif
4692             tcg_gen_shli_tl(t1, t1, 3);
4693             tcg_gen_andi_tl(t0, t0, ~7);
4694             tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ);
4695             tcg_gen_shr_tl(t0, t0, t1);
4696             tcg_gen_xori_tl(t1, t1, 63);
4697             t2 = tcg_const_tl(0xfffffffffffffffeull);
4698             tcg_gen_shl_tl(t2, t2, t1);
4699             gen_load_fpr64(ctx, t1, rt);
4700             tcg_gen_and_tl(t1, t1, t2);
4701             tcg_temp_free(t2);
4702             tcg_gen_or_tl(t0, t0, t1);
4703             tcg_temp_free(t1);
4704             gen_store_fpr64(ctx, t0, rt);
4705             break;
4706 #endif
4707         default:
4708             MIPS_INVAL("loongson_gsshfl");
4709             gen_reserved_instruction(ctx);
4710             break;
4711         }
4712         break;
4713     case OPC_GSSHFS:
4714         switch (MASK_LOONGSON_GSSHFLS(ctx->opcode)) {
4715         case OPC_GSSWLC1:
4716             check_cp1_enabled(ctx);
4717             t1 = tcg_temp_new();
4718             gen_base_offset_addr(ctx, t0, rs, shf_offset);
4719             fp0 = tcg_temp_new_i32();
4720             gen_load_fpr32(ctx, fp0, rt);
4721             tcg_gen_ext_i32_tl(t1, fp0);
4722             gen_helper_0e2i(swl, t1, t0, ctx->mem_idx);
4723             tcg_temp_free_i32(fp0);
4724             tcg_temp_free(t1);
4725             break;
4726         case OPC_GSSWRC1:
4727             check_cp1_enabled(ctx);
4728             t1 = tcg_temp_new();
4729             gen_base_offset_addr(ctx, t0, rs, shf_offset);
4730             fp0 = tcg_temp_new_i32();
4731             gen_load_fpr32(ctx, fp0, rt);
4732             tcg_gen_ext_i32_tl(t1, fp0);
4733             gen_helper_0e2i(swr, t1, t0, ctx->mem_idx);
4734             tcg_temp_free_i32(fp0);
4735             tcg_temp_free(t1);
4736             break;
4737 #if defined(TARGET_MIPS64)
4738         case OPC_GSSDLC1:
4739             check_cp1_enabled(ctx);
4740             t1 = tcg_temp_new();
4741             gen_base_offset_addr(ctx, t0, rs, shf_offset);
4742             gen_load_fpr64(ctx, t1, rt);
4743             gen_helper_0e2i(sdl, t1, t0, ctx->mem_idx);
4744             tcg_temp_free(t1);
4745             break;
4746         case OPC_GSSDRC1:
4747             check_cp1_enabled(ctx);
4748             t1 = tcg_temp_new();
4749             gen_base_offset_addr(ctx, t0, rs, shf_offset);
4750             gen_load_fpr64(ctx, t1, rt);
4751             gen_helper_0e2i(sdr, t1, t0, ctx->mem_idx);
4752             tcg_temp_free(t1);
4753             break;
4754 #endif
4755         default:
4756             MIPS_INVAL("loongson_gsshfs");
4757             gen_reserved_instruction(ctx);
4758             break;
4759         }
4760         break;
4761     default:
4762         MIPS_INVAL("loongson_gslsq");
4763         gen_reserved_instruction(ctx);
4764         break;
4765     }
4766     tcg_temp_free(t0);
4767 }
4768 
4769 /* Loongson EXT LDC2/SDC2 */
4770 static void gen_loongson_lsdc2(DisasContext *ctx, int rt,
4771                                int rs, int rd)
4772 {
4773     int offset = sextract32(ctx->opcode, 3, 8);
4774     uint32_t opc = MASK_LOONGSON_LSDC2(ctx->opcode);
4775     TCGv t0, t1;
4776     TCGv_i32 fp0;
4777 
4778     /* Pre-conditions */
4779     switch (opc) {
4780     case OPC_GSLBX:
4781     case OPC_GSLHX:
4782     case OPC_GSLWX:
4783     case OPC_GSLDX:
4784         /* prefetch, implement as NOP */
4785         if (rt == 0) {
4786             return;
4787         }
4788         break;
4789     case OPC_GSSBX:
4790     case OPC_GSSHX:
4791     case OPC_GSSWX:
4792     case OPC_GSSDX:
4793         break;
4794     case OPC_GSLWXC1:
4795 #if defined(TARGET_MIPS64)
4796     case OPC_GSLDXC1:
4797 #endif
4798         check_cp1_enabled(ctx);
4799         /* prefetch, implement as NOP */
4800         if (rt == 0) {
4801             return;
4802         }
4803         break;
4804     case OPC_GSSWXC1:
4805 #if defined(TARGET_MIPS64)
4806     case OPC_GSSDXC1:
4807 #endif
4808         check_cp1_enabled(ctx);
4809         break;
4810     default:
4811         MIPS_INVAL("loongson_lsdc2");
4812         gen_reserved_instruction(ctx);
4813         return;
4814         break;
4815     }
4816 
4817     t0 = tcg_temp_new();
4818 
4819     gen_base_offset_addr(ctx, t0, rs, offset);
4820     gen_op_addr_add(ctx, t0, cpu_gpr[rd], t0);
4821 
4822     switch (opc) {
4823     case OPC_GSLBX:
4824         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_SB);
4825         gen_store_gpr(t0, rt);
4826         break;
4827     case OPC_GSLHX:
4828         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESW |
4829                            ctx->default_tcg_memop_mask);
4830         gen_store_gpr(t0, rt);
4831         break;
4832     case OPC_GSLWX:
4833         gen_base_offset_addr(ctx, t0, rs, offset);
4834         if (rd) {
4835             gen_op_addr_add(ctx, t0, cpu_gpr[rd], t0);
4836         }
4837         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL |
4838                            ctx->default_tcg_memop_mask);
4839         gen_store_gpr(t0, rt);
4840         break;
4841 #if defined(TARGET_MIPS64)
4842     case OPC_GSLDX:
4843         gen_base_offset_addr(ctx, t0, rs, offset);
4844         if (rd) {
4845             gen_op_addr_add(ctx, t0, cpu_gpr[rd], t0);
4846         }
4847         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ |
4848                            ctx->default_tcg_memop_mask);
4849         gen_store_gpr(t0, rt);
4850         break;
4851 #endif
4852     case OPC_GSLWXC1:
4853         check_cp1_enabled(ctx);
4854         gen_base_offset_addr(ctx, t0, rs, offset);
4855         if (rd) {
4856             gen_op_addr_add(ctx, t0, cpu_gpr[rd], t0);
4857         }
4858         fp0 = tcg_temp_new_i32();
4859         tcg_gen_qemu_ld_i32(fp0, t0, ctx->mem_idx, MO_TESL |
4860                             ctx->default_tcg_memop_mask);
4861         gen_store_fpr32(ctx, fp0, rt);
4862         tcg_temp_free_i32(fp0);
4863         break;
4864 #if defined(TARGET_MIPS64)
4865     case OPC_GSLDXC1:
4866         check_cp1_enabled(ctx);
4867         gen_base_offset_addr(ctx, t0, rs, offset);
4868         if (rd) {
4869             gen_op_addr_add(ctx, t0, cpu_gpr[rd], t0);
4870         }
4871         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ |
4872                            ctx->default_tcg_memop_mask);
4873         gen_store_fpr64(ctx, t0, rt);
4874         break;
4875 #endif
4876     case OPC_GSSBX:
4877         t1 = tcg_temp_new();
4878         gen_load_gpr(t1, rt);
4879         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_SB);
4880         tcg_temp_free(t1);
4881         break;
4882     case OPC_GSSHX:
4883         t1 = tcg_temp_new();
4884         gen_load_gpr(t1, rt);
4885         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUW |
4886                            ctx->default_tcg_memop_mask);
4887         tcg_temp_free(t1);
4888         break;
4889     case OPC_GSSWX:
4890         t1 = tcg_temp_new();
4891         gen_load_gpr(t1, rt);
4892         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL |
4893                            ctx->default_tcg_memop_mask);
4894         tcg_temp_free(t1);
4895         break;
4896 #if defined(TARGET_MIPS64)
4897     case OPC_GSSDX:
4898         t1 = tcg_temp_new();
4899         gen_load_gpr(t1, rt);
4900         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ |
4901                            ctx->default_tcg_memop_mask);
4902         tcg_temp_free(t1);
4903         break;
4904 #endif
4905     case OPC_GSSWXC1:
4906         fp0 = tcg_temp_new_i32();
4907         gen_load_fpr32(ctx, fp0, rt);
4908         tcg_gen_qemu_st_i32(fp0, t0, ctx->mem_idx, MO_TEUL |
4909                             ctx->default_tcg_memop_mask);
4910         tcg_temp_free_i32(fp0);
4911         break;
4912 #if defined(TARGET_MIPS64)
4913     case OPC_GSSDXC1:
4914         t1 = tcg_temp_new();
4915         gen_load_fpr64(ctx, t1, rt);
4916         tcg_gen_qemu_st_i64(t1, t0, ctx->mem_idx, MO_TEQ |
4917                             ctx->default_tcg_memop_mask);
4918         tcg_temp_free(t1);
4919         break;
4920 #endif
4921     default:
4922         break;
4923     }
4924 
4925     tcg_temp_free(t0);
4926 }
4927 
4928 /* Traps */
4929 static void gen_trap(DisasContext *ctx, uint32_t opc,
4930                      int rs, int rt, int16_t imm)
4931 {
4932     int cond;
4933     TCGv t0 = tcg_temp_new();
4934     TCGv t1 = tcg_temp_new();
4935 
4936     cond = 0;
4937     /* Load needed operands */
4938     switch (opc) {
4939     case OPC_TEQ:
4940     case OPC_TGE:
4941     case OPC_TGEU:
4942     case OPC_TLT:
4943     case OPC_TLTU:
4944     case OPC_TNE:
4945         /* Compare two registers */
4946         if (rs != rt) {
4947             gen_load_gpr(t0, rs);
4948             gen_load_gpr(t1, rt);
4949             cond = 1;
4950         }
4951         break;
4952     case OPC_TEQI:
4953     case OPC_TGEI:
4954     case OPC_TGEIU:
4955     case OPC_TLTI:
4956     case OPC_TLTIU:
4957     case OPC_TNEI:
4958         /* Compare register to immediate */
4959         if (rs != 0 || imm != 0) {
4960             gen_load_gpr(t0, rs);
4961             tcg_gen_movi_tl(t1, (int32_t)imm);
4962             cond = 1;
4963         }
4964         break;
4965     }
4966     if (cond == 0) {
4967         switch (opc) {
4968         case OPC_TEQ:   /* rs == rs */
4969         case OPC_TEQI:  /* r0 == 0  */
4970         case OPC_TGE:   /* rs >= rs */
4971         case OPC_TGEI:  /* r0 >= 0  */
4972         case OPC_TGEU:  /* rs >= rs unsigned */
4973         case OPC_TGEIU: /* r0 >= 0  unsigned */
4974             /* Always trap */
4975             generate_exception_end(ctx, EXCP_TRAP);
4976             break;
4977         case OPC_TLT:   /* rs < rs           */
4978         case OPC_TLTI:  /* r0 < 0            */
4979         case OPC_TLTU:  /* rs < rs unsigned  */
4980         case OPC_TLTIU: /* r0 < 0  unsigned  */
4981         case OPC_TNE:   /* rs != rs          */
4982         case OPC_TNEI:  /* r0 != 0           */
4983             /* Never trap: treat as NOP. */
4984             break;
4985         }
4986     } else {
4987         TCGLabel *l1 = gen_new_label();
4988 
4989         switch (opc) {
4990         case OPC_TEQ:
4991         case OPC_TEQI:
4992             tcg_gen_brcond_tl(TCG_COND_NE, t0, t1, l1);
4993             break;
4994         case OPC_TGE:
4995         case OPC_TGEI:
4996             tcg_gen_brcond_tl(TCG_COND_LT, t0, t1, l1);
4997             break;
4998         case OPC_TGEU:
4999         case OPC_TGEIU:
5000             tcg_gen_brcond_tl(TCG_COND_LTU, t0, t1, l1);
5001             break;
5002         case OPC_TLT:
5003         case OPC_TLTI:
5004             tcg_gen_brcond_tl(TCG_COND_GE, t0, t1, l1);
5005             break;
5006         case OPC_TLTU:
5007         case OPC_TLTIU:
5008             tcg_gen_brcond_tl(TCG_COND_GEU, t0, t1, l1);
5009             break;
5010         case OPC_TNE:
5011         case OPC_TNEI:
5012             tcg_gen_brcond_tl(TCG_COND_EQ, t0, t1, l1);
5013             break;
5014         }
5015         generate_exception(ctx, EXCP_TRAP);
5016         gen_set_label(l1);
5017     }
5018     tcg_temp_free(t0);
5019     tcg_temp_free(t1);
5020 }
5021 
5022 static inline bool use_goto_tb(DisasContext *ctx, target_ulong dest)
5023 {
5024     if (unlikely(ctx->base.singlestep_enabled)) {
5025         return false;
5026     }
5027 
5028 #ifndef CONFIG_USER_ONLY
5029     return (ctx->base.tb->pc & TARGET_PAGE_MASK) == (dest & TARGET_PAGE_MASK);
5030 #else
5031     return true;
5032 #endif
5033 }
5034 
5035 static inline void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
5036 {
5037     if (use_goto_tb(ctx, dest)) {
5038         tcg_gen_goto_tb(n);
5039         gen_save_pc(dest);
5040         tcg_gen_exit_tb(ctx->base.tb, n);
5041     } else {
5042         gen_save_pc(dest);
5043         if (ctx->base.singlestep_enabled) {
5044             save_cpu_state(ctx, 0);
5045             gen_helper_raise_exception_debug(cpu_env);
5046         }
5047         tcg_gen_lookup_and_goto_ptr();
5048     }
5049 }
5050 
5051 /* Branches (before delay slot) */
5052 static void gen_compute_branch(DisasContext *ctx, uint32_t opc,
5053                                int insn_bytes,
5054                                int rs, int rt, int32_t offset,
5055                                int delayslot_size)
5056 {
5057     target_ulong btgt = -1;
5058     int blink = 0;
5059     int bcond_compute = 0;
5060     TCGv t0 = tcg_temp_new();
5061     TCGv t1 = tcg_temp_new();
5062 
5063     if (ctx->hflags & MIPS_HFLAG_BMASK) {
5064 #ifdef MIPS_DEBUG_DISAS
5065         LOG_DISAS("Branch in delay / forbidden slot at PC 0x"
5066                   TARGET_FMT_lx "\n", ctx->base.pc_next);
5067 #endif
5068         gen_reserved_instruction(ctx);
5069         goto out;
5070     }
5071 
5072     /* Load needed operands */
5073     switch (opc) {
5074     case OPC_BEQ:
5075     case OPC_BEQL:
5076     case OPC_BNE:
5077     case OPC_BNEL:
5078         /* Compare two registers */
5079         if (rs != rt) {
5080             gen_load_gpr(t0, rs);
5081             gen_load_gpr(t1, rt);
5082             bcond_compute = 1;
5083         }
5084         btgt = ctx->base.pc_next + insn_bytes + offset;
5085         break;
5086     case OPC_BGEZ:
5087     case OPC_BGEZAL:
5088     case OPC_BGEZALL:
5089     case OPC_BGEZL:
5090     case OPC_BGTZ:
5091     case OPC_BGTZL:
5092     case OPC_BLEZ:
5093     case OPC_BLEZL:
5094     case OPC_BLTZ:
5095     case OPC_BLTZAL:
5096     case OPC_BLTZALL:
5097     case OPC_BLTZL:
5098         /* Compare to zero */
5099         if (rs != 0) {
5100             gen_load_gpr(t0, rs);
5101             bcond_compute = 1;
5102         }
5103         btgt = ctx->base.pc_next + insn_bytes + offset;
5104         break;
5105     case OPC_BPOSGE32:
5106 #if defined(TARGET_MIPS64)
5107     case OPC_BPOSGE64:
5108         tcg_gen_andi_tl(t0, cpu_dspctrl, 0x7F);
5109 #else
5110         tcg_gen_andi_tl(t0, cpu_dspctrl, 0x3F);
5111 #endif
5112         bcond_compute = 1;
5113         btgt = ctx->base.pc_next + insn_bytes + offset;
5114         break;
5115     case OPC_J:
5116     case OPC_JAL:
5117     case OPC_JALX:
5118         /* Jump to immediate */
5119         btgt = ((ctx->base.pc_next + insn_bytes) & (int32_t)0xF0000000) |
5120             (uint32_t)offset;
5121         break;
5122     case OPC_JR:
5123     case OPC_JALR:
5124         /* Jump to register */
5125         if (offset != 0 && offset != 16) {
5126             /*
5127              * Hint = 0 is JR/JALR, hint 16 is JR.HB/JALR.HB, the
5128              * others are reserved.
5129              */
5130             MIPS_INVAL("jump hint");
5131             gen_reserved_instruction(ctx);
5132             goto out;
5133         }
5134         gen_load_gpr(btarget, rs);
5135         break;
5136     default:
5137         MIPS_INVAL("branch/jump");
5138         gen_reserved_instruction(ctx);
5139         goto out;
5140     }
5141     if (bcond_compute == 0) {
5142         /* No condition to be computed */
5143         switch (opc) {
5144         case OPC_BEQ:     /* rx == rx        */
5145         case OPC_BEQL:    /* rx == rx likely */
5146         case OPC_BGEZ:    /* 0 >= 0          */
5147         case OPC_BGEZL:   /* 0 >= 0 likely   */
5148         case OPC_BLEZ:    /* 0 <= 0          */
5149         case OPC_BLEZL:   /* 0 <= 0 likely   */
5150             /* Always take */
5151             ctx->hflags |= MIPS_HFLAG_B;
5152             break;
5153         case OPC_BGEZAL:  /* 0 >= 0          */
5154         case OPC_BGEZALL: /* 0 >= 0 likely   */
5155             /* Always take and link */
5156             blink = 31;
5157             ctx->hflags |= MIPS_HFLAG_B;
5158             break;
5159         case OPC_BNE:     /* rx != rx        */
5160         case OPC_BGTZ:    /* 0 > 0           */
5161         case OPC_BLTZ:    /* 0 < 0           */
5162             /* Treat as NOP. */
5163             goto out;
5164         case OPC_BLTZAL:  /* 0 < 0           */
5165             /*
5166              * Handle as an unconditional branch to get correct delay
5167              * slot checking.
5168              */
5169             blink = 31;
5170             btgt = ctx->base.pc_next + insn_bytes + delayslot_size;
5171             ctx->hflags |= MIPS_HFLAG_B;
5172             break;
5173         case OPC_BLTZALL: /* 0 < 0 likely */
5174             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 8);
5175             /* Skip the instruction in the delay slot */
5176             ctx->base.pc_next += 4;
5177             goto out;
5178         case OPC_BNEL:    /* rx != rx likely */
5179         case OPC_BGTZL:   /* 0 > 0 likely */
5180         case OPC_BLTZL:   /* 0 < 0 likely */
5181             /* Skip the instruction in the delay slot */
5182             ctx->base.pc_next += 4;
5183             goto out;
5184         case OPC_J:
5185             ctx->hflags |= MIPS_HFLAG_B;
5186             break;
5187         case OPC_JALX:
5188             ctx->hflags |= MIPS_HFLAG_BX;
5189             /* Fallthrough */
5190         case OPC_JAL:
5191             blink = 31;
5192             ctx->hflags |= MIPS_HFLAG_B;
5193             break;
5194         case OPC_JR:
5195             ctx->hflags |= MIPS_HFLAG_BR;
5196             break;
5197         case OPC_JALR:
5198             blink = rt;
5199             ctx->hflags |= MIPS_HFLAG_BR;
5200             break;
5201         default:
5202             MIPS_INVAL("branch/jump");
5203             gen_reserved_instruction(ctx);
5204             goto out;
5205         }
5206     } else {
5207         switch (opc) {
5208         case OPC_BEQ:
5209             tcg_gen_setcond_tl(TCG_COND_EQ, bcond, t0, t1);
5210             goto not_likely;
5211         case OPC_BEQL:
5212             tcg_gen_setcond_tl(TCG_COND_EQ, bcond, t0, t1);
5213             goto likely;
5214         case OPC_BNE:
5215             tcg_gen_setcond_tl(TCG_COND_NE, bcond, t0, t1);
5216             goto not_likely;
5217         case OPC_BNEL:
5218             tcg_gen_setcond_tl(TCG_COND_NE, bcond, t0, t1);
5219             goto likely;
5220         case OPC_BGEZ:
5221             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
5222             goto not_likely;
5223         case OPC_BGEZL:
5224             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
5225             goto likely;
5226         case OPC_BGEZAL:
5227             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
5228             blink = 31;
5229             goto not_likely;
5230         case OPC_BGEZALL:
5231             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
5232             blink = 31;
5233             goto likely;
5234         case OPC_BGTZ:
5235             tcg_gen_setcondi_tl(TCG_COND_GT, bcond, t0, 0);
5236             goto not_likely;
5237         case OPC_BGTZL:
5238             tcg_gen_setcondi_tl(TCG_COND_GT, bcond, t0, 0);
5239             goto likely;
5240         case OPC_BLEZ:
5241             tcg_gen_setcondi_tl(TCG_COND_LE, bcond, t0, 0);
5242             goto not_likely;
5243         case OPC_BLEZL:
5244             tcg_gen_setcondi_tl(TCG_COND_LE, bcond, t0, 0);
5245             goto likely;
5246         case OPC_BLTZ:
5247             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
5248             goto not_likely;
5249         case OPC_BLTZL:
5250             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
5251             goto likely;
5252         case OPC_BPOSGE32:
5253             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 32);
5254             goto not_likely;
5255 #if defined(TARGET_MIPS64)
5256         case OPC_BPOSGE64:
5257             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 64);
5258             goto not_likely;
5259 #endif
5260         case OPC_BLTZAL:
5261             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
5262             blink = 31;
5263         not_likely:
5264             ctx->hflags |= MIPS_HFLAG_BC;
5265             break;
5266         case OPC_BLTZALL:
5267             tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
5268             blink = 31;
5269         likely:
5270             ctx->hflags |= MIPS_HFLAG_BL;
5271             break;
5272         default:
5273             MIPS_INVAL("conditional branch/jump");
5274             gen_reserved_instruction(ctx);
5275             goto out;
5276         }
5277     }
5278 
5279     ctx->btarget = btgt;
5280 
5281     switch (delayslot_size) {
5282     case 2:
5283         ctx->hflags |= MIPS_HFLAG_BDS16;
5284         break;
5285     case 4:
5286         ctx->hflags |= MIPS_HFLAG_BDS32;
5287         break;
5288     }
5289 
5290     if (blink > 0) {
5291         int post_delay = insn_bytes + delayslot_size;
5292         int lowbit = !!(ctx->hflags & MIPS_HFLAG_M16);
5293 
5294         tcg_gen_movi_tl(cpu_gpr[blink],
5295                         ctx->base.pc_next + post_delay + lowbit);
5296     }
5297 
5298  out:
5299     if (insn_bytes == 2) {
5300         ctx->hflags |= MIPS_HFLAG_B16;
5301     }
5302     tcg_temp_free(t0);
5303     tcg_temp_free(t1);
5304 }
5305 
5306 
5307 /* nanoMIPS Branches */
5308 static void gen_compute_branch_nm(DisasContext *ctx, uint32_t opc,
5309                                 int insn_bytes,
5310                                 int rs, int rt, int32_t offset)
5311 {
5312     target_ulong btgt = -1;
5313     int bcond_compute = 0;
5314     TCGv t0 = tcg_temp_new();
5315     TCGv t1 = tcg_temp_new();
5316 
5317     /* Load needed operands */
5318     switch (opc) {
5319     case OPC_BEQ:
5320     case OPC_BNE:
5321         /* Compare two registers */
5322         if (rs != rt) {
5323             gen_load_gpr(t0, rs);
5324             gen_load_gpr(t1, rt);
5325             bcond_compute = 1;
5326         }
5327         btgt = ctx->base.pc_next + insn_bytes + offset;
5328         break;
5329     case OPC_BGEZAL:
5330         /* Compare to zero */
5331         if (rs != 0) {
5332             gen_load_gpr(t0, rs);
5333             bcond_compute = 1;
5334         }
5335         btgt = ctx->base.pc_next + insn_bytes + offset;
5336         break;
5337     case OPC_BPOSGE32:
5338         tcg_gen_andi_tl(t0, cpu_dspctrl, 0x3F);
5339         bcond_compute = 1;
5340         btgt = ctx->base.pc_next + insn_bytes + offset;
5341         break;
5342     case OPC_JR:
5343     case OPC_JALR:
5344         /* Jump to register */
5345         if (offset != 0 && offset != 16) {
5346             /*
5347              * Hint = 0 is JR/JALR, hint 16 is JR.HB/JALR.HB, the
5348              * others are reserved.
5349              */
5350             MIPS_INVAL("jump hint");
5351             gen_reserved_instruction(ctx);
5352             goto out;
5353         }
5354         gen_load_gpr(btarget, rs);
5355         break;
5356     default:
5357         MIPS_INVAL("branch/jump");
5358         gen_reserved_instruction(ctx);
5359         goto out;
5360     }
5361     if (bcond_compute == 0) {
5362         /* No condition to be computed */
5363         switch (opc) {
5364         case OPC_BEQ:     /* rx == rx        */
5365             /* Always take */
5366             ctx->hflags |= MIPS_HFLAG_B;
5367             break;
5368         case OPC_BGEZAL:  /* 0 >= 0          */
5369             /* Always take and link */
5370             tcg_gen_movi_tl(cpu_gpr[31],
5371                             ctx->base.pc_next + insn_bytes);
5372             ctx->hflags |= MIPS_HFLAG_B;
5373             break;
5374         case OPC_BNE:     /* rx != rx        */
5375             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 8);
5376             /* Skip the instruction in the delay slot */
5377             ctx->base.pc_next += 4;
5378             goto out;
5379         case OPC_JR:
5380             ctx->hflags |= MIPS_HFLAG_BR;
5381             break;
5382         case OPC_JALR:
5383             if (rt > 0) {
5384                 tcg_gen_movi_tl(cpu_gpr[rt],
5385                                 ctx->base.pc_next + insn_bytes);
5386             }
5387             ctx->hflags |= MIPS_HFLAG_BR;
5388             break;
5389         default:
5390             MIPS_INVAL("branch/jump");
5391             gen_reserved_instruction(ctx);
5392             goto out;
5393         }
5394     } else {
5395         switch (opc) {
5396         case OPC_BEQ:
5397             tcg_gen_setcond_tl(TCG_COND_EQ, bcond, t0, t1);
5398             goto not_likely;
5399         case OPC_BNE:
5400             tcg_gen_setcond_tl(TCG_COND_NE, bcond, t0, t1);
5401             goto not_likely;
5402         case OPC_BGEZAL:
5403             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
5404             tcg_gen_movi_tl(cpu_gpr[31],
5405                             ctx->base.pc_next + insn_bytes);
5406             goto not_likely;
5407         case OPC_BPOSGE32:
5408             tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 32);
5409         not_likely:
5410             ctx->hflags |= MIPS_HFLAG_BC;
5411             break;
5412         default:
5413             MIPS_INVAL("conditional branch/jump");
5414             gen_reserved_instruction(ctx);
5415             goto out;
5416         }
5417     }
5418 
5419     ctx->btarget = btgt;
5420 
5421  out:
5422     if (insn_bytes == 2) {
5423         ctx->hflags |= MIPS_HFLAG_B16;
5424     }
5425     tcg_temp_free(t0);
5426     tcg_temp_free(t1);
5427 }
5428 
5429 
5430 /* special3 bitfield operations */
5431 static void gen_bitops(DisasContext *ctx, uint32_t opc, int rt,
5432                        int rs, int lsb, int msb)
5433 {
5434     TCGv t0 = tcg_temp_new();
5435     TCGv t1 = tcg_temp_new();
5436 
5437     gen_load_gpr(t1, rs);
5438     switch (opc) {
5439     case OPC_EXT:
5440         if (lsb + msb > 31) {
5441             goto fail;
5442         }
5443         if (msb != 31) {
5444             tcg_gen_extract_tl(t0, t1, lsb, msb + 1);
5445         } else {
5446             /*
5447              * The two checks together imply that lsb == 0,
5448              * so this is a simple sign-extension.
5449              */
5450             tcg_gen_ext32s_tl(t0, t1);
5451         }
5452         break;
5453 #if defined(TARGET_MIPS64)
5454     case OPC_DEXTU:
5455         lsb += 32;
5456         goto do_dext;
5457     case OPC_DEXTM:
5458         msb += 32;
5459         goto do_dext;
5460     case OPC_DEXT:
5461     do_dext:
5462         if (lsb + msb > 63) {
5463             goto fail;
5464         }
5465         tcg_gen_extract_tl(t0, t1, lsb, msb + 1);
5466         break;
5467 #endif
5468     case OPC_INS:
5469         if (lsb > msb) {
5470             goto fail;
5471         }
5472         gen_load_gpr(t0, rt);
5473         tcg_gen_deposit_tl(t0, t0, t1, lsb, msb - lsb + 1);
5474         tcg_gen_ext32s_tl(t0, t0);
5475         break;
5476 #if defined(TARGET_MIPS64)
5477     case OPC_DINSU:
5478         lsb += 32;
5479         /* FALLTHRU */
5480     case OPC_DINSM:
5481         msb += 32;
5482         /* FALLTHRU */
5483     case OPC_DINS:
5484         if (lsb > msb) {
5485             goto fail;
5486         }
5487         gen_load_gpr(t0, rt);
5488         tcg_gen_deposit_tl(t0, t0, t1, lsb, msb - lsb + 1);
5489         break;
5490 #endif
5491     default:
5492 fail:
5493         MIPS_INVAL("bitops");
5494         gen_reserved_instruction(ctx);
5495         tcg_temp_free(t0);
5496         tcg_temp_free(t1);
5497         return;
5498     }
5499     gen_store_gpr(t0, rt);
5500     tcg_temp_free(t0);
5501     tcg_temp_free(t1);
5502 }
5503 
5504 static void gen_bshfl(DisasContext *ctx, uint32_t op2, int rt, int rd)
5505 {
5506     TCGv t0;
5507 
5508     if (rd == 0) {
5509         /* If no destination, treat it as a NOP. */
5510         return;
5511     }
5512 
5513     t0 = tcg_temp_new();
5514     gen_load_gpr(t0, rt);
5515     switch (op2) {
5516     case OPC_WSBH:
5517         {
5518             TCGv t1 = tcg_temp_new();
5519             TCGv t2 = tcg_const_tl(0x00FF00FF);
5520 
5521             tcg_gen_shri_tl(t1, t0, 8);
5522             tcg_gen_and_tl(t1, t1, t2);
5523             tcg_gen_and_tl(t0, t0, t2);
5524             tcg_gen_shli_tl(t0, t0, 8);
5525             tcg_gen_or_tl(t0, t0, t1);
5526             tcg_temp_free(t2);
5527             tcg_temp_free(t1);
5528             tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
5529         }
5530         break;
5531     case OPC_SEB:
5532         tcg_gen_ext8s_tl(cpu_gpr[rd], t0);
5533         break;
5534     case OPC_SEH:
5535         tcg_gen_ext16s_tl(cpu_gpr[rd], t0);
5536         break;
5537 #if defined(TARGET_MIPS64)
5538     case OPC_DSBH:
5539         {
5540             TCGv t1 = tcg_temp_new();
5541             TCGv t2 = tcg_const_tl(0x00FF00FF00FF00FFULL);
5542 
5543             tcg_gen_shri_tl(t1, t0, 8);
5544             tcg_gen_and_tl(t1, t1, t2);
5545             tcg_gen_and_tl(t0, t0, t2);
5546             tcg_gen_shli_tl(t0, t0, 8);
5547             tcg_gen_or_tl(cpu_gpr[rd], t0, t1);
5548             tcg_temp_free(t2);
5549             tcg_temp_free(t1);
5550         }
5551         break;
5552     case OPC_DSHD:
5553         {
5554             TCGv t1 = tcg_temp_new();
5555             TCGv t2 = tcg_const_tl(0x0000FFFF0000FFFFULL);
5556 
5557             tcg_gen_shri_tl(t1, t0, 16);
5558             tcg_gen_and_tl(t1, t1, t2);
5559             tcg_gen_and_tl(t0, t0, t2);
5560             tcg_gen_shli_tl(t0, t0, 16);
5561             tcg_gen_or_tl(t0, t0, t1);
5562             tcg_gen_shri_tl(t1, t0, 32);
5563             tcg_gen_shli_tl(t0, t0, 32);
5564             tcg_gen_or_tl(cpu_gpr[rd], t0, t1);
5565             tcg_temp_free(t2);
5566             tcg_temp_free(t1);
5567         }
5568         break;
5569 #endif
5570     default:
5571         MIPS_INVAL("bsfhl");
5572         gen_reserved_instruction(ctx);
5573         tcg_temp_free(t0);
5574         return;
5575     }
5576     tcg_temp_free(t0);
5577 }
5578 
5579 static void gen_align_bits(DisasContext *ctx, int wordsz, int rd, int rs,
5580                            int rt, int bits)
5581 {
5582     TCGv t0;
5583     if (rd == 0) {
5584         /* Treat as NOP. */
5585         return;
5586     }
5587     t0 = tcg_temp_new();
5588     if (bits == 0 || bits == wordsz) {
5589         if (bits == 0) {
5590             gen_load_gpr(t0, rt);
5591         } else {
5592             gen_load_gpr(t0, rs);
5593         }
5594         switch (wordsz) {
5595         case 32:
5596             tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
5597             break;
5598 #if defined(TARGET_MIPS64)
5599         case 64:
5600             tcg_gen_mov_tl(cpu_gpr[rd], t0);
5601             break;
5602 #endif
5603         }
5604     } else {
5605         TCGv t1 = tcg_temp_new();
5606         gen_load_gpr(t0, rt);
5607         gen_load_gpr(t1, rs);
5608         switch (wordsz) {
5609         case 32:
5610             {
5611                 TCGv_i64 t2 = tcg_temp_new_i64();
5612                 tcg_gen_concat_tl_i64(t2, t1, t0);
5613                 tcg_gen_shri_i64(t2, t2, 32 - bits);
5614                 gen_move_low32(cpu_gpr[rd], t2);
5615                 tcg_temp_free_i64(t2);
5616             }
5617             break;
5618 #if defined(TARGET_MIPS64)
5619         case 64:
5620             tcg_gen_shli_tl(t0, t0, bits);
5621             tcg_gen_shri_tl(t1, t1, 64 - bits);
5622             tcg_gen_or_tl(cpu_gpr[rd], t1, t0);
5623             break;
5624 #endif
5625         }
5626         tcg_temp_free(t1);
5627     }
5628 
5629     tcg_temp_free(t0);
5630 }
5631 
5632 static void gen_align(DisasContext *ctx, int wordsz, int rd, int rs, int rt,
5633                       int bp)
5634 {
5635     gen_align_bits(ctx, wordsz, rd, rs, rt, bp * 8);
5636 }
5637 
5638 static void gen_ext(DisasContext *ctx, int wordsz, int rd, int rs, int rt,
5639                     int shift)
5640 {
5641     gen_align_bits(ctx, wordsz, rd, rs, rt, wordsz - shift);
5642 }
5643 
5644 static void gen_bitswap(DisasContext *ctx, int opc, int rd, int rt)
5645 {
5646     TCGv t0;
5647     if (rd == 0) {
5648         /* Treat as NOP. */
5649         return;
5650     }
5651     t0 = tcg_temp_new();
5652     gen_load_gpr(t0, rt);
5653     switch (opc) {
5654     case OPC_BITSWAP:
5655         gen_helper_bitswap(cpu_gpr[rd], t0);
5656         break;
5657 #if defined(TARGET_MIPS64)
5658     case OPC_DBITSWAP:
5659         gen_helper_dbitswap(cpu_gpr[rd], t0);
5660         break;
5661 #endif
5662     }
5663     tcg_temp_free(t0);
5664 }
5665 
5666 #ifndef CONFIG_USER_ONLY
5667 /* CP0 (MMU and control) */
5668 static inline void gen_mthc0_entrylo(TCGv arg, target_ulong off)
5669 {
5670     TCGv_i64 t0 = tcg_temp_new_i64();
5671     TCGv_i64 t1 = tcg_temp_new_i64();
5672 
5673     tcg_gen_ext_tl_i64(t0, arg);
5674     tcg_gen_ld_i64(t1, cpu_env, off);
5675 #if defined(TARGET_MIPS64)
5676     tcg_gen_deposit_i64(t1, t1, t0, 30, 32);
5677 #else
5678     tcg_gen_concat32_i64(t1, t1, t0);
5679 #endif
5680     tcg_gen_st_i64(t1, cpu_env, off);
5681     tcg_temp_free_i64(t1);
5682     tcg_temp_free_i64(t0);
5683 }
5684 
5685 static inline void gen_mthc0_store64(TCGv arg, target_ulong off)
5686 {
5687     TCGv_i64 t0 = tcg_temp_new_i64();
5688     TCGv_i64 t1 = tcg_temp_new_i64();
5689 
5690     tcg_gen_ext_tl_i64(t0, arg);
5691     tcg_gen_ld_i64(t1, cpu_env, off);
5692     tcg_gen_concat32_i64(t1, t1, t0);
5693     tcg_gen_st_i64(t1, cpu_env, off);
5694     tcg_temp_free_i64(t1);
5695     tcg_temp_free_i64(t0);
5696 }
5697 
5698 static inline void gen_mfhc0_entrylo(TCGv arg, target_ulong off)
5699 {
5700     TCGv_i64 t0 = tcg_temp_new_i64();
5701 
5702     tcg_gen_ld_i64(t0, cpu_env, off);
5703 #if defined(TARGET_MIPS64)
5704     tcg_gen_shri_i64(t0, t0, 30);
5705 #else
5706     tcg_gen_shri_i64(t0, t0, 32);
5707 #endif
5708     gen_move_low32(arg, t0);
5709     tcg_temp_free_i64(t0);
5710 }
5711 
5712 static inline void gen_mfhc0_load64(TCGv arg, target_ulong off, int shift)
5713 {
5714     TCGv_i64 t0 = tcg_temp_new_i64();
5715 
5716     tcg_gen_ld_i64(t0, cpu_env, off);
5717     tcg_gen_shri_i64(t0, t0, 32 + shift);
5718     gen_move_low32(arg, t0);
5719     tcg_temp_free_i64(t0);
5720 }
5721 
5722 static inline void gen_mfc0_load32(TCGv arg, target_ulong off)
5723 {
5724     TCGv_i32 t0 = tcg_temp_new_i32();
5725 
5726     tcg_gen_ld_i32(t0, cpu_env, off);
5727     tcg_gen_ext_i32_tl(arg, t0);
5728     tcg_temp_free_i32(t0);
5729 }
5730 
5731 static inline void gen_mfc0_load64(TCGv arg, target_ulong off)
5732 {
5733     tcg_gen_ld_tl(arg, cpu_env, off);
5734     tcg_gen_ext32s_tl(arg, arg);
5735 }
5736 
5737 static inline void gen_mtc0_store32(TCGv arg, target_ulong off)
5738 {
5739     TCGv_i32 t0 = tcg_temp_new_i32();
5740 
5741     tcg_gen_trunc_tl_i32(t0, arg);
5742     tcg_gen_st_i32(t0, cpu_env, off);
5743     tcg_temp_free_i32(t0);
5744 }
5745 
5746 #define CP0_CHECK(c)                            \
5747     do {                                        \
5748         if (!(c)) {                             \
5749             goto cp0_unimplemented;             \
5750         }                                       \
5751     } while (0)
5752 
5753 static void gen_mfhc0(DisasContext *ctx, TCGv arg, int reg, int sel)
5754 {
5755     const char *register_name = "invalid";
5756 
5757     switch (reg) {
5758     case CP0_REGISTER_02:
5759         switch (sel) {
5760         case 0:
5761             CP0_CHECK(ctx->hflags & MIPS_HFLAG_ELPA);
5762             gen_mfhc0_entrylo(arg, offsetof(CPUMIPSState, CP0_EntryLo0));
5763             register_name = "EntryLo0";
5764             break;
5765         default:
5766             goto cp0_unimplemented;
5767         }
5768         break;
5769     case CP0_REGISTER_03:
5770         switch (sel) {
5771         case CP0_REG03__ENTRYLO1:
5772             CP0_CHECK(ctx->hflags & MIPS_HFLAG_ELPA);
5773             gen_mfhc0_entrylo(arg, offsetof(CPUMIPSState, CP0_EntryLo1));
5774             register_name = "EntryLo1";
5775             break;
5776         default:
5777             goto cp0_unimplemented;
5778         }
5779         break;
5780     case CP0_REGISTER_09:
5781         switch (sel) {
5782         case CP0_REG09__SAAR:
5783             CP0_CHECK(ctx->saar);
5784             gen_helper_mfhc0_saar(arg, cpu_env);
5785             register_name = "SAAR";
5786             break;
5787         default:
5788             goto cp0_unimplemented;
5789         }
5790         break;
5791     case CP0_REGISTER_17:
5792         switch (sel) {
5793         case CP0_REG17__LLADDR:
5794             gen_mfhc0_load64(arg, offsetof(CPUMIPSState, CP0_LLAddr),
5795                              ctx->CP0_LLAddr_shift);
5796             register_name = "LLAddr";
5797             break;
5798         case CP0_REG17__MAAR:
5799             CP0_CHECK(ctx->mrp);
5800             gen_helper_mfhc0_maar(arg, cpu_env);
5801             register_name = "MAAR";
5802             break;
5803         default:
5804             goto cp0_unimplemented;
5805         }
5806         break;
5807     case CP0_REGISTER_19:
5808         switch (sel) {
5809         case CP0_REG19__WATCHHI0:
5810         case CP0_REG19__WATCHHI1:
5811         case CP0_REG19__WATCHHI2:
5812         case CP0_REG19__WATCHHI3:
5813         case CP0_REG19__WATCHHI4:
5814         case CP0_REG19__WATCHHI5:
5815         case CP0_REG19__WATCHHI6:
5816         case CP0_REG19__WATCHHI7:
5817             /* upper 32 bits are only available when Config5MI != 0 */
5818             CP0_CHECK(ctx->mi);
5819             gen_mfhc0_load64(arg, offsetof(CPUMIPSState, CP0_WatchHi[sel]), 0);
5820             register_name = "WatchHi";
5821             break;
5822         default:
5823             goto cp0_unimplemented;
5824         }
5825         break;
5826     case CP0_REGISTER_28:
5827         switch (sel) {
5828         case 0:
5829         case 2:
5830         case 4:
5831         case 6:
5832             gen_mfhc0_load64(arg, offsetof(CPUMIPSState, CP0_TagLo), 0);
5833             register_name = "TagLo";
5834             break;
5835         default:
5836             goto cp0_unimplemented;
5837         }
5838         break;
5839     default:
5840         goto cp0_unimplemented;
5841     }
5842     trace_mips_translate_c0("mfhc0", register_name, reg, sel);
5843     return;
5844 
5845 cp0_unimplemented:
5846     qemu_log_mask(LOG_UNIMP, "mfhc0 %s (reg %d sel %d)\n",
5847                   register_name, reg, sel);
5848     tcg_gen_movi_tl(arg, 0);
5849 }
5850 
5851 static void gen_mthc0(DisasContext *ctx, TCGv arg, int reg, int sel)
5852 {
5853     const char *register_name = "invalid";
5854     uint64_t mask = ctx->PAMask >> 36;
5855 
5856     switch (reg) {
5857     case CP0_REGISTER_02:
5858         switch (sel) {
5859         case 0:
5860             CP0_CHECK(ctx->hflags & MIPS_HFLAG_ELPA);
5861             tcg_gen_andi_tl(arg, arg, mask);
5862             gen_mthc0_entrylo(arg, offsetof(CPUMIPSState, CP0_EntryLo0));
5863             register_name = "EntryLo0";
5864             break;
5865         default:
5866             goto cp0_unimplemented;
5867         }
5868         break;
5869     case CP0_REGISTER_03:
5870         switch (sel) {
5871         case CP0_REG03__ENTRYLO1:
5872             CP0_CHECK(ctx->hflags & MIPS_HFLAG_ELPA);
5873             tcg_gen_andi_tl(arg, arg, mask);
5874             gen_mthc0_entrylo(arg, offsetof(CPUMIPSState, CP0_EntryLo1));
5875             register_name = "EntryLo1";
5876             break;
5877         default:
5878             goto cp0_unimplemented;
5879         }
5880         break;
5881     case CP0_REGISTER_09:
5882         switch (sel) {
5883         case CP0_REG09__SAAR:
5884             CP0_CHECK(ctx->saar);
5885             gen_helper_mthc0_saar(cpu_env, arg);
5886             register_name = "SAAR";
5887             break;
5888         default:
5889             goto cp0_unimplemented;
5890         }
5891         break;
5892     case CP0_REGISTER_17:
5893         switch (sel) {
5894         case CP0_REG17__LLADDR:
5895             /*
5896              * LLAddr is read-only (the only exception is bit 0 if LLB is
5897              * supported); the CP0_LLAddr_rw_bitmask does not seem to be
5898              * relevant for modern MIPS cores supporting MTHC0, therefore
5899              * treating MTHC0 to LLAddr as NOP.
5900              */
5901             register_name = "LLAddr";
5902             break;
5903         case CP0_REG17__MAAR:
5904             CP0_CHECK(ctx->mrp);
5905             gen_helper_mthc0_maar(cpu_env, arg);
5906             register_name = "MAAR";
5907             break;
5908         default:
5909             goto cp0_unimplemented;
5910         }
5911         break;
5912     case CP0_REGISTER_19:
5913         switch (sel) {
5914         case CP0_REG19__WATCHHI0:
5915         case CP0_REG19__WATCHHI1:
5916         case CP0_REG19__WATCHHI2:
5917         case CP0_REG19__WATCHHI3:
5918         case CP0_REG19__WATCHHI4:
5919         case CP0_REG19__WATCHHI5:
5920         case CP0_REG19__WATCHHI6:
5921         case CP0_REG19__WATCHHI7:
5922             /* upper 32 bits are only available when Config5MI != 0 */
5923             CP0_CHECK(ctx->mi);
5924             gen_helper_0e1i(mthc0_watchhi, arg, sel);
5925             register_name = "WatchHi";
5926             break;
5927         default:
5928             goto cp0_unimplemented;
5929         }
5930         break;
5931     case CP0_REGISTER_28:
5932         switch (sel) {
5933         case 0:
5934         case 2:
5935         case 4:
5936         case 6:
5937             tcg_gen_andi_tl(arg, arg, mask);
5938             gen_mthc0_store64(arg, offsetof(CPUMIPSState, CP0_TagLo));
5939             register_name = "TagLo";
5940             break;
5941         default:
5942             goto cp0_unimplemented;
5943         }
5944         break;
5945     default:
5946         goto cp0_unimplemented;
5947     }
5948     trace_mips_translate_c0("mthc0", register_name, reg, sel);
5949     return;
5950 
5951 cp0_unimplemented:
5952     qemu_log_mask(LOG_UNIMP, "mthc0 %s (reg %d sel %d)\n",
5953                   register_name, reg, sel);
5954 }
5955 
5956 static inline void gen_mfc0_unimplemented(DisasContext *ctx, TCGv arg)
5957 {
5958     if (ctx->insn_flags & ISA_MIPS_R6) {
5959         tcg_gen_movi_tl(arg, 0);
5960     } else {
5961         tcg_gen_movi_tl(arg, ~0);
5962     }
5963 }
5964 
5965 static void gen_mfc0(DisasContext *ctx, TCGv arg, int reg, int sel)
5966 {
5967     const char *register_name = "invalid";
5968 
5969     if (sel != 0) {
5970         check_insn(ctx, ISA_MIPS_R1);
5971     }
5972 
5973     switch (reg) {
5974     case CP0_REGISTER_00:
5975         switch (sel) {
5976         case CP0_REG00__INDEX:
5977             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Index));
5978             register_name = "Index";
5979             break;
5980         case CP0_REG00__MVPCONTROL:
5981             CP0_CHECK(ctx->insn_flags & ASE_MT);
5982             gen_helper_mfc0_mvpcontrol(arg, cpu_env);
5983             register_name = "MVPControl";
5984             break;
5985         case CP0_REG00__MVPCONF0:
5986             CP0_CHECK(ctx->insn_flags & ASE_MT);
5987             gen_helper_mfc0_mvpconf0(arg, cpu_env);
5988             register_name = "MVPConf0";
5989             break;
5990         case CP0_REG00__MVPCONF1:
5991             CP0_CHECK(ctx->insn_flags & ASE_MT);
5992             gen_helper_mfc0_mvpconf1(arg, cpu_env);
5993             register_name = "MVPConf1";
5994             break;
5995         case CP0_REG00__VPCONTROL:
5996             CP0_CHECK(ctx->vp);
5997             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPControl));
5998             register_name = "VPControl";
5999             break;
6000         default:
6001             goto cp0_unimplemented;
6002         }
6003         break;
6004     case CP0_REGISTER_01:
6005         switch (sel) {
6006         case CP0_REG01__RANDOM:
6007             CP0_CHECK(!(ctx->insn_flags & ISA_MIPS_R6));
6008             gen_helper_mfc0_random(arg, cpu_env);
6009             register_name = "Random";
6010             break;
6011         case CP0_REG01__VPECONTROL:
6012             CP0_CHECK(ctx->insn_flags & ASE_MT);
6013             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEControl));
6014             register_name = "VPEControl";
6015             break;
6016         case CP0_REG01__VPECONF0:
6017             CP0_CHECK(ctx->insn_flags & ASE_MT);
6018             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf0));
6019             register_name = "VPEConf0";
6020             break;
6021         case CP0_REG01__VPECONF1:
6022             CP0_CHECK(ctx->insn_flags & ASE_MT);
6023             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf1));
6024             register_name = "VPEConf1";
6025             break;
6026         case CP0_REG01__YQMASK:
6027             CP0_CHECK(ctx->insn_flags & ASE_MT);
6028             gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_YQMask));
6029             register_name = "YQMask";
6030             break;
6031         case CP0_REG01__VPESCHEDULE:
6032             CP0_CHECK(ctx->insn_flags & ASE_MT);
6033             gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_VPESchedule));
6034             register_name = "VPESchedule";
6035             break;
6036         case CP0_REG01__VPESCHEFBACK:
6037             CP0_CHECK(ctx->insn_flags & ASE_MT);
6038             gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_VPEScheFBack));
6039             register_name = "VPEScheFBack";
6040             break;
6041         case CP0_REG01__VPEOPT:
6042             CP0_CHECK(ctx->insn_flags & ASE_MT);
6043             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEOpt));
6044             register_name = "VPEOpt";
6045             break;
6046         default:
6047             goto cp0_unimplemented;
6048         }
6049         break;
6050     case CP0_REGISTER_02:
6051         switch (sel) {
6052         case CP0_REG02__ENTRYLO0:
6053             {
6054                 TCGv_i64 tmp = tcg_temp_new_i64();
6055                 tcg_gen_ld_i64(tmp, cpu_env,
6056                                offsetof(CPUMIPSState, CP0_EntryLo0));
6057 #if defined(TARGET_MIPS64)
6058                 if (ctx->rxi) {
6059                     /* Move RI/XI fields to bits 31:30 */
6060                     tcg_gen_shri_tl(arg, tmp, CP0EnLo_XI);
6061                     tcg_gen_deposit_tl(tmp, tmp, arg, 30, 2);
6062                 }
6063 #endif
6064                 gen_move_low32(arg, tmp);
6065                 tcg_temp_free_i64(tmp);
6066             }
6067             register_name = "EntryLo0";
6068             break;
6069         case CP0_REG02__TCSTATUS:
6070             CP0_CHECK(ctx->insn_flags & ASE_MT);
6071             gen_helper_mfc0_tcstatus(arg, cpu_env);
6072             register_name = "TCStatus";
6073             break;
6074         case CP0_REG02__TCBIND:
6075             CP0_CHECK(ctx->insn_flags & ASE_MT);
6076             gen_helper_mfc0_tcbind(arg, cpu_env);
6077             register_name = "TCBind";
6078             break;
6079         case CP0_REG02__TCRESTART:
6080             CP0_CHECK(ctx->insn_flags & ASE_MT);
6081             gen_helper_mfc0_tcrestart(arg, cpu_env);
6082             register_name = "TCRestart";
6083             break;
6084         case CP0_REG02__TCHALT:
6085             CP0_CHECK(ctx->insn_flags & ASE_MT);
6086             gen_helper_mfc0_tchalt(arg, cpu_env);
6087             register_name = "TCHalt";
6088             break;
6089         case CP0_REG02__TCCONTEXT:
6090             CP0_CHECK(ctx->insn_flags & ASE_MT);
6091             gen_helper_mfc0_tccontext(arg, cpu_env);
6092             register_name = "TCContext";
6093             break;
6094         case CP0_REG02__TCSCHEDULE:
6095             CP0_CHECK(ctx->insn_flags & ASE_MT);
6096             gen_helper_mfc0_tcschedule(arg, cpu_env);
6097             register_name = "TCSchedule";
6098             break;
6099         case CP0_REG02__TCSCHEFBACK:
6100             CP0_CHECK(ctx->insn_flags & ASE_MT);
6101             gen_helper_mfc0_tcschefback(arg, cpu_env);
6102             register_name = "TCScheFBack";
6103             break;
6104         default:
6105             goto cp0_unimplemented;
6106         }
6107         break;
6108     case CP0_REGISTER_03:
6109         switch (sel) {
6110         case CP0_REG03__ENTRYLO1:
6111             {
6112                 TCGv_i64 tmp = tcg_temp_new_i64();
6113                 tcg_gen_ld_i64(tmp, cpu_env,
6114                                offsetof(CPUMIPSState, CP0_EntryLo1));
6115 #if defined(TARGET_MIPS64)
6116                 if (ctx->rxi) {
6117                     /* Move RI/XI fields to bits 31:30 */
6118                     tcg_gen_shri_tl(arg, tmp, CP0EnLo_XI);
6119                     tcg_gen_deposit_tl(tmp, tmp, arg, 30, 2);
6120                 }
6121 #endif
6122                 gen_move_low32(arg, tmp);
6123                 tcg_temp_free_i64(tmp);
6124             }
6125             register_name = "EntryLo1";
6126             break;
6127         case CP0_REG03__GLOBALNUM:
6128             CP0_CHECK(ctx->vp);
6129             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_GlobalNumber));
6130             register_name = "GlobalNumber";
6131             break;
6132         default:
6133             goto cp0_unimplemented;
6134         }
6135         break;
6136     case CP0_REGISTER_04:
6137         switch (sel) {
6138         case CP0_REG04__CONTEXT:
6139             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_Context));
6140             tcg_gen_ext32s_tl(arg, arg);
6141             register_name = "Context";
6142             break;
6143         case CP0_REG04__CONTEXTCONFIG:
6144             /* SmartMIPS ASE */
6145             /* gen_helper_mfc0_contextconfig(arg); */
6146             register_name = "ContextConfig";
6147             goto cp0_unimplemented;
6148         case CP0_REG04__USERLOCAL:
6149             CP0_CHECK(ctx->ulri);
6150             tcg_gen_ld_tl(arg, cpu_env,
6151                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
6152             tcg_gen_ext32s_tl(arg, arg);
6153             register_name = "UserLocal";
6154             break;
6155         case CP0_REG04__MMID:
6156             CP0_CHECK(ctx->mi);
6157             gen_helper_mtc0_memorymapid(cpu_env, arg);
6158             register_name = "MMID";
6159             break;
6160         default:
6161             goto cp0_unimplemented;
6162         }
6163         break;
6164     case CP0_REGISTER_05:
6165         switch (sel) {
6166         case CP0_REG05__PAGEMASK:
6167             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageMask));
6168             register_name = "PageMask";
6169             break;
6170         case CP0_REG05__PAGEGRAIN:
6171             check_insn(ctx, ISA_MIPS_R2);
6172             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageGrain));
6173             register_name = "PageGrain";
6174             break;
6175         case CP0_REG05__SEGCTL0:
6176             CP0_CHECK(ctx->sc);
6177             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl0));
6178             tcg_gen_ext32s_tl(arg, arg);
6179             register_name = "SegCtl0";
6180             break;
6181         case CP0_REG05__SEGCTL1:
6182             CP0_CHECK(ctx->sc);
6183             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl1));
6184             tcg_gen_ext32s_tl(arg, arg);
6185             register_name = "SegCtl1";
6186             break;
6187         case CP0_REG05__SEGCTL2:
6188             CP0_CHECK(ctx->sc);
6189             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl2));
6190             tcg_gen_ext32s_tl(arg, arg);
6191             register_name = "SegCtl2";
6192             break;
6193         case CP0_REG05__PWBASE:
6194             check_pw(ctx);
6195             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PWBase));
6196             register_name = "PWBase";
6197             break;
6198         case CP0_REG05__PWFIELD:
6199             check_pw(ctx);
6200             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PWField));
6201             register_name = "PWField";
6202             break;
6203         case CP0_REG05__PWSIZE:
6204             check_pw(ctx);
6205             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PWSize));
6206             register_name = "PWSize";
6207             break;
6208         default:
6209             goto cp0_unimplemented;
6210         }
6211         break;
6212     case CP0_REGISTER_06:
6213         switch (sel) {
6214         case CP0_REG06__WIRED:
6215             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Wired));
6216             register_name = "Wired";
6217             break;
6218         case CP0_REG06__SRSCONF0:
6219             check_insn(ctx, ISA_MIPS_R2);
6220             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf0));
6221             register_name = "SRSConf0";
6222             break;
6223         case CP0_REG06__SRSCONF1:
6224             check_insn(ctx, ISA_MIPS_R2);
6225             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf1));
6226             register_name = "SRSConf1";
6227             break;
6228         case CP0_REG06__SRSCONF2:
6229             check_insn(ctx, ISA_MIPS_R2);
6230             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf2));
6231             register_name = "SRSConf2";
6232             break;
6233         case CP0_REG06__SRSCONF3:
6234             check_insn(ctx, ISA_MIPS_R2);
6235             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf3));
6236             register_name = "SRSConf3";
6237             break;
6238         case CP0_REG06__SRSCONF4:
6239             check_insn(ctx, ISA_MIPS_R2);
6240             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf4));
6241             register_name = "SRSConf4";
6242             break;
6243         case CP0_REG06__PWCTL:
6244             check_pw(ctx);
6245             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PWCtl));
6246             register_name = "PWCtl";
6247             break;
6248         default:
6249             goto cp0_unimplemented;
6250         }
6251         break;
6252     case CP0_REGISTER_07:
6253         switch (sel) {
6254         case CP0_REG07__HWRENA:
6255             check_insn(ctx, ISA_MIPS_R2);
6256             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_HWREna));
6257             register_name = "HWREna";
6258             break;
6259         default:
6260             goto cp0_unimplemented;
6261         }
6262         break;
6263     case CP0_REGISTER_08:
6264         switch (sel) {
6265         case CP0_REG08__BADVADDR:
6266             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));
6267             tcg_gen_ext32s_tl(arg, arg);
6268             register_name = "BadVAddr";
6269             break;
6270         case CP0_REG08__BADINSTR:
6271             CP0_CHECK(ctx->bi);
6272             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstr));
6273             register_name = "BadInstr";
6274             break;
6275         case CP0_REG08__BADINSTRP:
6276             CP0_CHECK(ctx->bp);
6277             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrP));
6278             register_name = "BadInstrP";
6279             break;
6280         case CP0_REG08__BADINSTRX:
6281             CP0_CHECK(ctx->bi);
6282             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrX));
6283             tcg_gen_andi_tl(arg, arg, ~0xffff);
6284             register_name = "BadInstrX";
6285             break;
6286         default:
6287             goto cp0_unimplemented;
6288         }
6289         break;
6290     case CP0_REGISTER_09:
6291         switch (sel) {
6292         case CP0_REG09__COUNT:
6293             /* Mark as an IO operation because we read the time.  */
6294             if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
6295                 gen_io_start();
6296             }
6297             gen_helper_mfc0_count(arg, cpu_env);
6298             /*
6299              * Break the TB to be able to take timer interrupts immediately
6300              * after reading count. DISAS_STOP isn't sufficient, we need to
6301              * ensure we break completely out of translated code.
6302              */
6303             gen_save_pc(ctx->base.pc_next + 4);
6304             ctx->base.is_jmp = DISAS_EXIT;
6305             register_name = "Count";
6306             break;
6307         case CP0_REG09__SAARI:
6308             CP0_CHECK(ctx->saar);
6309             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SAARI));
6310             register_name = "SAARI";
6311             break;
6312         case CP0_REG09__SAAR:
6313             CP0_CHECK(ctx->saar);
6314             gen_helper_mfc0_saar(arg, cpu_env);
6315             register_name = "SAAR";
6316             break;
6317         default:
6318             goto cp0_unimplemented;
6319         }
6320         break;
6321     case CP0_REGISTER_10:
6322         switch (sel) {
6323         case CP0_REG10__ENTRYHI:
6324             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryHi));
6325             tcg_gen_ext32s_tl(arg, arg);
6326             register_name = "EntryHi";
6327             break;
6328         default:
6329             goto cp0_unimplemented;
6330         }
6331         break;
6332     case CP0_REGISTER_11:
6333         switch (sel) {
6334         case CP0_REG11__COMPARE:
6335             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Compare));
6336             register_name = "Compare";
6337             break;
6338         /* 6,7 are implementation dependent */
6339         default:
6340             goto cp0_unimplemented;
6341         }
6342         break;
6343     case CP0_REGISTER_12:
6344         switch (sel) {
6345         case CP0_REG12__STATUS:
6346             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Status));
6347             register_name = "Status";
6348             break;
6349         case CP0_REG12__INTCTL:
6350             check_insn(ctx, ISA_MIPS_R2);
6351             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_IntCtl));
6352             register_name = "IntCtl";
6353             break;
6354         case CP0_REG12__SRSCTL:
6355             check_insn(ctx, ISA_MIPS_R2);
6356             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSCtl));
6357             register_name = "SRSCtl";
6358             break;
6359         case CP0_REG12__SRSMAP:
6360             check_insn(ctx, ISA_MIPS_R2);
6361             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
6362             register_name = "SRSMap";
6363             break;
6364         default:
6365             goto cp0_unimplemented;
6366        }
6367         break;
6368     case CP0_REGISTER_13:
6369         switch (sel) {
6370         case CP0_REG13__CAUSE:
6371             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Cause));
6372             register_name = "Cause";
6373             break;
6374         default:
6375             goto cp0_unimplemented;
6376        }
6377         break;
6378     case CP0_REGISTER_14:
6379         switch (sel) {
6380         case CP0_REG14__EPC:
6381             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
6382             tcg_gen_ext32s_tl(arg, arg);
6383             register_name = "EPC";
6384             break;
6385         default:
6386             goto cp0_unimplemented;
6387         }
6388         break;
6389     case CP0_REGISTER_15:
6390         switch (sel) {
6391         case CP0_REG15__PRID:
6392             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PRid));
6393             register_name = "PRid";
6394             break;
6395         case CP0_REG15__EBASE:
6396             check_insn(ctx, ISA_MIPS_R2);
6397             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EBase));
6398             tcg_gen_ext32s_tl(arg, arg);
6399             register_name = "EBase";
6400             break;
6401         case CP0_REG15__CMGCRBASE:
6402             check_insn(ctx, ISA_MIPS_R2);
6403             CP0_CHECK(ctx->cmgcr);
6404             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_CMGCRBase));
6405             tcg_gen_ext32s_tl(arg, arg);
6406             register_name = "CMGCRBase";
6407             break;
6408         default:
6409             goto cp0_unimplemented;
6410        }
6411         break;
6412     case CP0_REGISTER_16:
6413         switch (sel) {
6414         case CP0_REG16__CONFIG:
6415             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config0));
6416             register_name = "Config";
6417             break;
6418         case CP0_REG16__CONFIG1:
6419             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config1));
6420             register_name = "Config1";
6421             break;
6422         case CP0_REG16__CONFIG2:
6423             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config2));
6424             register_name = "Config2";
6425             break;
6426         case CP0_REG16__CONFIG3:
6427             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config3));
6428             register_name = "Config3";
6429             break;
6430         case CP0_REG16__CONFIG4:
6431             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config4));
6432             register_name = "Config4";
6433             break;
6434         case CP0_REG16__CONFIG5:
6435             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config5));
6436             register_name = "Config5";
6437             break;
6438         /* 6,7 are implementation dependent */
6439         case CP0_REG16__CONFIG6:
6440             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config6));
6441             register_name = "Config6";
6442             break;
6443         case CP0_REG16__CONFIG7:
6444             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config7));
6445             register_name = "Config7";
6446             break;
6447         default:
6448             goto cp0_unimplemented;
6449         }
6450         break;
6451     case CP0_REGISTER_17:
6452         switch (sel) {
6453         case CP0_REG17__LLADDR:
6454             gen_helper_mfc0_lladdr(arg, cpu_env);
6455             register_name = "LLAddr";
6456             break;
6457         case CP0_REG17__MAAR:
6458             CP0_CHECK(ctx->mrp);
6459             gen_helper_mfc0_maar(arg, cpu_env);
6460             register_name = "MAAR";
6461             break;
6462         case CP0_REG17__MAARI:
6463             CP0_CHECK(ctx->mrp);
6464             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_MAARI));
6465             register_name = "MAARI";
6466             break;
6467         default:
6468             goto cp0_unimplemented;
6469         }
6470         break;
6471     case CP0_REGISTER_18:
6472         switch (sel) {
6473         case CP0_REG18__WATCHLO0:
6474         case CP0_REG18__WATCHLO1:
6475         case CP0_REG18__WATCHLO2:
6476         case CP0_REG18__WATCHLO3:
6477         case CP0_REG18__WATCHLO4:
6478         case CP0_REG18__WATCHLO5:
6479         case CP0_REG18__WATCHLO6:
6480         case CP0_REG18__WATCHLO7:
6481             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
6482             gen_helper_1e0i(mfc0_watchlo, arg, sel);
6483             register_name = "WatchLo";
6484             break;
6485         default:
6486             goto cp0_unimplemented;
6487         }
6488         break;
6489     case CP0_REGISTER_19:
6490         switch (sel) {
6491         case CP0_REG19__WATCHHI0:
6492         case CP0_REG19__WATCHHI1:
6493         case CP0_REG19__WATCHHI2:
6494         case CP0_REG19__WATCHHI3:
6495         case CP0_REG19__WATCHHI4:
6496         case CP0_REG19__WATCHHI5:
6497         case CP0_REG19__WATCHHI6:
6498         case CP0_REG19__WATCHHI7:
6499             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
6500             gen_helper_1e0i(mfc0_watchhi, arg, sel);
6501             register_name = "WatchHi";
6502             break;
6503         default:
6504             goto cp0_unimplemented;
6505         }
6506         break;
6507     case CP0_REGISTER_20:
6508         switch (sel) {
6509         case CP0_REG20__XCONTEXT:
6510 #if defined(TARGET_MIPS64)
6511             check_insn(ctx, ISA_MIPS3);
6512             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_XContext));
6513             tcg_gen_ext32s_tl(arg, arg);
6514             register_name = "XContext";
6515             break;
6516 #endif
6517         default:
6518             goto cp0_unimplemented;
6519         }
6520         break;
6521     case CP0_REGISTER_21:
6522        /* Officially reserved, but sel 0 is used for R1x000 framemask */
6523         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS_R6));
6524         switch (sel) {
6525         case 0:
6526             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Framemask));
6527             register_name = "Framemask";
6528             break;
6529         default:
6530             goto cp0_unimplemented;
6531         }
6532         break;
6533     case CP0_REGISTER_22:
6534         tcg_gen_movi_tl(arg, 0); /* unimplemented */
6535         register_name = "'Diagnostic"; /* implementation dependent */
6536         break;
6537     case CP0_REGISTER_23:
6538         switch (sel) {
6539         case CP0_REG23__DEBUG:
6540             gen_helper_mfc0_debug(arg, cpu_env); /* EJTAG support */
6541             register_name = "Debug";
6542             break;
6543         case CP0_REG23__TRACECONTROL:
6544             /* PDtrace support */
6545             /* gen_helper_mfc0_tracecontrol(arg);  */
6546             register_name = "TraceControl";
6547             goto cp0_unimplemented;
6548         case CP0_REG23__TRACECONTROL2:
6549             /* PDtrace support */
6550             /* gen_helper_mfc0_tracecontrol2(arg); */
6551             register_name = "TraceControl2";
6552             goto cp0_unimplemented;
6553         case CP0_REG23__USERTRACEDATA1:
6554             /* PDtrace support */
6555             /* gen_helper_mfc0_usertracedata1(arg);*/
6556             register_name = "UserTraceData1";
6557             goto cp0_unimplemented;
6558         case CP0_REG23__TRACEIBPC:
6559             /* PDtrace support */
6560             /* gen_helper_mfc0_traceibpc(arg);     */
6561             register_name = "TraceIBPC";
6562             goto cp0_unimplemented;
6563         case CP0_REG23__TRACEDBPC:
6564             /* PDtrace support */
6565             /* gen_helper_mfc0_tracedbpc(arg);     */
6566             register_name = "TraceDBPC";
6567             goto cp0_unimplemented;
6568         default:
6569             goto cp0_unimplemented;
6570         }
6571         break;
6572     case CP0_REGISTER_24:
6573         switch (sel) {
6574         case CP0_REG24__DEPC:
6575             /* EJTAG support */
6576             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
6577             tcg_gen_ext32s_tl(arg, arg);
6578             register_name = "DEPC";
6579             break;
6580         default:
6581             goto cp0_unimplemented;
6582         }
6583         break;
6584     case CP0_REGISTER_25:
6585         switch (sel) {
6586         case CP0_REG25__PERFCTL0:
6587             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Performance0));
6588             register_name = "Performance0";
6589             break;
6590         case CP0_REG25__PERFCNT0:
6591             /* gen_helper_mfc0_performance1(arg); */
6592             register_name = "Performance1";
6593             goto cp0_unimplemented;
6594         case CP0_REG25__PERFCTL1:
6595             /* gen_helper_mfc0_performance2(arg); */
6596             register_name = "Performance2";
6597             goto cp0_unimplemented;
6598         case CP0_REG25__PERFCNT1:
6599             /* gen_helper_mfc0_performance3(arg); */
6600             register_name = "Performance3";
6601             goto cp0_unimplemented;
6602         case CP0_REG25__PERFCTL2:
6603             /* gen_helper_mfc0_performance4(arg); */
6604             register_name = "Performance4";
6605             goto cp0_unimplemented;
6606         case CP0_REG25__PERFCNT2:
6607             /* gen_helper_mfc0_performance5(arg); */
6608             register_name = "Performance5";
6609             goto cp0_unimplemented;
6610         case CP0_REG25__PERFCTL3:
6611             /* gen_helper_mfc0_performance6(arg); */
6612             register_name = "Performance6";
6613             goto cp0_unimplemented;
6614         case CP0_REG25__PERFCNT3:
6615             /* gen_helper_mfc0_performance7(arg); */
6616             register_name = "Performance7";
6617             goto cp0_unimplemented;
6618         default:
6619             goto cp0_unimplemented;
6620         }
6621         break;
6622     case CP0_REGISTER_26:
6623         switch (sel) {
6624         case CP0_REG26__ERRCTL:
6625             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_ErrCtl));
6626             register_name = "ErrCtl";
6627             break;
6628         default:
6629             goto cp0_unimplemented;
6630         }
6631         break;
6632     case CP0_REGISTER_27:
6633         switch (sel) {
6634         case CP0_REG27__CACHERR:
6635             tcg_gen_movi_tl(arg, 0); /* unimplemented */
6636             register_name = "CacheErr";
6637             break;
6638         default:
6639             goto cp0_unimplemented;
6640         }
6641         break;
6642     case CP0_REGISTER_28:
6643         switch (sel) {
6644         case CP0_REG28__TAGLO:
6645         case CP0_REG28__TAGLO1:
6646         case CP0_REG28__TAGLO2:
6647         case CP0_REG28__TAGLO3:
6648             {
6649                 TCGv_i64 tmp = tcg_temp_new_i64();
6650                 tcg_gen_ld_i64(tmp, cpu_env, offsetof(CPUMIPSState, CP0_TagLo));
6651                 gen_move_low32(arg, tmp);
6652                 tcg_temp_free_i64(tmp);
6653             }
6654             register_name = "TagLo";
6655             break;
6656         case CP0_REG28__DATALO:
6657         case CP0_REG28__DATALO1:
6658         case CP0_REG28__DATALO2:
6659         case CP0_REG28__DATALO3:
6660             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataLo));
6661             register_name = "DataLo";
6662             break;
6663         default:
6664             goto cp0_unimplemented;
6665         }
6666         break;
6667     case CP0_REGISTER_29:
6668         switch (sel) {
6669         case CP0_REG29__TAGHI:
6670         case CP0_REG29__TAGHI1:
6671         case CP0_REG29__TAGHI2:
6672         case CP0_REG29__TAGHI3:
6673             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagHi));
6674             register_name = "TagHi";
6675             break;
6676         case CP0_REG29__DATAHI:
6677         case CP0_REG29__DATAHI1:
6678         case CP0_REG29__DATAHI2:
6679         case CP0_REG29__DATAHI3:
6680             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataHi));
6681             register_name = "DataHi";
6682             break;
6683         default:
6684             goto cp0_unimplemented;
6685         }
6686         break;
6687     case CP0_REGISTER_30:
6688         switch (sel) {
6689         case CP0_REG30__ERROREPC:
6690             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
6691             tcg_gen_ext32s_tl(arg, arg);
6692             register_name = "ErrorEPC";
6693             break;
6694         default:
6695             goto cp0_unimplemented;
6696         }
6697         break;
6698     case CP0_REGISTER_31:
6699         switch (sel) {
6700         case CP0_REG31__DESAVE:
6701             /* EJTAG support */
6702             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
6703             register_name = "DESAVE";
6704             break;
6705         case CP0_REG31__KSCRATCH1:
6706         case CP0_REG31__KSCRATCH2:
6707         case CP0_REG31__KSCRATCH3:
6708         case CP0_REG31__KSCRATCH4:
6709         case CP0_REG31__KSCRATCH5:
6710         case CP0_REG31__KSCRATCH6:
6711             CP0_CHECK(ctx->kscrexist & (1 << sel));
6712             tcg_gen_ld_tl(arg, cpu_env,
6713                           offsetof(CPUMIPSState, CP0_KScratch[sel - 2]));
6714             tcg_gen_ext32s_tl(arg, arg);
6715             register_name = "KScratch";
6716             break;
6717         default:
6718             goto cp0_unimplemented;
6719         }
6720         break;
6721     default:
6722        goto cp0_unimplemented;
6723     }
6724     trace_mips_translate_c0("mfc0", register_name, reg, sel);
6725     return;
6726 
6727 cp0_unimplemented:
6728     qemu_log_mask(LOG_UNIMP, "mfc0 %s (reg %d sel %d)\n",
6729                   register_name, reg, sel);
6730     gen_mfc0_unimplemented(ctx, arg);
6731 }
6732 
6733 static void gen_mtc0(DisasContext *ctx, TCGv arg, int reg, int sel)
6734 {
6735     const char *register_name = "invalid";
6736 
6737     if (sel != 0) {
6738         check_insn(ctx, ISA_MIPS_R1);
6739     }
6740 
6741     if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
6742         gen_io_start();
6743     }
6744 
6745     switch (reg) {
6746     case CP0_REGISTER_00:
6747         switch (sel) {
6748         case CP0_REG00__INDEX:
6749             gen_helper_mtc0_index(cpu_env, arg);
6750             register_name = "Index";
6751             break;
6752         case CP0_REG00__MVPCONTROL:
6753             CP0_CHECK(ctx->insn_flags & ASE_MT);
6754             gen_helper_mtc0_mvpcontrol(cpu_env, arg);
6755             register_name = "MVPControl";
6756             break;
6757         case CP0_REG00__MVPCONF0:
6758             CP0_CHECK(ctx->insn_flags & ASE_MT);
6759             /* ignored */
6760             register_name = "MVPConf0";
6761             break;
6762         case CP0_REG00__MVPCONF1:
6763             CP0_CHECK(ctx->insn_flags & ASE_MT);
6764             /* ignored */
6765             register_name = "MVPConf1";
6766             break;
6767         case CP0_REG00__VPCONTROL:
6768             CP0_CHECK(ctx->vp);
6769             /* ignored */
6770             register_name = "VPControl";
6771             break;
6772         default:
6773             goto cp0_unimplemented;
6774         }
6775         break;
6776     case CP0_REGISTER_01:
6777         switch (sel) {
6778         case CP0_REG01__RANDOM:
6779             /* ignored */
6780             register_name = "Random";
6781             break;
6782         case CP0_REG01__VPECONTROL:
6783             CP0_CHECK(ctx->insn_flags & ASE_MT);
6784             gen_helper_mtc0_vpecontrol(cpu_env, arg);
6785             register_name = "VPEControl";
6786             break;
6787         case CP0_REG01__VPECONF0:
6788             CP0_CHECK(ctx->insn_flags & ASE_MT);
6789             gen_helper_mtc0_vpeconf0(cpu_env, arg);
6790             register_name = "VPEConf0";
6791             break;
6792         case CP0_REG01__VPECONF1:
6793             CP0_CHECK(ctx->insn_flags & ASE_MT);
6794             gen_helper_mtc0_vpeconf1(cpu_env, arg);
6795             register_name = "VPEConf1";
6796             break;
6797         case CP0_REG01__YQMASK:
6798             CP0_CHECK(ctx->insn_flags & ASE_MT);
6799             gen_helper_mtc0_yqmask(cpu_env, arg);
6800             register_name = "YQMask";
6801             break;
6802         case CP0_REG01__VPESCHEDULE:
6803             CP0_CHECK(ctx->insn_flags & ASE_MT);
6804             tcg_gen_st_tl(arg, cpu_env,
6805                           offsetof(CPUMIPSState, CP0_VPESchedule));
6806             register_name = "VPESchedule";
6807             break;
6808         case CP0_REG01__VPESCHEFBACK:
6809             CP0_CHECK(ctx->insn_flags & ASE_MT);
6810             tcg_gen_st_tl(arg, cpu_env,
6811                           offsetof(CPUMIPSState, CP0_VPEScheFBack));
6812             register_name = "VPEScheFBack";
6813             break;
6814         case CP0_REG01__VPEOPT:
6815             CP0_CHECK(ctx->insn_flags & ASE_MT);
6816             gen_helper_mtc0_vpeopt(cpu_env, arg);
6817             register_name = "VPEOpt";
6818             break;
6819         default:
6820             goto cp0_unimplemented;
6821         }
6822         break;
6823     case CP0_REGISTER_02:
6824         switch (sel) {
6825         case CP0_REG02__ENTRYLO0:
6826             gen_helper_mtc0_entrylo0(cpu_env, arg);
6827             register_name = "EntryLo0";
6828             break;
6829         case CP0_REG02__TCSTATUS:
6830             CP0_CHECK(ctx->insn_flags & ASE_MT);
6831             gen_helper_mtc0_tcstatus(cpu_env, arg);
6832             register_name = "TCStatus";
6833             break;
6834         case CP0_REG02__TCBIND:
6835             CP0_CHECK(ctx->insn_flags & ASE_MT);
6836             gen_helper_mtc0_tcbind(cpu_env, arg);
6837             register_name = "TCBind";
6838             break;
6839         case CP0_REG02__TCRESTART:
6840             CP0_CHECK(ctx->insn_flags & ASE_MT);
6841             gen_helper_mtc0_tcrestart(cpu_env, arg);
6842             register_name = "TCRestart";
6843             break;
6844         case CP0_REG02__TCHALT:
6845             CP0_CHECK(ctx->insn_flags & ASE_MT);
6846             gen_helper_mtc0_tchalt(cpu_env, arg);
6847             register_name = "TCHalt";
6848             break;
6849         case CP0_REG02__TCCONTEXT:
6850             CP0_CHECK(ctx->insn_flags & ASE_MT);
6851             gen_helper_mtc0_tccontext(cpu_env, arg);
6852             register_name = "TCContext";
6853             break;
6854         case CP0_REG02__TCSCHEDULE:
6855             CP0_CHECK(ctx->insn_flags & ASE_MT);
6856             gen_helper_mtc0_tcschedule(cpu_env, arg);
6857             register_name = "TCSchedule";
6858             break;
6859         case CP0_REG02__TCSCHEFBACK:
6860             CP0_CHECK(ctx->insn_flags & ASE_MT);
6861             gen_helper_mtc0_tcschefback(cpu_env, arg);
6862             register_name = "TCScheFBack";
6863             break;
6864         default:
6865             goto cp0_unimplemented;
6866         }
6867         break;
6868     case CP0_REGISTER_03:
6869         switch (sel) {
6870         case CP0_REG03__ENTRYLO1:
6871             gen_helper_mtc0_entrylo1(cpu_env, arg);
6872             register_name = "EntryLo1";
6873             break;
6874         case CP0_REG03__GLOBALNUM:
6875             CP0_CHECK(ctx->vp);
6876             /* ignored */
6877             register_name = "GlobalNumber";
6878             break;
6879         default:
6880             goto cp0_unimplemented;
6881         }
6882         break;
6883     case CP0_REGISTER_04:
6884         switch (sel) {
6885         case CP0_REG04__CONTEXT:
6886             gen_helper_mtc0_context(cpu_env, arg);
6887             register_name = "Context";
6888             break;
6889         case CP0_REG04__CONTEXTCONFIG:
6890             /* SmartMIPS ASE */
6891             /* gen_helper_mtc0_contextconfig(arg); */
6892             register_name = "ContextConfig";
6893             goto cp0_unimplemented;
6894         case CP0_REG04__USERLOCAL:
6895             CP0_CHECK(ctx->ulri);
6896             tcg_gen_st_tl(arg, cpu_env,
6897                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
6898             register_name = "UserLocal";
6899             break;
6900         case CP0_REG04__MMID:
6901             CP0_CHECK(ctx->mi);
6902             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_MemoryMapID));
6903             register_name = "MMID";
6904             break;
6905         default:
6906             goto cp0_unimplemented;
6907         }
6908         break;
6909     case CP0_REGISTER_05:
6910         switch (sel) {
6911         case CP0_REG05__PAGEMASK:
6912             gen_helper_mtc0_pagemask(cpu_env, arg);
6913             register_name = "PageMask";
6914             break;
6915         case CP0_REG05__PAGEGRAIN:
6916             check_insn(ctx, ISA_MIPS_R2);
6917             gen_helper_mtc0_pagegrain(cpu_env, arg);
6918             register_name = "PageGrain";
6919             ctx->base.is_jmp = DISAS_STOP;
6920             break;
6921         case CP0_REG05__SEGCTL0:
6922             CP0_CHECK(ctx->sc);
6923             gen_helper_mtc0_segctl0(cpu_env, arg);
6924             register_name = "SegCtl0";
6925             break;
6926         case CP0_REG05__SEGCTL1:
6927             CP0_CHECK(ctx->sc);
6928             gen_helper_mtc0_segctl1(cpu_env, arg);
6929             register_name = "SegCtl1";
6930             break;
6931         case CP0_REG05__SEGCTL2:
6932             CP0_CHECK(ctx->sc);
6933             gen_helper_mtc0_segctl2(cpu_env, arg);
6934             register_name = "SegCtl2";
6935             break;
6936         case CP0_REG05__PWBASE:
6937             check_pw(ctx);
6938             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_PWBase));
6939             register_name = "PWBase";
6940             break;
6941         case CP0_REG05__PWFIELD:
6942             check_pw(ctx);
6943             gen_helper_mtc0_pwfield(cpu_env, arg);
6944             register_name = "PWField";
6945             break;
6946         case CP0_REG05__PWSIZE:
6947             check_pw(ctx);
6948             gen_helper_mtc0_pwsize(cpu_env, arg);
6949             register_name = "PWSize";
6950             break;
6951         default:
6952             goto cp0_unimplemented;
6953         }
6954         break;
6955     case CP0_REGISTER_06:
6956         switch (sel) {
6957         case CP0_REG06__WIRED:
6958             gen_helper_mtc0_wired(cpu_env, arg);
6959             register_name = "Wired";
6960             break;
6961         case CP0_REG06__SRSCONF0:
6962             check_insn(ctx, ISA_MIPS_R2);
6963             gen_helper_mtc0_srsconf0(cpu_env, arg);
6964             register_name = "SRSConf0";
6965             break;
6966         case CP0_REG06__SRSCONF1:
6967             check_insn(ctx, ISA_MIPS_R2);
6968             gen_helper_mtc0_srsconf1(cpu_env, arg);
6969             register_name = "SRSConf1";
6970             break;
6971         case CP0_REG06__SRSCONF2:
6972             check_insn(ctx, ISA_MIPS_R2);
6973             gen_helper_mtc0_srsconf2(cpu_env, arg);
6974             register_name = "SRSConf2";
6975             break;
6976         case CP0_REG06__SRSCONF3:
6977             check_insn(ctx, ISA_MIPS_R2);
6978             gen_helper_mtc0_srsconf3(cpu_env, arg);
6979             register_name = "SRSConf3";
6980             break;
6981         case CP0_REG06__SRSCONF4:
6982             check_insn(ctx, ISA_MIPS_R2);
6983             gen_helper_mtc0_srsconf4(cpu_env, arg);
6984             register_name = "SRSConf4";
6985             break;
6986         case CP0_REG06__PWCTL:
6987             check_pw(ctx);
6988             gen_helper_mtc0_pwctl(cpu_env, arg);
6989             register_name = "PWCtl";
6990             break;
6991         default:
6992             goto cp0_unimplemented;
6993         }
6994         break;
6995     case CP0_REGISTER_07:
6996         switch (sel) {
6997         case CP0_REG07__HWRENA:
6998             check_insn(ctx, ISA_MIPS_R2);
6999             gen_helper_mtc0_hwrena(cpu_env, arg);
7000             ctx->base.is_jmp = DISAS_STOP;
7001             register_name = "HWREna";
7002             break;
7003         default:
7004             goto cp0_unimplemented;
7005         }
7006         break;
7007     case CP0_REGISTER_08:
7008         switch (sel) {
7009         case CP0_REG08__BADVADDR:
7010             /* ignored */
7011             register_name = "BadVAddr";
7012             break;
7013         case CP0_REG08__BADINSTR:
7014             /* ignored */
7015             register_name = "BadInstr";
7016             break;
7017         case CP0_REG08__BADINSTRP:
7018             /* ignored */
7019             register_name = "BadInstrP";
7020             break;
7021         case CP0_REG08__BADINSTRX:
7022             /* ignored */
7023             register_name = "BadInstrX";
7024             break;
7025         default:
7026             goto cp0_unimplemented;
7027         }
7028         break;
7029     case CP0_REGISTER_09:
7030         switch (sel) {
7031         case CP0_REG09__COUNT:
7032             gen_helper_mtc0_count(cpu_env, arg);
7033             register_name = "Count";
7034             break;
7035         case CP0_REG09__SAARI:
7036             CP0_CHECK(ctx->saar);
7037             gen_helper_mtc0_saari(cpu_env, arg);
7038             register_name = "SAARI";
7039             break;
7040         case CP0_REG09__SAAR:
7041             CP0_CHECK(ctx->saar);
7042             gen_helper_mtc0_saar(cpu_env, arg);
7043             register_name = "SAAR";
7044             break;
7045         default:
7046             goto cp0_unimplemented;
7047         }
7048         break;
7049     case CP0_REGISTER_10:
7050         switch (sel) {
7051         case CP0_REG10__ENTRYHI:
7052             gen_helper_mtc0_entryhi(cpu_env, arg);
7053             register_name = "EntryHi";
7054             break;
7055         default:
7056             goto cp0_unimplemented;
7057         }
7058         break;
7059     case CP0_REGISTER_11:
7060         switch (sel) {
7061         case CP0_REG11__COMPARE:
7062             gen_helper_mtc0_compare(cpu_env, arg);
7063             register_name = "Compare";
7064             break;
7065         /* 6,7 are implementation dependent */
7066         default:
7067             goto cp0_unimplemented;
7068         }
7069         break;
7070     case CP0_REGISTER_12:
7071         switch (sel) {
7072         case CP0_REG12__STATUS:
7073             save_cpu_state(ctx, 1);
7074             gen_helper_mtc0_status(cpu_env, arg);
7075             /* DISAS_STOP isn't good enough here, hflags may have changed. */
7076             gen_save_pc(ctx->base.pc_next + 4);
7077             ctx->base.is_jmp = DISAS_EXIT;
7078             register_name = "Status";
7079             break;
7080         case CP0_REG12__INTCTL:
7081             check_insn(ctx, ISA_MIPS_R2);
7082             gen_helper_mtc0_intctl(cpu_env, arg);
7083             /* Stop translation as we may have switched the execution mode */
7084             ctx->base.is_jmp = DISAS_STOP;
7085             register_name = "IntCtl";
7086             break;
7087         case CP0_REG12__SRSCTL:
7088             check_insn(ctx, ISA_MIPS_R2);
7089             gen_helper_mtc0_srsctl(cpu_env, arg);
7090             /* Stop translation as we may have switched the execution mode */
7091             ctx->base.is_jmp = DISAS_STOP;
7092             register_name = "SRSCtl";
7093             break;
7094         case CP0_REG12__SRSMAP:
7095             check_insn(ctx, ISA_MIPS_R2);
7096             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
7097             /* Stop translation as we may have switched the execution mode */
7098             ctx->base.is_jmp = DISAS_STOP;
7099             register_name = "SRSMap";
7100             break;
7101         default:
7102             goto cp0_unimplemented;
7103         }
7104         break;
7105     case CP0_REGISTER_13:
7106         switch (sel) {
7107         case CP0_REG13__CAUSE:
7108             save_cpu_state(ctx, 1);
7109             gen_helper_mtc0_cause(cpu_env, arg);
7110             /*
7111              * Stop translation as we may have triggered an interrupt.
7112              * DISAS_STOP isn't sufficient, we need to ensure we break out of
7113              * translated code to check for pending interrupts.
7114              */
7115             gen_save_pc(ctx->base.pc_next + 4);
7116             ctx->base.is_jmp = DISAS_EXIT;
7117             register_name = "Cause";
7118             break;
7119         default:
7120             goto cp0_unimplemented;
7121         }
7122         break;
7123     case CP0_REGISTER_14:
7124         switch (sel) {
7125         case CP0_REG14__EPC:
7126             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
7127             register_name = "EPC";
7128             break;
7129         default:
7130             goto cp0_unimplemented;
7131         }
7132         break;
7133     case CP0_REGISTER_15:
7134         switch (sel) {
7135         case CP0_REG15__PRID:
7136             /* ignored */
7137             register_name = "PRid";
7138             break;
7139         case CP0_REG15__EBASE:
7140             check_insn(ctx, ISA_MIPS_R2);
7141             gen_helper_mtc0_ebase(cpu_env, arg);
7142             register_name = "EBase";
7143             break;
7144         default:
7145             goto cp0_unimplemented;
7146         }
7147         break;
7148     case CP0_REGISTER_16:
7149         switch (sel) {
7150         case CP0_REG16__CONFIG:
7151             gen_helper_mtc0_config0(cpu_env, arg);
7152             register_name = "Config";
7153             /* Stop translation as we may have switched the execution mode */
7154             ctx->base.is_jmp = DISAS_STOP;
7155             break;
7156         case CP0_REG16__CONFIG1:
7157             /* ignored, read only */
7158             register_name = "Config1";
7159             break;
7160         case CP0_REG16__CONFIG2:
7161             gen_helper_mtc0_config2(cpu_env, arg);
7162             register_name = "Config2";
7163             /* Stop translation as we may have switched the execution mode */
7164             ctx->base.is_jmp = DISAS_STOP;
7165             break;
7166         case CP0_REG16__CONFIG3:
7167             gen_helper_mtc0_config3(cpu_env, arg);
7168             register_name = "Config3";
7169             /* Stop translation as we may have switched the execution mode */
7170             ctx->base.is_jmp = DISAS_STOP;
7171             break;
7172         case CP0_REG16__CONFIG4:
7173             gen_helper_mtc0_config4(cpu_env, arg);
7174             register_name = "Config4";
7175             ctx->base.is_jmp = DISAS_STOP;
7176             break;
7177         case CP0_REG16__CONFIG5:
7178             gen_helper_mtc0_config5(cpu_env, arg);
7179             register_name = "Config5";
7180             /* Stop translation as we may have switched the execution mode */
7181             ctx->base.is_jmp = DISAS_STOP;
7182             break;
7183         /* 6,7 are implementation dependent */
7184         case CP0_REG16__CONFIG6:
7185             /* ignored */
7186             register_name = "Config6";
7187             break;
7188         case CP0_REG16__CONFIG7:
7189             /* ignored */
7190             register_name = "Config7";
7191             break;
7192         default:
7193             register_name = "Invalid config selector";
7194             goto cp0_unimplemented;
7195         }
7196         break;
7197     case CP0_REGISTER_17:
7198         switch (sel) {
7199         case CP0_REG17__LLADDR:
7200             gen_helper_mtc0_lladdr(cpu_env, arg);
7201             register_name = "LLAddr";
7202             break;
7203         case CP0_REG17__MAAR:
7204             CP0_CHECK(ctx->mrp);
7205             gen_helper_mtc0_maar(cpu_env, arg);
7206             register_name = "MAAR";
7207             break;
7208         case CP0_REG17__MAARI:
7209             CP0_CHECK(ctx->mrp);
7210             gen_helper_mtc0_maari(cpu_env, arg);
7211             register_name = "MAARI";
7212             break;
7213         default:
7214             goto cp0_unimplemented;
7215         }
7216         break;
7217     case CP0_REGISTER_18:
7218         switch (sel) {
7219         case CP0_REG18__WATCHLO0:
7220         case CP0_REG18__WATCHLO1:
7221         case CP0_REG18__WATCHLO2:
7222         case CP0_REG18__WATCHLO3:
7223         case CP0_REG18__WATCHLO4:
7224         case CP0_REG18__WATCHLO5:
7225         case CP0_REG18__WATCHLO6:
7226         case CP0_REG18__WATCHLO7:
7227             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
7228             gen_helper_0e1i(mtc0_watchlo, arg, sel);
7229             register_name = "WatchLo";
7230             break;
7231         default:
7232             goto cp0_unimplemented;
7233         }
7234         break;
7235     case CP0_REGISTER_19:
7236         switch (sel) {
7237         case CP0_REG19__WATCHHI0:
7238         case CP0_REG19__WATCHHI1:
7239         case CP0_REG19__WATCHHI2:
7240         case CP0_REG19__WATCHHI3:
7241         case CP0_REG19__WATCHHI4:
7242         case CP0_REG19__WATCHHI5:
7243         case CP0_REG19__WATCHHI6:
7244         case CP0_REG19__WATCHHI7:
7245             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
7246             gen_helper_0e1i(mtc0_watchhi, arg, sel);
7247             register_name = "WatchHi";
7248             break;
7249         default:
7250             goto cp0_unimplemented;
7251         }
7252         break;
7253     case CP0_REGISTER_20:
7254         switch (sel) {
7255         case CP0_REG20__XCONTEXT:
7256 #if defined(TARGET_MIPS64)
7257             check_insn(ctx, ISA_MIPS3);
7258             gen_helper_mtc0_xcontext(cpu_env, arg);
7259             register_name = "XContext";
7260             break;
7261 #endif
7262         default:
7263             goto cp0_unimplemented;
7264         }
7265         break;
7266     case CP0_REGISTER_21:
7267        /* Officially reserved, but sel 0 is used for R1x000 framemask */
7268         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS_R6));
7269         switch (sel) {
7270         case 0:
7271             gen_helper_mtc0_framemask(cpu_env, arg);
7272             register_name = "Framemask";
7273             break;
7274         default:
7275             goto cp0_unimplemented;
7276         }
7277         break;
7278     case CP0_REGISTER_22:
7279         /* ignored */
7280         register_name = "Diagnostic"; /* implementation dependent */
7281         break;
7282     case CP0_REGISTER_23:
7283         switch (sel) {
7284         case CP0_REG23__DEBUG:
7285             gen_helper_mtc0_debug(cpu_env, arg); /* EJTAG support */
7286             /* DISAS_STOP isn't good enough here, hflags may have changed. */
7287             gen_save_pc(ctx->base.pc_next + 4);
7288             ctx->base.is_jmp = DISAS_EXIT;
7289             register_name = "Debug";
7290             break;
7291         case CP0_REG23__TRACECONTROL:
7292             /* PDtrace support */
7293             /* gen_helper_mtc0_tracecontrol(cpu_env, arg);  */
7294             register_name = "TraceControl";
7295             /* Stop translation as we may have switched the execution mode */
7296             ctx->base.is_jmp = DISAS_STOP;
7297             goto cp0_unimplemented;
7298         case CP0_REG23__TRACECONTROL2:
7299             /* PDtrace support */
7300             /* gen_helper_mtc0_tracecontrol2(cpu_env, arg); */
7301             register_name = "TraceControl2";
7302             /* Stop translation as we may have switched the execution mode */
7303             ctx->base.is_jmp = DISAS_STOP;
7304             goto cp0_unimplemented;
7305         case CP0_REG23__USERTRACEDATA1:
7306             /* Stop translation as we may have switched the execution mode */
7307             ctx->base.is_jmp = DISAS_STOP;
7308             /* PDtrace support */
7309             /* gen_helper_mtc0_usertracedata1(cpu_env, arg);*/
7310             register_name = "UserTraceData";
7311             /* Stop translation as we may have switched the execution mode */
7312             ctx->base.is_jmp = DISAS_STOP;
7313             goto cp0_unimplemented;
7314         case CP0_REG23__TRACEIBPC:
7315             /* PDtrace support */
7316             /* gen_helper_mtc0_traceibpc(cpu_env, arg);     */
7317             /* Stop translation as we may have switched the execution mode */
7318             ctx->base.is_jmp = DISAS_STOP;
7319             register_name = "TraceIBPC";
7320             goto cp0_unimplemented;
7321         case CP0_REG23__TRACEDBPC:
7322             /* PDtrace support */
7323             /* gen_helper_mtc0_tracedbpc(cpu_env, arg);     */
7324             /* Stop translation as we may have switched the execution mode */
7325             ctx->base.is_jmp = DISAS_STOP;
7326             register_name = "TraceDBPC";
7327             goto cp0_unimplemented;
7328         default:
7329             goto cp0_unimplemented;
7330         }
7331         break;
7332     case CP0_REGISTER_24:
7333         switch (sel) {
7334         case CP0_REG24__DEPC:
7335             /* EJTAG support */
7336             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
7337             register_name = "DEPC";
7338             break;
7339         default:
7340             goto cp0_unimplemented;
7341         }
7342         break;
7343     case CP0_REGISTER_25:
7344         switch (sel) {
7345         case CP0_REG25__PERFCTL0:
7346             gen_helper_mtc0_performance0(cpu_env, arg);
7347             register_name = "Performance0";
7348             break;
7349         case CP0_REG25__PERFCNT0:
7350             /* gen_helper_mtc0_performance1(arg); */
7351             register_name = "Performance1";
7352             goto cp0_unimplemented;
7353         case CP0_REG25__PERFCTL1:
7354             /* gen_helper_mtc0_performance2(arg); */
7355             register_name = "Performance2";
7356             goto cp0_unimplemented;
7357         case CP0_REG25__PERFCNT1:
7358             /* gen_helper_mtc0_performance3(arg); */
7359             register_name = "Performance3";
7360             goto cp0_unimplemented;
7361         case CP0_REG25__PERFCTL2:
7362             /* gen_helper_mtc0_performance4(arg); */
7363             register_name = "Performance4";
7364             goto cp0_unimplemented;
7365         case CP0_REG25__PERFCNT2:
7366             /* gen_helper_mtc0_performance5(arg); */
7367             register_name = "Performance5";
7368             goto cp0_unimplemented;
7369         case CP0_REG25__PERFCTL3:
7370             /* gen_helper_mtc0_performance6(arg); */
7371             register_name = "Performance6";
7372             goto cp0_unimplemented;
7373         case CP0_REG25__PERFCNT3:
7374             /* gen_helper_mtc0_performance7(arg); */
7375             register_name = "Performance7";
7376             goto cp0_unimplemented;
7377         default:
7378             goto cp0_unimplemented;
7379         }
7380        break;
7381     case CP0_REGISTER_26:
7382         switch (sel) {
7383         case CP0_REG26__ERRCTL:
7384             gen_helper_mtc0_errctl(cpu_env, arg);
7385             ctx->base.is_jmp = DISAS_STOP;
7386             register_name = "ErrCtl";
7387             break;
7388         default:
7389             goto cp0_unimplemented;
7390         }
7391         break;
7392     case CP0_REGISTER_27:
7393         switch (sel) {
7394         case CP0_REG27__CACHERR:
7395             /* ignored */
7396             register_name = "CacheErr";
7397             break;
7398         default:
7399             goto cp0_unimplemented;
7400         }
7401        break;
7402     case CP0_REGISTER_28:
7403         switch (sel) {
7404         case CP0_REG28__TAGLO:
7405         case CP0_REG28__TAGLO1:
7406         case CP0_REG28__TAGLO2:
7407         case CP0_REG28__TAGLO3:
7408             gen_helper_mtc0_taglo(cpu_env, arg);
7409             register_name = "TagLo";
7410             break;
7411         case CP0_REG28__DATALO:
7412         case CP0_REG28__DATALO1:
7413         case CP0_REG28__DATALO2:
7414         case CP0_REG28__DATALO3:
7415             gen_helper_mtc0_datalo(cpu_env, arg);
7416             register_name = "DataLo";
7417             break;
7418         default:
7419             goto cp0_unimplemented;
7420         }
7421         break;
7422     case CP0_REGISTER_29:
7423         switch (sel) {
7424         case CP0_REG29__TAGHI:
7425         case CP0_REG29__TAGHI1:
7426         case CP0_REG29__TAGHI2:
7427         case CP0_REG29__TAGHI3:
7428             gen_helper_mtc0_taghi(cpu_env, arg);
7429             register_name = "TagHi";
7430             break;
7431         case CP0_REG29__DATAHI:
7432         case CP0_REG29__DATAHI1:
7433         case CP0_REG29__DATAHI2:
7434         case CP0_REG29__DATAHI3:
7435             gen_helper_mtc0_datahi(cpu_env, arg);
7436             register_name = "DataHi";
7437             break;
7438         default:
7439             register_name = "invalid sel";
7440             goto cp0_unimplemented;
7441         }
7442        break;
7443     case CP0_REGISTER_30:
7444         switch (sel) {
7445         case CP0_REG30__ERROREPC:
7446             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
7447             register_name = "ErrorEPC";
7448             break;
7449         default:
7450             goto cp0_unimplemented;
7451         }
7452         break;
7453     case CP0_REGISTER_31:
7454         switch (sel) {
7455         case CP0_REG31__DESAVE:
7456             /* EJTAG support */
7457             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
7458             register_name = "DESAVE";
7459             break;
7460         case CP0_REG31__KSCRATCH1:
7461         case CP0_REG31__KSCRATCH2:
7462         case CP0_REG31__KSCRATCH3:
7463         case CP0_REG31__KSCRATCH4:
7464         case CP0_REG31__KSCRATCH5:
7465         case CP0_REG31__KSCRATCH6:
7466             CP0_CHECK(ctx->kscrexist & (1 << sel));
7467             tcg_gen_st_tl(arg, cpu_env,
7468                           offsetof(CPUMIPSState, CP0_KScratch[sel - 2]));
7469             register_name = "KScratch";
7470             break;
7471         default:
7472             goto cp0_unimplemented;
7473         }
7474         break;
7475     default:
7476        goto cp0_unimplemented;
7477     }
7478     trace_mips_translate_c0("mtc0", register_name, reg, sel);
7479 
7480     /* For simplicity assume that all writes can cause interrupts.  */
7481     if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
7482         /*
7483          * DISAS_STOP isn't sufficient, we need to ensure we break out of
7484          * translated code to check for pending interrupts.
7485          */
7486         gen_save_pc(ctx->base.pc_next + 4);
7487         ctx->base.is_jmp = DISAS_EXIT;
7488     }
7489     return;
7490 
7491 cp0_unimplemented:
7492     qemu_log_mask(LOG_UNIMP, "mtc0 %s (reg %d sel %d)\n",
7493                   register_name, reg, sel);
7494 }
7495 
7496 #if defined(TARGET_MIPS64)
7497 static void gen_dmfc0(DisasContext *ctx, TCGv arg, int reg, int sel)
7498 {
7499     const char *register_name = "invalid";
7500 
7501     if (sel != 0) {
7502         check_insn(ctx, ISA_MIPS_R1);
7503     }
7504 
7505     switch (reg) {
7506     case CP0_REGISTER_00:
7507         switch (sel) {
7508         case CP0_REG00__INDEX:
7509             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Index));
7510             register_name = "Index";
7511             break;
7512         case CP0_REG00__MVPCONTROL:
7513             CP0_CHECK(ctx->insn_flags & ASE_MT);
7514             gen_helper_mfc0_mvpcontrol(arg, cpu_env);
7515             register_name = "MVPControl";
7516             break;
7517         case CP0_REG00__MVPCONF0:
7518             CP0_CHECK(ctx->insn_flags & ASE_MT);
7519             gen_helper_mfc0_mvpconf0(arg, cpu_env);
7520             register_name = "MVPConf0";
7521             break;
7522         case CP0_REG00__MVPCONF1:
7523             CP0_CHECK(ctx->insn_flags & ASE_MT);
7524             gen_helper_mfc0_mvpconf1(arg, cpu_env);
7525             register_name = "MVPConf1";
7526             break;
7527         case CP0_REG00__VPCONTROL:
7528             CP0_CHECK(ctx->vp);
7529             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPControl));
7530             register_name = "VPControl";
7531             break;
7532         default:
7533             goto cp0_unimplemented;
7534         }
7535         break;
7536     case CP0_REGISTER_01:
7537         switch (sel) {
7538         case CP0_REG01__RANDOM:
7539             CP0_CHECK(!(ctx->insn_flags & ISA_MIPS_R6));
7540             gen_helper_mfc0_random(arg, cpu_env);
7541             register_name = "Random";
7542             break;
7543         case CP0_REG01__VPECONTROL:
7544             CP0_CHECK(ctx->insn_flags & ASE_MT);
7545             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEControl));
7546             register_name = "VPEControl";
7547             break;
7548         case CP0_REG01__VPECONF0:
7549             CP0_CHECK(ctx->insn_flags & ASE_MT);
7550             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf0));
7551             register_name = "VPEConf0";
7552             break;
7553         case CP0_REG01__VPECONF1:
7554             CP0_CHECK(ctx->insn_flags & ASE_MT);
7555             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf1));
7556             register_name = "VPEConf1";
7557             break;
7558         case CP0_REG01__YQMASK:
7559             CP0_CHECK(ctx->insn_flags & ASE_MT);
7560             tcg_gen_ld_tl(arg, cpu_env,
7561                           offsetof(CPUMIPSState, CP0_YQMask));
7562             register_name = "YQMask";
7563             break;
7564         case CP0_REG01__VPESCHEDULE:
7565             CP0_CHECK(ctx->insn_flags & ASE_MT);
7566             tcg_gen_ld_tl(arg, cpu_env,
7567                           offsetof(CPUMIPSState, CP0_VPESchedule));
7568             register_name = "VPESchedule";
7569             break;
7570         case CP0_REG01__VPESCHEFBACK:
7571             CP0_CHECK(ctx->insn_flags & ASE_MT);
7572             tcg_gen_ld_tl(arg, cpu_env,
7573                           offsetof(CPUMIPSState, CP0_VPEScheFBack));
7574             register_name = "VPEScheFBack";
7575             break;
7576         case CP0_REG01__VPEOPT:
7577             CP0_CHECK(ctx->insn_flags & ASE_MT);
7578             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEOpt));
7579             register_name = "VPEOpt";
7580             break;
7581         default:
7582             goto cp0_unimplemented;
7583         }
7584         break;
7585     case CP0_REGISTER_02:
7586         switch (sel) {
7587         case CP0_REG02__ENTRYLO0:
7588             tcg_gen_ld_tl(arg, cpu_env,
7589                           offsetof(CPUMIPSState, CP0_EntryLo0));
7590             register_name = "EntryLo0";
7591             break;
7592         case CP0_REG02__TCSTATUS:
7593             CP0_CHECK(ctx->insn_flags & ASE_MT);
7594             gen_helper_mfc0_tcstatus(arg, cpu_env);
7595             register_name = "TCStatus";
7596             break;
7597         case CP0_REG02__TCBIND:
7598             CP0_CHECK(ctx->insn_flags & ASE_MT);
7599             gen_helper_mfc0_tcbind(arg, cpu_env);
7600             register_name = "TCBind";
7601             break;
7602         case CP0_REG02__TCRESTART:
7603             CP0_CHECK(ctx->insn_flags & ASE_MT);
7604             gen_helper_dmfc0_tcrestart(arg, cpu_env);
7605             register_name = "TCRestart";
7606             break;
7607         case CP0_REG02__TCHALT:
7608             CP0_CHECK(ctx->insn_flags & ASE_MT);
7609             gen_helper_dmfc0_tchalt(arg, cpu_env);
7610             register_name = "TCHalt";
7611             break;
7612         case CP0_REG02__TCCONTEXT:
7613             CP0_CHECK(ctx->insn_flags & ASE_MT);
7614             gen_helper_dmfc0_tccontext(arg, cpu_env);
7615             register_name = "TCContext";
7616             break;
7617         case CP0_REG02__TCSCHEDULE:
7618             CP0_CHECK(ctx->insn_flags & ASE_MT);
7619             gen_helper_dmfc0_tcschedule(arg, cpu_env);
7620             register_name = "TCSchedule";
7621             break;
7622         case CP0_REG02__TCSCHEFBACK:
7623             CP0_CHECK(ctx->insn_flags & ASE_MT);
7624             gen_helper_dmfc0_tcschefback(arg, cpu_env);
7625             register_name = "TCScheFBack";
7626             break;
7627         default:
7628             goto cp0_unimplemented;
7629         }
7630         break;
7631     case CP0_REGISTER_03:
7632         switch (sel) {
7633         case CP0_REG03__ENTRYLO1:
7634             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryLo1));
7635             register_name = "EntryLo1";
7636             break;
7637         case CP0_REG03__GLOBALNUM:
7638             CP0_CHECK(ctx->vp);
7639             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_GlobalNumber));
7640             register_name = "GlobalNumber";
7641             break;
7642         default:
7643             goto cp0_unimplemented;
7644         }
7645         break;
7646     case CP0_REGISTER_04:
7647         switch (sel) {
7648         case CP0_REG04__CONTEXT:
7649             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_Context));
7650             register_name = "Context";
7651             break;
7652         case CP0_REG04__CONTEXTCONFIG:
7653             /* SmartMIPS ASE */
7654             /* gen_helper_dmfc0_contextconfig(arg); */
7655             register_name = "ContextConfig";
7656             goto cp0_unimplemented;
7657         case CP0_REG04__USERLOCAL:
7658             CP0_CHECK(ctx->ulri);
7659             tcg_gen_ld_tl(arg, cpu_env,
7660                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
7661             register_name = "UserLocal";
7662             break;
7663         case CP0_REG04__MMID:
7664             CP0_CHECK(ctx->mi);
7665             gen_helper_mtc0_memorymapid(cpu_env, arg);
7666             register_name = "MMID";
7667             break;
7668         default:
7669             goto cp0_unimplemented;
7670         }
7671         break;
7672     case CP0_REGISTER_05:
7673         switch (sel) {
7674         case CP0_REG05__PAGEMASK:
7675             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageMask));
7676             register_name = "PageMask";
7677             break;
7678         case CP0_REG05__PAGEGRAIN:
7679             check_insn(ctx, ISA_MIPS_R2);
7680             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageGrain));
7681             register_name = "PageGrain";
7682             break;
7683         case CP0_REG05__SEGCTL0:
7684             CP0_CHECK(ctx->sc);
7685             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl0));
7686             register_name = "SegCtl0";
7687             break;
7688         case CP0_REG05__SEGCTL1:
7689             CP0_CHECK(ctx->sc);
7690             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl1));
7691             register_name = "SegCtl1";
7692             break;
7693         case CP0_REG05__SEGCTL2:
7694             CP0_CHECK(ctx->sc);
7695             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_SegCtl2));
7696             register_name = "SegCtl2";
7697             break;
7698         case CP0_REG05__PWBASE:
7699             check_pw(ctx);
7700             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_PWBase));
7701             register_name = "PWBase";
7702             break;
7703         case CP0_REG05__PWFIELD:
7704             check_pw(ctx);
7705             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_PWField));
7706             register_name = "PWField";
7707             break;
7708         case CP0_REG05__PWSIZE:
7709             check_pw(ctx);
7710             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_PWSize));
7711             register_name = "PWSize";
7712             break;
7713         default:
7714             goto cp0_unimplemented;
7715         }
7716         break;
7717     case CP0_REGISTER_06:
7718         switch (sel) {
7719         case CP0_REG06__WIRED:
7720             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Wired));
7721             register_name = "Wired";
7722             break;
7723         case CP0_REG06__SRSCONF0:
7724             check_insn(ctx, ISA_MIPS_R2);
7725             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf0));
7726             register_name = "SRSConf0";
7727             break;
7728         case CP0_REG06__SRSCONF1:
7729             check_insn(ctx, ISA_MIPS_R2);
7730             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf1));
7731             register_name = "SRSConf1";
7732             break;
7733         case CP0_REG06__SRSCONF2:
7734             check_insn(ctx, ISA_MIPS_R2);
7735             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf2));
7736             register_name = "SRSConf2";
7737             break;
7738         case CP0_REG06__SRSCONF3:
7739             check_insn(ctx, ISA_MIPS_R2);
7740             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf3));
7741             register_name = "SRSConf3";
7742             break;
7743         case CP0_REG06__SRSCONF4:
7744             check_insn(ctx, ISA_MIPS_R2);
7745             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf4));
7746             register_name = "SRSConf4";
7747             break;
7748         case CP0_REG06__PWCTL:
7749             check_pw(ctx);
7750             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PWCtl));
7751             register_name = "PWCtl";
7752             break;
7753         default:
7754             goto cp0_unimplemented;
7755         }
7756         break;
7757     case CP0_REGISTER_07:
7758         switch (sel) {
7759         case CP0_REG07__HWRENA:
7760             check_insn(ctx, ISA_MIPS_R2);
7761             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_HWREna));
7762             register_name = "HWREna";
7763             break;
7764         default:
7765             goto cp0_unimplemented;
7766         }
7767         break;
7768     case CP0_REGISTER_08:
7769         switch (sel) {
7770         case CP0_REG08__BADVADDR:
7771             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));
7772             register_name = "BadVAddr";
7773             break;
7774         case CP0_REG08__BADINSTR:
7775             CP0_CHECK(ctx->bi);
7776             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstr));
7777             register_name = "BadInstr";
7778             break;
7779         case CP0_REG08__BADINSTRP:
7780             CP0_CHECK(ctx->bp);
7781             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrP));
7782             register_name = "BadInstrP";
7783             break;
7784         case CP0_REG08__BADINSTRX:
7785             CP0_CHECK(ctx->bi);
7786             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_BadInstrX));
7787             tcg_gen_andi_tl(arg, arg, ~0xffff);
7788             register_name = "BadInstrX";
7789             break;
7790         default:
7791             goto cp0_unimplemented;
7792         }
7793         break;
7794     case CP0_REGISTER_09:
7795         switch (sel) {
7796         case CP0_REG09__COUNT:
7797             /* Mark as an IO operation because we read the time.  */
7798             if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
7799                 gen_io_start();
7800             }
7801             gen_helper_mfc0_count(arg, cpu_env);
7802             /*
7803              * Break the TB to be able to take timer interrupts immediately
7804              * after reading count. DISAS_STOP isn't sufficient, we need to
7805              * ensure we break completely out of translated code.
7806              */
7807             gen_save_pc(ctx->base.pc_next + 4);
7808             ctx->base.is_jmp = DISAS_EXIT;
7809             register_name = "Count";
7810             break;
7811         case CP0_REG09__SAARI:
7812             CP0_CHECK(ctx->saar);
7813             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SAARI));
7814             register_name = "SAARI";
7815             break;
7816         case CP0_REG09__SAAR:
7817             CP0_CHECK(ctx->saar);
7818             gen_helper_dmfc0_saar(arg, cpu_env);
7819             register_name = "SAAR";
7820             break;
7821         default:
7822             goto cp0_unimplemented;
7823         }
7824         break;
7825     case CP0_REGISTER_10:
7826         switch (sel) {
7827         case CP0_REG10__ENTRYHI:
7828             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryHi));
7829             register_name = "EntryHi";
7830             break;
7831         default:
7832             goto cp0_unimplemented;
7833         }
7834         break;
7835     case CP0_REGISTER_11:
7836         switch (sel) {
7837         case CP0_REG11__COMPARE:
7838             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Compare));
7839             register_name = "Compare";
7840             break;
7841         /* 6,7 are implementation dependent */
7842         default:
7843             goto cp0_unimplemented;
7844         }
7845         break;
7846     case CP0_REGISTER_12:
7847         switch (sel) {
7848         case CP0_REG12__STATUS:
7849             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Status));
7850             register_name = "Status";
7851             break;
7852         case CP0_REG12__INTCTL:
7853             check_insn(ctx, ISA_MIPS_R2);
7854             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_IntCtl));
7855             register_name = "IntCtl";
7856             break;
7857         case CP0_REG12__SRSCTL:
7858             check_insn(ctx, ISA_MIPS_R2);
7859             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSCtl));
7860             register_name = "SRSCtl";
7861             break;
7862         case CP0_REG12__SRSMAP:
7863             check_insn(ctx, ISA_MIPS_R2);
7864             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
7865             register_name = "SRSMap";
7866             break;
7867         default:
7868             goto cp0_unimplemented;
7869         }
7870         break;
7871     case CP0_REGISTER_13:
7872         switch (sel) {
7873         case CP0_REG13__CAUSE:
7874             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Cause));
7875             register_name = "Cause";
7876             break;
7877         default:
7878             goto cp0_unimplemented;
7879         }
7880         break;
7881     case CP0_REGISTER_14:
7882         switch (sel) {
7883         case CP0_REG14__EPC:
7884             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
7885             register_name = "EPC";
7886             break;
7887         default:
7888             goto cp0_unimplemented;
7889         }
7890         break;
7891     case CP0_REGISTER_15:
7892         switch (sel) {
7893         case CP0_REG15__PRID:
7894             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PRid));
7895             register_name = "PRid";
7896             break;
7897         case CP0_REG15__EBASE:
7898             check_insn(ctx, ISA_MIPS_R2);
7899             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EBase));
7900             register_name = "EBase";
7901             break;
7902         case CP0_REG15__CMGCRBASE:
7903             check_insn(ctx, ISA_MIPS_R2);
7904             CP0_CHECK(ctx->cmgcr);
7905             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_CMGCRBase));
7906             register_name = "CMGCRBase";
7907             break;
7908         default:
7909             goto cp0_unimplemented;
7910         }
7911         break;
7912     case CP0_REGISTER_16:
7913         switch (sel) {
7914         case CP0_REG16__CONFIG:
7915             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config0));
7916             register_name = "Config";
7917             break;
7918         case CP0_REG16__CONFIG1:
7919             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config1));
7920             register_name = "Config1";
7921             break;
7922         case CP0_REG16__CONFIG2:
7923             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config2));
7924             register_name = "Config2";
7925             break;
7926         case CP0_REG16__CONFIG3:
7927             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config3));
7928             register_name = "Config3";
7929             break;
7930         case CP0_REG16__CONFIG4:
7931             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config4));
7932             register_name = "Config4";
7933             break;
7934         case CP0_REG16__CONFIG5:
7935             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config5));
7936             register_name = "Config5";
7937             break;
7938         /* 6,7 are implementation dependent */
7939         case CP0_REG16__CONFIG6:
7940             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config6));
7941             register_name = "Config6";
7942             break;
7943         case CP0_REG16__CONFIG7:
7944             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config7));
7945             register_name = "Config7";
7946             break;
7947         default:
7948             goto cp0_unimplemented;
7949         }
7950         break;
7951     case CP0_REGISTER_17:
7952         switch (sel) {
7953         case CP0_REG17__LLADDR:
7954             gen_helper_dmfc0_lladdr(arg, cpu_env);
7955             register_name = "LLAddr";
7956             break;
7957         case CP0_REG17__MAAR:
7958             CP0_CHECK(ctx->mrp);
7959             gen_helper_dmfc0_maar(arg, cpu_env);
7960             register_name = "MAAR";
7961             break;
7962         case CP0_REG17__MAARI:
7963             CP0_CHECK(ctx->mrp);
7964             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_MAARI));
7965             register_name = "MAARI";
7966             break;
7967         default:
7968             goto cp0_unimplemented;
7969         }
7970         break;
7971     case CP0_REGISTER_18:
7972         switch (sel) {
7973         case CP0_REG18__WATCHLO0:
7974         case CP0_REG18__WATCHLO1:
7975         case CP0_REG18__WATCHLO2:
7976         case CP0_REG18__WATCHLO3:
7977         case CP0_REG18__WATCHLO4:
7978         case CP0_REG18__WATCHLO5:
7979         case CP0_REG18__WATCHLO6:
7980         case CP0_REG18__WATCHLO7:
7981             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
7982             gen_helper_1e0i(dmfc0_watchlo, arg, sel);
7983             register_name = "WatchLo";
7984             break;
7985         default:
7986             goto cp0_unimplemented;
7987         }
7988         break;
7989     case CP0_REGISTER_19:
7990         switch (sel) {
7991         case CP0_REG19__WATCHHI0:
7992         case CP0_REG19__WATCHHI1:
7993         case CP0_REG19__WATCHHI2:
7994         case CP0_REG19__WATCHHI3:
7995         case CP0_REG19__WATCHHI4:
7996         case CP0_REG19__WATCHHI5:
7997         case CP0_REG19__WATCHHI6:
7998         case CP0_REG19__WATCHHI7:
7999             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
8000             gen_helper_1e0i(dmfc0_watchhi, arg, sel);
8001             register_name = "WatchHi";
8002             break;
8003         default:
8004             goto cp0_unimplemented;
8005         }
8006         break;
8007     case CP0_REGISTER_20:
8008         switch (sel) {
8009         case CP0_REG20__XCONTEXT:
8010             check_insn(ctx, ISA_MIPS3);
8011             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_XContext));
8012             register_name = "XContext";
8013             break;
8014         default:
8015             goto cp0_unimplemented;
8016         }
8017         break;
8018     case CP0_REGISTER_21:
8019         /* Officially reserved, but sel 0 is used for R1x000 framemask */
8020         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS_R6));
8021         switch (sel) {
8022         case 0:
8023             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Framemask));
8024             register_name = "Framemask";
8025             break;
8026         default:
8027             goto cp0_unimplemented;
8028         }
8029         break;
8030     case CP0_REGISTER_22:
8031         tcg_gen_movi_tl(arg, 0); /* unimplemented */
8032         register_name = "'Diagnostic"; /* implementation dependent */
8033         break;
8034     case CP0_REGISTER_23:
8035         switch (sel) {
8036         case CP0_REG23__DEBUG:
8037             gen_helper_mfc0_debug(arg, cpu_env); /* EJTAG support */
8038             register_name = "Debug";
8039             break;
8040         case CP0_REG23__TRACECONTROL:
8041             /* PDtrace support */
8042             /* gen_helper_dmfc0_tracecontrol(arg, cpu_env);  */
8043             register_name = "TraceControl";
8044             goto cp0_unimplemented;
8045         case CP0_REG23__TRACECONTROL2:
8046             /* PDtrace support */
8047             /* gen_helper_dmfc0_tracecontrol2(arg, cpu_env); */
8048             register_name = "TraceControl2";
8049             goto cp0_unimplemented;
8050         case CP0_REG23__USERTRACEDATA1:
8051             /* PDtrace support */
8052             /* gen_helper_dmfc0_usertracedata1(arg, cpu_env);*/
8053             register_name = "UserTraceData1";
8054             goto cp0_unimplemented;
8055         case CP0_REG23__TRACEIBPC:
8056             /* PDtrace support */
8057             /* gen_helper_dmfc0_traceibpc(arg, cpu_env);     */
8058             register_name = "TraceIBPC";
8059             goto cp0_unimplemented;
8060         case CP0_REG23__TRACEDBPC:
8061             /* PDtrace support */
8062             /* gen_helper_dmfc0_tracedbpc(arg, cpu_env);     */
8063             register_name = "TraceDBPC";
8064             goto cp0_unimplemented;
8065         default:
8066             goto cp0_unimplemented;
8067         }
8068         break;
8069     case CP0_REGISTER_24:
8070         switch (sel) {
8071         case CP0_REG24__DEPC:
8072             /* EJTAG support */
8073             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
8074             register_name = "DEPC";
8075             break;
8076         default:
8077             goto cp0_unimplemented;
8078         }
8079         break;
8080     case CP0_REGISTER_25:
8081         switch (sel) {
8082         case CP0_REG25__PERFCTL0:
8083             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Performance0));
8084             register_name = "Performance0";
8085             break;
8086         case CP0_REG25__PERFCNT0:
8087             /* gen_helper_dmfc0_performance1(arg); */
8088             register_name = "Performance1";
8089             goto cp0_unimplemented;
8090         case CP0_REG25__PERFCTL1:
8091             /* gen_helper_dmfc0_performance2(arg); */
8092             register_name = "Performance2";
8093             goto cp0_unimplemented;
8094         case CP0_REG25__PERFCNT1:
8095             /* gen_helper_dmfc0_performance3(arg); */
8096             register_name = "Performance3";
8097             goto cp0_unimplemented;
8098         case CP0_REG25__PERFCTL2:
8099             /* gen_helper_dmfc0_performance4(arg); */
8100             register_name = "Performance4";
8101             goto cp0_unimplemented;
8102         case CP0_REG25__PERFCNT2:
8103             /* gen_helper_dmfc0_performance5(arg); */
8104             register_name = "Performance5";
8105             goto cp0_unimplemented;
8106         case CP0_REG25__PERFCTL3:
8107             /* gen_helper_dmfc0_performance6(arg); */
8108             register_name = "Performance6";
8109             goto cp0_unimplemented;
8110         case CP0_REG25__PERFCNT3:
8111             /* gen_helper_dmfc0_performance7(arg); */
8112             register_name = "Performance7";
8113             goto cp0_unimplemented;
8114         default:
8115             goto cp0_unimplemented;
8116         }
8117         break;
8118     case CP0_REGISTER_26:
8119         switch (sel) {
8120         case CP0_REG26__ERRCTL:
8121             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_ErrCtl));
8122             register_name = "ErrCtl";
8123             break;
8124         default:
8125             goto cp0_unimplemented;
8126         }
8127         break;
8128     case CP0_REGISTER_27:
8129         switch (sel) {
8130         /* ignored */
8131         case CP0_REG27__CACHERR:
8132             tcg_gen_movi_tl(arg, 0); /* unimplemented */
8133             register_name = "CacheErr";
8134             break;
8135         default:
8136             goto cp0_unimplemented;
8137         }
8138         break;
8139     case CP0_REGISTER_28:
8140         switch (sel) {
8141         case CP0_REG28__TAGLO:
8142         case CP0_REG28__TAGLO1:
8143         case CP0_REG28__TAGLO2:
8144         case CP0_REG28__TAGLO3:
8145             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagLo));
8146             register_name = "TagLo";
8147             break;
8148         case CP0_REG28__DATALO:
8149         case CP0_REG28__DATALO1:
8150         case CP0_REG28__DATALO2:
8151         case CP0_REG28__DATALO3:
8152             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataLo));
8153             register_name = "DataLo";
8154             break;
8155         default:
8156             goto cp0_unimplemented;
8157         }
8158         break;
8159     case CP0_REGISTER_29:
8160         switch (sel) {
8161         case CP0_REG29__TAGHI:
8162         case CP0_REG29__TAGHI1:
8163         case CP0_REG29__TAGHI2:
8164         case CP0_REG29__TAGHI3:
8165             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagHi));
8166             register_name = "TagHi";
8167             break;
8168         case CP0_REG29__DATAHI:
8169         case CP0_REG29__DATAHI1:
8170         case CP0_REG29__DATAHI2:
8171         case CP0_REG29__DATAHI3:
8172             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataHi));
8173             register_name = "DataHi";
8174             break;
8175         default:
8176             goto cp0_unimplemented;
8177         }
8178         break;
8179     case CP0_REGISTER_30:
8180         switch (sel) {
8181         case CP0_REG30__ERROREPC:
8182             tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
8183             register_name = "ErrorEPC";
8184             break;
8185         default:
8186             goto cp0_unimplemented;
8187         }
8188         break;
8189     case CP0_REGISTER_31:
8190         switch (sel) {
8191         case CP0_REG31__DESAVE:
8192             /* EJTAG support */
8193             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
8194             register_name = "DESAVE";
8195             break;
8196         case CP0_REG31__KSCRATCH1:
8197         case CP0_REG31__KSCRATCH2:
8198         case CP0_REG31__KSCRATCH3:
8199         case CP0_REG31__KSCRATCH4:
8200         case CP0_REG31__KSCRATCH5:
8201         case CP0_REG31__KSCRATCH6:
8202             CP0_CHECK(ctx->kscrexist & (1 << sel));
8203             tcg_gen_ld_tl(arg, cpu_env,
8204                           offsetof(CPUMIPSState, CP0_KScratch[sel - 2]));
8205             register_name = "KScratch";
8206             break;
8207         default:
8208             goto cp0_unimplemented;
8209         }
8210         break;
8211     default:
8212         goto cp0_unimplemented;
8213     }
8214     trace_mips_translate_c0("dmfc0", register_name, reg, sel);
8215     return;
8216 
8217 cp0_unimplemented:
8218     qemu_log_mask(LOG_UNIMP, "dmfc0 %s (reg %d sel %d)\n",
8219                   register_name, reg, sel);
8220     gen_mfc0_unimplemented(ctx, arg);
8221 }
8222 
8223 static void gen_dmtc0(DisasContext *ctx, TCGv arg, int reg, int sel)
8224 {
8225     const char *register_name = "invalid";
8226 
8227     if (sel != 0) {
8228         check_insn(ctx, ISA_MIPS_R1);
8229     }
8230 
8231     if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
8232         gen_io_start();
8233     }
8234 
8235     switch (reg) {
8236     case CP0_REGISTER_00:
8237         switch (sel) {
8238         case CP0_REG00__INDEX:
8239             gen_helper_mtc0_index(cpu_env, arg);
8240             register_name = "Index";
8241             break;
8242         case CP0_REG00__MVPCONTROL:
8243             CP0_CHECK(ctx->insn_flags & ASE_MT);
8244             gen_helper_mtc0_mvpcontrol(cpu_env, arg);
8245             register_name = "MVPControl";
8246             break;
8247         case CP0_REG00__MVPCONF0:
8248             CP0_CHECK(ctx->insn_flags & ASE_MT);
8249             /* ignored */
8250             register_name = "MVPConf0";
8251             break;
8252         case CP0_REG00__MVPCONF1:
8253             CP0_CHECK(ctx->insn_flags & ASE_MT);
8254             /* ignored */
8255             register_name = "MVPConf1";
8256             break;
8257         case CP0_REG00__VPCONTROL:
8258             CP0_CHECK(ctx->vp);
8259             /* ignored */
8260             register_name = "VPControl";
8261             break;
8262         default:
8263             goto cp0_unimplemented;
8264         }
8265         break;
8266     case CP0_REGISTER_01:
8267         switch (sel) {
8268         case CP0_REG01__RANDOM:
8269             /* ignored */
8270             register_name = "Random";
8271             break;
8272         case CP0_REG01__VPECONTROL:
8273             CP0_CHECK(ctx->insn_flags & ASE_MT);
8274             gen_helper_mtc0_vpecontrol(cpu_env, arg);
8275             register_name = "VPEControl";
8276             break;
8277         case CP0_REG01__VPECONF0:
8278             CP0_CHECK(ctx->insn_flags & ASE_MT);
8279             gen_helper_mtc0_vpeconf0(cpu_env, arg);
8280             register_name = "VPEConf0";
8281             break;
8282         case CP0_REG01__VPECONF1:
8283             CP0_CHECK(ctx->insn_flags & ASE_MT);
8284             gen_helper_mtc0_vpeconf1(cpu_env, arg);
8285             register_name = "VPEConf1";
8286             break;
8287         case CP0_REG01__YQMASK:
8288             CP0_CHECK(ctx->insn_flags & ASE_MT);
8289             gen_helper_mtc0_yqmask(cpu_env, arg);
8290             register_name = "YQMask";
8291             break;
8292         case CP0_REG01__VPESCHEDULE:
8293             CP0_CHECK(ctx->insn_flags & ASE_MT);
8294             tcg_gen_st_tl(arg, cpu_env,
8295                           offsetof(CPUMIPSState, CP0_VPESchedule));
8296             register_name = "VPESchedule";
8297             break;
8298         case CP0_REG01__VPESCHEFBACK:
8299             CP0_CHECK(ctx->insn_flags & ASE_MT);
8300             tcg_gen_st_tl(arg, cpu_env,
8301                           offsetof(CPUMIPSState, CP0_VPEScheFBack));
8302             register_name = "VPEScheFBack";
8303             break;
8304         case CP0_REG01__VPEOPT:
8305             CP0_CHECK(ctx->insn_flags & ASE_MT);
8306             gen_helper_mtc0_vpeopt(cpu_env, arg);
8307             register_name = "VPEOpt";
8308             break;
8309         default:
8310             goto cp0_unimplemented;
8311         }
8312         break;
8313     case CP0_REGISTER_02:
8314         switch (sel) {
8315         case CP0_REG02__ENTRYLO0:
8316             gen_helper_dmtc0_entrylo0(cpu_env, arg);
8317             register_name = "EntryLo0";
8318             break;
8319         case CP0_REG02__TCSTATUS:
8320             CP0_CHECK(ctx->insn_flags & ASE_MT);
8321             gen_helper_mtc0_tcstatus(cpu_env, arg);
8322             register_name = "TCStatus";
8323             break;
8324         case CP0_REG02__TCBIND:
8325             CP0_CHECK(ctx->insn_flags & ASE_MT);
8326             gen_helper_mtc0_tcbind(cpu_env, arg);
8327             register_name = "TCBind";
8328             break;
8329         case CP0_REG02__TCRESTART:
8330             CP0_CHECK(ctx->insn_flags & ASE_MT);
8331             gen_helper_mtc0_tcrestart(cpu_env, arg);
8332             register_name = "TCRestart";
8333             break;
8334         case CP0_REG02__TCHALT:
8335             CP0_CHECK(ctx->insn_flags & ASE_MT);
8336             gen_helper_mtc0_tchalt(cpu_env, arg);
8337             register_name = "TCHalt";
8338             break;
8339         case CP0_REG02__TCCONTEXT:
8340             CP0_CHECK(ctx->insn_flags & ASE_MT);
8341             gen_helper_mtc0_tccontext(cpu_env, arg);
8342             register_name = "TCContext";
8343             break;
8344         case CP0_REG02__TCSCHEDULE:
8345             CP0_CHECK(ctx->insn_flags & ASE_MT);
8346             gen_helper_mtc0_tcschedule(cpu_env, arg);
8347             register_name = "TCSchedule";
8348             break;
8349         case CP0_REG02__TCSCHEFBACK:
8350             CP0_CHECK(ctx->insn_flags & ASE_MT);
8351             gen_helper_mtc0_tcschefback(cpu_env, arg);
8352             register_name = "TCScheFBack";
8353             break;
8354         default:
8355             goto cp0_unimplemented;
8356         }
8357         break;
8358     case CP0_REGISTER_03:
8359         switch (sel) {
8360         case CP0_REG03__ENTRYLO1:
8361             gen_helper_dmtc0_entrylo1(cpu_env, arg);
8362             register_name = "EntryLo1";
8363             break;
8364         case CP0_REG03__GLOBALNUM:
8365             CP0_CHECK(ctx->vp);
8366             /* ignored */
8367             register_name = "GlobalNumber";
8368             break;
8369         default:
8370             goto cp0_unimplemented;
8371         }
8372         break;
8373     case CP0_REGISTER_04:
8374         switch (sel) {
8375         case CP0_REG04__CONTEXT:
8376             gen_helper_mtc0_context(cpu_env, arg);
8377             register_name = "Context";
8378             break;
8379         case CP0_REG04__CONTEXTCONFIG:
8380             /* SmartMIPS ASE */
8381             /* gen_helper_dmtc0_contextconfig(arg); */
8382             register_name = "ContextConfig";
8383             goto cp0_unimplemented;
8384         case CP0_REG04__USERLOCAL:
8385             CP0_CHECK(ctx->ulri);
8386             tcg_gen_st_tl(arg, cpu_env,
8387                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
8388             register_name = "UserLocal";
8389             break;
8390         case CP0_REG04__MMID:
8391             CP0_CHECK(ctx->mi);
8392             gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_MemoryMapID));
8393             register_name = "MMID";
8394             break;
8395         default:
8396             goto cp0_unimplemented;
8397         }
8398         break;
8399     case CP0_REGISTER_05:
8400         switch (sel) {
8401         case CP0_REG05__PAGEMASK:
8402             gen_helper_mtc0_pagemask(cpu_env, arg);
8403             register_name = "PageMask";
8404             break;
8405         case CP0_REG05__PAGEGRAIN:
8406             check_insn(ctx, ISA_MIPS_R2);
8407             gen_helper_mtc0_pagegrain(cpu_env, arg);
8408             register_name = "PageGrain";
8409             break;
8410         case CP0_REG05__SEGCTL0:
8411             CP0_CHECK(ctx->sc);
8412             gen_helper_mtc0_segctl0(cpu_env, arg);
8413             register_name = "SegCtl0";
8414             break;
8415         case CP0_REG05__SEGCTL1:
8416             CP0_CHECK(ctx->sc);
8417             gen_helper_mtc0_segctl1(cpu_env, arg);
8418             register_name = "SegCtl1";
8419             break;
8420         case CP0_REG05__SEGCTL2:
8421             CP0_CHECK(ctx->sc);
8422             gen_helper_mtc0_segctl2(cpu_env, arg);
8423             register_name = "SegCtl2";
8424             break;
8425         case CP0_REG05__PWBASE:
8426             check_pw(ctx);
8427             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_PWBase));
8428             register_name = "PWBase";
8429             break;
8430         case CP0_REG05__PWFIELD:
8431             check_pw(ctx);
8432             gen_helper_mtc0_pwfield(cpu_env, arg);
8433             register_name = "PWField";
8434             break;
8435         case CP0_REG05__PWSIZE:
8436             check_pw(ctx);
8437             gen_helper_mtc0_pwsize(cpu_env, arg);
8438             register_name = "PWSize";
8439             break;
8440         default:
8441             goto cp0_unimplemented;
8442         }
8443         break;
8444     case CP0_REGISTER_06:
8445         switch (sel) {
8446         case CP0_REG06__WIRED:
8447             gen_helper_mtc0_wired(cpu_env, arg);
8448             register_name = "Wired";
8449             break;
8450         case CP0_REG06__SRSCONF0:
8451             check_insn(ctx, ISA_MIPS_R2);
8452             gen_helper_mtc0_srsconf0(cpu_env, arg);
8453             register_name = "SRSConf0";
8454             break;
8455         case CP0_REG06__SRSCONF1:
8456             check_insn(ctx, ISA_MIPS_R2);
8457             gen_helper_mtc0_srsconf1(cpu_env, arg);
8458             register_name = "SRSConf1";
8459             break;
8460         case CP0_REG06__SRSCONF2:
8461             check_insn(ctx, ISA_MIPS_R2);
8462             gen_helper_mtc0_srsconf2(cpu_env, arg);
8463             register_name = "SRSConf2";
8464             break;
8465         case CP0_REG06__SRSCONF3:
8466             check_insn(ctx, ISA_MIPS_R2);
8467             gen_helper_mtc0_srsconf3(cpu_env, arg);
8468             register_name = "SRSConf3";
8469             break;
8470         case CP0_REG06__SRSCONF4:
8471             check_insn(ctx, ISA_MIPS_R2);
8472             gen_helper_mtc0_srsconf4(cpu_env, arg);
8473             register_name = "SRSConf4";
8474             break;
8475         case CP0_REG06__PWCTL:
8476             check_pw(ctx);
8477             gen_helper_mtc0_pwctl(cpu_env, arg);
8478             register_name = "PWCtl";
8479             break;
8480         default:
8481             goto cp0_unimplemented;
8482         }
8483         break;
8484     case CP0_REGISTER_07:
8485         switch (sel) {
8486         case CP0_REG07__HWRENA:
8487             check_insn(ctx, ISA_MIPS_R2);
8488             gen_helper_mtc0_hwrena(cpu_env, arg);
8489             ctx->base.is_jmp = DISAS_STOP;
8490             register_name = "HWREna";
8491             break;
8492         default:
8493             goto cp0_unimplemented;
8494         }
8495         break;
8496     case CP0_REGISTER_08:
8497         switch (sel) {
8498         case CP0_REG08__BADVADDR:
8499             /* ignored */
8500             register_name = "BadVAddr";
8501             break;
8502         case CP0_REG08__BADINSTR:
8503             /* ignored */
8504             register_name = "BadInstr";
8505             break;
8506         case CP0_REG08__BADINSTRP:
8507             /* ignored */
8508             register_name = "BadInstrP";
8509             break;
8510         case CP0_REG08__BADINSTRX:
8511             /* ignored */
8512             register_name = "BadInstrX";
8513             break;
8514         default:
8515             goto cp0_unimplemented;
8516         }
8517         break;
8518     case CP0_REGISTER_09:
8519         switch (sel) {
8520         case CP0_REG09__COUNT:
8521             gen_helper_mtc0_count(cpu_env, arg);
8522             register_name = "Count";
8523             break;
8524         case CP0_REG09__SAARI:
8525             CP0_CHECK(ctx->saar);
8526             gen_helper_mtc0_saari(cpu_env, arg);
8527             register_name = "SAARI";
8528             break;
8529         case CP0_REG09__SAAR:
8530             CP0_CHECK(ctx->saar);
8531             gen_helper_mtc0_saar(cpu_env, arg);
8532             register_name = "SAAR";
8533             break;
8534         default:
8535             goto cp0_unimplemented;
8536         }
8537         /* Stop translation as we may have switched the execution mode */
8538         ctx->base.is_jmp = DISAS_STOP;
8539         break;
8540     case CP0_REGISTER_10:
8541         switch (sel) {
8542         case CP0_REG10__ENTRYHI:
8543             gen_helper_mtc0_entryhi(cpu_env, arg);
8544             register_name = "EntryHi";
8545             break;
8546         default:
8547             goto cp0_unimplemented;
8548         }
8549         break;
8550     case CP0_REGISTER_11:
8551         switch (sel) {
8552         case CP0_REG11__COMPARE:
8553             gen_helper_mtc0_compare(cpu_env, arg);
8554             register_name = "Compare";
8555             break;
8556         /* 6,7 are implementation dependent */
8557         default:
8558             goto cp0_unimplemented;
8559         }
8560         /* Stop translation as we may have switched the execution mode */
8561         ctx->base.is_jmp = DISAS_STOP;
8562         break;
8563     case CP0_REGISTER_12:
8564         switch (sel) {
8565         case CP0_REG12__STATUS:
8566             save_cpu_state(ctx, 1);
8567             gen_helper_mtc0_status(cpu_env, arg);
8568             /* DISAS_STOP isn't good enough here, hflags may have changed. */
8569             gen_save_pc(ctx->base.pc_next + 4);
8570             ctx->base.is_jmp = DISAS_EXIT;
8571             register_name = "Status";
8572             break;
8573         case CP0_REG12__INTCTL:
8574             check_insn(ctx, ISA_MIPS_R2);
8575             gen_helper_mtc0_intctl(cpu_env, arg);
8576             /* Stop translation as we may have switched the execution mode */
8577             ctx->base.is_jmp = DISAS_STOP;
8578             register_name = "IntCtl";
8579             break;
8580         case CP0_REG12__SRSCTL:
8581             check_insn(ctx, ISA_MIPS_R2);
8582             gen_helper_mtc0_srsctl(cpu_env, arg);
8583             /* Stop translation as we may have switched the execution mode */
8584             ctx->base.is_jmp = DISAS_STOP;
8585             register_name = "SRSCtl";
8586             break;
8587         case CP0_REG12__SRSMAP:
8588             check_insn(ctx, ISA_MIPS_R2);
8589             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
8590             /* Stop translation as we may have switched the execution mode */
8591             ctx->base.is_jmp = DISAS_STOP;
8592             register_name = "SRSMap";
8593             break;
8594         default:
8595             goto cp0_unimplemented;
8596         }
8597         break;
8598     case CP0_REGISTER_13:
8599         switch (sel) {
8600         case CP0_REG13__CAUSE:
8601             save_cpu_state(ctx, 1);
8602             gen_helper_mtc0_cause(cpu_env, arg);
8603             /*
8604              * Stop translation as we may have triggered an interrupt.
8605              * DISAS_STOP isn't sufficient, we need to ensure we break out of
8606              * translated code to check for pending interrupts.
8607              */
8608             gen_save_pc(ctx->base.pc_next + 4);
8609             ctx->base.is_jmp = DISAS_EXIT;
8610             register_name = "Cause";
8611             break;
8612         default:
8613             goto cp0_unimplemented;
8614         }
8615         break;
8616     case CP0_REGISTER_14:
8617         switch (sel) {
8618         case CP0_REG14__EPC:
8619             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
8620             register_name = "EPC";
8621             break;
8622         default:
8623             goto cp0_unimplemented;
8624         }
8625         break;
8626     case CP0_REGISTER_15:
8627         switch (sel) {
8628         case CP0_REG15__PRID:
8629             /* ignored */
8630             register_name = "PRid";
8631             break;
8632         case CP0_REG15__EBASE:
8633             check_insn(ctx, ISA_MIPS_R2);
8634             gen_helper_mtc0_ebase(cpu_env, arg);
8635             register_name = "EBase";
8636             break;
8637         default:
8638             goto cp0_unimplemented;
8639         }
8640         break;
8641     case CP0_REGISTER_16:
8642         switch (sel) {
8643         case CP0_REG16__CONFIG:
8644             gen_helper_mtc0_config0(cpu_env, arg);
8645             register_name = "Config";
8646             /* Stop translation as we may have switched the execution mode */
8647             ctx->base.is_jmp = DISAS_STOP;
8648             break;
8649         case CP0_REG16__CONFIG1:
8650             /* ignored, read only */
8651             register_name = "Config1";
8652             break;
8653         case CP0_REG16__CONFIG2:
8654             gen_helper_mtc0_config2(cpu_env, arg);
8655             register_name = "Config2";
8656             /* Stop translation as we may have switched the execution mode */
8657             ctx->base.is_jmp = DISAS_STOP;
8658             break;
8659         case CP0_REG16__CONFIG3:
8660             gen_helper_mtc0_config3(cpu_env, arg);
8661             register_name = "Config3";
8662             /* Stop translation as we may have switched the execution mode */
8663             ctx->base.is_jmp = DISAS_STOP;
8664             break;
8665         case CP0_REG16__CONFIG4:
8666             /* currently ignored */
8667             register_name = "Config4";
8668             break;
8669         case CP0_REG16__CONFIG5:
8670             gen_helper_mtc0_config5(cpu_env, arg);
8671             register_name = "Config5";
8672             /* Stop translation as we may have switched the execution mode */
8673             ctx->base.is_jmp = DISAS_STOP;
8674             break;
8675         /* 6,7 are implementation dependent */
8676         default:
8677             register_name = "Invalid config selector";
8678             goto cp0_unimplemented;
8679         }
8680         break;
8681     case CP0_REGISTER_17:
8682         switch (sel) {
8683         case CP0_REG17__LLADDR:
8684             gen_helper_mtc0_lladdr(cpu_env, arg);
8685             register_name = "LLAddr";
8686             break;
8687         case CP0_REG17__MAAR:
8688             CP0_CHECK(ctx->mrp);
8689             gen_helper_mtc0_maar(cpu_env, arg);
8690             register_name = "MAAR";
8691             break;
8692         case CP0_REG17__MAARI:
8693             CP0_CHECK(ctx->mrp);
8694             gen_helper_mtc0_maari(cpu_env, arg);
8695             register_name = "MAARI";
8696             break;
8697         default:
8698             goto cp0_unimplemented;
8699         }
8700         break;
8701     case CP0_REGISTER_18:
8702         switch (sel) {
8703         case CP0_REG18__WATCHLO0:
8704         case CP0_REG18__WATCHLO1:
8705         case CP0_REG18__WATCHLO2:
8706         case CP0_REG18__WATCHLO3:
8707         case CP0_REG18__WATCHLO4:
8708         case CP0_REG18__WATCHLO5:
8709         case CP0_REG18__WATCHLO6:
8710         case CP0_REG18__WATCHLO7:
8711             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
8712             gen_helper_0e1i(mtc0_watchlo, arg, sel);
8713             register_name = "WatchLo";
8714             break;
8715         default:
8716             goto cp0_unimplemented;
8717         }
8718         break;
8719     case CP0_REGISTER_19:
8720         switch (sel) {
8721         case CP0_REG19__WATCHHI0:
8722         case CP0_REG19__WATCHHI1:
8723         case CP0_REG19__WATCHHI2:
8724         case CP0_REG19__WATCHHI3:
8725         case CP0_REG19__WATCHHI4:
8726         case CP0_REG19__WATCHHI5:
8727         case CP0_REG19__WATCHHI6:
8728         case CP0_REG19__WATCHHI7:
8729             CP0_CHECK(ctx->CP0_Config1 & (1 << CP0C1_WR));
8730             gen_helper_0e1i(mtc0_watchhi, arg, sel);
8731             register_name = "WatchHi";
8732             break;
8733         default:
8734             goto cp0_unimplemented;
8735         }
8736         break;
8737     case CP0_REGISTER_20:
8738         switch (sel) {
8739         case CP0_REG20__XCONTEXT:
8740             check_insn(ctx, ISA_MIPS3);
8741             gen_helper_mtc0_xcontext(cpu_env, arg);
8742             register_name = "XContext";
8743             break;
8744         default:
8745             goto cp0_unimplemented;
8746         }
8747         break;
8748     case CP0_REGISTER_21:
8749        /* Officially reserved, but sel 0 is used for R1x000 framemask */
8750         CP0_CHECK(!(ctx->insn_flags & ISA_MIPS_R6));
8751         switch (sel) {
8752         case 0:
8753             gen_helper_mtc0_framemask(cpu_env, arg);
8754             register_name = "Framemask";
8755             break;
8756         default:
8757             goto cp0_unimplemented;
8758         }
8759         break;
8760     case CP0_REGISTER_22:
8761         /* ignored */
8762         register_name = "Diagnostic"; /* implementation dependent */
8763         break;
8764     case CP0_REGISTER_23:
8765         switch (sel) {
8766         case CP0_REG23__DEBUG:
8767             gen_helper_mtc0_debug(cpu_env, arg); /* EJTAG support */
8768             /* DISAS_STOP isn't good enough here, hflags may have changed. */
8769             gen_save_pc(ctx->base.pc_next + 4);
8770             ctx->base.is_jmp = DISAS_EXIT;
8771             register_name = "Debug";
8772             break;
8773         case CP0_REG23__TRACECONTROL:
8774             /* PDtrace support */
8775             /* gen_helper_mtc0_tracecontrol(cpu_env, arg);  */
8776             /* Stop translation as we may have switched the execution mode */
8777             ctx->base.is_jmp = DISAS_STOP;
8778             register_name = "TraceControl";
8779             goto cp0_unimplemented;
8780         case CP0_REG23__TRACECONTROL2:
8781             /* PDtrace support */
8782             /* gen_helper_mtc0_tracecontrol2(cpu_env, arg); */
8783             /* Stop translation as we may have switched the execution mode */
8784             ctx->base.is_jmp = DISAS_STOP;
8785             register_name = "TraceControl2";
8786             goto cp0_unimplemented;
8787         case CP0_REG23__USERTRACEDATA1:
8788             /* PDtrace support */
8789             /* gen_helper_mtc0_usertracedata1(cpu_env, arg);*/
8790             /* Stop translation as we may have switched the execution mode */
8791             ctx->base.is_jmp = DISAS_STOP;
8792             register_name = "UserTraceData1";
8793             goto cp0_unimplemented;
8794         case CP0_REG23__TRACEIBPC:
8795             /* PDtrace support */
8796             /* gen_helper_mtc0_traceibpc(cpu_env, arg);     */
8797             /* Stop translation as we may have switched the execution mode */
8798             ctx->base.is_jmp = DISAS_STOP;
8799             register_name = "TraceIBPC";
8800             goto cp0_unimplemented;
8801         case CP0_REG23__TRACEDBPC:
8802             /* PDtrace support */
8803             /* gen_helper_mtc0_tracedbpc(cpu_env, arg);     */
8804             /* Stop translation as we may have switched the execution mode */
8805             ctx->base.is_jmp = DISAS_STOP;
8806             register_name = "TraceDBPC";
8807             goto cp0_unimplemented;
8808         default:
8809             goto cp0_unimplemented;
8810         }
8811         break;
8812     case CP0_REGISTER_24:
8813         switch (sel) {
8814         case CP0_REG24__DEPC:
8815             /* EJTAG support */
8816             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
8817             register_name = "DEPC";
8818             break;
8819         default:
8820             goto cp0_unimplemented;
8821         }
8822         break;
8823     case CP0_REGISTER_25:
8824         switch (sel) {
8825         case CP0_REG25__PERFCTL0:
8826             gen_helper_mtc0_performance0(cpu_env, arg);
8827             register_name = "Performance0";
8828             break;
8829         case CP0_REG25__PERFCNT0:
8830             /* gen_helper_mtc0_performance1(cpu_env, arg); */
8831             register_name = "Performance1";
8832             goto cp0_unimplemented;
8833         case CP0_REG25__PERFCTL1:
8834             /* gen_helper_mtc0_performance2(cpu_env, arg); */
8835             register_name = "Performance2";
8836             goto cp0_unimplemented;
8837         case CP0_REG25__PERFCNT1:
8838             /* gen_helper_mtc0_performance3(cpu_env, arg); */
8839             register_name = "Performance3";
8840             goto cp0_unimplemented;
8841         case CP0_REG25__PERFCTL2:
8842             /* gen_helper_mtc0_performance4(cpu_env, arg); */
8843             register_name = "Performance4";
8844             goto cp0_unimplemented;
8845         case CP0_REG25__PERFCNT2:
8846             /* gen_helper_mtc0_performance5(cpu_env, arg); */
8847             register_name = "Performance5";
8848             goto cp0_unimplemented;
8849         case CP0_REG25__PERFCTL3:
8850             /* gen_helper_mtc0_performance6(cpu_env, arg); */
8851             register_name = "Performance6";
8852             goto cp0_unimplemented;
8853         case CP0_REG25__PERFCNT3:
8854             /* gen_helper_mtc0_performance7(cpu_env, arg); */
8855             register_name = "Performance7";
8856             goto cp0_unimplemented;
8857         default:
8858             goto cp0_unimplemented;
8859         }
8860         break;
8861     case CP0_REGISTER_26:
8862         switch (sel) {
8863         case CP0_REG26__ERRCTL:
8864             gen_helper_mtc0_errctl(cpu_env, arg);
8865             ctx->base.is_jmp = DISAS_STOP;
8866             register_name = "ErrCtl";
8867             break;
8868         default:
8869             goto cp0_unimplemented;
8870         }
8871         break;
8872     case CP0_REGISTER_27:
8873         switch (sel) {
8874         case CP0_REG27__CACHERR:
8875             /* ignored */
8876             register_name = "CacheErr";
8877             break;
8878         default:
8879             goto cp0_unimplemented;
8880         }
8881         break;
8882     case CP0_REGISTER_28:
8883         switch (sel) {
8884         case CP0_REG28__TAGLO:
8885         case CP0_REG28__TAGLO1:
8886         case CP0_REG28__TAGLO2:
8887         case CP0_REG28__TAGLO3:
8888             gen_helper_mtc0_taglo(cpu_env, arg);
8889             register_name = "TagLo";
8890             break;
8891         case CP0_REG28__DATALO:
8892         case CP0_REG28__DATALO1:
8893         case CP0_REG28__DATALO2:
8894         case CP0_REG28__DATALO3:
8895             gen_helper_mtc0_datalo(cpu_env, arg);
8896             register_name = "DataLo";
8897             break;
8898         default:
8899             goto cp0_unimplemented;
8900         }
8901         break;
8902     case CP0_REGISTER_29:
8903         switch (sel) {
8904         case CP0_REG29__TAGHI:
8905         case CP0_REG29__TAGHI1:
8906         case CP0_REG29__TAGHI2:
8907         case CP0_REG29__TAGHI3:
8908             gen_helper_mtc0_taghi(cpu_env, arg);
8909             register_name = "TagHi";
8910             break;
8911         case CP0_REG29__DATAHI:
8912         case CP0_REG29__DATAHI1:
8913         case CP0_REG29__DATAHI2:
8914         case CP0_REG29__DATAHI3:
8915             gen_helper_mtc0_datahi(cpu_env, arg);
8916             register_name = "DataHi";
8917             break;
8918         default:
8919             register_name = "invalid sel";
8920             goto cp0_unimplemented;
8921         }
8922         break;
8923     case CP0_REGISTER_30:
8924         switch (sel) {
8925         case CP0_REG30__ERROREPC:
8926             tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
8927             register_name = "ErrorEPC";
8928             break;
8929         default:
8930             goto cp0_unimplemented;
8931         }
8932         break;
8933     case CP0_REGISTER_31:
8934         switch (sel) {
8935         case CP0_REG31__DESAVE:
8936             /* EJTAG support */
8937             gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
8938             register_name = "DESAVE";
8939             break;
8940         case CP0_REG31__KSCRATCH1:
8941         case CP0_REG31__KSCRATCH2:
8942         case CP0_REG31__KSCRATCH3:
8943         case CP0_REG31__KSCRATCH4:
8944         case CP0_REG31__KSCRATCH5:
8945         case CP0_REG31__KSCRATCH6:
8946             CP0_CHECK(ctx->kscrexist & (1 << sel));
8947             tcg_gen_st_tl(arg, cpu_env,
8948                           offsetof(CPUMIPSState, CP0_KScratch[sel - 2]));
8949             register_name = "KScratch";
8950             break;
8951         default:
8952             goto cp0_unimplemented;
8953         }
8954         break;
8955     default:
8956         goto cp0_unimplemented;
8957     }
8958     trace_mips_translate_c0("dmtc0", register_name, reg, sel);
8959 
8960     /* For simplicity assume that all writes can cause interrupts.  */
8961     if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
8962         /*
8963          * DISAS_STOP isn't sufficient, we need to ensure we break out of
8964          * translated code to check for pending interrupts.
8965          */
8966         gen_save_pc(ctx->base.pc_next + 4);
8967         ctx->base.is_jmp = DISAS_EXIT;
8968     }
8969     return;
8970 
8971 cp0_unimplemented:
8972     qemu_log_mask(LOG_UNIMP, "dmtc0 %s (reg %d sel %d)\n",
8973                   register_name, reg, sel);
8974 }
8975 #endif /* TARGET_MIPS64 */
8976 
8977 static void gen_mftr(CPUMIPSState *env, DisasContext *ctx, int rt, int rd,
8978                      int u, int sel, int h)
8979 {
8980     int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
8981     TCGv t0 = tcg_temp_local_new();
8982 
8983     if ((env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) == 0 &&
8984         ((env->tcs[other_tc].CP0_TCBind & (0xf << CP0TCBd_CurVPE)) !=
8985          (env->active_tc.CP0_TCBind & (0xf << CP0TCBd_CurVPE)))) {
8986         tcg_gen_movi_tl(t0, -1);
8987     } else if ((env->CP0_VPEControl & (0xff << CP0VPECo_TargTC)) >
8988                (env->mvp->CP0_MVPConf0 & (0xff << CP0MVPC0_PTC))) {
8989         tcg_gen_movi_tl(t0, -1);
8990     } else if (u == 0) {
8991         switch (rt) {
8992         case 1:
8993             switch (sel) {
8994             case 1:
8995                 gen_helper_mftc0_vpecontrol(t0, cpu_env);
8996                 break;
8997             case 2:
8998                 gen_helper_mftc0_vpeconf0(t0, cpu_env);
8999                 break;
9000             default:
9001                 goto die;
9002                 break;
9003             }
9004             break;
9005         case 2:
9006             switch (sel) {
9007             case 1:
9008                 gen_helper_mftc0_tcstatus(t0, cpu_env);
9009                 break;
9010             case 2:
9011                 gen_helper_mftc0_tcbind(t0, cpu_env);
9012                 break;
9013             case 3:
9014                 gen_helper_mftc0_tcrestart(t0, cpu_env);
9015                 break;
9016             case 4:
9017                 gen_helper_mftc0_tchalt(t0, cpu_env);
9018                 break;
9019             case 5:
9020                 gen_helper_mftc0_tccontext(t0, cpu_env);
9021                 break;
9022             case 6:
9023                 gen_helper_mftc0_tcschedule(t0, cpu_env);
9024                 break;
9025             case 7:
9026                 gen_helper_mftc0_tcschefback(t0, cpu_env);
9027                 break;
9028             default:
9029                 gen_mfc0(ctx, t0, rt, sel);
9030                 break;
9031             }
9032             break;
9033         case 10:
9034             switch (sel) {
9035             case 0:
9036                 gen_helper_mftc0_entryhi(t0, cpu_env);
9037                 break;
9038             default:
9039                 gen_mfc0(ctx, t0, rt, sel);
9040                 break;
9041             }
9042             break;
9043         case 12:
9044             switch (sel) {
9045             case 0:
9046                 gen_helper_mftc0_status(t0, cpu_env);
9047                 break;
9048             default:
9049                 gen_mfc0(ctx, t0, rt, sel);
9050                 break;
9051             }
9052             break;
9053         case 13:
9054             switch (sel) {
9055             case 0:
9056                 gen_helper_mftc0_cause(t0, cpu_env);
9057                 break;
9058             default:
9059                 goto die;
9060                 break;
9061             }
9062             break;
9063         case 14:
9064             switch (sel) {
9065             case 0:
9066                 gen_helper_mftc0_epc(t0, cpu_env);
9067                 break;
9068             default:
9069                 goto die;
9070                 break;
9071             }
9072             break;
9073         case 15:
9074             switch (sel) {
9075             case 1:
9076                 gen_helper_mftc0_ebase(t0, cpu_env);
9077                 break;
9078             default:
9079                 goto die;
9080                 break;
9081             }
9082             break;
9083         case 16:
9084             switch (sel) {
9085             case 0:
9086             case 1:
9087             case 2:
9088             case 3:
9089             case 4:
9090             case 5:
9091             case 6:
9092             case 7:
9093                 gen_helper_mftc0_configx(t0, cpu_env, tcg_const_tl(sel));
9094                 break;
9095             default:
9096                 goto die;
9097                 break;
9098             }
9099             break;
9100         case 23:
9101             switch (sel) {
9102             case 0:
9103                 gen_helper_mftc0_debug(t0, cpu_env);
9104                 break;
9105             default:
9106                 gen_mfc0(ctx, t0, rt, sel);
9107                 break;
9108             }
9109             break;
9110         default:
9111             gen_mfc0(ctx, t0, rt, sel);
9112         }
9113     } else {
9114         switch (sel) {
9115         /* GPR registers. */
9116         case 0:
9117             gen_helper_1e0i(mftgpr, t0, rt);
9118             break;
9119         /* Auxiliary CPU registers */
9120         case 1:
9121             switch (rt) {
9122             case 0:
9123                 gen_helper_1e0i(mftlo, t0, 0);
9124                 break;
9125             case 1:
9126                 gen_helper_1e0i(mfthi, t0, 0);
9127                 break;
9128             case 2:
9129                 gen_helper_1e0i(mftacx, t0, 0);
9130                 break;
9131             case 4:
9132                 gen_helper_1e0i(mftlo, t0, 1);
9133                 break;
9134             case 5:
9135                 gen_helper_1e0i(mfthi, t0, 1);
9136                 break;
9137             case 6:
9138                 gen_helper_1e0i(mftacx, t0, 1);
9139                 break;
9140             case 8:
9141                 gen_helper_1e0i(mftlo, t0, 2);
9142                 break;
9143             case 9:
9144                 gen_helper_1e0i(mfthi, t0, 2);
9145                 break;
9146             case 10:
9147                 gen_helper_1e0i(mftacx, t0, 2);
9148                 break;
9149             case 12:
9150                 gen_helper_1e0i(mftlo, t0, 3);
9151                 break;
9152             case 13:
9153                 gen_helper_1e0i(mfthi, t0, 3);
9154                 break;
9155             case 14:
9156                 gen_helper_1e0i(mftacx, t0, 3);
9157                 break;
9158             case 16:
9159                 gen_helper_mftdsp(t0, cpu_env);
9160                 break;
9161             default:
9162                 goto die;
9163             }
9164             break;
9165         /* Floating point (COP1). */
9166         case 2:
9167             /* XXX: For now we support only a single FPU context. */
9168             if (h == 0) {
9169                 TCGv_i32 fp0 = tcg_temp_new_i32();
9170 
9171                 gen_load_fpr32(ctx, fp0, rt);
9172                 tcg_gen_ext_i32_tl(t0, fp0);
9173                 tcg_temp_free_i32(fp0);
9174             } else {
9175                 TCGv_i32 fp0 = tcg_temp_new_i32();
9176 
9177                 gen_load_fpr32h(ctx, fp0, rt);
9178                 tcg_gen_ext_i32_tl(t0, fp0);
9179                 tcg_temp_free_i32(fp0);
9180             }
9181             break;
9182         case 3:
9183             /* XXX: For now we support only a single FPU context. */
9184             gen_helper_1e0i(cfc1, t0, rt);
9185             break;
9186         /* COP2: Not implemented. */
9187         case 4:
9188         case 5:
9189             /* fall through */
9190         default:
9191             goto die;
9192         }
9193     }
9194     trace_mips_translate_tr("mftr", rt, u, sel, h);
9195     gen_store_gpr(t0, rd);
9196     tcg_temp_free(t0);
9197     return;
9198 
9199 die:
9200     tcg_temp_free(t0);
9201     LOG_DISAS("mftr (reg %d u %d sel %d h %d)\n", rt, u, sel, h);
9202     gen_reserved_instruction(ctx);
9203 }
9204 
9205 static void gen_mttr(CPUMIPSState *env, DisasContext *ctx, int rd, int rt,
9206                      int u, int sel, int h)
9207 {
9208     int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
9209     TCGv t0 = tcg_temp_local_new();
9210 
9211     gen_load_gpr(t0, rt);
9212     if ((env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) == 0 &&
9213         ((env->tcs[other_tc].CP0_TCBind & (0xf << CP0TCBd_CurVPE)) !=
9214          (env->active_tc.CP0_TCBind & (0xf << CP0TCBd_CurVPE)))) {
9215         /* NOP */
9216         ;
9217     } else if ((env->CP0_VPEControl & (0xff << CP0VPECo_TargTC)) >
9218              (env->mvp->CP0_MVPConf0 & (0xff << CP0MVPC0_PTC))) {
9219         /* NOP */
9220         ;
9221     } else if (u == 0) {
9222         switch (rd) {
9223         case 1:
9224             switch (sel) {
9225             case 1:
9226                 gen_helper_mttc0_vpecontrol(cpu_env, t0);
9227                 break;
9228             case 2:
9229                 gen_helper_mttc0_vpeconf0(cpu_env, t0);
9230                 break;
9231             default:
9232                 goto die;
9233                 break;
9234             }
9235             break;
9236         case 2:
9237             switch (sel) {
9238             case 1:
9239                 gen_helper_mttc0_tcstatus(cpu_env, t0);
9240                 break;
9241             case 2:
9242                 gen_helper_mttc0_tcbind(cpu_env, t0);
9243                 break;
9244             case 3:
9245                 gen_helper_mttc0_tcrestart(cpu_env, t0);
9246                 break;
9247             case 4:
9248                 gen_helper_mttc0_tchalt(cpu_env, t0);
9249                 break;
9250             case 5:
9251                 gen_helper_mttc0_tccontext(cpu_env, t0);
9252                 break;
9253             case 6:
9254                 gen_helper_mttc0_tcschedule(cpu_env, t0);
9255                 break;
9256             case 7:
9257                 gen_helper_mttc0_tcschefback(cpu_env, t0);
9258                 break;
9259             default:
9260                 gen_mtc0(ctx, t0, rd, sel);
9261                 break;
9262             }
9263             break;
9264         case 10:
9265             switch (sel) {
9266             case 0:
9267                 gen_helper_mttc0_entryhi(cpu_env, t0);
9268                 break;
9269             default:
9270                 gen_mtc0(ctx, t0, rd, sel);
9271                 break;
9272             }
9273             break;
9274         case 12:
9275             switch (sel) {
9276             case 0:
9277                 gen_helper_mttc0_status(cpu_env, t0);
9278                 break;
9279             default:
9280                 gen_mtc0(ctx, t0, rd, sel);
9281                 break;
9282             }
9283             break;
9284         case 13:
9285             switch (sel) {
9286             case 0:
9287                 gen_helper_mttc0_cause(cpu_env, t0);
9288                 break;
9289             default:
9290                 goto die;
9291                 break;
9292             }
9293             break;
9294         case 15:
9295             switch (sel) {
9296             case 1:
9297                 gen_helper_mttc0_ebase(cpu_env, t0);
9298                 break;
9299             default:
9300                 goto die;
9301                 break;
9302             }
9303             break;
9304         case 23:
9305             switch (sel) {
9306             case 0:
9307                 gen_helper_mttc0_debug(cpu_env, t0);
9308                 break;
9309             default:
9310                 gen_mtc0(ctx, t0, rd, sel);
9311                 break;
9312             }
9313             break;
9314         default:
9315             gen_mtc0(ctx, t0, rd, sel);
9316         }
9317     } else {
9318         switch (sel) {
9319         /* GPR registers. */
9320         case 0:
9321             gen_helper_0e1i(mttgpr, t0, rd);
9322             break;
9323         /* Auxiliary CPU registers */
9324         case 1:
9325             switch (rd) {
9326             case 0:
9327                 gen_helper_0e1i(mttlo, t0, 0);
9328                 break;
9329             case 1:
9330                 gen_helper_0e1i(mtthi, t0, 0);
9331                 break;
9332             case 2:
9333                 gen_helper_0e1i(mttacx, t0, 0);
9334                 break;
9335             case 4:
9336                 gen_helper_0e1i(mttlo, t0, 1);
9337                 break;
9338             case 5:
9339                 gen_helper_0e1i(mtthi, t0, 1);
9340                 break;
9341             case 6:
9342                 gen_helper_0e1i(mttacx, t0, 1);
9343                 break;
9344             case 8:
9345                 gen_helper_0e1i(mttlo, t0, 2);
9346                 break;
9347             case 9:
9348                 gen_helper_0e1i(mtthi, t0, 2);
9349                 break;
9350             case 10:
9351                 gen_helper_0e1i(mttacx, t0, 2);
9352                 break;
9353             case 12:
9354                 gen_helper_0e1i(mttlo, t0, 3);
9355                 break;
9356             case 13:
9357                 gen_helper_0e1i(mtthi, t0, 3);
9358                 break;
9359             case 14:
9360                 gen_helper_0e1i(mttacx, t0, 3);
9361                 break;
9362             case 16:
9363                 gen_helper_mttdsp(cpu_env, t0);
9364                 break;
9365             default:
9366                 goto die;
9367             }
9368             break;
9369         /* Floating point (COP1). */
9370         case 2:
9371             /* XXX: For now we support only a single FPU context. */
9372             if (h == 0) {
9373                 TCGv_i32 fp0 = tcg_temp_new_i32();
9374 
9375                 tcg_gen_trunc_tl_i32(fp0, t0);
9376                 gen_store_fpr32(ctx, fp0, rd);
9377                 tcg_temp_free_i32(fp0);
9378             } else {
9379                 TCGv_i32 fp0 = tcg_temp_new_i32();
9380 
9381                 tcg_gen_trunc_tl_i32(fp0, t0);
9382                 gen_store_fpr32h(ctx, fp0, rd);
9383                 tcg_temp_free_i32(fp0);
9384             }
9385             break;
9386         case 3:
9387             /* XXX: For now we support only a single FPU context. */
9388             {
9389                 TCGv_i32 fs_tmp = tcg_const_i32(rd);
9390 
9391                 gen_helper_0e2i(ctc1, t0, fs_tmp, rt);
9392                 tcg_temp_free_i32(fs_tmp);
9393             }
9394             /* Stop translation as we may have changed hflags */
9395             ctx->base.is_jmp = DISAS_STOP;
9396             break;
9397         /* COP2: Not implemented. */
9398         case 4:
9399         case 5:
9400             /* fall through */
9401         default:
9402             goto die;
9403         }
9404     }
9405     trace_mips_translate_tr("mttr", rd, u, sel, h);
9406     tcg_temp_free(t0);
9407     return;
9408 
9409 die:
9410     tcg_temp_free(t0);
9411     LOG_DISAS("mttr (reg %d u %d sel %d h %d)\n", rd, u, sel, h);
9412     gen_reserved_instruction(ctx);
9413 }
9414 
9415 static void gen_cp0(CPUMIPSState *env, DisasContext *ctx, uint32_t opc,
9416                     int rt, int rd)
9417 {
9418     const char *opn = "ldst";
9419 
9420     check_cp0_enabled(ctx);
9421     switch (opc) {
9422     case OPC_MFC0:
9423         if (rt == 0) {
9424             /* Treat as NOP. */
9425             return;
9426         }
9427         gen_mfc0(ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
9428         opn = "mfc0";
9429         break;
9430     case OPC_MTC0:
9431         {
9432             TCGv t0 = tcg_temp_new();
9433 
9434             gen_load_gpr(t0, rt);
9435             gen_mtc0(ctx, t0, rd, ctx->opcode & 0x7);
9436             tcg_temp_free(t0);
9437         }
9438         opn = "mtc0";
9439         break;
9440 #if defined(TARGET_MIPS64)
9441     case OPC_DMFC0:
9442         check_insn(ctx, ISA_MIPS3);
9443         if (rt == 0) {
9444             /* Treat as NOP. */
9445             return;
9446         }
9447         gen_dmfc0(ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
9448         opn = "dmfc0";
9449         break;
9450     case OPC_DMTC0:
9451         check_insn(ctx, ISA_MIPS3);
9452         {
9453             TCGv t0 = tcg_temp_new();
9454 
9455             gen_load_gpr(t0, rt);
9456             gen_dmtc0(ctx, t0, rd, ctx->opcode & 0x7);
9457             tcg_temp_free(t0);
9458         }
9459         opn = "dmtc0";
9460         break;
9461 #endif
9462     case OPC_MFHC0:
9463         check_mvh(ctx);
9464         if (rt == 0) {
9465             /* Treat as NOP. */
9466             return;
9467         }
9468         gen_mfhc0(ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
9469         opn = "mfhc0";
9470         break;
9471     case OPC_MTHC0:
9472         check_mvh(ctx);
9473         {
9474             TCGv t0 = tcg_temp_new();
9475             gen_load_gpr(t0, rt);
9476             gen_mthc0(ctx, t0, rd, ctx->opcode & 0x7);
9477             tcg_temp_free(t0);
9478         }
9479         opn = "mthc0";
9480         break;
9481     case OPC_MFTR:
9482         check_cp0_enabled(ctx);
9483         if (rd == 0) {
9484             /* Treat as NOP. */
9485             return;
9486         }
9487         gen_mftr(env, ctx, rt, rd, (ctx->opcode >> 5) & 1,
9488                  ctx->opcode & 0x7, (ctx->opcode >> 4) & 1);
9489         opn = "mftr";
9490         break;
9491     case OPC_MTTR:
9492         check_cp0_enabled(ctx);
9493         gen_mttr(env, ctx, rd, rt, (ctx->opcode >> 5) & 1,
9494                  ctx->opcode & 0x7, (ctx->opcode >> 4) & 1);
9495         opn = "mttr";
9496         break;
9497     case OPC_TLBWI:
9498         opn = "tlbwi";
9499         if (!env->tlb->helper_tlbwi) {
9500             goto die;
9501         }
9502         gen_helper_tlbwi(cpu_env);
9503         break;
9504     case OPC_TLBINV:
9505         opn = "tlbinv";
9506         if (ctx->ie >= 2) {
9507             if (!env->tlb->helper_tlbinv) {
9508                 goto die;
9509             }
9510             gen_helper_tlbinv(cpu_env);
9511         } /* treat as nop if TLBINV not supported */
9512         break;
9513     case OPC_TLBINVF:
9514         opn = "tlbinvf";
9515         if (ctx->ie >= 2) {
9516             if (!env->tlb->helper_tlbinvf) {
9517                 goto die;
9518             }
9519             gen_helper_tlbinvf(cpu_env);
9520         } /* treat as nop if TLBINV not supported */
9521         break;
9522     case OPC_TLBWR:
9523         opn = "tlbwr";
9524         if (!env->tlb->helper_tlbwr) {
9525             goto die;
9526         }
9527         gen_helper_tlbwr(cpu_env);
9528         break;
9529     case OPC_TLBP:
9530         opn = "tlbp";
9531         if (!env->tlb->helper_tlbp) {
9532             goto die;
9533         }
9534         gen_helper_tlbp(cpu_env);
9535         break;
9536     case OPC_TLBR:
9537         opn = "tlbr";
9538         if (!env->tlb->helper_tlbr) {
9539             goto die;
9540         }
9541         gen_helper_tlbr(cpu_env);
9542         break;
9543     case OPC_ERET: /* OPC_ERETNC */
9544         if ((ctx->insn_flags & ISA_MIPS_R6) &&
9545             (ctx->hflags & MIPS_HFLAG_BMASK)) {
9546             goto die;
9547         } else {
9548             int bit_shift = (ctx->hflags & MIPS_HFLAG_M16) ? 16 : 6;
9549             if (ctx->opcode & (1 << bit_shift)) {
9550                 /* OPC_ERETNC */
9551                 opn = "eretnc";
9552                 check_insn(ctx, ISA_MIPS_R5);
9553                 gen_helper_eretnc(cpu_env);
9554             } else {
9555                 /* OPC_ERET */
9556                 opn = "eret";
9557                 check_insn(ctx, ISA_MIPS2);
9558                 gen_helper_eret(cpu_env);
9559             }
9560             ctx->base.is_jmp = DISAS_EXIT;
9561         }
9562         break;
9563     case OPC_DERET:
9564         opn = "deret";
9565         check_insn(ctx, ISA_MIPS_R1);
9566         if ((ctx->insn_flags & ISA_MIPS_R6) &&
9567             (ctx->hflags & MIPS_HFLAG_BMASK)) {
9568             goto die;
9569         }
9570         if (!(ctx->hflags & MIPS_HFLAG_DM)) {
9571             MIPS_INVAL(opn);
9572             gen_reserved_instruction(ctx);
9573         } else {
9574             gen_helper_deret(cpu_env);
9575             ctx->base.is_jmp = DISAS_EXIT;
9576         }
9577         break;
9578     case OPC_WAIT:
9579         opn = "wait";
9580         check_insn(ctx, ISA_MIPS3 | ISA_MIPS_R1);
9581         if ((ctx->insn_flags & ISA_MIPS_R6) &&
9582             (ctx->hflags & MIPS_HFLAG_BMASK)) {
9583             goto die;
9584         }
9585         /* If we get an exception, we want to restart at next instruction */
9586         ctx->base.pc_next += 4;
9587         save_cpu_state(ctx, 1);
9588         ctx->base.pc_next -= 4;
9589         gen_helper_wait(cpu_env);
9590         ctx->base.is_jmp = DISAS_NORETURN;
9591         break;
9592     default:
9593  die:
9594         MIPS_INVAL(opn);
9595         gen_reserved_instruction(ctx);
9596         return;
9597     }
9598     (void)opn; /* avoid a compiler warning */
9599 }
9600 #endif /* !CONFIG_USER_ONLY */
9601 
9602 /* CP1 Branches (before delay slot) */
9603 static void gen_compute_branch1(DisasContext *ctx, uint32_t op,
9604                                 int32_t cc, int32_t offset)
9605 {
9606     target_ulong btarget;
9607     TCGv_i32 t0 = tcg_temp_new_i32();
9608 
9609     if ((ctx->insn_flags & ISA_MIPS_R6) && (ctx->hflags & MIPS_HFLAG_BMASK)) {
9610         gen_reserved_instruction(ctx);
9611         goto out;
9612     }
9613 
9614     if (cc != 0) {
9615         check_insn(ctx, ISA_MIPS4 | ISA_MIPS_R1);
9616     }
9617 
9618     btarget = ctx->base.pc_next + 4 + offset;
9619 
9620     switch (op) {
9621     case OPC_BC1F:
9622         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
9623         tcg_gen_not_i32(t0, t0);
9624         tcg_gen_andi_i32(t0, t0, 1);
9625         tcg_gen_extu_i32_tl(bcond, t0);
9626         goto not_likely;
9627     case OPC_BC1FL:
9628         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
9629         tcg_gen_not_i32(t0, t0);
9630         tcg_gen_andi_i32(t0, t0, 1);
9631         tcg_gen_extu_i32_tl(bcond, t0);
9632         goto likely;
9633     case OPC_BC1T:
9634         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
9635         tcg_gen_andi_i32(t0, t0, 1);
9636         tcg_gen_extu_i32_tl(bcond, t0);
9637         goto not_likely;
9638     case OPC_BC1TL:
9639         tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
9640         tcg_gen_andi_i32(t0, t0, 1);
9641         tcg_gen_extu_i32_tl(bcond, t0);
9642     likely:
9643         ctx->hflags |= MIPS_HFLAG_BL;
9644         break;
9645     case OPC_BC1FANY2:
9646         {
9647             TCGv_i32 t1 = tcg_temp_new_i32();
9648             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
9649             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc + 1));
9650             tcg_gen_nand_i32(t0, t0, t1);
9651             tcg_temp_free_i32(t1);
9652             tcg_gen_andi_i32(t0, t0, 1);
9653             tcg_gen_extu_i32_tl(bcond, t0);
9654         }
9655         goto not_likely;
9656     case OPC_BC1TANY2:
9657         {
9658             TCGv_i32 t1 = tcg_temp_new_i32();
9659             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
9660             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc + 1));
9661             tcg_gen_or_i32(t0, t0, t1);
9662             tcg_temp_free_i32(t1);
9663             tcg_gen_andi_i32(t0, t0, 1);
9664             tcg_gen_extu_i32_tl(bcond, t0);
9665         }
9666         goto not_likely;
9667     case OPC_BC1FANY4:
9668         {
9669             TCGv_i32 t1 = tcg_temp_new_i32();
9670             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
9671             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc + 1));
9672             tcg_gen_and_i32(t0, t0, t1);
9673             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc + 2));
9674             tcg_gen_and_i32(t0, t0, t1);
9675             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc + 3));
9676             tcg_gen_nand_i32(t0, t0, t1);
9677             tcg_temp_free_i32(t1);
9678             tcg_gen_andi_i32(t0, t0, 1);
9679             tcg_gen_extu_i32_tl(bcond, t0);
9680         }
9681         goto not_likely;
9682     case OPC_BC1TANY4:
9683         {
9684             TCGv_i32 t1 = tcg_temp_new_i32();
9685             tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
9686             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc + 1));
9687             tcg_gen_or_i32(t0, t0, t1);
9688             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc + 2));
9689             tcg_gen_or_i32(t0, t0, t1);
9690             tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc + 3));
9691             tcg_gen_or_i32(t0, t0, t1);
9692             tcg_temp_free_i32(t1);
9693             tcg_gen_andi_i32(t0, t0, 1);
9694             tcg_gen_extu_i32_tl(bcond, t0);
9695         }
9696     not_likely:
9697         ctx->hflags |= MIPS_HFLAG_BC;
9698         break;
9699     default:
9700         MIPS_INVAL("cp1 cond branch");
9701         gen_reserved_instruction(ctx);
9702         goto out;
9703     }
9704     ctx->btarget = btarget;
9705     ctx->hflags |= MIPS_HFLAG_BDS32;
9706  out:
9707     tcg_temp_free_i32(t0);
9708 }
9709 
9710 /* R6 CP1 Branches */
9711 static void gen_compute_branch1_r6(DisasContext *ctx, uint32_t op,
9712                                    int32_t ft, int32_t offset,
9713                                    int delayslot_size)
9714 {
9715     target_ulong btarget;
9716     TCGv_i64 t0 = tcg_temp_new_i64();
9717 
9718     if (ctx->hflags & MIPS_HFLAG_BMASK) {
9719 #ifdef MIPS_DEBUG_DISAS
9720         LOG_DISAS("Branch in delay / forbidden slot at PC 0x" TARGET_FMT_lx
9721                   "\n", ctx->base.pc_next);
9722 #endif
9723         gen_reserved_instruction(ctx);
9724         goto out;
9725     }
9726 
9727     gen_load_fpr64(ctx, t0, ft);
9728     tcg_gen_andi_i64(t0, t0, 1);
9729 
9730     btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
9731 
9732     switch (op) {
9733     case OPC_BC1EQZ:
9734         tcg_gen_xori_i64(t0, t0, 1);
9735         ctx->hflags |= MIPS_HFLAG_BC;
9736         break;
9737     case OPC_BC1NEZ:
9738         /* t0 already set */
9739         ctx->hflags |= MIPS_HFLAG_BC;
9740         break;
9741     default:
9742         MIPS_INVAL("cp1 cond branch");
9743         gen_reserved_instruction(ctx);
9744         goto out;
9745     }
9746 
9747     tcg_gen_trunc_i64_tl(bcond, t0);
9748 
9749     ctx->btarget = btarget;
9750 
9751     switch (delayslot_size) {
9752     case 2:
9753         ctx->hflags |= MIPS_HFLAG_BDS16;
9754         break;
9755     case 4:
9756         ctx->hflags |= MIPS_HFLAG_BDS32;
9757         break;
9758     }
9759 
9760 out:
9761     tcg_temp_free_i64(t0);
9762 }
9763 
9764 /* Coprocessor 1 (FPU) */
9765 
9766 #define FOP(func, fmt) (((fmt) << 21) | (func))
9767 
9768 enum fopcode {
9769     OPC_ADD_S = FOP(0, FMT_S),
9770     OPC_SUB_S = FOP(1, FMT_S),
9771     OPC_MUL_S = FOP(2, FMT_S),
9772     OPC_DIV_S = FOP(3, FMT_S),
9773     OPC_SQRT_S = FOP(4, FMT_S),
9774     OPC_ABS_S = FOP(5, FMT_S),
9775     OPC_MOV_S = FOP(6, FMT_S),
9776     OPC_NEG_S = FOP(7, FMT_S),
9777     OPC_ROUND_L_S = FOP(8, FMT_S),
9778     OPC_TRUNC_L_S = FOP(9, FMT_S),
9779     OPC_CEIL_L_S = FOP(10, FMT_S),
9780     OPC_FLOOR_L_S = FOP(11, FMT_S),
9781     OPC_ROUND_W_S = FOP(12, FMT_S),
9782     OPC_TRUNC_W_S = FOP(13, FMT_S),
9783     OPC_CEIL_W_S = FOP(14, FMT_S),
9784     OPC_FLOOR_W_S = FOP(15, FMT_S),
9785     OPC_SEL_S = FOP(16, FMT_S),
9786     OPC_MOVCF_S = FOP(17, FMT_S),
9787     OPC_MOVZ_S = FOP(18, FMT_S),
9788     OPC_MOVN_S = FOP(19, FMT_S),
9789     OPC_SELEQZ_S = FOP(20, FMT_S),
9790     OPC_RECIP_S = FOP(21, FMT_S),
9791     OPC_RSQRT_S = FOP(22, FMT_S),
9792     OPC_SELNEZ_S = FOP(23, FMT_S),
9793     OPC_MADDF_S = FOP(24, FMT_S),
9794     OPC_MSUBF_S = FOP(25, FMT_S),
9795     OPC_RINT_S = FOP(26, FMT_S),
9796     OPC_CLASS_S = FOP(27, FMT_S),
9797     OPC_MIN_S = FOP(28, FMT_S),
9798     OPC_RECIP2_S = FOP(28, FMT_S),
9799     OPC_MINA_S = FOP(29, FMT_S),
9800     OPC_RECIP1_S = FOP(29, FMT_S),
9801     OPC_MAX_S = FOP(30, FMT_S),
9802     OPC_RSQRT1_S = FOP(30, FMT_S),
9803     OPC_MAXA_S = FOP(31, FMT_S),
9804     OPC_RSQRT2_S = FOP(31, FMT_S),
9805     OPC_CVT_D_S = FOP(33, FMT_S),
9806     OPC_CVT_W_S = FOP(36, FMT_S),
9807     OPC_CVT_L_S = FOP(37, FMT_S),
9808     OPC_CVT_PS_S = FOP(38, FMT_S),
9809     OPC_CMP_F_S = FOP(48, FMT_S),
9810     OPC_CMP_UN_S = FOP(49, FMT_S),
9811     OPC_CMP_EQ_S = FOP(50, FMT_S),
9812     OPC_CMP_UEQ_S = FOP(51, FMT_S),
9813     OPC_CMP_OLT_S = FOP(52, FMT_S),
9814     OPC_CMP_ULT_S = FOP(53, FMT_S),
9815     OPC_CMP_OLE_S = FOP(54, FMT_S),
9816     OPC_CMP_ULE_S = FOP(55, FMT_S),
9817     OPC_CMP_SF_S = FOP(56, FMT_S),
9818     OPC_CMP_NGLE_S = FOP(57, FMT_S),
9819     OPC_CMP_SEQ_S = FOP(58, FMT_S),
9820     OPC_CMP_NGL_S = FOP(59, FMT_S),
9821     OPC_CMP_LT_S = FOP(60, FMT_S),
9822     OPC_CMP_NGE_S = FOP(61, FMT_S),
9823     OPC_CMP_LE_S = FOP(62, FMT_S),
9824     OPC_CMP_NGT_S = FOP(63, FMT_S),
9825 
9826     OPC_ADD_D = FOP(0, FMT_D),
9827     OPC_SUB_D = FOP(1, FMT_D),
9828     OPC_MUL_D = FOP(2, FMT_D),
9829     OPC_DIV_D = FOP(3, FMT_D),
9830     OPC_SQRT_D = FOP(4, FMT_D),
9831     OPC_ABS_D = FOP(5, FMT_D),
9832     OPC_MOV_D = FOP(6, FMT_D),
9833     OPC_NEG_D = FOP(7, FMT_D),
9834     OPC_ROUND_L_D = FOP(8, FMT_D),
9835     OPC_TRUNC_L_D = FOP(9, FMT_D),
9836     OPC_CEIL_L_D = FOP(10, FMT_D),
9837     OPC_FLOOR_L_D = FOP(11, FMT_D),
9838     OPC_ROUND_W_D = FOP(12, FMT_D),
9839     OPC_TRUNC_W_D = FOP(13, FMT_D),
9840     OPC_CEIL_W_D = FOP(14, FMT_D),
9841     OPC_FLOOR_W_D = FOP(15, FMT_D),
9842     OPC_SEL_D = FOP(16, FMT_D),
9843     OPC_MOVCF_D = FOP(17, FMT_D),
9844     OPC_MOVZ_D = FOP(18, FMT_D),
9845     OPC_MOVN_D = FOP(19, FMT_D),
9846     OPC_SELEQZ_D = FOP(20, FMT_D),
9847     OPC_RECIP_D = FOP(21, FMT_D),
9848     OPC_RSQRT_D = FOP(22, FMT_D),
9849     OPC_SELNEZ_D = FOP(23, FMT_D),
9850     OPC_MADDF_D = FOP(24, FMT_D),
9851     OPC_MSUBF_D = FOP(25, FMT_D),
9852     OPC_RINT_D = FOP(26, FMT_D),
9853     OPC_CLASS_D = FOP(27, FMT_D),
9854     OPC_MIN_D = FOP(28, FMT_D),
9855     OPC_RECIP2_D = FOP(28, FMT_D),
9856     OPC_MINA_D = FOP(29, FMT_D),
9857     OPC_RECIP1_D = FOP(29, FMT_D),
9858     OPC_MAX_D = FOP(30, FMT_D),
9859     OPC_RSQRT1_D = FOP(30, FMT_D),
9860     OPC_MAXA_D = FOP(31, FMT_D),
9861     OPC_RSQRT2_D = FOP(31, FMT_D),
9862     OPC_CVT_S_D = FOP(32, FMT_D),
9863     OPC_CVT_W_D = FOP(36, FMT_D),
9864     OPC_CVT_L_D = FOP(37, FMT_D),
9865     OPC_CMP_F_D = FOP(48, FMT_D),
9866     OPC_CMP_UN_D = FOP(49, FMT_D),
9867     OPC_CMP_EQ_D = FOP(50, FMT_D),
9868     OPC_CMP_UEQ_D = FOP(51, FMT_D),
9869     OPC_CMP_OLT_D = FOP(52, FMT_D),
9870     OPC_CMP_ULT_D = FOP(53, FMT_D),
9871     OPC_CMP_OLE_D = FOP(54, FMT_D),
9872     OPC_CMP_ULE_D = FOP(55, FMT_D),
9873     OPC_CMP_SF_D = FOP(56, FMT_D),
9874     OPC_CMP_NGLE_D = FOP(57, FMT_D),
9875     OPC_CMP_SEQ_D = FOP(58, FMT_D),
9876     OPC_CMP_NGL_D = FOP(59, FMT_D),
9877     OPC_CMP_LT_D = FOP(60, FMT_D),
9878     OPC_CMP_NGE_D = FOP(61, FMT_D),
9879     OPC_CMP_LE_D = FOP(62, FMT_D),
9880     OPC_CMP_NGT_D = FOP(63, FMT_D),
9881 
9882     OPC_CVT_S_W = FOP(32, FMT_W),
9883     OPC_CVT_D_W = FOP(33, FMT_W),
9884     OPC_CVT_S_L = FOP(32, FMT_L),
9885     OPC_CVT_D_L = FOP(33, FMT_L),
9886     OPC_CVT_PS_PW = FOP(38, FMT_W),
9887 
9888     OPC_ADD_PS = FOP(0, FMT_PS),
9889     OPC_SUB_PS = FOP(1, FMT_PS),
9890     OPC_MUL_PS = FOP(2, FMT_PS),
9891     OPC_DIV_PS = FOP(3, FMT_PS),
9892     OPC_ABS_PS = FOP(5, FMT_PS),
9893     OPC_MOV_PS = FOP(6, FMT_PS),
9894     OPC_NEG_PS = FOP(7, FMT_PS),
9895     OPC_MOVCF_PS = FOP(17, FMT_PS),
9896     OPC_MOVZ_PS = FOP(18, FMT_PS),
9897     OPC_MOVN_PS = FOP(19, FMT_PS),
9898     OPC_ADDR_PS = FOP(24, FMT_PS),
9899     OPC_MULR_PS = FOP(26, FMT_PS),
9900     OPC_RECIP2_PS = FOP(28, FMT_PS),
9901     OPC_RECIP1_PS = FOP(29, FMT_PS),
9902     OPC_RSQRT1_PS = FOP(30, FMT_PS),
9903     OPC_RSQRT2_PS = FOP(31, FMT_PS),
9904 
9905     OPC_CVT_S_PU = FOP(32, FMT_PS),
9906     OPC_CVT_PW_PS = FOP(36, FMT_PS),
9907     OPC_CVT_S_PL = FOP(40, FMT_PS),
9908     OPC_PLL_PS = FOP(44, FMT_PS),
9909     OPC_PLU_PS = FOP(45, FMT_PS),
9910     OPC_PUL_PS = FOP(46, FMT_PS),
9911     OPC_PUU_PS = FOP(47, FMT_PS),
9912     OPC_CMP_F_PS = FOP(48, FMT_PS),
9913     OPC_CMP_UN_PS = FOP(49, FMT_PS),
9914     OPC_CMP_EQ_PS = FOP(50, FMT_PS),
9915     OPC_CMP_UEQ_PS = FOP(51, FMT_PS),
9916     OPC_CMP_OLT_PS = FOP(52, FMT_PS),
9917     OPC_CMP_ULT_PS = FOP(53, FMT_PS),
9918     OPC_CMP_OLE_PS = FOP(54, FMT_PS),
9919     OPC_CMP_ULE_PS = FOP(55, FMT_PS),
9920     OPC_CMP_SF_PS = FOP(56, FMT_PS),
9921     OPC_CMP_NGLE_PS = FOP(57, FMT_PS),
9922     OPC_CMP_SEQ_PS = FOP(58, FMT_PS),
9923     OPC_CMP_NGL_PS = FOP(59, FMT_PS),
9924     OPC_CMP_LT_PS = FOP(60, FMT_PS),
9925     OPC_CMP_NGE_PS = FOP(61, FMT_PS),
9926     OPC_CMP_LE_PS = FOP(62, FMT_PS),
9927     OPC_CMP_NGT_PS = FOP(63, FMT_PS),
9928 };
9929 
9930 enum r6_f_cmp_op {
9931     R6_OPC_CMP_AF_S   = FOP(0, FMT_W),
9932     R6_OPC_CMP_UN_S   = FOP(1, FMT_W),
9933     R6_OPC_CMP_EQ_S   = FOP(2, FMT_W),
9934     R6_OPC_CMP_UEQ_S  = FOP(3, FMT_W),
9935     R6_OPC_CMP_LT_S   = FOP(4, FMT_W),
9936     R6_OPC_CMP_ULT_S  = FOP(5, FMT_W),
9937     R6_OPC_CMP_LE_S   = FOP(6, FMT_W),
9938     R6_OPC_CMP_ULE_S  = FOP(7, FMT_W),
9939     R6_OPC_CMP_SAF_S  = FOP(8, FMT_W),
9940     R6_OPC_CMP_SUN_S  = FOP(9, FMT_W),
9941     R6_OPC_CMP_SEQ_S  = FOP(10, FMT_W),
9942     R6_OPC_CMP_SEUQ_S = FOP(11, FMT_W),
9943     R6_OPC_CMP_SLT_S  = FOP(12, FMT_W),
9944     R6_OPC_CMP_SULT_S = FOP(13, FMT_W),
9945     R6_OPC_CMP_SLE_S  = FOP(14, FMT_W),
9946     R6_OPC_CMP_SULE_S = FOP(15, FMT_W),
9947     R6_OPC_CMP_OR_S   = FOP(17, FMT_W),
9948     R6_OPC_CMP_UNE_S  = FOP(18, FMT_W),
9949     R6_OPC_CMP_NE_S   = FOP(19, FMT_W),
9950     R6_OPC_CMP_SOR_S  = FOP(25, FMT_W),
9951     R6_OPC_CMP_SUNE_S = FOP(26, FMT_W),
9952     R6_OPC_CMP_SNE_S  = FOP(27, FMT_W),
9953 
9954     R6_OPC_CMP_AF_D   = FOP(0, FMT_L),
9955     R6_OPC_CMP_UN_D   = FOP(1, FMT_L),
9956     R6_OPC_CMP_EQ_D   = FOP(2, FMT_L),
9957     R6_OPC_CMP_UEQ_D  = FOP(3, FMT_L),
9958     R6_OPC_CMP_LT_D   = FOP(4, FMT_L),
9959     R6_OPC_CMP_ULT_D  = FOP(5, FMT_L),
9960     R6_OPC_CMP_LE_D   = FOP(6, FMT_L),
9961     R6_OPC_CMP_ULE_D  = FOP(7, FMT_L),
9962     R6_OPC_CMP_SAF_D  = FOP(8, FMT_L),
9963     R6_OPC_CMP_SUN_D  = FOP(9, FMT_L),
9964     R6_OPC_CMP_SEQ_D  = FOP(10, FMT_L),
9965     R6_OPC_CMP_SEUQ_D = FOP(11, FMT_L),
9966     R6_OPC_CMP_SLT_D  = FOP(12, FMT_L),
9967     R6_OPC_CMP_SULT_D = FOP(13, FMT_L),
9968     R6_OPC_CMP_SLE_D  = FOP(14, FMT_L),
9969     R6_OPC_CMP_SULE_D = FOP(15, FMT_L),
9970     R6_OPC_CMP_OR_D   = FOP(17, FMT_L),
9971     R6_OPC_CMP_UNE_D  = FOP(18, FMT_L),
9972     R6_OPC_CMP_NE_D   = FOP(19, FMT_L),
9973     R6_OPC_CMP_SOR_D  = FOP(25, FMT_L),
9974     R6_OPC_CMP_SUNE_D = FOP(26, FMT_L),
9975     R6_OPC_CMP_SNE_D  = FOP(27, FMT_L),
9976 };
9977 
9978 static void gen_cp1(DisasContext *ctx, uint32_t opc, int rt, int fs)
9979 {
9980     TCGv t0 = tcg_temp_new();
9981 
9982     switch (opc) {
9983     case OPC_MFC1:
9984         {
9985             TCGv_i32 fp0 = tcg_temp_new_i32();
9986 
9987             gen_load_fpr32(ctx, fp0, fs);
9988             tcg_gen_ext_i32_tl(t0, fp0);
9989             tcg_temp_free_i32(fp0);
9990         }
9991         gen_store_gpr(t0, rt);
9992         break;
9993     case OPC_MTC1:
9994         gen_load_gpr(t0, rt);
9995         {
9996             TCGv_i32 fp0 = tcg_temp_new_i32();
9997 
9998             tcg_gen_trunc_tl_i32(fp0, t0);
9999             gen_store_fpr32(ctx, fp0, fs);
10000             tcg_temp_free_i32(fp0);
10001         }
10002         break;
10003     case OPC_CFC1:
10004         gen_helper_1e0i(cfc1, t0, fs);
10005         gen_store_gpr(t0, rt);
10006         break;
10007     case OPC_CTC1:
10008         gen_load_gpr(t0, rt);
10009         save_cpu_state(ctx, 0);
10010         {
10011             TCGv_i32 fs_tmp = tcg_const_i32(fs);
10012 
10013             gen_helper_0e2i(ctc1, t0, fs_tmp, rt);
10014             tcg_temp_free_i32(fs_tmp);
10015         }
10016         /* Stop translation as we may have changed hflags */
10017         ctx->base.is_jmp = DISAS_STOP;
10018         break;
10019 #if defined(TARGET_MIPS64)
10020     case OPC_DMFC1:
10021         gen_load_fpr64(ctx, t0, fs);
10022         gen_store_gpr(t0, rt);
10023         break;
10024     case OPC_DMTC1:
10025         gen_load_gpr(t0, rt);
10026         gen_store_fpr64(ctx, t0, fs);
10027         break;
10028 #endif
10029     case OPC_MFHC1:
10030         {
10031             TCGv_i32 fp0 = tcg_temp_new_i32();
10032 
10033             gen_load_fpr32h(ctx, fp0, fs);
10034             tcg_gen_ext_i32_tl(t0, fp0);
10035             tcg_temp_free_i32(fp0);
10036         }
10037         gen_store_gpr(t0, rt);
10038         break;
10039     case OPC_MTHC1:
10040         gen_load_gpr(t0, rt);
10041         {
10042             TCGv_i32 fp0 = tcg_temp_new_i32();
10043 
10044             tcg_gen_trunc_tl_i32(fp0, t0);
10045             gen_store_fpr32h(ctx, fp0, fs);
10046             tcg_temp_free_i32(fp0);
10047         }
10048         break;
10049     default:
10050         MIPS_INVAL("cp1 move");
10051         gen_reserved_instruction(ctx);
10052         goto out;
10053     }
10054 
10055  out:
10056     tcg_temp_free(t0);
10057 }
10058 
10059 static void gen_movci(DisasContext *ctx, int rd, int rs, int cc, int tf)
10060 {
10061     TCGLabel *l1;
10062     TCGCond cond;
10063     TCGv_i32 t0;
10064 
10065     if (rd == 0) {
10066         /* Treat as NOP. */
10067         return;
10068     }
10069 
10070     if (tf) {
10071         cond = TCG_COND_EQ;
10072     } else {
10073         cond = TCG_COND_NE;
10074     }
10075 
10076     l1 = gen_new_label();
10077     t0 = tcg_temp_new_i32();
10078     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
10079     tcg_gen_brcondi_i32(cond, t0, 0, l1);
10080     tcg_temp_free_i32(t0);
10081     gen_load_gpr(cpu_gpr[rd], rs);
10082     gen_set_label(l1);
10083 }
10084 
10085 static inline void gen_movcf_s(DisasContext *ctx, int fs, int fd, int cc,
10086                                int tf)
10087 {
10088     int cond;
10089     TCGv_i32 t0 = tcg_temp_new_i32();
10090     TCGLabel *l1 = gen_new_label();
10091 
10092     if (tf) {
10093         cond = TCG_COND_EQ;
10094     } else {
10095         cond = TCG_COND_NE;
10096     }
10097 
10098     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
10099     tcg_gen_brcondi_i32(cond, t0, 0, l1);
10100     gen_load_fpr32(ctx, t0, fs);
10101     gen_store_fpr32(ctx, t0, fd);
10102     gen_set_label(l1);
10103     tcg_temp_free_i32(t0);
10104 }
10105 
10106 static inline void gen_movcf_d(DisasContext *ctx, int fs, int fd, int cc,
10107                                int tf)
10108 {
10109     int cond;
10110     TCGv_i32 t0 = tcg_temp_new_i32();
10111     TCGv_i64 fp0;
10112     TCGLabel *l1 = gen_new_label();
10113 
10114     if (tf) {
10115         cond = TCG_COND_EQ;
10116     } else {
10117         cond = TCG_COND_NE;
10118     }
10119 
10120     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
10121     tcg_gen_brcondi_i32(cond, t0, 0, l1);
10122     tcg_temp_free_i32(t0);
10123     fp0 = tcg_temp_new_i64();
10124     gen_load_fpr64(ctx, fp0, fs);
10125     gen_store_fpr64(ctx, fp0, fd);
10126     tcg_temp_free_i64(fp0);
10127     gen_set_label(l1);
10128 }
10129 
10130 static inline void gen_movcf_ps(DisasContext *ctx, int fs, int fd,
10131                                 int cc, int tf)
10132 {
10133     int cond;
10134     TCGv_i32 t0 = tcg_temp_new_i32();
10135     TCGLabel *l1 = gen_new_label();
10136     TCGLabel *l2 = gen_new_label();
10137 
10138     if (tf) {
10139         cond = TCG_COND_EQ;
10140     } else {
10141         cond = TCG_COND_NE;
10142     }
10143 
10144     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
10145     tcg_gen_brcondi_i32(cond, t0, 0, l1);
10146     gen_load_fpr32(ctx, t0, fs);
10147     gen_store_fpr32(ctx, t0, fd);
10148     gen_set_label(l1);
10149 
10150     tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc + 1));
10151     tcg_gen_brcondi_i32(cond, t0, 0, l2);
10152     gen_load_fpr32h(ctx, t0, fs);
10153     gen_store_fpr32h(ctx, t0, fd);
10154     tcg_temp_free_i32(t0);
10155     gen_set_label(l2);
10156 }
10157 
10158 static void gen_sel_s(DisasContext *ctx, enum fopcode op1, int fd, int ft,
10159                       int fs)
10160 {
10161     TCGv_i32 t1 = tcg_const_i32(0);
10162     TCGv_i32 fp0 = tcg_temp_new_i32();
10163     TCGv_i32 fp1 = tcg_temp_new_i32();
10164     TCGv_i32 fp2 = tcg_temp_new_i32();
10165     gen_load_fpr32(ctx, fp0, fd);
10166     gen_load_fpr32(ctx, fp1, ft);
10167     gen_load_fpr32(ctx, fp2, fs);
10168 
10169     switch (op1) {
10170     case OPC_SEL_S:
10171         tcg_gen_andi_i32(fp0, fp0, 1);
10172         tcg_gen_movcond_i32(TCG_COND_NE, fp0, fp0, t1, fp1, fp2);
10173         break;
10174     case OPC_SELEQZ_S:
10175         tcg_gen_andi_i32(fp1, fp1, 1);
10176         tcg_gen_movcond_i32(TCG_COND_EQ, fp0, fp1, t1, fp2, t1);
10177         break;
10178     case OPC_SELNEZ_S:
10179         tcg_gen_andi_i32(fp1, fp1, 1);
10180         tcg_gen_movcond_i32(TCG_COND_NE, fp0, fp1, t1, fp2, t1);
10181         break;
10182     default:
10183         MIPS_INVAL("gen_sel_s");
10184         gen_reserved_instruction(ctx);
10185         break;
10186     }
10187 
10188     gen_store_fpr32(ctx, fp0, fd);
10189     tcg_temp_free_i32(fp2);
10190     tcg_temp_free_i32(fp1);
10191     tcg_temp_free_i32(fp0);
10192     tcg_temp_free_i32(t1);
10193 }
10194 
10195 static void gen_sel_d(DisasContext *ctx, enum fopcode op1, int fd, int ft,
10196                       int fs)
10197 {
10198     TCGv_i64 t1 = tcg_const_i64(0);
10199     TCGv_i64 fp0 = tcg_temp_new_i64();
10200     TCGv_i64 fp1 = tcg_temp_new_i64();
10201     TCGv_i64 fp2 = tcg_temp_new_i64();
10202     gen_load_fpr64(ctx, fp0, fd);
10203     gen_load_fpr64(ctx, fp1, ft);
10204     gen_load_fpr64(ctx, fp2, fs);
10205 
10206     switch (op1) {
10207     case OPC_SEL_D:
10208         tcg_gen_andi_i64(fp0, fp0, 1);
10209         tcg_gen_movcond_i64(TCG_COND_NE, fp0, fp0, t1, fp1, fp2);
10210         break;
10211     case OPC_SELEQZ_D:
10212         tcg_gen_andi_i64(fp1, fp1, 1);
10213         tcg_gen_movcond_i64(TCG_COND_EQ, fp0, fp1, t1, fp2, t1);
10214         break;
10215     case OPC_SELNEZ_D:
10216         tcg_gen_andi_i64(fp1, fp1, 1);
10217         tcg_gen_movcond_i64(TCG_COND_NE, fp0, fp1, t1, fp2, t1);
10218         break;
10219     default:
10220         MIPS_INVAL("gen_sel_d");
10221         gen_reserved_instruction(ctx);
10222         break;
10223     }
10224 
10225     gen_store_fpr64(ctx, fp0, fd);
10226     tcg_temp_free_i64(fp2);
10227     tcg_temp_free_i64(fp1);
10228     tcg_temp_free_i64(fp0);
10229     tcg_temp_free_i64(t1);
10230 }
10231 
10232 static void gen_farith(DisasContext *ctx, enum fopcode op1,
10233                        int ft, int fs, int fd, int cc)
10234 {
10235     uint32_t func = ctx->opcode & 0x3f;
10236     switch (op1) {
10237     case OPC_ADD_S:
10238         {
10239             TCGv_i32 fp0 = tcg_temp_new_i32();
10240             TCGv_i32 fp1 = tcg_temp_new_i32();
10241 
10242             gen_load_fpr32(ctx, fp0, fs);
10243             gen_load_fpr32(ctx, fp1, ft);
10244             gen_helper_float_add_s(fp0, cpu_env, fp0, fp1);
10245             tcg_temp_free_i32(fp1);
10246             gen_store_fpr32(ctx, fp0, fd);
10247             tcg_temp_free_i32(fp0);
10248         }
10249         break;
10250     case OPC_SUB_S:
10251         {
10252             TCGv_i32 fp0 = tcg_temp_new_i32();
10253             TCGv_i32 fp1 = tcg_temp_new_i32();
10254 
10255             gen_load_fpr32(ctx, fp0, fs);
10256             gen_load_fpr32(ctx, fp1, ft);
10257             gen_helper_float_sub_s(fp0, cpu_env, fp0, fp1);
10258             tcg_temp_free_i32(fp1);
10259             gen_store_fpr32(ctx, fp0, fd);
10260             tcg_temp_free_i32(fp0);
10261         }
10262         break;
10263     case OPC_MUL_S:
10264         {
10265             TCGv_i32 fp0 = tcg_temp_new_i32();
10266             TCGv_i32 fp1 = tcg_temp_new_i32();
10267 
10268             gen_load_fpr32(ctx, fp0, fs);
10269             gen_load_fpr32(ctx, fp1, ft);
10270             gen_helper_float_mul_s(fp0, cpu_env, fp0, fp1);
10271             tcg_temp_free_i32(fp1);
10272             gen_store_fpr32(ctx, fp0, fd);
10273             tcg_temp_free_i32(fp0);
10274         }
10275         break;
10276     case OPC_DIV_S:
10277         {
10278             TCGv_i32 fp0 = tcg_temp_new_i32();
10279             TCGv_i32 fp1 = tcg_temp_new_i32();
10280 
10281             gen_load_fpr32(ctx, fp0, fs);
10282             gen_load_fpr32(ctx, fp1, ft);
10283             gen_helper_float_div_s(fp0, cpu_env, fp0, fp1);
10284             tcg_temp_free_i32(fp1);
10285             gen_store_fpr32(ctx, fp0, fd);
10286             tcg_temp_free_i32(fp0);
10287         }
10288         break;
10289     case OPC_SQRT_S:
10290         {
10291             TCGv_i32 fp0 = tcg_temp_new_i32();
10292 
10293             gen_load_fpr32(ctx, fp0, fs);
10294             gen_helper_float_sqrt_s(fp0, cpu_env, fp0);
10295             gen_store_fpr32(ctx, fp0, fd);
10296             tcg_temp_free_i32(fp0);
10297         }
10298         break;
10299     case OPC_ABS_S:
10300         {
10301             TCGv_i32 fp0 = tcg_temp_new_i32();
10302 
10303             gen_load_fpr32(ctx, fp0, fs);
10304             if (ctx->abs2008) {
10305                 tcg_gen_andi_i32(fp0, fp0, 0x7fffffffUL);
10306             } else {
10307                 gen_helper_float_abs_s(fp0, fp0);
10308             }
10309             gen_store_fpr32(ctx, fp0, fd);
10310             tcg_temp_free_i32(fp0);
10311         }
10312         break;
10313     case OPC_MOV_S:
10314         {
10315             TCGv_i32 fp0 = tcg_temp_new_i32();
10316 
10317             gen_load_fpr32(ctx, fp0, fs);
10318             gen_store_fpr32(ctx, fp0, fd);
10319             tcg_temp_free_i32(fp0);
10320         }
10321         break;
10322     case OPC_NEG_S:
10323         {
10324             TCGv_i32 fp0 = tcg_temp_new_i32();
10325 
10326             gen_load_fpr32(ctx, fp0, fs);
10327             if (ctx->abs2008) {
10328                 tcg_gen_xori_i32(fp0, fp0, 1UL << 31);
10329             } else {
10330                 gen_helper_float_chs_s(fp0, fp0);
10331             }
10332             gen_store_fpr32(ctx, fp0, fd);
10333             tcg_temp_free_i32(fp0);
10334         }
10335         break;
10336     case OPC_ROUND_L_S:
10337         check_cp1_64bitmode(ctx);
10338         {
10339             TCGv_i32 fp32 = tcg_temp_new_i32();
10340             TCGv_i64 fp64 = tcg_temp_new_i64();
10341 
10342             gen_load_fpr32(ctx, fp32, fs);
10343             if (ctx->nan2008) {
10344                 gen_helper_float_round_2008_l_s(fp64, cpu_env, fp32);
10345             } else {
10346                 gen_helper_float_round_l_s(fp64, cpu_env, fp32);
10347             }
10348             tcg_temp_free_i32(fp32);
10349             gen_store_fpr64(ctx, fp64, fd);
10350             tcg_temp_free_i64(fp64);
10351         }
10352         break;
10353     case OPC_TRUNC_L_S:
10354         check_cp1_64bitmode(ctx);
10355         {
10356             TCGv_i32 fp32 = tcg_temp_new_i32();
10357             TCGv_i64 fp64 = tcg_temp_new_i64();
10358 
10359             gen_load_fpr32(ctx, fp32, fs);
10360             if (ctx->nan2008) {
10361                 gen_helper_float_trunc_2008_l_s(fp64, cpu_env, fp32);
10362             } else {
10363                 gen_helper_float_trunc_l_s(fp64, cpu_env, fp32);
10364             }
10365             tcg_temp_free_i32(fp32);
10366             gen_store_fpr64(ctx, fp64, fd);
10367             tcg_temp_free_i64(fp64);
10368         }
10369         break;
10370     case OPC_CEIL_L_S:
10371         check_cp1_64bitmode(ctx);
10372         {
10373             TCGv_i32 fp32 = tcg_temp_new_i32();
10374             TCGv_i64 fp64 = tcg_temp_new_i64();
10375 
10376             gen_load_fpr32(ctx, fp32, fs);
10377             if (ctx->nan2008) {
10378                 gen_helper_float_ceil_2008_l_s(fp64, cpu_env, fp32);
10379             } else {
10380                 gen_helper_float_ceil_l_s(fp64, cpu_env, fp32);
10381             }
10382             tcg_temp_free_i32(fp32);
10383             gen_store_fpr64(ctx, fp64, fd);
10384             tcg_temp_free_i64(fp64);
10385         }
10386         break;
10387     case OPC_FLOOR_L_S:
10388         check_cp1_64bitmode(ctx);
10389         {
10390             TCGv_i32 fp32 = tcg_temp_new_i32();
10391             TCGv_i64 fp64 = tcg_temp_new_i64();
10392 
10393             gen_load_fpr32(ctx, fp32, fs);
10394             if (ctx->nan2008) {
10395                 gen_helper_float_floor_2008_l_s(fp64, cpu_env, fp32);
10396             } else {
10397                 gen_helper_float_floor_l_s(fp64, cpu_env, fp32);
10398             }
10399             tcg_temp_free_i32(fp32);
10400             gen_store_fpr64(ctx, fp64, fd);
10401             tcg_temp_free_i64(fp64);
10402         }
10403         break;
10404     case OPC_ROUND_W_S:
10405         {
10406             TCGv_i32 fp0 = tcg_temp_new_i32();
10407 
10408             gen_load_fpr32(ctx, fp0, fs);
10409             if (ctx->nan2008) {
10410                 gen_helper_float_round_2008_w_s(fp0, cpu_env, fp0);
10411             } else {
10412                 gen_helper_float_round_w_s(fp0, cpu_env, fp0);
10413             }
10414             gen_store_fpr32(ctx, fp0, fd);
10415             tcg_temp_free_i32(fp0);
10416         }
10417         break;
10418     case OPC_TRUNC_W_S:
10419         {
10420             TCGv_i32 fp0 = tcg_temp_new_i32();
10421 
10422             gen_load_fpr32(ctx, fp0, fs);
10423             if (ctx->nan2008) {
10424                 gen_helper_float_trunc_2008_w_s(fp0, cpu_env, fp0);
10425             } else {
10426                 gen_helper_float_trunc_w_s(fp0, cpu_env, fp0);
10427             }
10428             gen_store_fpr32(ctx, fp0, fd);
10429             tcg_temp_free_i32(fp0);
10430         }
10431         break;
10432     case OPC_CEIL_W_S:
10433         {
10434             TCGv_i32 fp0 = tcg_temp_new_i32();
10435 
10436             gen_load_fpr32(ctx, fp0, fs);
10437             if (ctx->nan2008) {
10438                 gen_helper_float_ceil_2008_w_s(fp0, cpu_env, fp0);
10439             } else {
10440                 gen_helper_float_ceil_w_s(fp0, cpu_env, fp0);
10441             }
10442             gen_store_fpr32(ctx, fp0, fd);
10443             tcg_temp_free_i32(fp0);
10444         }
10445         break;
10446     case OPC_FLOOR_W_S:
10447         {
10448             TCGv_i32 fp0 = tcg_temp_new_i32();
10449 
10450             gen_load_fpr32(ctx, fp0, fs);
10451             if (ctx->nan2008) {
10452                 gen_helper_float_floor_2008_w_s(fp0, cpu_env, fp0);
10453             } else {
10454                 gen_helper_float_floor_w_s(fp0, cpu_env, fp0);
10455             }
10456             gen_store_fpr32(ctx, fp0, fd);
10457             tcg_temp_free_i32(fp0);
10458         }
10459         break;
10460     case OPC_SEL_S:
10461         check_insn(ctx, ISA_MIPS_R6);
10462         gen_sel_s(ctx, op1, fd, ft, fs);
10463         break;
10464     case OPC_SELEQZ_S:
10465         check_insn(ctx, ISA_MIPS_R6);
10466         gen_sel_s(ctx, op1, fd, ft, fs);
10467         break;
10468     case OPC_SELNEZ_S:
10469         check_insn(ctx, ISA_MIPS_R6);
10470         gen_sel_s(ctx, op1, fd, ft, fs);
10471         break;
10472     case OPC_MOVCF_S:
10473         check_insn_opc_removed(ctx, ISA_MIPS_R6);
10474         gen_movcf_s(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1);
10475         break;
10476     case OPC_MOVZ_S:
10477         check_insn_opc_removed(ctx, ISA_MIPS_R6);
10478         {
10479             TCGLabel *l1 = gen_new_label();
10480             TCGv_i32 fp0;
10481 
10482             if (ft != 0) {
10483                 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
10484             }
10485             fp0 = tcg_temp_new_i32();
10486             gen_load_fpr32(ctx, fp0, fs);
10487             gen_store_fpr32(ctx, fp0, fd);
10488             tcg_temp_free_i32(fp0);
10489             gen_set_label(l1);
10490         }
10491         break;
10492     case OPC_MOVN_S:
10493         check_insn_opc_removed(ctx, ISA_MIPS_R6);
10494         {
10495             TCGLabel *l1 = gen_new_label();
10496             TCGv_i32 fp0;
10497 
10498             if (ft != 0) {
10499                 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
10500                 fp0 = tcg_temp_new_i32();
10501                 gen_load_fpr32(ctx, fp0, fs);
10502                 gen_store_fpr32(ctx, fp0, fd);
10503                 tcg_temp_free_i32(fp0);
10504                 gen_set_label(l1);
10505             }
10506         }
10507         break;
10508     case OPC_RECIP_S:
10509         {
10510             TCGv_i32 fp0 = tcg_temp_new_i32();
10511 
10512             gen_load_fpr32(ctx, fp0, fs);
10513             gen_helper_float_recip_s(fp0, cpu_env, fp0);
10514             gen_store_fpr32(ctx, fp0, fd);
10515             tcg_temp_free_i32(fp0);
10516         }
10517         break;
10518     case OPC_RSQRT_S:
10519         {
10520             TCGv_i32 fp0 = tcg_temp_new_i32();
10521 
10522             gen_load_fpr32(ctx, fp0, fs);
10523             gen_helper_float_rsqrt_s(fp0, cpu_env, fp0);
10524             gen_store_fpr32(ctx, fp0, fd);
10525             tcg_temp_free_i32(fp0);
10526         }
10527         break;
10528     case OPC_MADDF_S:
10529         check_insn(ctx, ISA_MIPS_R6);
10530         {
10531             TCGv_i32 fp0 = tcg_temp_new_i32();
10532             TCGv_i32 fp1 = tcg_temp_new_i32();
10533             TCGv_i32 fp2 = tcg_temp_new_i32();
10534             gen_load_fpr32(ctx, fp0, fs);
10535             gen_load_fpr32(ctx, fp1, ft);
10536             gen_load_fpr32(ctx, fp2, fd);
10537             gen_helper_float_maddf_s(fp2, cpu_env, fp0, fp1, fp2);
10538             gen_store_fpr32(ctx, fp2, fd);
10539             tcg_temp_free_i32(fp2);
10540             tcg_temp_free_i32(fp1);
10541             tcg_temp_free_i32(fp0);
10542         }
10543         break;
10544     case OPC_MSUBF_S:
10545         check_insn(ctx, ISA_MIPS_R6);
10546         {
10547             TCGv_i32 fp0 = tcg_temp_new_i32();
10548             TCGv_i32 fp1 = tcg_temp_new_i32();
10549             TCGv_i32 fp2 = tcg_temp_new_i32();
10550             gen_load_fpr32(ctx, fp0, fs);
10551             gen_load_fpr32(ctx, fp1, ft);
10552             gen_load_fpr32(ctx, fp2, fd);
10553             gen_helper_float_msubf_s(fp2, cpu_env, fp0, fp1, fp2);
10554             gen_store_fpr32(ctx, fp2, fd);
10555             tcg_temp_free_i32(fp2);
10556             tcg_temp_free_i32(fp1);
10557             tcg_temp_free_i32(fp0);
10558         }
10559         break;
10560     case OPC_RINT_S:
10561         check_insn(ctx, ISA_MIPS_R6);
10562         {
10563             TCGv_i32 fp0 = tcg_temp_new_i32();
10564             gen_load_fpr32(ctx, fp0, fs);
10565             gen_helper_float_rint_s(fp0, cpu_env, fp0);
10566             gen_store_fpr32(ctx, fp0, fd);
10567             tcg_temp_free_i32(fp0);
10568         }
10569         break;
10570     case OPC_CLASS_S:
10571         check_insn(ctx, ISA_MIPS_R6);
10572         {
10573             TCGv_i32 fp0 = tcg_temp_new_i32();
10574             gen_load_fpr32(ctx, fp0, fs);
10575             gen_helper_float_class_s(fp0, cpu_env, fp0);
10576             gen_store_fpr32(ctx, fp0, fd);
10577             tcg_temp_free_i32(fp0);
10578         }
10579         break;
10580     case OPC_MIN_S: /* OPC_RECIP2_S */
10581         if (ctx->insn_flags & ISA_MIPS_R6) {
10582             /* OPC_MIN_S */
10583             TCGv_i32 fp0 = tcg_temp_new_i32();
10584             TCGv_i32 fp1 = tcg_temp_new_i32();
10585             TCGv_i32 fp2 = tcg_temp_new_i32();
10586             gen_load_fpr32(ctx, fp0, fs);
10587             gen_load_fpr32(ctx, fp1, ft);
10588             gen_helper_float_min_s(fp2, cpu_env, fp0, fp1);
10589             gen_store_fpr32(ctx, fp2, fd);
10590             tcg_temp_free_i32(fp2);
10591             tcg_temp_free_i32(fp1);
10592             tcg_temp_free_i32(fp0);
10593         } else {
10594             /* OPC_RECIP2_S */
10595             check_cp1_64bitmode(ctx);
10596             {
10597                 TCGv_i32 fp0 = tcg_temp_new_i32();
10598                 TCGv_i32 fp1 = tcg_temp_new_i32();
10599 
10600                 gen_load_fpr32(ctx, fp0, fs);
10601                 gen_load_fpr32(ctx, fp1, ft);
10602                 gen_helper_float_recip2_s(fp0, cpu_env, fp0, fp1);
10603                 tcg_temp_free_i32(fp1);
10604                 gen_store_fpr32(ctx, fp0, fd);
10605                 tcg_temp_free_i32(fp0);
10606             }
10607         }
10608         break;
10609     case OPC_MINA_S: /* OPC_RECIP1_S */
10610         if (ctx->insn_flags & ISA_MIPS_R6) {
10611             /* OPC_MINA_S */
10612             TCGv_i32 fp0 = tcg_temp_new_i32();
10613             TCGv_i32 fp1 = tcg_temp_new_i32();
10614             TCGv_i32 fp2 = tcg_temp_new_i32();
10615             gen_load_fpr32(ctx, fp0, fs);
10616             gen_load_fpr32(ctx, fp1, ft);
10617             gen_helper_float_mina_s(fp2, cpu_env, fp0, fp1);
10618             gen_store_fpr32(ctx, fp2, fd);
10619             tcg_temp_free_i32(fp2);
10620             tcg_temp_free_i32(fp1);
10621             tcg_temp_free_i32(fp0);
10622         } else {
10623             /* OPC_RECIP1_S */
10624             check_cp1_64bitmode(ctx);
10625             {
10626                 TCGv_i32 fp0 = tcg_temp_new_i32();
10627 
10628                 gen_load_fpr32(ctx, fp0, fs);
10629                 gen_helper_float_recip1_s(fp0, cpu_env, fp0);
10630                 gen_store_fpr32(ctx, fp0, fd);
10631                 tcg_temp_free_i32(fp0);
10632             }
10633         }
10634         break;
10635     case OPC_MAX_S: /* OPC_RSQRT1_S */
10636         if (ctx->insn_flags & ISA_MIPS_R6) {
10637             /* OPC_MAX_S */
10638             TCGv_i32 fp0 = tcg_temp_new_i32();
10639             TCGv_i32 fp1 = tcg_temp_new_i32();
10640             gen_load_fpr32(ctx, fp0, fs);
10641             gen_load_fpr32(ctx, fp1, ft);
10642             gen_helper_float_max_s(fp1, cpu_env, fp0, fp1);
10643             gen_store_fpr32(ctx, fp1, fd);
10644             tcg_temp_free_i32(fp1);
10645             tcg_temp_free_i32(fp0);
10646         } else {
10647             /* OPC_RSQRT1_S */
10648             check_cp1_64bitmode(ctx);
10649             {
10650                 TCGv_i32 fp0 = tcg_temp_new_i32();
10651 
10652                 gen_load_fpr32(ctx, fp0, fs);
10653                 gen_helper_float_rsqrt1_s(fp0, cpu_env, fp0);
10654                 gen_store_fpr32(ctx, fp0, fd);
10655                 tcg_temp_free_i32(fp0);
10656             }
10657         }
10658         break;
10659     case OPC_MAXA_S: /* OPC_RSQRT2_S */
10660         if (ctx->insn_flags & ISA_MIPS_R6) {
10661             /* OPC_MAXA_S */
10662             TCGv_i32 fp0 = tcg_temp_new_i32();
10663             TCGv_i32 fp1 = tcg_temp_new_i32();
10664             gen_load_fpr32(ctx, fp0, fs);
10665             gen_load_fpr32(ctx, fp1, ft);
10666             gen_helper_float_maxa_s(fp1, cpu_env, fp0, fp1);
10667             gen_store_fpr32(ctx, fp1, fd);
10668             tcg_temp_free_i32(fp1);
10669             tcg_temp_free_i32(fp0);
10670         } else {
10671             /* OPC_RSQRT2_S */
10672             check_cp1_64bitmode(ctx);
10673             {
10674                 TCGv_i32 fp0 = tcg_temp_new_i32();
10675                 TCGv_i32 fp1 = tcg_temp_new_i32();
10676 
10677                 gen_load_fpr32(ctx, fp0, fs);
10678                 gen_load_fpr32(ctx, fp1, ft);
10679                 gen_helper_float_rsqrt2_s(fp0, cpu_env, fp0, fp1);
10680                 tcg_temp_free_i32(fp1);
10681                 gen_store_fpr32(ctx, fp0, fd);
10682                 tcg_temp_free_i32(fp0);
10683             }
10684         }
10685         break;
10686     case OPC_CVT_D_S:
10687         check_cp1_registers(ctx, fd);
10688         {
10689             TCGv_i32 fp32 = tcg_temp_new_i32();
10690             TCGv_i64 fp64 = tcg_temp_new_i64();
10691 
10692             gen_load_fpr32(ctx, fp32, fs);
10693             gen_helper_float_cvtd_s(fp64, cpu_env, fp32);
10694             tcg_temp_free_i32(fp32);
10695             gen_store_fpr64(ctx, fp64, fd);
10696             tcg_temp_free_i64(fp64);
10697         }
10698         break;
10699     case OPC_CVT_W_S:
10700         {
10701             TCGv_i32 fp0 = tcg_temp_new_i32();
10702 
10703             gen_load_fpr32(ctx, fp0, fs);
10704             if (ctx->nan2008) {
10705                 gen_helper_float_cvt_2008_w_s(fp0, cpu_env, fp0);
10706             } else {
10707                 gen_helper_float_cvt_w_s(fp0, cpu_env, fp0);
10708             }
10709             gen_store_fpr32(ctx, fp0, fd);
10710             tcg_temp_free_i32(fp0);
10711         }
10712         break;
10713     case OPC_CVT_L_S:
10714         check_cp1_64bitmode(ctx);
10715         {
10716             TCGv_i32 fp32 = tcg_temp_new_i32();
10717             TCGv_i64 fp64 = tcg_temp_new_i64();
10718 
10719             gen_load_fpr32(ctx, fp32, fs);
10720             if (ctx->nan2008) {
10721                 gen_helper_float_cvt_2008_l_s(fp64, cpu_env, fp32);
10722             } else {
10723                 gen_helper_float_cvt_l_s(fp64, cpu_env, fp32);
10724             }
10725             tcg_temp_free_i32(fp32);
10726             gen_store_fpr64(ctx, fp64, fd);
10727             tcg_temp_free_i64(fp64);
10728         }
10729         break;
10730     case OPC_CVT_PS_S:
10731         check_ps(ctx);
10732         {
10733             TCGv_i64 fp64 = tcg_temp_new_i64();
10734             TCGv_i32 fp32_0 = tcg_temp_new_i32();
10735             TCGv_i32 fp32_1 = tcg_temp_new_i32();
10736 
10737             gen_load_fpr32(ctx, fp32_0, fs);
10738             gen_load_fpr32(ctx, fp32_1, ft);
10739             tcg_gen_concat_i32_i64(fp64, fp32_1, fp32_0);
10740             tcg_temp_free_i32(fp32_1);
10741             tcg_temp_free_i32(fp32_0);
10742             gen_store_fpr64(ctx, fp64, fd);
10743             tcg_temp_free_i64(fp64);
10744         }
10745         break;
10746     case OPC_CMP_F_S:
10747     case OPC_CMP_UN_S:
10748     case OPC_CMP_EQ_S:
10749     case OPC_CMP_UEQ_S:
10750     case OPC_CMP_OLT_S:
10751     case OPC_CMP_ULT_S:
10752     case OPC_CMP_OLE_S:
10753     case OPC_CMP_ULE_S:
10754     case OPC_CMP_SF_S:
10755     case OPC_CMP_NGLE_S:
10756     case OPC_CMP_SEQ_S:
10757     case OPC_CMP_NGL_S:
10758     case OPC_CMP_LT_S:
10759     case OPC_CMP_NGE_S:
10760     case OPC_CMP_LE_S:
10761     case OPC_CMP_NGT_S:
10762         check_insn_opc_removed(ctx, ISA_MIPS_R6);
10763         if (ctx->opcode & (1 << 6)) {
10764             gen_cmpabs_s(ctx, func - 48, ft, fs, cc);
10765         } else {
10766             gen_cmp_s(ctx, func - 48, ft, fs, cc);
10767         }
10768         break;
10769     case OPC_ADD_D:
10770         check_cp1_registers(ctx, fs | ft | fd);
10771         {
10772             TCGv_i64 fp0 = tcg_temp_new_i64();
10773             TCGv_i64 fp1 = tcg_temp_new_i64();
10774 
10775             gen_load_fpr64(ctx, fp0, fs);
10776             gen_load_fpr64(ctx, fp1, ft);
10777             gen_helper_float_add_d(fp0, cpu_env, fp0, fp1);
10778             tcg_temp_free_i64(fp1);
10779             gen_store_fpr64(ctx, fp0, fd);
10780             tcg_temp_free_i64(fp0);
10781         }
10782         break;
10783     case OPC_SUB_D:
10784         check_cp1_registers(ctx, fs | ft | fd);
10785         {
10786             TCGv_i64 fp0 = tcg_temp_new_i64();
10787             TCGv_i64 fp1 = tcg_temp_new_i64();
10788 
10789             gen_load_fpr64(ctx, fp0, fs);
10790             gen_load_fpr64(ctx, fp1, ft);
10791             gen_helper_float_sub_d(fp0, cpu_env, fp0, fp1);
10792             tcg_temp_free_i64(fp1);
10793             gen_store_fpr64(ctx, fp0, fd);
10794             tcg_temp_free_i64(fp0);
10795         }
10796         break;
10797     case OPC_MUL_D:
10798         check_cp1_registers(ctx, fs | ft | fd);
10799         {
10800             TCGv_i64 fp0 = tcg_temp_new_i64();
10801             TCGv_i64 fp1 = tcg_temp_new_i64();
10802 
10803             gen_load_fpr64(ctx, fp0, fs);
10804             gen_load_fpr64(ctx, fp1, ft);
10805             gen_helper_float_mul_d(fp0, cpu_env, fp0, fp1);
10806             tcg_temp_free_i64(fp1);
10807             gen_store_fpr64(ctx, fp0, fd);
10808             tcg_temp_free_i64(fp0);
10809         }
10810         break;
10811     case OPC_DIV_D:
10812         check_cp1_registers(ctx, fs | ft | fd);
10813         {
10814             TCGv_i64 fp0 = tcg_temp_new_i64();
10815             TCGv_i64 fp1 = tcg_temp_new_i64();
10816 
10817             gen_load_fpr64(ctx, fp0, fs);
10818             gen_load_fpr64(ctx, fp1, ft);
10819             gen_helper_float_div_d(fp0, cpu_env, fp0, fp1);
10820             tcg_temp_free_i64(fp1);
10821             gen_store_fpr64(ctx, fp0, fd);
10822             tcg_temp_free_i64(fp0);
10823         }
10824         break;
10825     case OPC_SQRT_D:
10826         check_cp1_registers(ctx, fs | fd);
10827         {
10828             TCGv_i64 fp0 = tcg_temp_new_i64();
10829 
10830             gen_load_fpr64(ctx, fp0, fs);
10831             gen_helper_float_sqrt_d(fp0, cpu_env, fp0);
10832             gen_store_fpr64(ctx, fp0, fd);
10833             tcg_temp_free_i64(fp0);
10834         }
10835         break;
10836     case OPC_ABS_D:
10837         check_cp1_registers(ctx, fs | fd);
10838         {
10839             TCGv_i64 fp0 = tcg_temp_new_i64();
10840 
10841             gen_load_fpr64(ctx, fp0, fs);
10842             if (ctx->abs2008) {
10843                 tcg_gen_andi_i64(fp0, fp0, 0x7fffffffffffffffULL);
10844             } else {
10845                 gen_helper_float_abs_d(fp0, fp0);
10846             }
10847             gen_store_fpr64(ctx, fp0, fd);
10848             tcg_temp_free_i64(fp0);
10849         }
10850         break;
10851     case OPC_MOV_D:
10852         check_cp1_registers(ctx, fs | fd);
10853         {
10854             TCGv_i64 fp0 = tcg_temp_new_i64();
10855 
10856             gen_load_fpr64(ctx, fp0, fs);
10857             gen_store_fpr64(ctx, fp0, fd);
10858             tcg_temp_free_i64(fp0);
10859         }
10860         break;
10861     case OPC_NEG_D:
10862         check_cp1_registers(ctx, fs | fd);
10863         {
10864             TCGv_i64 fp0 = tcg_temp_new_i64();
10865 
10866             gen_load_fpr64(ctx, fp0, fs);
10867             if (ctx->abs2008) {
10868                 tcg_gen_xori_i64(fp0, fp0, 1ULL << 63);
10869             } else {
10870                 gen_helper_float_chs_d(fp0, fp0);
10871             }
10872             gen_store_fpr64(ctx, fp0, fd);
10873             tcg_temp_free_i64(fp0);
10874         }
10875         break;
10876     case OPC_ROUND_L_D:
10877         check_cp1_64bitmode(ctx);
10878         {
10879             TCGv_i64 fp0 = tcg_temp_new_i64();
10880 
10881             gen_load_fpr64(ctx, fp0, fs);
10882             if (ctx->nan2008) {
10883                 gen_helper_float_round_2008_l_d(fp0, cpu_env, fp0);
10884             } else {
10885                 gen_helper_float_round_l_d(fp0, cpu_env, fp0);
10886             }
10887             gen_store_fpr64(ctx, fp0, fd);
10888             tcg_temp_free_i64(fp0);
10889         }
10890         break;
10891     case OPC_TRUNC_L_D:
10892         check_cp1_64bitmode(ctx);
10893         {
10894             TCGv_i64 fp0 = tcg_temp_new_i64();
10895 
10896             gen_load_fpr64(ctx, fp0, fs);
10897             if (ctx->nan2008) {
10898                 gen_helper_float_trunc_2008_l_d(fp0, cpu_env, fp0);
10899             } else {
10900                 gen_helper_float_trunc_l_d(fp0, cpu_env, fp0);
10901             }
10902             gen_store_fpr64(ctx, fp0, fd);
10903             tcg_temp_free_i64(fp0);
10904         }
10905         break;
10906     case OPC_CEIL_L_D:
10907         check_cp1_64bitmode(ctx);
10908         {
10909             TCGv_i64 fp0 = tcg_temp_new_i64();
10910 
10911             gen_load_fpr64(ctx, fp0, fs);
10912             if (ctx->nan2008) {
10913                 gen_helper_float_ceil_2008_l_d(fp0, cpu_env, fp0);
10914             } else {
10915                 gen_helper_float_ceil_l_d(fp0, cpu_env, fp0);
10916             }
10917             gen_store_fpr64(ctx, fp0, fd);
10918             tcg_temp_free_i64(fp0);
10919         }
10920         break;
10921     case OPC_FLOOR_L_D:
10922         check_cp1_64bitmode(ctx);
10923         {
10924             TCGv_i64 fp0 = tcg_temp_new_i64();
10925 
10926             gen_load_fpr64(ctx, fp0, fs);
10927             if (ctx->nan2008) {
10928                 gen_helper_float_floor_2008_l_d(fp0, cpu_env, fp0);
10929             } else {
10930                 gen_helper_float_floor_l_d(fp0, cpu_env, fp0);
10931             }
10932             gen_store_fpr64(ctx, fp0, fd);
10933             tcg_temp_free_i64(fp0);
10934         }
10935         break;
10936     case OPC_ROUND_W_D:
10937         check_cp1_registers(ctx, fs);
10938         {
10939             TCGv_i32 fp32 = tcg_temp_new_i32();
10940             TCGv_i64 fp64 = tcg_temp_new_i64();
10941 
10942             gen_load_fpr64(ctx, fp64, fs);
10943             if (ctx->nan2008) {
10944                 gen_helper_float_round_2008_w_d(fp32, cpu_env, fp64);
10945             } else {
10946                 gen_helper_float_round_w_d(fp32, cpu_env, fp64);
10947             }
10948             tcg_temp_free_i64(fp64);
10949             gen_store_fpr32(ctx, fp32, fd);
10950             tcg_temp_free_i32(fp32);
10951         }
10952         break;
10953     case OPC_TRUNC_W_D:
10954         check_cp1_registers(ctx, fs);
10955         {
10956             TCGv_i32 fp32 = tcg_temp_new_i32();
10957             TCGv_i64 fp64 = tcg_temp_new_i64();
10958 
10959             gen_load_fpr64(ctx, fp64, fs);
10960             if (ctx->nan2008) {
10961                 gen_helper_float_trunc_2008_w_d(fp32, cpu_env, fp64);
10962             } else {
10963                 gen_helper_float_trunc_w_d(fp32, cpu_env, fp64);
10964             }
10965             tcg_temp_free_i64(fp64);
10966             gen_store_fpr32(ctx, fp32, fd);
10967             tcg_temp_free_i32(fp32);
10968         }
10969         break;
10970     case OPC_CEIL_W_D:
10971         check_cp1_registers(ctx, fs);
10972         {
10973             TCGv_i32 fp32 = tcg_temp_new_i32();
10974             TCGv_i64 fp64 = tcg_temp_new_i64();
10975 
10976             gen_load_fpr64(ctx, fp64, fs);
10977             if (ctx->nan2008) {
10978                 gen_helper_float_ceil_2008_w_d(fp32, cpu_env, fp64);
10979             } else {
10980                 gen_helper_float_ceil_w_d(fp32, cpu_env, fp64);
10981             }
10982             tcg_temp_free_i64(fp64);
10983             gen_store_fpr32(ctx, fp32, fd);
10984             tcg_temp_free_i32(fp32);
10985         }
10986         break;
10987     case OPC_FLOOR_W_D:
10988         check_cp1_registers(ctx, fs);
10989         {
10990             TCGv_i32 fp32 = tcg_temp_new_i32();
10991             TCGv_i64 fp64 = tcg_temp_new_i64();
10992 
10993             gen_load_fpr64(ctx, fp64, fs);
10994             if (ctx->nan2008) {
10995                 gen_helper_float_floor_2008_w_d(fp32, cpu_env, fp64);
10996             } else {
10997                 gen_helper_float_floor_w_d(fp32, cpu_env, fp64);
10998             }
10999             tcg_temp_free_i64(fp64);
11000             gen_store_fpr32(ctx, fp32, fd);
11001             tcg_temp_free_i32(fp32);
11002         }
11003         break;
11004     case OPC_SEL_D:
11005         check_insn(ctx, ISA_MIPS_R6);
11006         gen_sel_d(ctx, op1, fd, ft, fs);
11007         break;
11008     case OPC_SELEQZ_D:
11009         check_insn(ctx, ISA_MIPS_R6);
11010         gen_sel_d(ctx, op1, fd, ft, fs);
11011         break;
11012     case OPC_SELNEZ_D:
11013         check_insn(ctx, ISA_MIPS_R6);
11014         gen_sel_d(ctx, op1, fd, ft, fs);
11015         break;
11016     case OPC_MOVCF_D:
11017         check_insn_opc_removed(ctx, ISA_MIPS_R6);
11018         gen_movcf_d(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1);
11019         break;
11020     case OPC_MOVZ_D:
11021         check_insn_opc_removed(ctx, ISA_MIPS_R6);
11022         {
11023             TCGLabel *l1 = gen_new_label();
11024             TCGv_i64 fp0;
11025 
11026             if (ft != 0) {
11027                 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
11028             }
11029             fp0 = tcg_temp_new_i64();
11030             gen_load_fpr64(ctx, fp0, fs);
11031             gen_store_fpr64(ctx, fp0, fd);
11032             tcg_temp_free_i64(fp0);
11033             gen_set_label(l1);
11034         }
11035         break;
11036     case OPC_MOVN_D:
11037         check_insn_opc_removed(ctx, ISA_MIPS_R6);
11038         {
11039             TCGLabel *l1 = gen_new_label();
11040             TCGv_i64 fp0;
11041 
11042             if (ft != 0) {
11043                 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
11044                 fp0 = tcg_temp_new_i64();
11045                 gen_load_fpr64(ctx, fp0, fs);
11046                 gen_store_fpr64(ctx, fp0, fd);
11047                 tcg_temp_free_i64(fp0);
11048                 gen_set_label(l1);
11049             }
11050         }
11051         break;
11052     case OPC_RECIP_D:
11053         check_cp1_registers(ctx, fs | fd);
11054         {
11055             TCGv_i64 fp0 = tcg_temp_new_i64();
11056 
11057             gen_load_fpr64(ctx, fp0, fs);
11058             gen_helper_float_recip_d(fp0, cpu_env, fp0);
11059             gen_store_fpr64(ctx, fp0, fd);
11060             tcg_temp_free_i64(fp0);
11061         }
11062         break;
11063     case OPC_RSQRT_D:
11064         check_cp1_registers(ctx, fs | fd);
11065         {
11066             TCGv_i64 fp0 = tcg_temp_new_i64();
11067 
11068             gen_load_fpr64(ctx, fp0, fs);
11069             gen_helper_float_rsqrt_d(fp0, cpu_env, fp0);
11070             gen_store_fpr64(ctx, fp0, fd);
11071             tcg_temp_free_i64(fp0);
11072         }
11073         break;
11074     case OPC_MADDF_D:
11075         check_insn(ctx, ISA_MIPS_R6);
11076         {
11077             TCGv_i64 fp0 = tcg_temp_new_i64();
11078             TCGv_i64 fp1 = tcg_temp_new_i64();
11079             TCGv_i64 fp2 = tcg_temp_new_i64();
11080             gen_load_fpr64(ctx, fp0, fs);
11081             gen_load_fpr64(ctx, fp1, ft);
11082             gen_load_fpr64(ctx, fp2, fd);
11083             gen_helper_float_maddf_d(fp2, cpu_env, fp0, fp1, fp2);
11084             gen_store_fpr64(ctx, fp2, fd);
11085             tcg_temp_free_i64(fp2);
11086             tcg_temp_free_i64(fp1);
11087             tcg_temp_free_i64(fp0);
11088         }
11089         break;
11090     case OPC_MSUBF_D:
11091         check_insn(ctx, ISA_MIPS_R6);
11092         {
11093             TCGv_i64 fp0 = tcg_temp_new_i64();
11094             TCGv_i64 fp1 = tcg_temp_new_i64();
11095             TCGv_i64 fp2 = tcg_temp_new_i64();
11096             gen_load_fpr64(ctx, fp0, fs);
11097             gen_load_fpr64(ctx, fp1, ft);
11098             gen_load_fpr64(ctx, fp2, fd);
11099             gen_helper_float_msubf_d(fp2, cpu_env, fp0, fp1, fp2);
11100             gen_store_fpr64(ctx, fp2, fd);
11101             tcg_temp_free_i64(fp2);
11102             tcg_temp_free_i64(fp1);
11103             tcg_temp_free_i64(fp0);
11104         }
11105         break;
11106     case OPC_RINT_D:
11107         check_insn(ctx, ISA_MIPS_R6);
11108         {
11109             TCGv_i64 fp0 = tcg_temp_new_i64();
11110             gen_load_fpr64(ctx, fp0, fs);
11111             gen_helper_float_rint_d(fp0, cpu_env, fp0);
11112             gen_store_fpr64(ctx, fp0, fd);
11113             tcg_temp_free_i64(fp0);
11114         }
11115         break;
11116     case OPC_CLASS_D:
11117         check_insn(ctx, ISA_MIPS_R6);
11118         {
11119             TCGv_i64 fp0 = tcg_temp_new_i64();
11120             gen_load_fpr64(ctx, fp0, fs);
11121             gen_helper_float_class_d(fp0, cpu_env, fp0);
11122             gen_store_fpr64(ctx, fp0, fd);
11123             tcg_temp_free_i64(fp0);
11124         }
11125         break;
11126     case OPC_MIN_D: /* OPC_RECIP2_D */
11127         if (ctx->insn_flags & ISA_MIPS_R6) {
11128             /* OPC_MIN_D */
11129             TCGv_i64 fp0 = tcg_temp_new_i64();
11130             TCGv_i64 fp1 = tcg_temp_new_i64();
11131             gen_load_fpr64(ctx, fp0, fs);
11132             gen_load_fpr64(ctx, fp1, ft);
11133             gen_helper_float_min_d(fp1, cpu_env, fp0, fp1);
11134             gen_store_fpr64(ctx, fp1, fd);
11135             tcg_temp_free_i64(fp1);
11136             tcg_temp_free_i64(fp0);
11137         } else {
11138             /* OPC_RECIP2_D */
11139             check_cp1_64bitmode(ctx);
11140             {
11141                 TCGv_i64 fp0 = tcg_temp_new_i64();
11142                 TCGv_i64 fp1 = tcg_temp_new_i64();
11143 
11144                 gen_load_fpr64(ctx, fp0, fs);
11145                 gen_load_fpr64(ctx, fp1, ft);
11146                 gen_helper_float_recip2_d(fp0, cpu_env, fp0, fp1);
11147                 tcg_temp_free_i64(fp1);
11148                 gen_store_fpr64(ctx, fp0, fd);
11149                 tcg_temp_free_i64(fp0);
11150             }
11151         }
11152         break;
11153     case OPC_MINA_D: /* OPC_RECIP1_D */
11154         if (ctx->insn_flags & ISA_MIPS_R6) {
11155             /* OPC_MINA_D */
11156             TCGv_i64 fp0 = tcg_temp_new_i64();
11157             TCGv_i64 fp1 = tcg_temp_new_i64();
11158             gen_load_fpr64(ctx, fp0, fs);
11159             gen_load_fpr64(ctx, fp1, ft);
11160             gen_helper_float_mina_d(fp1, cpu_env, fp0, fp1);
11161             gen_store_fpr64(ctx, fp1, fd);
11162             tcg_temp_free_i64(fp1);
11163             tcg_temp_free_i64(fp0);
11164         } else {
11165             /* OPC_RECIP1_D */
11166             check_cp1_64bitmode(ctx);
11167             {
11168                 TCGv_i64 fp0 = tcg_temp_new_i64();
11169 
11170                 gen_load_fpr64(ctx, fp0, fs);
11171                 gen_helper_float_recip1_d(fp0, cpu_env, fp0);
11172                 gen_store_fpr64(ctx, fp0, fd);
11173                 tcg_temp_free_i64(fp0);
11174             }
11175         }
11176         break;
11177     case OPC_MAX_D: /*  OPC_RSQRT1_D */
11178         if (ctx->insn_flags & ISA_MIPS_R6) {
11179             /* OPC_MAX_D */
11180             TCGv_i64 fp0 = tcg_temp_new_i64();
11181             TCGv_i64 fp1 = tcg_temp_new_i64();
11182             gen_load_fpr64(ctx, fp0, fs);
11183             gen_load_fpr64(ctx, fp1, ft);
11184             gen_helper_float_max_d(fp1, cpu_env, fp0, fp1);
11185             gen_store_fpr64(ctx, fp1, fd);
11186             tcg_temp_free_i64(fp1);
11187             tcg_temp_free_i64(fp0);
11188         } else {
11189             /* OPC_RSQRT1_D */
11190             check_cp1_64bitmode(ctx);
11191             {
11192                 TCGv_i64 fp0 = tcg_temp_new_i64();
11193 
11194                 gen_load_fpr64(ctx, fp0, fs);
11195                 gen_helper_float_rsqrt1_d(fp0, cpu_env, fp0);
11196                 gen_store_fpr64(ctx, fp0, fd);
11197                 tcg_temp_free_i64(fp0);
11198             }
11199         }
11200         break;
11201     case OPC_MAXA_D: /* OPC_RSQRT2_D */
11202         if (ctx->insn_flags & ISA_MIPS_R6) {
11203             /* OPC_MAXA_D */
11204             TCGv_i64 fp0 = tcg_temp_new_i64();
11205             TCGv_i64 fp1 = tcg_temp_new_i64();
11206             gen_load_fpr64(ctx, fp0, fs);
11207             gen_load_fpr64(ctx, fp1, ft);
11208             gen_helper_float_maxa_d(fp1, cpu_env, fp0, fp1);
11209             gen_store_fpr64(ctx, fp1, fd);
11210             tcg_temp_free_i64(fp1);
11211             tcg_temp_free_i64(fp0);
11212         } else {
11213             /* OPC_RSQRT2_D */
11214             check_cp1_64bitmode(ctx);
11215             {
11216                 TCGv_i64 fp0 = tcg_temp_new_i64();
11217                 TCGv_i64 fp1 = tcg_temp_new_i64();
11218 
11219                 gen_load_fpr64(ctx, fp0, fs);
11220                 gen_load_fpr64(ctx, fp1, ft);
11221                 gen_helper_float_rsqrt2_d(fp0, cpu_env, fp0, fp1);
11222                 tcg_temp_free_i64(fp1);
11223                 gen_store_fpr64(ctx, fp0, fd);
11224                 tcg_temp_free_i64(fp0);
11225             }
11226         }
11227         break;
11228     case OPC_CMP_F_D:
11229     case OPC_CMP_UN_D:
11230     case OPC_CMP_EQ_D:
11231     case OPC_CMP_UEQ_D:
11232     case OPC_CMP_OLT_D:
11233     case OPC_CMP_ULT_D:
11234     case OPC_CMP_OLE_D:
11235     case OPC_CMP_ULE_D:
11236     case OPC_CMP_SF_D:
11237     case OPC_CMP_NGLE_D:
11238     case OPC_CMP_SEQ_D:
11239     case OPC_CMP_NGL_D:
11240     case OPC_CMP_LT_D:
11241     case OPC_CMP_NGE_D:
11242     case OPC_CMP_LE_D:
11243     case OPC_CMP_NGT_D:
11244         check_insn_opc_removed(ctx, ISA_MIPS_R6);
11245         if (ctx->opcode & (1 << 6)) {
11246             gen_cmpabs_d(ctx, func - 48, ft, fs, cc);
11247         } else {
11248             gen_cmp_d(ctx, func - 48, ft, fs, cc);
11249         }
11250         break;
11251     case OPC_CVT_S_D:
11252         check_cp1_registers(ctx, fs);
11253         {
11254             TCGv_i32 fp32 = tcg_temp_new_i32();
11255             TCGv_i64 fp64 = tcg_temp_new_i64();
11256 
11257             gen_load_fpr64(ctx, fp64, fs);
11258             gen_helper_float_cvts_d(fp32, cpu_env, fp64);
11259             tcg_temp_free_i64(fp64);
11260             gen_store_fpr32(ctx, fp32, fd);
11261             tcg_temp_free_i32(fp32);
11262         }
11263         break;
11264     case OPC_CVT_W_D:
11265         check_cp1_registers(ctx, fs);
11266         {
11267             TCGv_i32 fp32 = tcg_temp_new_i32();
11268             TCGv_i64 fp64 = tcg_temp_new_i64();
11269 
11270             gen_load_fpr64(ctx, fp64, fs);
11271             if (ctx->nan2008) {
11272                 gen_helper_float_cvt_2008_w_d(fp32, cpu_env, fp64);
11273             } else {
11274                 gen_helper_float_cvt_w_d(fp32, cpu_env, fp64);
11275             }
11276             tcg_temp_free_i64(fp64);
11277             gen_store_fpr32(ctx, fp32, fd);
11278             tcg_temp_free_i32(fp32);
11279         }
11280         break;
11281     case OPC_CVT_L_D:
11282         check_cp1_64bitmode(ctx);
11283         {
11284             TCGv_i64 fp0 = tcg_temp_new_i64();
11285 
11286             gen_load_fpr64(ctx, fp0, fs);
11287             if (ctx->nan2008) {
11288                 gen_helper_float_cvt_2008_l_d(fp0, cpu_env, fp0);
11289             } else {
11290                 gen_helper_float_cvt_l_d(fp0, cpu_env, fp0);
11291             }
11292             gen_store_fpr64(ctx, fp0, fd);
11293             tcg_temp_free_i64(fp0);
11294         }
11295         break;
11296     case OPC_CVT_S_W:
11297         {
11298             TCGv_i32 fp0 = tcg_temp_new_i32();
11299 
11300             gen_load_fpr32(ctx, fp0, fs);
11301             gen_helper_float_cvts_w(fp0, cpu_env, fp0);
11302             gen_store_fpr32(ctx, fp0, fd);
11303             tcg_temp_free_i32(fp0);
11304         }
11305         break;
11306     case OPC_CVT_D_W:
11307         check_cp1_registers(ctx, fd);
11308         {
11309             TCGv_i32 fp32 = tcg_temp_new_i32();
11310             TCGv_i64 fp64 = tcg_temp_new_i64();
11311 
11312             gen_load_fpr32(ctx, fp32, fs);
11313             gen_helper_float_cvtd_w(fp64, cpu_env, fp32);
11314             tcg_temp_free_i32(fp32);
11315             gen_store_fpr64(ctx, fp64, fd);
11316             tcg_temp_free_i64(fp64);
11317         }
11318         break;
11319     case OPC_CVT_S_L:
11320         check_cp1_64bitmode(ctx);
11321         {
11322             TCGv_i32 fp32 = tcg_temp_new_i32();
11323             TCGv_i64 fp64 = tcg_temp_new_i64();
11324 
11325             gen_load_fpr64(ctx, fp64, fs);
11326             gen_helper_float_cvts_l(fp32, cpu_env, fp64);
11327             tcg_temp_free_i64(fp64);
11328             gen_store_fpr32(ctx, fp32, fd);
11329             tcg_temp_free_i32(fp32);
11330         }
11331         break;
11332     case OPC_CVT_D_L:
11333         check_cp1_64bitmode(ctx);
11334         {
11335             TCGv_i64 fp0 = tcg_temp_new_i64();
11336 
11337             gen_load_fpr64(ctx, fp0, fs);
11338             gen_helper_float_cvtd_l(fp0, cpu_env, fp0);
11339             gen_store_fpr64(ctx, fp0, fd);
11340             tcg_temp_free_i64(fp0);
11341         }
11342         break;
11343     case OPC_CVT_PS_PW:
11344         check_ps(ctx);
11345         {
11346             TCGv_i64 fp0 = tcg_temp_new_i64();
11347 
11348             gen_load_fpr64(ctx, fp0, fs);
11349             gen_helper_float_cvtps_pw(fp0, cpu_env, fp0);
11350             gen_store_fpr64(ctx, fp0, fd);
11351             tcg_temp_free_i64(fp0);
11352         }
11353         break;
11354     case OPC_ADD_PS:
11355         check_ps(ctx);
11356         {
11357             TCGv_i64 fp0 = tcg_temp_new_i64();
11358             TCGv_i64 fp1 = tcg_temp_new_i64();
11359 
11360             gen_load_fpr64(ctx, fp0, fs);
11361             gen_load_fpr64(ctx, fp1, ft);
11362             gen_helper_float_add_ps(fp0, cpu_env, fp0, fp1);
11363             tcg_temp_free_i64(fp1);
11364             gen_store_fpr64(ctx, fp0, fd);
11365             tcg_temp_free_i64(fp0);
11366         }
11367         break;
11368     case OPC_SUB_PS:
11369         check_ps(ctx);
11370         {
11371             TCGv_i64 fp0 = tcg_temp_new_i64();
11372             TCGv_i64 fp1 = tcg_temp_new_i64();
11373 
11374             gen_load_fpr64(ctx, fp0, fs);
11375             gen_load_fpr64(ctx, fp1, ft);
11376             gen_helper_float_sub_ps(fp0, cpu_env, fp0, fp1);
11377             tcg_temp_free_i64(fp1);
11378             gen_store_fpr64(ctx, fp0, fd);
11379             tcg_temp_free_i64(fp0);
11380         }
11381         break;
11382     case OPC_MUL_PS:
11383         check_ps(ctx);
11384         {
11385             TCGv_i64 fp0 = tcg_temp_new_i64();
11386             TCGv_i64 fp1 = tcg_temp_new_i64();
11387 
11388             gen_load_fpr64(ctx, fp0, fs);
11389             gen_load_fpr64(ctx, fp1, ft);
11390             gen_helper_float_mul_ps(fp0, cpu_env, fp0, fp1);
11391             tcg_temp_free_i64(fp1);
11392             gen_store_fpr64(ctx, fp0, fd);
11393             tcg_temp_free_i64(fp0);
11394         }
11395         break;
11396     case OPC_ABS_PS:
11397         check_ps(ctx);
11398         {
11399             TCGv_i64 fp0 = tcg_temp_new_i64();
11400 
11401             gen_load_fpr64(ctx, fp0, fs);
11402             gen_helper_float_abs_ps(fp0, fp0);
11403             gen_store_fpr64(ctx, fp0, fd);
11404             tcg_temp_free_i64(fp0);
11405         }
11406         break;
11407     case OPC_MOV_PS:
11408         check_ps(ctx);
11409         {
11410             TCGv_i64 fp0 = tcg_temp_new_i64();
11411 
11412             gen_load_fpr64(ctx, fp0, fs);
11413             gen_store_fpr64(ctx, fp0, fd);
11414             tcg_temp_free_i64(fp0);
11415         }
11416         break;
11417     case OPC_NEG_PS:
11418         check_ps(ctx);
11419         {
11420             TCGv_i64 fp0 = tcg_temp_new_i64();
11421 
11422             gen_load_fpr64(ctx, fp0, fs);
11423             gen_helper_float_chs_ps(fp0, fp0);
11424             gen_store_fpr64(ctx, fp0, fd);
11425             tcg_temp_free_i64(fp0);
11426         }
11427         break;
11428     case OPC_MOVCF_PS:
11429         check_ps(ctx);
11430         gen_movcf_ps(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1);
11431         break;
11432     case OPC_MOVZ_PS:
11433         check_ps(ctx);
11434         {
11435             TCGLabel *l1 = gen_new_label();
11436             TCGv_i64 fp0;
11437 
11438             if (ft != 0) {
11439                 tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
11440             }
11441             fp0 = tcg_temp_new_i64();
11442             gen_load_fpr64(ctx, fp0, fs);
11443             gen_store_fpr64(ctx, fp0, fd);
11444             tcg_temp_free_i64(fp0);
11445             gen_set_label(l1);
11446         }
11447         break;
11448     case OPC_MOVN_PS:
11449         check_ps(ctx);
11450         {
11451             TCGLabel *l1 = gen_new_label();
11452             TCGv_i64 fp0;
11453 
11454             if (ft != 0) {
11455                 tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
11456                 fp0 = tcg_temp_new_i64();
11457                 gen_load_fpr64(ctx, fp0, fs);
11458                 gen_store_fpr64(ctx, fp0, fd);
11459                 tcg_temp_free_i64(fp0);
11460                 gen_set_label(l1);
11461             }
11462         }
11463         break;
11464     case OPC_ADDR_PS:
11465         check_ps(ctx);
11466         {
11467             TCGv_i64 fp0 = tcg_temp_new_i64();
11468             TCGv_i64 fp1 = tcg_temp_new_i64();
11469 
11470             gen_load_fpr64(ctx, fp0, ft);
11471             gen_load_fpr64(ctx, fp1, fs);
11472             gen_helper_float_addr_ps(fp0, cpu_env, fp0, fp1);
11473             tcg_temp_free_i64(fp1);
11474             gen_store_fpr64(ctx, fp0, fd);
11475             tcg_temp_free_i64(fp0);
11476         }
11477         break;
11478     case OPC_MULR_PS:
11479         check_ps(ctx);
11480         {
11481             TCGv_i64 fp0 = tcg_temp_new_i64();
11482             TCGv_i64 fp1 = tcg_temp_new_i64();
11483 
11484             gen_load_fpr64(ctx, fp0, ft);
11485             gen_load_fpr64(ctx, fp1, fs);
11486             gen_helper_float_mulr_ps(fp0, cpu_env, fp0, fp1);
11487             tcg_temp_free_i64(fp1);
11488             gen_store_fpr64(ctx, fp0, fd);
11489             tcg_temp_free_i64(fp0);
11490         }
11491         break;
11492     case OPC_RECIP2_PS:
11493         check_ps(ctx);
11494         {
11495             TCGv_i64 fp0 = tcg_temp_new_i64();
11496             TCGv_i64 fp1 = tcg_temp_new_i64();
11497 
11498             gen_load_fpr64(ctx, fp0, fs);
11499             gen_load_fpr64(ctx, fp1, ft);
11500             gen_helper_float_recip2_ps(fp0, cpu_env, fp0, fp1);
11501             tcg_temp_free_i64(fp1);
11502             gen_store_fpr64(ctx, fp0, fd);
11503             tcg_temp_free_i64(fp0);
11504         }
11505         break;
11506     case OPC_RECIP1_PS:
11507         check_ps(ctx);
11508         {
11509             TCGv_i64 fp0 = tcg_temp_new_i64();
11510 
11511             gen_load_fpr64(ctx, fp0, fs);
11512             gen_helper_float_recip1_ps(fp0, cpu_env, fp0);
11513             gen_store_fpr64(ctx, fp0, fd);
11514             tcg_temp_free_i64(fp0);
11515         }
11516         break;
11517     case OPC_RSQRT1_PS:
11518         check_ps(ctx);
11519         {
11520             TCGv_i64 fp0 = tcg_temp_new_i64();
11521 
11522             gen_load_fpr64(ctx, fp0, fs);
11523             gen_helper_float_rsqrt1_ps(fp0, cpu_env, fp0);
11524             gen_store_fpr64(ctx, fp0, fd);
11525             tcg_temp_free_i64(fp0);
11526         }
11527         break;
11528     case OPC_RSQRT2_PS:
11529         check_ps(ctx);
11530         {
11531             TCGv_i64 fp0 = tcg_temp_new_i64();
11532             TCGv_i64 fp1 = tcg_temp_new_i64();
11533 
11534             gen_load_fpr64(ctx, fp0, fs);
11535             gen_load_fpr64(ctx, fp1, ft);
11536             gen_helper_float_rsqrt2_ps(fp0, cpu_env, fp0, fp1);
11537             tcg_temp_free_i64(fp1);
11538             gen_store_fpr64(ctx, fp0, fd);
11539             tcg_temp_free_i64(fp0);
11540         }
11541         break;
11542     case OPC_CVT_S_PU:
11543         check_cp1_64bitmode(ctx);
11544         {
11545             TCGv_i32 fp0 = tcg_temp_new_i32();
11546 
11547             gen_load_fpr32h(ctx, fp0, fs);
11548             gen_helper_float_cvts_pu(fp0, cpu_env, fp0);
11549             gen_store_fpr32(ctx, fp0, fd);
11550             tcg_temp_free_i32(fp0);
11551         }
11552         break;
11553     case OPC_CVT_PW_PS:
11554         check_ps(ctx);
11555         {
11556             TCGv_i64 fp0 = tcg_temp_new_i64();
11557 
11558             gen_load_fpr64(ctx, fp0, fs);
11559             gen_helper_float_cvtpw_ps(fp0, cpu_env, fp0);
11560             gen_store_fpr64(ctx, fp0, fd);
11561             tcg_temp_free_i64(fp0);
11562         }
11563         break;
11564     case OPC_CVT_S_PL:
11565         check_cp1_64bitmode(ctx);
11566         {
11567             TCGv_i32 fp0 = tcg_temp_new_i32();
11568 
11569             gen_load_fpr32(ctx, fp0, fs);
11570             gen_helper_float_cvts_pl(fp0, cpu_env, fp0);
11571             gen_store_fpr32(ctx, fp0, fd);
11572             tcg_temp_free_i32(fp0);
11573         }
11574         break;
11575     case OPC_PLL_PS:
11576         check_ps(ctx);
11577         {
11578             TCGv_i32 fp0 = tcg_temp_new_i32();
11579             TCGv_i32 fp1 = tcg_temp_new_i32();
11580 
11581             gen_load_fpr32(ctx, fp0, fs);
11582             gen_load_fpr32(ctx, fp1, ft);
11583             gen_store_fpr32h(ctx, fp0, fd);
11584             gen_store_fpr32(ctx, fp1, fd);
11585             tcg_temp_free_i32(fp0);
11586             tcg_temp_free_i32(fp1);
11587         }
11588         break;
11589     case OPC_PLU_PS:
11590         check_ps(ctx);
11591         {
11592             TCGv_i32 fp0 = tcg_temp_new_i32();
11593             TCGv_i32 fp1 = tcg_temp_new_i32();
11594 
11595             gen_load_fpr32(ctx, fp0, fs);
11596             gen_load_fpr32h(ctx, fp1, ft);
11597             gen_store_fpr32(ctx, fp1, fd);
11598             gen_store_fpr32h(ctx, fp0, fd);
11599             tcg_temp_free_i32(fp0);
11600             tcg_temp_free_i32(fp1);
11601         }
11602         break;
11603     case OPC_PUL_PS:
11604         check_ps(ctx);
11605         {
11606             TCGv_i32 fp0 = tcg_temp_new_i32();
11607             TCGv_i32 fp1 = tcg_temp_new_i32();
11608 
11609             gen_load_fpr32h(ctx, fp0, fs);
11610             gen_load_fpr32(ctx, fp1, ft);
11611             gen_store_fpr32(ctx, fp1, fd);
11612             gen_store_fpr32h(ctx, fp0, fd);
11613             tcg_temp_free_i32(fp0);
11614             tcg_temp_free_i32(fp1);
11615         }
11616         break;
11617     case OPC_PUU_PS:
11618         check_ps(ctx);
11619         {
11620             TCGv_i32 fp0 = tcg_temp_new_i32();
11621             TCGv_i32 fp1 = tcg_temp_new_i32();
11622 
11623             gen_load_fpr32h(ctx, fp0, fs);
11624             gen_load_fpr32h(ctx, fp1, ft);
11625             gen_store_fpr32(ctx, fp1, fd);
11626             gen_store_fpr32h(ctx, fp0, fd);
11627             tcg_temp_free_i32(fp0);
11628             tcg_temp_free_i32(fp1);
11629         }
11630         break;
11631     case OPC_CMP_F_PS:
11632     case OPC_CMP_UN_PS:
11633     case OPC_CMP_EQ_PS:
11634     case OPC_CMP_UEQ_PS:
11635     case OPC_CMP_OLT_PS:
11636     case OPC_CMP_ULT_PS:
11637     case OPC_CMP_OLE_PS:
11638     case OPC_CMP_ULE_PS:
11639     case OPC_CMP_SF_PS:
11640     case OPC_CMP_NGLE_PS:
11641     case OPC_CMP_SEQ_PS:
11642     case OPC_CMP_NGL_PS:
11643     case OPC_CMP_LT_PS:
11644     case OPC_CMP_NGE_PS:
11645     case OPC_CMP_LE_PS:
11646     case OPC_CMP_NGT_PS:
11647         if (ctx->opcode & (1 << 6)) {
11648             gen_cmpabs_ps(ctx, func - 48, ft, fs, cc);
11649         } else {
11650             gen_cmp_ps(ctx, func - 48, ft, fs, cc);
11651         }
11652         break;
11653     default:
11654         MIPS_INVAL("farith");
11655         gen_reserved_instruction(ctx);
11656         return;
11657     }
11658 }
11659 
11660 /* Coprocessor 3 (FPU) */
11661 static void gen_flt3_ldst(DisasContext *ctx, uint32_t opc,
11662                           int fd, int fs, int base, int index)
11663 {
11664     TCGv t0 = tcg_temp_new();
11665 
11666     if (base == 0) {
11667         gen_load_gpr(t0, index);
11668     } else if (index == 0) {
11669         gen_load_gpr(t0, base);
11670     } else {
11671         gen_op_addr_add(ctx, t0, cpu_gpr[base], cpu_gpr[index]);
11672     }
11673     /*
11674      * Don't do NOP if destination is zero: we must perform the actual
11675      * memory access.
11676      */
11677     switch (opc) {
11678     case OPC_LWXC1:
11679         check_cop1x(ctx);
11680         {
11681             TCGv_i32 fp0 = tcg_temp_new_i32();
11682 
11683             tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL);
11684             tcg_gen_trunc_tl_i32(fp0, t0);
11685             gen_store_fpr32(ctx, fp0, fd);
11686             tcg_temp_free_i32(fp0);
11687         }
11688         break;
11689     case OPC_LDXC1:
11690         check_cop1x(ctx);
11691         check_cp1_registers(ctx, fd);
11692         {
11693             TCGv_i64 fp0 = tcg_temp_new_i64();
11694             tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
11695             gen_store_fpr64(ctx, fp0, fd);
11696             tcg_temp_free_i64(fp0);
11697         }
11698         break;
11699     case OPC_LUXC1:
11700         check_cp1_64bitmode(ctx);
11701         tcg_gen_andi_tl(t0, t0, ~0x7);
11702         {
11703             TCGv_i64 fp0 = tcg_temp_new_i64();
11704 
11705             tcg_gen_qemu_ld_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
11706             gen_store_fpr64(ctx, fp0, fd);
11707             tcg_temp_free_i64(fp0);
11708         }
11709         break;
11710     case OPC_SWXC1:
11711         check_cop1x(ctx);
11712         {
11713             TCGv_i32 fp0 = tcg_temp_new_i32();
11714             gen_load_fpr32(ctx, fp0, fs);
11715             tcg_gen_qemu_st_i32(fp0, t0, ctx->mem_idx, MO_TEUL);
11716             tcg_temp_free_i32(fp0);
11717         }
11718         break;
11719     case OPC_SDXC1:
11720         check_cop1x(ctx);
11721         check_cp1_registers(ctx, fs);
11722         {
11723             TCGv_i64 fp0 = tcg_temp_new_i64();
11724             gen_load_fpr64(ctx, fp0, fs);
11725             tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
11726             tcg_temp_free_i64(fp0);
11727         }
11728         break;
11729     case OPC_SUXC1:
11730         check_cp1_64bitmode(ctx);
11731         tcg_gen_andi_tl(t0, t0, ~0x7);
11732         {
11733             TCGv_i64 fp0 = tcg_temp_new_i64();
11734             gen_load_fpr64(ctx, fp0, fs);
11735             tcg_gen_qemu_st_i64(fp0, t0, ctx->mem_idx, MO_TEQ);
11736             tcg_temp_free_i64(fp0);
11737         }
11738         break;
11739     }
11740     tcg_temp_free(t0);
11741 }
11742 
11743 static void gen_flt3_arith(DisasContext *ctx, uint32_t opc,
11744                            int fd, int fr, int fs, int ft)
11745 {
11746     switch (opc) {
11747     case OPC_ALNV_PS:
11748         check_ps(ctx);
11749         {
11750             TCGv t0 = tcg_temp_local_new();
11751             TCGv_i32 fp = tcg_temp_new_i32();
11752             TCGv_i32 fph = tcg_temp_new_i32();
11753             TCGLabel *l1 = gen_new_label();
11754             TCGLabel *l2 = gen_new_label();
11755 
11756             gen_load_gpr(t0, fr);
11757             tcg_gen_andi_tl(t0, t0, 0x7);
11758 
11759             tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0, l1);
11760             gen_load_fpr32(ctx, fp, fs);
11761             gen_load_fpr32h(ctx, fph, fs);
11762             gen_store_fpr32(ctx, fp, fd);
11763             gen_store_fpr32h(ctx, fph, fd);
11764             tcg_gen_br(l2);
11765             gen_set_label(l1);
11766             tcg_gen_brcondi_tl(TCG_COND_NE, t0, 4, l2);
11767             tcg_temp_free(t0);
11768 #ifdef TARGET_WORDS_BIGENDIAN
11769             gen_load_fpr32(ctx, fp, fs);
11770             gen_load_fpr32h(ctx, fph, ft);
11771             gen_store_fpr32h(ctx, fp, fd);
11772             gen_store_fpr32(ctx, fph, fd);
11773 #else
11774             gen_load_fpr32h(ctx, fph, fs);
11775             gen_load_fpr32(ctx, fp, ft);
11776             gen_store_fpr32(ctx, fph, fd);
11777             gen_store_fpr32h(ctx, fp, fd);
11778 #endif
11779             gen_set_label(l2);
11780             tcg_temp_free_i32(fp);
11781             tcg_temp_free_i32(fph);
11782         }
11783         break;
11784     case OPC_MADD_S:
11785         check_cop1x(ctx);
11786         {
11787             TCGv_i32 fp0 = tcg_temp_new_i32();
11788             TCGv_i32 fp1 = tcg_temp_new_i32();
11789             TCGv_i32 fp2 = tcg_temp_new_i32();
11790 
11791             gen_load_fpr32(ctx, fp0, fs);
11792             gen_load_fpr32(ctx, fp1, ft);
11793             gen_load_fpr32(ctx, fp2, fr);
11794             gen_helper_float_madd_s(fp2, cpu_env, fp0, fp1, fp2);
11795             tcg_temp_free_i32(fp0);
11796             tcg_temp_free_i32(fp1);
11797             gen_store_fpr32(ctx, fp2, fd);
11798             tcg_temp_free_i32(fp2);
11799         }
11800         break;
11801     case OPC_MADD_D:
11802         check_cop1x(ctx);
11803         check_cp1_registers(ctx, fd | fs | ft | fr);
11804         {
11805             TCGv_i64 fp0 = tcg_temp_new_i64();
11806             TCGv_i64 fp1 = tcg_temp_new_i64();
11807             TCGv_i64 fp2 = tcg_temp_new_i64();
11808 
11809             gen_load_fpr64(ctx, fp0, fs);
11810             gen_load_fpr64(ctx, fp1, ft);
11811             gen_load_fpr64(ctx, fp2, fr);
11812             gen_helper_float_madd_d(fp2, cpu_env, fp0, fp1, fp2);
11813             tcg_temp_free_i64(fp0);
11814             tcg_temp_free_i64(fp1);
11815             gen_store_fpr64(ctx, fp2, fd);
11816             tcg_temp_free_i64(fp2);
11817         }
11818         break;
11819     case OPC_MADD_PS:
11820         check_ps(ctx);
11821         {
11822             TCGv_i64 fp0 = tcg_temp_new_i64();
11823             TCGv_i64 fp1 = tcg_temp_new_i64();
11824             TCGv_i64 fp2 = tcg_temp_new_i64();
11825 
11826             gen_load_fpr64(ctx, fp0, fs);
11827             gen_load_fpr64(ctx, fp1, ft);
11828             gen_load_fpr64(ctx, fp2, fr);
11829             gen_helper_float_madd_ps(fp2, cpu_env, fp0, fp1, fp2);
11830             tcg_temp_free_i64(fp0);
11831             tcg_temp_free_i64(fp1);
11832             gen_store_fpr64(ctx, fp2, fd);
11833             tcg_temp_free_i64(fp2);
11834         }
11835         break;
11836     case OPC_MSUB_S:
11837         check_cop1x(ctx);
11838         {
11839             TCGv_i32 fp0 = tcg_temp_new_i32();
11840             TCGv_i32 fp1 = tcg_temp_new_i32();
11841             TCGv_i32 fp2 = tcg_temp_new_i32();
11842 
11843             gen_load_fpr32(ctx, fp0, fs);
11844             gen_load_fpr32(ctx, fp1, ft);
11845             gen_load_fpr32(ctx, fp2, fr);
11846             gen_helper_float_msub_s(fp2, cpu_env, fp0, fp1, fp2);
11847             tcg_temp_free_i32(fp0);
11848             tcg_temp_free_i32(fp1);
11849             gen_store_fpr32(ctx, fp2, fd);
11850             tcg_temp_free_i32(fp2);
11851         }
11852         break;
11853     case OPC_MSUB_D:
11854         check_cop1x(ctx);
11855         check_cp1_registers(ctx, fd | fs | ft | fr);
11856         {
11857             TCGv_i64 fp0 = tcg_temp_new_i64();
11858             TCGv_i64 fp1 = tcg_temp_new_i64();
11859             TCGv_i64 fp2 = tcg_temp_new_i64();
11860 
11861             gen_load_fpr64(ctx, fp0, fs);
11862             gen_load_fpr64(ctx, fp1, ft);
11863             gen_load_fpr64(ctx, fp2, fr);
11864             gen_helper_float_msub_d(fp2, cpu_env, fp0, fp1, fp2);
11865             tcg_temp_free_i64(fp0);
11866             tcg_temp_free_i64(fp1);
11867             gen_store_fpr64(ctx, fp2, fd);
11868             tcg_temp_free_i64(fp2);
11869         }
11870         break;
11871     case OPC_MSUB_PS:
11872         check_ps(ctx);
11873         {
11874             TCGv_i64 fp0 = tcg_temp_new_i64();
11875             TCGv_i64 fp1 = tcg_temp_new_i64();
11876             TCGv_i64 fp2 = tcg_temp_new_i64();
11877 
11878             gen_load_fpr64(ctx, fp0, fs);
11879             gen_load_fpr64(ctx, fp1, ft);
11880             gen_load_fpr64(ctx, fp2, fr);
11881             gen_helper_float_msub_ps(fp2, cpu_env, fp0, fp1, fp2);
11882             tcg_temp_free_i64(fp0);
11883             tcg_temp_free_i64(fp1);
11884             gen_store_fpr64(ctx, fp2, fd);
11885             tcg_temp_free_i64(fp2);
11886         }
11887         break;
11888     case OPC_NMADD_S:
11889         check_cop1x(ctx);
11890         {
11891             TCGv_i32 fp0 = tcg_temp_new_i32();
11892             TCGv_i32 fp1 = tcg_temp_new_i32();
11893             TCGv_i32 fp2 = tcg_temp_new_i32();
11894 
11895             gen_load_fpr32(ctx, fp0, fs);
11896             gen_load_fpr32(ctx, fp1, ft);
11897             gen_load_fpr32(ctx, fp2, fr);
11898             gen_helper_float_nmadd_s(fp2, cpu_env, fp0, fp1, fp2);
11899             tcg_temp_free_i32(fp0);
11900             tcg_temp_free_i32(fp1);
11901             gen_store_fpr32(ctx, fp2, fd);
11902             tcg_temp_free_i32(fp2);
11903         }
11904         break;
11905     case OPC_NMADD_D:
11906         check_cop1x(ctx);
11907         check_cp1_registers(ctx, fd | fs | ft | fr);
11908         {
11909             TCGv_i64 fp0 = tcg_temp_new_i64();
11910             TCGv_i64 fp1 = tcg_temp_new_i64();
11911             TCGv_i64 fp2 = tcg_temp_new_i64();
11912 
11913             gen_load_fpr64(ctx, fp0, fs);
11914             gen_load_fpr64(ctx, fp1, ft);
11915             gen_load_fpr64(ctx, fp2, fr);
11916             gen_helper_float_nmadd_d(fp2, cpu_env, fp0, fp1, fp2);
11917             tcg_temp_free_i64(fp0);
11918             tcg_temp_free_i64(fp1);
11919             gen_store_fpr64(ctx, fp2, fd);
11920             tcg_temp_free_i64(fp2);
11921         }
11922         break;
11923     case OPC_NMADD_PS:
11924         check_ps(ctx);
11925         {
11926             TCGv_i64 fp0 = tcg_temp_new_i64();
11927             TCGv_i64 fp1 = tcg_temp_new_i64();
11928             TCGv_i64 fp2 = tcg_temp_new_i64();
11929 
11930             gen_load_fpr64(ctx, fp0, fs);
11931             gen_load_fpr64(ctx, fp1, ft);
11932             gen_load_fpr64(ctx, fp2, fr);
11933             gen_helper_float_nmadd_ps(fp2, cpu_env, fp0, fp1, fp2);
11934             tcg_temp_free_i64(fp0);
11935             tcg_temp_free_i64(fp1);
11936             gen_store_fpr64(ctx, fp2, fd);
11937             tcg_temp_free_i64(fp2);
11938         }
11939         break;
11940     case OPC_NMSUB_S:
11941         check_cop1x(ctx);
11942         {
11943             TCGv_i32 fp0 = tcg_temp_new_i32();
11944             TCGv_i32 fp1 = tcg_temp_new_i32();
11945             TCGv_i32 fp2 = tcg_temp_new_i32();
11946 
11947             gen_load_fpr32(ctx, fp0, fs);
11948             gen_load_fpr32(ctx, fp1, ft);
11949             gen_load_fpr32(ctx, fp2, fr);
11950             gen_helper_float_nmsub_s(fp2, cpu_env, fp0, fp1, fp2);
11951             tcg_temp_free_i32(fp0);
11952             tcg_temp_free_i32(fp1);
11953             gen_store_fpr32(ctx, fp2, fd);
11954             tcg_temp_free_i32(fp2);
11955         }
11956         break;
11957     case OPC_NMSUB_D:
11958         check_cop1x(ctx);
11959         check_cp1_registers(ctx, fd | fs | ft | fr);
11960         {
11961             TCGv_i64 fp0 = tcg_temp_new_i64();
11962             TCGv_i64 fp1 = tcg_temp_new_i64();
11963             TCGv_i64 fp2 = tcg_temp_new_i64();
11964 
11965             gen_load_fpr64(ctx, fp0, fs);
11966             gen_load_fpr64(ctx, fp1, ft);
11967             gen_load_fpr64(ctx, fp2, fr);
11968             gen_helper_float_nmsub_d(fp2, cpu_env, fp0, fp1, fp2);
11969             tcg_temp_free_i64(fp0);
11970             tcg_temp_free_i64(fp1);
11971             gen_store_fpr64(ctx, fp2, fd);
11972             tcg_temp_free_i64(fp2);
11973         }
11974         break;
11975     case OPC_NMSUB_PS:
11976         check_ps(ctx);
11977         {
11978             TCGv_i64 fp0 = tcg_temp_new_i64();
11979             TCGv_i64 fp1 = tcg_temp_new_i64();
11980             TCGv_i64 fp2 = tcg_temp_new_i64();
11981 
11982             gen_load_fpr64(ctx, fp0, fs);
11983             gen_load_fpr64(ctx, fp1, ft);
11984             gen_load_fpr64(ctx, fp2, fr);
11985             gen_helper_float_nmsub_ps(fp2, cpu_env, fp0, fp1, fp2);
11986             tcg_temp_free_i64(fp0);
11987             tcg_temp_free_i64(fp1);
11988             gen_store_fpr64(ctx, fp2, fd);
11989             tcg_temp_free_i64(fp2);
11990         }
11991         break;
11992     default:
11993         MIPS_INVAL("flt3_arith");
11994         gen_reserved_instruction(ctx);
11995         return;
11996     }
11997 }
11998 
11999 void gen_rdhwr(DisasContext *ctx, int rt, int rd, int sel)
12000 {
12001     TCGv t0;
12002 
12003 #if !defined(CONFIG_USER_ONLY)
12004     /*
12005      * The Linux kernel will emulate rdhwr if it's not supported natively.
12006      * Therefore only check the ISA in system mode.
12007      */
12008     check_insn(ctx, ISA_MIPS_R2);
12009 #endif
12010     t0 = tcg_temp_new();
12011 
12012     switch (rd) {
12013     case 0:
12014         gen_helper_rdhwr_cpunum(t0, cpu_env);
12015         gen_store_gpr(t0, rt);
12016         break;
12017     case 1:
12018         gen_helper_rdhwr_synci_step(t0, cpu_env);
12019         gen_store_gpr(t0, rt);
12020         break;
12021     case 2:
12022         if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
12023             gen_io_start();
12024         }
12025         gen_helper_rdhwr_cc(t0, cpu_env);
12026         gen_store_gpr(t0, rt);
12027         /*
12028          * Break the TB to be able to take timer interrupts immediately
12029          * after reading count. DISAS_STOP isn't sufficient, we need to ensure
12030          * we break completely out of translated code.
12031          */
12032         gen_save_pc(ctx->base.pc_next + 4);
12033         ctx->base.is_jmp = DISAS_EXIT;
12034         break;
12035     case 3:
12036         gen_helper_rdhwr_ccres(t0, cpu_env);
12037         gen_store_gpr(t0, rt);
12038         break;
12039     case 4:
12040         check_insn(ctx, ISA_MIPS_R6);
12041         if (sel != 0) {
12042             /*
12043              * Performance counter registers are not implemented other than
12044              * control register 0.
12045              */
12046             generate_exception(ctx, EXCP_RI);
12047         }
12048         gen_helper_rdhwr_performance(t0, cpu_env);
12049         gen_store_gpr(t0, rt);
12050         break;
12051     case 5:
12052         check_insn(ctx, ISA_MIPS_R6);
12053         gen_helper_rdhwr_xnp(t0, cpu_env);
12054         gen_store_gpr(t0, rt);
12055         break;
12056     case 29:
12057 #if defined(CONFIG_USER_ONLY)
12058         tcg_gen_ld_tl(t0, cpu_env,
12059                       offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
12060         gen_store_gpr(t0, rt);
12061         break;
12062 #else
12063         if ((ctx->hflags & MIPS_HFLAG_CP0) ||
12064             (ctx->hflags & MIPS_HFLAG_HWRENA_ULR)) {
12065             tcg_gen_ld_tl(t0, cpu_env,
12066                           offsetof(CPUMIPSState, active_tc.CP0_UserLocal));
12067             gen_store_gpr(t0, rt);
12068         } else {
12069             gen_reserved_instruction(ctx);
12070         }
12071         break;
12072 #endif
12073     default:            /* Invalid */
12074         MIPS_INVAL("rdhwr");
12075         gen_reserved_instruction(ctx);
12076         break;
12077     }
12078     tcg_temp_free(t0);
12079 }
12080 
12081 static inline void clear_branch_hflags(DisasContext *ctx)
12082 {
12083     ctx->hflags &= ~MIPS_HFLAG_BMASK;
12084     if (ctx->base.is_jmp == DISAS_NEXT) {
12085         save_cpu_state(ctx, 0);
12086     } else {
12087         /*
12088          * It is not safe to save ctx->hflags as hflags may be changed
12089          * in execution time by the instruction in delay / forbidden slot.
12090          */
12091         tcg_gen_andi_i32(hflags, hflags, ~MIPS_HFLAG_BMASK);
12092     }
12093 }
12094 
12095 static void gen_branch(DisasContext *ctx, int insn_bytes)
12096 {
12097     if (ctx->hflags & MIPS_HFLAG_BMASK) {
12098         int proc_hflags = ctx->hflags & MIPS_HFLAG_BMASK;
12099         /* Branches completion */
12100         clear_branch_hflags(ctx);
12101         ctx->base.is_jmp = DISAS_NORETURN;
12102         /* FIXME: Need to clear can_do_io.  */
12103         switch (proc_hflags & MIPS_HFLAG_BMASK_BASE) {
12104         case MIPS_HFLAG_FBNSLOT:
12105             gen_goto_tb(ctx, 0, ctx->base.pc_next + insn_bytes);
12106             break;
12107         case MIPS_HFLAG_B:
12108             /* unconditional branch */
12109             if (proc_hflags & MIPS_HFLAG_BX) {
12110                 tcg_gen_xori_i32(hflags, hflags, MIPS_HFLAG_M16);
12111             }
12112             gen_goto_tb(ctx, 0, ctx->btarget);
12113             break;
12114         case MIPS_HFLAG_BL:
12115             /* blikely taken case */
12116             gen_goto_tb(ctx, 0, ctx->btarget);
12117             break;
12118         case MIPS_HFLAG_BC:
12119             /* Conditional branch */
12120             {
12121                 TCGLabel *l1 = gen_new_label();
12122 
12123                 tcg_gen_brcondi_tl(TCG_COND_NE, bcond, 0, l1);
12124                 gen_goto_tb(ctx, 1, ctx->base.pc_next + insn_bytes);
12125                 gen_set_label(l1);
12126                 gen_goto_tb(ctx, 0, ctx->btarget);
12127             }
12128             break;
12129         case MIPS_HFLAG_BR:
12130             /* unconditional branch to register */
12131             if (ctx->insn_flags & (ASE_MIPS16 | ASE_MICROMIPS)) {
12132                 TCGv t0 = tcg_temp_new();
12133                 TCGv_i32 t1 = tcg_temp_new_i32();
12134 
12135                 tcg_gen_andi_tl(t0, btarget, 0x1);
12136                 tcg_gen_trunc_tl_i32(t1, t0);
12137                 tcg_temp_free(t0);
12138                 tcg_gen_andi_i32(hflags, hflags, ~(uint32_t)MIPS_HFLAG_M16);
12139                 tcg_gen_shli_i32(t1, t1, MIPS_HFLAG_M16_SHIFT);
12140                 tcg_gen_or_i32(hflags, hflags, t1);
12141                 tcg_temp_free_i32(t1);
12142 
12143                 tcg_gen_andi_tl(cpu_PC, btarget, ~(target_ulong)0x1);
12144             } else {
12145                 tcg_gen_mov_tl(cpu_PC, btarget);
12146             }
12147             if (ctx->base.singlestep_enabled) {
12148                 save_cpu_state(ctx, 0);
12149                 gen_helper_raise_exception_debug(cpu_env);
12150             }
12151             tcg_gen_lookup_and_goto_ptr();
12152             break;
12153         default:
12154             LOG_DISAS("unknown branch 0x%x\n", proc_hflags);
12155             gen_reserved_instruction(ctx);
12156         }
12157     }
12158 }
12159 
12160 /* Compact Branches */
12161 static void gen_compute_compact_branch(DisasContext *ctx, uint32_t opc,
12162                                        int rs, int rt, int32_t offset)
12163 {
12164     int bcond_compute = 0;
12165     TCGv t0 = tcg_temp_new();
12166     TCGv t1 = tcg_temp_new();
12167     int m16_lowbit = (ctx->hflags & MIPS_HFLAG_M16) != 0;
12168 
12169     if (ctx->hflags & MIPS_HFLAG_BMASK) {
12170 #ifdef MIPS_DEBUG_DISAS
12171         LOG_DISAS("Branch in delay / forbidden slot at PC 0x" TARGET_FMT_lx
12172                   "\n", ctx->base.pc_next);
12173 #endif
12174         gen_reserved_instruction(ctx);
12175         goto out;
12176     }
12177 
12178     /* Load needed operands and calculate btarget */
12179     switch (opc) {
12180     /* compact branch */
12181     case OPC_BOVC: /* OPC_BEQZALC, OPC_BEQC */
12182     case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC */
12183         gen_load_gpr(t0, rs);
12184         gen_load_gpr(t1, rt);
12185         bcond_compute = 1;
12186         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
12187         if (rs <= rt && rs == 0) {
12188             /* OPC_BEQZALC, OPC_BNEZALC */
12189             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4 + m16_lowbit);
12190         }
12191         break;
12192     case OPC_BLEZC: /* OPC_BGEZC, OPC_BGEC */
12193     case OPC_BGTZC: /* OPC_BLTZC, OPC_BLTC */
12194         gen_load_gpr(t0, rs);
12195         gen_load_gpr(t1, rt);
12196         bcond_compute = 1;
12197         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
12198         break;
12199     case OPC_BLEZALC: /* OPC_BGEZALC, OPC_BGEUC */
12200     case OPC_BGTZALC: /* OPC_BLTZALC, OPC_BLTUC */
12201         if (rs == 0 || rs == rt) {
12202             /* OPC_BLEZALC, OPC_BGEZALC */
12203             /* OPC_BGTZALC, OPC_BLTZALC */
12204             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4 + m16_lowbit);
12205         }
12206         gen_load_gpr(t0, rs);
12207         gen_load_gpr(t1, rt);
12208         bcond_compute = 1;
12209         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
12210         break;
12211     case OPC_BC:
12212     case OPC_BALC:
12213         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
12214         break;
12215     case OPC_BEQZC:
12216     case OPC_BNEZC:
12217         if (rs != 0) {
12218             /* OPC_BEQZC, OPC_BNEZC */
12219             gen_load_gpr(t0, rs);
12220             bcond_compute = 1;
12221             ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
12222         } else {
12223             /* OPC_JIC, OPC_JIALC */
12224             TCGv tbase = tcg_temp_new();
12225             TCGv toffset = tcg_temp_new();
12226 
12227             gen_load_gpr(tbase, rt);
12228             tcg_gen_movi_tl(toffset, offset);
12229             gen_op_addr_add(ctx, btarget, tbase, toffset);
12230             tcg_temp_free(tbase);
12231             tcg_temp_free(toffset);
12232         }
12233         break;
12234     default:
12235         MIPS_INVAL("Compact branch/jump");
12236         gen_reserved_instruction(ctx);
12237         goto out;
12238     }
12239 
12240     if (bcond_compute == 0) {
12241         /* Unconditional compact branch */
12242         switch (opc) {
12243         case OPC_JIALC:
12244             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4 + m16_lowbit);
12245             /* Fallthrough */
12246         case OPC_JIC:
12247             ctx->hflags |= MIPS_HFLAG_BR;
12248             break;
12249         case OPC_BALC:
12250             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4 + m16_lowbit);
12251             /* Fallthrough */
12252         case OPC_BC:
12253             ctx->hflags |= MIPS_HFLAG_B;
12254             break;
12255         default:
12256             MIPS_INVAL("Compact branch/jump");
12257             gen_reserved_instruction(ctx);
12258             goto out;
12259         }
12260 
12261         /* Generating branch here as compact branches don't have delay slot */
12262         gen_branch(ctx, 4);
12263     } else {
12264         /* Conditional compact branch */
12265         TCGLabel *fs = gen_new_label();
12266         save_cpu_state(ctx, 0);
12267 
12268         switch (opc) {
12269         case OPC_BLEZALC: /* OPC_BGEZALC, OPC_BGEUC */
12270             if (rs == 0 && rt != 0) {
12271                 /* OPC_BLEZALC */
12272                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LE), t1, 0, fs);
12273             } else if (rs != 0 && rt != 0 && rs == rt) {
12274                 /* OPC_BGEZALC */
12275                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GE), t1, 0, fs);
12276             } else {
12277                 /* OPC_BGEUC */
12278                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_GEU), t0, t1, fs);
12279             }
12280             break;
12281         case OPC_BGTZALC: /* OPC_BLTZALC, OPC_BLTUC */
12282             if (rs == 0 && rt != 0) {
12283                 /* OPC_BGTZALC */
12284                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GT), t1, 0, fs);
12285             } else if (rs != 0 && rt != 0 && rs == rt) {
12286                 /* OPC_BLTZALC */
12287                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LT), t1, 0, fs);
12288             } else {
12289                 /* OPC_BLTUC */
12290                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_LTU), t0, t1, fs);
12291             }
12292             break;
12293         case OPC_BLEZC: /* OPC_BGEZC, OPC_BGEC */
12294             if (rs == 0 && rt != 0) {
12295                 /* OPC_BLEZC */
12296                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LE), t1, 0, fs);
12297             } else if (rs != 0 && rt != 0 && rs == rt) {
12298                 /* OPC_BGEZC */
12299                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GE), t1, 0, fs);
12300             } else {
12301                 /* OPC_BGEC */
12302                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_GE), t0, t1, fs);
12303             }
12304             break;
12305         case OPC_BGTZC: /* OPC_BLTZC, OPC_BLTC */
12306             if (rs == 0 && rt != 0) {
12307                 /* OPC_BGTZC */
12308                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GT), t1, 0, fs);
12309             } else if (rs != 0 && rt != 0 && rs == rt) {
12310                 /* OPC_BLTZC */
12311                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LT), t1, 0, fs);
12312             } else {
12313                 /* OPC_BLTC */
12314                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_LT), t0, t1, fs);
12315             }
12316             break;
12317         case OPC_BOVC: /* OPC_BEQZALC, OPC_BEQC */
12318         case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC */
12319             if (rs >= rt) {
12320                 /* OPC_BOVC, OPC_BNVC */
12321                 TCGv t2 = tcg_temp_new();
12322                 TCGv t3 = tcg_temp_new();
12323                 TCGv t4 = tcg_temp_new();
12324                 TCGv input_overflow = tcg_temp_new();
12325 
12326                 gen_load_gpr(t0, rs);
12327                 gen_load_gpr(t1, rt);
12328                 tcg_gen_ext32s_tl(t2, t0);
12329                 tcg_gen_setcond_tl(TCG_COND_NE, input_overflow, t2, t0);
12330                 tcg_gen_ext32s_tl(t3, t1);
12331                 tcg_gen_setcond_tl(TCG_COND_NE, t4, t3, t1);
12332                 tcg_gen_or_tl(input_overflow, input_overflow, t4);
12333 
12334                 tcg_gen_add_tl(t4, t2, t3);
12335                 tcg_gen_ext32s_tl(t4, t4);
12336                 tcg_gen_xor_tl(t2, t2, t3);
12337                 tcg_gen_xor_tl(t3, t4, t3);
12338                 tcg_gen_andc_tl(t2, t3, t2);
12339                 tcg_gen_setcondi_tl(TCG_COND_LT, t4, t2, 0);
12340                 tcg_gen_or_tl(t4, t4, input_overflow);
12341                 if (opc == OPC_BOVC) {
12342                     /* OPC_BOVC */
12343                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_NE), t4, 0, fs);
12344                 } else {
12345                     /* OPC_BNVC */
12346                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_EQ), t4, 0, fs);
12347                 }
12348                 tcg_temp_free(input_overflow);
12349                 tcg_temp_free(t4);
12350                 tcg_temp_free(t3);
12351                 tcg_temp_free(t2);
12352             } else if (rs < rt && rs == 0) {
12353                 /* OPC_BEQZALC, OPC_BNEZALC */
12354                 if (opc == OPC_BEQZALC) {
12355                     /* OPC_BEQZALC */
12356                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_EQ), t1, 0, fs);
12357                 } else {
12358                     /* OPC_BNEZALC */
12359                     tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_NE), t1, 0, fs);
12360                 }
12361             } else {
12362                 /* OPC_BEQC, OPC_BNEC */
12363                 if (opc == OPC_BEQC) {
12364                     /* OPC_BEQC */
12365                     tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_EQ), t0, t1, fs);
12366                 } else {
12367                     /* OPC_BNEC */
12368                     tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_NE), t0, t1, fs);
12369                 }
12370             }
12371             break;
12372         case OPC_BEQZC:
12373             tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_EQ), t0, 0, fs);
12374             break;
12375         case OPC_BNEZC:
12376             tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_NE), t0, 0, fs);
12377             break;
12378         default:
12379             MIPS_INVAL("Compact conditional branch/jump");
12380             gen_reserved_instruction(ctx);
12381             goto out;
12382         }
12383 
12384         /* Generating branch here as compact branches don't have delay slot */
12385         gen_goto_tb(ctx, 1, ctx->btarget);
12386         gen_set_label(fs);
12387 
12388         ctx->hflags |= MIPS_HFLAG_FBNSLOT;
12389     }
12390 
12391 out:
12392     tcg_temp_free(t0);
12393     tcg_temp_free(t1);
12394 }
12395 
12396 /* ISA extensions (ASEs) */
12397 /* MIPS16 extension to MIPS32 */
12398 
12399 /* MIPS16 major opcodes */
12400 enum {
12401   M16_OPC_ADDIUSP = 0x00,
12402   M16_OPC_ADDIUPC = 0x01,
12403   M16_OPC_B = 0x02,
12404   M16_OPC_JAL = 0x03,
12405   M16_OPC_BEQZ = 0x04,
12406   M16_OPC_BNEQZ = 0x05,
12407   M16_OPC_SHIFT = 0x06,
12408   M16_OPC_LD = 0x07,
12409   M16_OPC_RRIA = 0x08,
12410   M16_OPC_ADDIU8 = 0x09,
12411   M16_OPC_SLTI = 0x0a,
12412   M16_OPC_SLTIU = 0x0b,
12413   M16_OPC_I8 = 0x0c,
12414   M16_OPC_LI = 0x0d,
12415   M16_OPC_CMPI = 0x0e,
12416   M16_OPC_SD = 0x0f,
12417   M16_OPC_LB = 0x10,
12418   M16_OPC_LH = 0x11,
12419   M16_OPC_LWSP = 0x12,
12420   M16_OPC_LW = 0x13,
12421   M16_OPC_LBU = 0x14,
12422   M16_OPC_LHU = 0x15,
12423   M16_OPC_LWPC = 0x16,
12424   M16_OPC_LWU = 0x17,
12425   M16_OPC_SB = 0x18,
12426   M16_OPC_SH = 0x19,
12427   M16_OPC_SWSP = 0x1a,
12428   M16_OPC_SW = 0x1b,
12429   M16_OPC_RRR = 0x1c,
12430   M16_OPC_RR = 0x1d,
12431   M16_OPC_EXTEND = 0x1e,
12432   M16_OPC_I64 = 0x1f
12433 };
12434 
12435 /* I8 funct field */
12436 enum {
12437   I8_BTEQZ = 0x0,
12438   I8_BTNEZ = 0x1,
12439   I8_SWRASP = 0x2,
12440   I8_ADJSP = 0x3,
12441   I8_SVRS = 0x4,
12442   I8_MOV32R = 0x5,
12443   I8_MOVR32 = 0x7
12444 };
12445 
12446 /* RRR f field */
12447 enum {
12448   RRR_DADDU = 0x0,
12449   RRR_ADDU = 0x1,
12450   RRR_DSUBU = 0x2,
12451   RRR_SUBU = 0x3
12452 };
12453 
12454 /* RR funct field */
12455 enum {
12456   RR_JR = 0x00,
12457   RR_SDBBP = 0x01,
12458   RR_SLT = 0x02,
12459   RR_SLTU = 0x03,
12460   RR_SLLV = 0x04,
12461   RR_BREAK = 0x05,
12462   RR_SRLV = 0x06,
12463   RR_SRAV = 0x07,
12464   RR_DSRL = 0x08,
12465   RR_CMP = 0x0a,
12466   RR_NEG = 0x0b,
12467   RR_AND = 0x0c,
12468   RR_OR = 0x0d,
12469   RR_XOR = 0x0e,
12470   RR_NOT = 0x0f,
12471   RR_MFHI = 0x10,
12472   RR_CNVT = 0x11,
12473   RR_MFLO = 0x12,
12474   RR_DSRA = 0x13,
12475   RR_DSLLV = 0x14,
12476   RR_DSRLV = 0x16,
12477   RR_DSRAV = 0x17,
12478   RR_MULT = 0x18,
12479   RR_MULTU = 0x19,
12480   RR_DIV = 0x1a,
12481   RR_DIVU = 0x1b,
12482   RR_DMULT = 0x1c,
12483   RR_DMULTU = 0x1d,
12484   RR_DDIV = 0x1e,
12485   RR_DDIVU = 0x1f
12486 };
12487 
12488 /* I64 funct field */
12489 enum {
12490   I64_LDSP = 0x0,
12491   I64_SDSP = 0x1,
12492   I64_SDRASP = 0x2,
12493   I64_DADJSP = 0x3,
12494   I64_LDPC = 0x4,
12495   I64_DADDIU5 = 0x5,
12496   I64_DADDIUPC = 0x6,
12497   I64_DADDIUSP = 0x7
12498 };
12499 
12500 /* RR ry field for CNVT */
12501 enum {
12502   RR_RY_CNVT_ZEB = 0x0,
12503   RR_RY_CNVT_ZEH = 0x1,
12504   RR_RY_CNVT_ZEW = 0x2,
12505   RR_RY_CNVT_SEB = 0x4,
12506   RR_RY_CNVT_SEH = 0x5,
12507   RR_RY_CNVT_SEW = 0x6,
12508 };
12509 
12510 static int xlat(int r)
12511 {
12512   static int map[] = { 16, 17, 2, 3, 4, 5, 6, 7 };
12513 
12514   return map[r];
12515 }
12516 
12517 static void gen_mips16_save(DisasContext *ctx,
12518                             int xsregs, int aregs,
12519                             int do_ra, int do_s0, int do_s1,
12520                             int framesize)
12521 {
12522     TCGv t0 = tcg_temp_new();
12523     TCGv t1 = tcg_temp_new();
12524     TCGv t2 = tcg_temp_new();
12525     int args, astatic;
12526 
12527     switch (aregs) {
12528     case 0:
12529     case 1:
12530     case 2:
12531     case 3:
12532     case 11:
12533         args = 0;
12534         break;
12535     case 4:
12536     case 5:
12537     case 6:
12538     case 7:
12539         args = 1;
12540         break;
12541     case 8:
12542     case 9:
12543     case 10:
12544         args = 2;
12545         break;
12546     case 12:
12547     case 13:
12548         args = 3;
12549         break;
12550     case 14:
12551         args = 4;
12552         break;
12553     default:
12554         gen_reserved_instruction(ctx);
12555         return;
12556     }
12557 
12558     switch (args) {
12559     case 4:
12560         gen_base_offset_addr(ctx, t0, 29, 12);
12561         gen_load_gpr(t1, 7);
12562         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
12563         /* Fall through */
12564     case 3:
12565         gen_base_offset_addr(ctx, t0, 29, 8);
12566         gen_load_gpr(t1, 6);
12567         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
12568         /* Fall through */
12569     case 2:
12570         gen_base_offset_addr(ctx, t0, 29, 4);
12571         gen_load_gpr(t1, 5);
12572         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
12573         /* Fall through */
12574     case 1:
12575         gen_base_offset_addr(ctx, t0, 29, 0);
12576         gen_load_gpr(t1, 4);
12577         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
12578     }
12579 
12580     gen_load_gpr(t0, 29);
12581 
12582 #define DECR_AND_STORE(reg) do {                                 \
12583         tcg_gen_movi_tl(t2, -4);                                 \
12584         gen_op_addr_add(ctx, t0, t0, t2);                        \
12585         gen_load_gpr(t1, reg);                                   \
12586         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL); \
12587     } while (0)
12588 
12589     if (do_ra) {
12590         DECR_AND_STORE(31);
12591     }
12592 
12593     switch (xsregs) {
12594     case 7:
12595         DECR_AND_STORE(30);
12596         /* Fall through */
12597     case 6:
12598         DECR_AND_STORE(23);
12599         /* Fall through */
12600     case 5:
12601         DECR_AND_STORE(22);
12602         /* Fall through */
12603     case 4:
12604         DECR_AND_STORE(21);
12605         /* Fall through */
12606     case 3:
12607         DECR_AND_STORE(20);
12608         /* Fall through */
12609     case 2:
12610         DECR_AND_STORE(19);
12611         /* Fall through */
12612     case 1:
12613         DECR_AND_STORE(18);
12614     }
12615 
12616     if (do_s1) {
12617         DECR_AND_STORE(17);
12618     }
12619     if (do_s0) {
12620         DECR_AND_STORE(16);
12621     }
12622 
12623     switch (aregs) {
12624     case 0:
12625     case 4:
12626     case 8:
12627     case 12:
12628     case 14:
12629         astatic = 0;
12630         break;
12631     case 1:
12632     case 5:
12633     case 9:
12634     case 13:
12635         astatic = 1;
12636         break;
12637     case 2:
12638     case 6:
12639     case 10:
12640         astatic = 2;
12641         break;
12642     case 3:
12643     case 7:
12644         astatic = 3;
12645         break;
12646     case 11:
12647         astatic = 4;
12648         break;
12649     default:
12650         gen_reserved_instruction(ctx);
12651         return;
12652     }
12653 
12654     if (astatic > 0) {
12655         DECR_AND_STORE(7);
12656         if (astatic > 1) {
12657             DECR_AND_STORE(6);
12658             if (astatic > 2) {
12659                 DECR_AND_STORE(5);
12660                 if (astatic > 3) {
12661                     DECR_AND_STORE(4);
12662                 }
12663             }
12664         }
12665     }
12666 #undef DECR_AND_STORE
12667 
12668     tcg_gen_movi_tl(t2, -framesize);
12669     gen_op_addr_add(ctx, cpu_gpr[29], cpu_gpr[29], t2);
12670     tcg_temp_free(t0);
12671     tcg_temp_free(t1);
12672     tcg_temp_free(t2);
12673 }
12674 
12675 static void gen_mips16_restore(DisasContext *ctx,
12676                                int xsregs, int aregs,
12677                                int do_ra, int do_s0, int do_s1,
12678                                int framesize)
12679 {
12680     int astatic;
12681     TCGv t0 = tcg_temp_new();
12682     TCGv t1 = tcg_temp_new();
12683     TCGv t2 = tcg_temp_new();
12684 
12685     tcg_gen_movi_tl(t2, framesize);
12686     gen_op_addr_add(ctx, t0, cpu_gpr[29], t2);
12687 
12688 #define DECR_AND_LOAD(reg) do {                            \
12689         tcg_gen_movi_tl(t2, -4);                           \
12690         gen_op_addr_add(ctx, t0, t0, t2);                  \
12691         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL); \
12692         gen_store_gpr(t1, reg);                            \
12693     } while (0)
12694 
12695     if (do_ra) {
12696         DECR_AND_LOAD(31);
12697     }
12698 
12699     switch (xsregs) {
12700     case 7:
12701         DECR_AND_LOAD(30);
12702         /* Fall through */
12703     case 6:
12704         DECR_AND_LOAD(23);
12705         /* Fall through */
12706     case 5:
12707         DECR_AND_LOAD(22);
12708         /* Fall through */
12709     case 4:
12710         DECR_AND_LOAD(21);
12711         /* Fall through */
12712     case 3:
12713         DECR_AND_LOAD(20);
12714         /* Fall through */
12715     case 2:
12716         DECR_AND_LOAD(19);
12717         /* Fall through */
12718     case 1:
12719         DECR_AND_LOAD(18);
12720     }
12721 
12722     if (do_s1) {
12723         DECR_AND_LOAD(17);
12724     }
12725     if (do_s0) {
12726         DECR_AND_LOAD(16);
12727     }
12728 
12729     switch (aregs) {
12730     case 0:
12731     case 4:
12732     case 8:
12733     case 12:
12734     case 14:
12735         astatic = 0;
12736         break;
12737     case 1:
12738     case 5:
12739     case 9:
12740     case 13:
12741         astatic = 1;
12742         break;
12743     case 2:
12744     case 6:
12745     case 10:
12746         astatic = 2;
12747         break;
12748     case 3:
12749     case 7:
12750         astatic = 3;
12751         break;
12752     case 11:
12753         astatic = 4;
12754         break;
12755     default:
12756         gen_reserved_instruction(ctx);
12757         return;
12758     }
12759 
12760     if (astatic > 0) {
12761         DECR_AND_LOAD(7);
12762         if (astatic > 1) {
12763             DECR_AND_LOAD(6);
12764             if (astatic > 2) {
12765                 DECR_AND_LOAD(5);
12766                 if (astatic > 3) {
12767                     DECR_AND_LOAD(4);
12768                 }
12769             }
12770         }
12771     }
12772 #undef DECR_AND_LOAD
12773 
12774     tcg_gen_movi_tl(t2, framesize);
12775     gen_op_addr_add(ctx, cpu_gpr[29], cpu_gpr[29], t2);
12776     tcg_temp_free(t0);
12777     tcg_temp_free(t1);
12778     tcg_temp_free(t2);
12779 }
12780 
12781 static void gen_addiupc(DisasContext *ctx, int rx, int imm,
12782                         int is_64_bit, int extended)
12783 {
12784     TCGv t0;
12785 
12786     if (extended && (ctx->hflags & MIPS_HFLAG_BMASK)) {
12787         gen_reserved_instruction(ctx);
12788         return;
12789     }
12790 
12791     t0 = tcg_temp_new();
12792 
12793     tcg_gen_movi_tl(t0, pc_relative_pc(ctx));
12794     tcg_gen_addi_tl(cpu_gpr[rx], t0, imm);
12795     if (!is_64_bit) {
12796         tcg_gen_ext32s_tl(cpu_gpr[rx], cpu_gpr[rx]);
12797     }
12798 
12799     tcg_temp_free(t0);
12800 }
12801 
12802 static void gen_cache_operation(DisasContext *ctx, uint32_t op, int base,
12803                                 int16_t offset)
12804 {
12805     TCGv_i32 t0 = tcg_const_i32(op);
12806     TCGv t1 = tcg_temp_new();
12807     gen_base_offset_addr(ctx, t1, base, offset);
12808     gen_helper_cache(cpu_env, t1, t0);
12809     tcg_temp_free(t1);
12810     tcg_temp_free_i32(t0);
12811 }
12812 
12813 #if defined(TARGET_MIPS64)
12814 static void decode_i64_mips16(DisasContext *ctx,
12815                               int ry, int funct, int16_t offset,
12816                               int extended)
12817 {
12818     switch (funct) {
12819     case I64_LDSP:
12820         check_insn(ctx, ISA_MIPS3);
12821         check_mips_64(ctx);
12822         offset = extended ? offset : offset << 3;
12823         gen_ld(ctx, OPC_LD, ry, 29, offset);
12824         break;
12825     case I64_SDSP:
12826         check_insn(ctx, ISA_MIPS3);
12827         check_mips_64(ctx);
12828         offset = extended ? offset : offset << 3;
12829         gen_st(ctx, OPC_SD, ry, 29, offset);
12830         break;
12831     case I64_SDRASP:
12832         check_insn(ctx, ISA_MIPS3);
12833         check_mips_64(ctx);
12834         offset = extended ? offset : (ctx->opcode & 0xff) << 3;
12835         gen_st(ctx, OPC_SD, 31, 29, offset);
12836         break;
12837     case I64_DADJSP:
12838         check_insn(ctx, ISA_MIPS3);
12839         check_mips_64(ctx);
12840         offset = extended ? offset : ((int8_t)ctx->opcode) << 3;
12841         gen_arith_imm(ctx, OPC_DADDIU, 29, 29, offset);
12842         break;
12843     case I64_LDPC:
12844         check_insn(ctx, ISA_MIPS3);
12845         check_mips_64(ctx);
12846         if (extended && (ctx->hflags & MIPS_HFLAG_BMASK)) {
12847             gen_reserved_instruction(ctx);
12848         } else {
12849             offset = extended ? offset : offset << 3;
12850             gen_ld(ctx, OPC_LDPC, ry, 0, offset);
12851         }
12852         break;
12853     case I64_DADDIU5:
12854         check_insn(ctx, ISA_MIPS3);
12855         check_mips_64(ctx);
12856         offset = extended ? offset : ((int8_t)(offset << 3)) >> 3;
12857         gen_arith_imm(ctx, OPC_DADDIU, ry, ry, offset);
12858         break;
12859     case I64_DADDIUPC:
12860         check_insn(ctx, ISA_MIPS3);
12861         check_mips_64(ctx);
12862         offset = extended ? offset : offset << 2;
12863         gen_addiupc(ctx, ry, offset, 1, extended);
12864         break;
12865     case I64_DADDIUSP:
12866         check_insn(ctx, ISA_MIPS3);
12867         check_mips_64(ctx);
12868         offset = extended ? offset : offset << 2;
12869         gen_arith_imm(ctx, OPC_DADDIU, ry, 29, offset);
12870         break;
12871     }
12872 }
12873 #endif
12874 
12875 static int decode_extended_mips16_opc(CPUMIPSState *env, DisasContext *ctx)
12876 {
12877     int extend = translator_lduw(env, ctx->base.pc_next + 2);
12878     int op, rx, ry, funct, sa;
12879     int16_t imm, offset;
12880 
12881     ctx->opcode = (ctx->opcode << 16) | extend;
12882     op = (ctx->opcode >> 11) & 0x1f;
12883     sa = (ctx->opcode >> 22) & 0x1f;
12884     funct = (ctx->opcode >> 8) & 0x7;
12885     rx = xlat((ctx->opcode >> 8) & 0x7);
12886     ry = xlat((ctx->opcode >> 5) & 0x7);
12887     offset = imm = (int16_t) (((ctx->opcode >> 16) & 0x1f) << 11
12888                               | ((ctx->opcode >> 21) & 0x3f) << 5
12889                               | (ctx->opcode & 0x1f));
12890 
12891     /*
12892      * The extended opcodes cleverly reuse the opcodes from their 16-bit
12893      * counterparts.
12894      */
12895     switch (op) {
12896     case M16_OPC_ADDIUSP:
12897         gen_arith_imm(ctx, OPC_ADDIU, rx, 29, imm);
12898         break;
12899     case M16_OPC_ADDIUPC:
12900         gen_addiupc(ctx, rx, imm, 0, 1);
12901         break;
12902     case M16_OPC_B:
12903         gen_compute_branch(ctx, OPC_BEQ, 4, 0, 0, offset << 1, 0);
12904         /* No delay slot, so just process as a normal instruction */
12905         break;
12906     case M16_OPC_BEQZ:
12907         gen_compute_branch(ctx, OPC_BEQ, 4, rx, 0, offset << 1, 0);
12908         /* No delay slot, so just process as a normal instruction */
12909         break;
12910     case M16_OPC_BNEQZ:
12911         gen_compute_branch(ctx, OPC_BNE, 4, rx, 0, offset << 1, 0);
12912         /* No delay slot, so just process as a normal instruction */
12913         break;
12914     case M16_OPC_SHIFT:
12915         switch (ctx->opcode & 0x3) {
12916         case 0x0:
12917             gen_shift_imm(ctx, OPC_SLL, rx, ry, sa);
12918             break;
12919         case 0x1:
12920 #if defined(TARGET_MIPS64)
12921             check_mips_64(ctx);
12922             gen_shift_imm(ctx, OPC_DSLL, rx, ry, sa);
12923 #else
12924             gen_reserved_instruction(ctx);
12925 #endif
12926             break;
12927         case 0x2:
12928             gen_shift_imm(ctx, OPC_SRL, rx, ry, sa);
12929             break;
12930         case 0x3:
12931             gen_shift_imm(ctx, OPC_SRA, rx, ry, sa);
12932             break;
12933         }
12934         break;
12935 #if defined(TARGET_MIPS64)
12936     case M16_OPC_LD:
12937         check_insn(ctx, ISA_MIPS3);
12938         check_mips_64(ctx);
12939         gen_ld(ctx, OPC_LD, ry, rx, offset);
12940         break;
12941 #endif
12942     case M16_OPC_RRIA:
12943         imm = ctx->opcode & 0xf;
12944         imm = imm | ((ctx->opcode >> 20) & 0x7f) << 4;
12945         imm = imm | ((ctx->opcode >> 16) & 0xf) << 11;
12946         imm = (int16_t) (imm << 1) >> 1;
12947         if ((ctx->opcode >> 4) & 0x1) {
12948 #if defined(TARGET_MIPS64)
12949             check_mips_64(ctx);
12950             gen_arith_imm(ctx, OPC_DADDIU, ry, rx, imm);
12951 #else
12952             gen_reserved_instruction(ctx);
12953 #endif
12954         } else {
12955             gen_arith_imm(ctx, OPC_ADDIU, ry, rx, imm);
12956         }
12957         break;
12958     case M16_OPC_ADDIU8:
12959         gen_arith_imm(ctx, OPC_ADDIU, rx, rx, imm);
12960         break;
12961     case M16_OPC_SLTI:
12962         gen_slt_imm(ctx, OPC_SLTI, 24, rx, imm);
12963         break;
12964     case M16_OPC_SLTIU:
12965         gen_slt_imm(ctx, OPC_SLTIU, 24, rx, imm);
12966         break;
12967     case M16_OPC_I8:
12968         switch (funct) {
12969         case I8_BTEQZ:
12970             gen_compute_branch(ctx, OPC_BEQ, 4, 24, 0, offset << 1, 0);
12971             break;
12972         case I8_BTNEZ:
12973             gen_compute_branch(ctx, OPC_BNE, 4, 24, 0, offset << 1, 0);
12974             break;
12975         case I8_SWRASP:
12976             gen_st(ctx, OPC_SW, 31, 29, imm);
12977             break;
12978         case I8_ADJSP:
12979             gen_arith_imm(ctx, OPC_ADDIU, 29, 29, imm);
12980             break;
12981         case I8_SVRS:
12982             check_insn(ctx, ISA_MIPS_R1);
12983             {
12984                 int xsregs = (ctx->opcode >> 24) & 0x7;
12985                 int aregs = (ctx->opcode >> 16) & 0xf;
12986                 int do_ra = (ctx->opcode >> 6) & 0x1;
12987                 int do_s0 = (ctx->opcode >> 5) & 0x1;
12988                 int do_s1 = (ctx->opcode >> 4) & 0x1;
12989                 int framesize = (((ctx->opcode >> 20) & 0xf) << 4
12990                                  | (ctx->opcode & 0xf)) << 3;
12991 
12992                 if (ctx->opcode & (1 << 7)) {
12993                     gen_mips16_save(ctx, xsregs, aregs,
12994                                     do_ra, do_s0, do_s1,
12995                                     framesize);
12996                 } else {
12997                     gen_mips16_restore(ctx, xsregs, aregs,
12998                                        do_ra, do_s0, do_s1,
12999                                        framesize);
13000                 }
13001             }
13002             break;
13003         default:
13004             gen_reserved_instruction(ctx);
13005             break;
13006         }
13007         break;
13008     case M16_OPC_LI:
13009         tcg_gen_movi_tl(cpu_gpr[rx], (uint16_t) imm);
13010         break;
13011     case M16_OPC_CMPI:
13012         tcg_gen_xori_tl(cpu_gpr[24], cpu_gpr[rx], (uint16_t) imm);
13013         break;
13014 #if defined(TARGET_MIPS64)
13015     case M16_OPC_SD:
13016         check_insn(ctx, ISA_MIPS3);
13017         check_mips_64(ctx);
13018         gen_st(ctx, OPC_SD, ry, rx, offset);
13019         break;
13020 #endif
13021     case M16_OPC_LB:
13022         gen_ld(ctx, OPC_LB, ry, rx, offset);
13023         break;
13024     case M16_OPC_LH:
13025         gen_ld(ctx, OPC_LH, ry, rx, offset);
13026         break;
13027     case M16_OPC_LWSP:
13028         gen_ld(ctx, OPC_LW, rx, 29, offset);
13029         break;
13030     case M16_OPC_LW:
13031         gen_ld(ctx, OPC_LW, ry, rx, offset);
13032         break;
13033     case M16_OPC_LBU:
13034         gen_ld(ctx, OPC_LBU, ry, rx, offset);
13035         break;
13036     case M16_OPC_LHU:
13037         gen_ld(ctx, OPC_LHU, ry, rx, offset);
13038         break;
13039     case M16_OPC_LWPC:
13040         gen_ld(ctx, OPC_LWPC, rx, 0, offset);
13041         break;
13042 #if defined(TARGET_MIPS64)
13043     case M16_OPC_LWU:
13044         check_insn(ctx, ISA_MIPS3);
13045         check_mips_64(ctx);
13046         gen_ld(ctx, OPC_LWU, ry, rx, offset);
13047         break;
13048 #endif
13049     case M16_OPC_SB:
13050         gen_st(ctx, OPC_SB, ry, rx, offset);
13051         break;
13052     case M16_OPC_SH:
13053         gen_st(ctx, OPC_SH, ry, rx, offset);
13054         break;
13055     case M16_OPC_SWSP:
13056         gen_st(ctx, OPC_SW, rx, 29, offset);
13057         break;
13058     case M16_OPC_SW:
13059         gen_st(ctx, OPC_SW, ry, rx, offset);
13060         break;
13061 #if defined(TARGET_MIPS64)
13062     case M16_OPC_I64:
13063         decode_i64_mips16(ctx, ry, funct, offset, 1);
13064         break;
13065 #endif
13066     default:
13067         gen_reserved_instruction(ctx);
13068         break;
13069     }
13070 
13071     return 4;
13072 }
13073 
13074 static inline bool is_uhi(int sdbbp_code)
13075 {
13076 #ifdef CONFIG_USER_ONLY
13077     return false;
13078 #else
13079     return semihosting_enabled() && sdbbp_code == 1;
13080 #endif
13081 }
13082 
13083 #ifdef CONFIG_USER_ONLY
13084 /* The above should dead-code away any calls to this..*/
13085 static inline void gen_helper_do_semihosting(void *env)
13086 {
13087     g_assert_not_reached();
13088 }
13089 #endif
13090 
13091 static int decode_mips16_opc(CPUMIPSState *env, DisasContext *ctx)
13092 {
13093     int rx, ry;
13094     int sa;
13095     int op, cnvt_op, op1, offset;
13096     int funct;
13097     int n_bytes;
13098 
13099     op = (ctx->opcode >> 11) & 0x1f;
13100     sa = (ctx->opcode >> 2) & 0x7;
13101     sa = sa == 0 ? 8 : sa;
13102     rx = xlat((ctx->opcode >> 8) & 0x7);
13103     cnvt_op = (ctx->opcode >> 5) & 0x7;
13104     ry = xlat((ctx->opcode >> 5) & 0x7);
13105     op1 = offset = ctx->opcode & 0x1f;
13106 
13107     n_bytes = 2;
13108 
13109     switch (op) {
13110     case M16_OPC_ADDIUSP:
13111         {
13112             int16_t imm = ((uint8_t) ctx->opcode) << 2;
13113 
13114             gen_arith_imm(ctx, OPC_ADDIU, rx, 29, imm);
13115         }
13116         break;
13117     case M16_OPC_ADDIUPC:
13118         gen_addiupc(ctx, rx, ((uint8_t) ctx->opcode) << 2, 0, 0);
13119         break;
13120     case M16_OPC_B:
13121         offset = (ctx->opcode & 0x7ff) << 1;
13122         offset = (int16_t)(offset << 4) >> 4;
13123         gen_compute_branch(ctx, OPC_BEQ, 2, 0, 0, offset, 0);
13124         /* No delay slot, so just process as a normal instruction */
13125         break;
13126     case M16_OPC_JAL:
13127         offset = translator_lduw(env, ctx->base.pc_next + 2);
13128         offset = (((ctx->opcode & 0x1f) << 21)
13129                   | ((ctx->opcode >> 5) & 0x1f) << 16
13130                   | offset) << 2;
13131         op = ((ctx->opcode >> 10) & 0x1) ? OPC_JALX : OPC_JAL;
13132         gen_compute_branch(ctx, op, 4, rx, ry, offset, 2);
13133         n_bytes = 4;
13134         break;
13135     case M16_OPC_BEQZ:
13136         gen_compute_branch(ctx, OPC_BEQ, 2, rx, 0,
13137                            ((int8_t)ctx->opcode) << 1, 0);
13138         /* No delay slot, so just process as a normal instruction */
13139         break;
13140     case M16_OPC_BNEQZ:
13141         gen_compute_branch(ctx, OPC_BNE, 2, rx, 0,
13142                            ((int8_t)ctx->opcode) << 1, 0);
13143         /* No delay slot, so just process as a normal instruction */
13144         break;
13145     case M16_OPC_SHIFT:
13146         switch (ctx->opcode & 0x3) {
13147         case 0x0:
13148             gen_shift_imm(ctx, OPC_SLL, rx, ry, sa);
13149             break;
13150         case 0x1:
13151 #if defined(TARGET_MIPS64)
13152             check_insn(ctx, ISA_MIPS3);
13153             check_mips_64(ctx);
13154             gen_shift_imm(ctx, OPC_DSLL, rx, ry, sa);
13155 #else
13156             gen_reserved_instruction(ctx);
13157 #endif
13158             break;
13159         case 0x2:
13160             gen_shift_imm(ctx, OPC_SRL, rx, ry, sa);
13161             break;
13162         case 0x3:
13163             gen_shift_imm(ctx, OPC_SRA, rx, ry, sa);
13164             break;
13165         }
13166         break;
13167 #if defined(TARGET_MIPS64)
13168     case M16_OPC_LD:
13169         check_insn(ctx, ISA_MIPS3);
13170         check_mips_64(ctx);
13171         gen_ld(ctx, OPC_LD, ry, rx, offset << 3);
13172         break;
13173 #endif
13174     case M16_OPC_RRIA:
13175         {
13176             int16_t imm = (int8_t)((ctx->opcode & 0xf) << 4) >> 4;
13177 
13178             if ((ctx->opcode >> 4) & 1) {
13179 #if defined(TARGET_MIPS64)
13180                 check_insn(ctx, ISA_MIPS3);
13181                 check_mips_64(ctx);
13182                 gen_arith_imm(ctx, OPC_DADDIU, ry, rx, imm);
13183 #else
13184                 gen_reserved_instruction(ctx);
13185 #endif
13186             } else {
13187                 gen_arith_imm(ctx, OPC_ADDIU, ry, rx, imm);
13188             }
13189         }
13190         break;
13191     case M16_OPC_ADDIU8:
13192         {
13193             int16_t imm = (int8_t) ctx->opcode;
13194 
13195             gen_arith_imm(ctx, OPC_ADDIU, rx, rx, imm);
13196         }
13197         break;
13198     case M16_OPC_SLTI:
13199         {
13200             int16_t imm = (uint8_t) ctx->opcode;
13201             gen_slt_imm(ctx, OPC_SLTI, 24, rx, imm);
13202         }
13203         break;
13204     case M16_OPC_SLTIU:
13205         {
13206             int16_t imm = (uint8_t) ctx->opcode;
13207             gen_slt_imm(ctx, OPC_SLTIU, 24, rx, imm);
13208         }
13209         break;
13210     case M16_OPC_I8:
13211         {
13212             int reg32;
13213 
13214             funct = (ctx->opcode >> 8) & 0x7;
13215             switch (funct) {
13216             case I8_BTEQZ:
13217                 gen_compute_branch(ctx, OPC_BEQ, 2, 24, 0,
13218                                    ((int8_t)ctx->opcode) << 1, 0);
13219                 break;
13220             case I8_BTNEZ:
13221                 gen_compute_branch(ctx, OPC_BNE, 2, 24, 0,
13222                                    ((int8_t)ctx->opcode) << 1, 0);
13223                 break;
13224             case I8_SWRASP:
13225                 gen_st(ctx, OPC_SW, 31, 29, (ctx->opcode & 0xff) << 2);
13226                 break;
13227             case I8_ADJSP:
13228                 gen_arith_imm(ctx, OPC_ADDIU, 29, 29,
13229                               ((int8_t)ctx->opcode) << 3);
13230                 break;
13231             case I8_SVRS:
13232                 check_insn(ctx, ISA_MIPS_R1);
13233                 {
13234                     int do_ra = ctx->opcode & (1 << 6);
13235                     int do_s0 = ctx->opcode & (1 << 5);
13236                     int do_s1 = ctx->opcode & (1 << 4);
13237                     int framesize = ctx->opcode & 0xf;
13238 
13239                     if (framesize == 0) {
13240                         framesize = 128;
13241                     } else {
13242                         framesize = framesize << 3;
13243                     }
13244 
13245                     if (ctx->opcode & (1 << 7)) {
13246                         gen_mips16_save(ctx, 0, 0,
13247                                         do_ra, do_s0, do_s1, framesize);
13248                     } else {
13249                         gen_mips16_restore(ctx, 0, 0,
13250                                            do_ra, do_s0, do_s1, framesize);
13251                     }
13252                 }
13253                 break;
13254             case I8_MOV32R:
13255                 {
13256                     int rz = xlat(ctx->opcode & 0x7);
13257 
13258                     reg32 = (((ctx->opcode >> 3) & 0x3) << 3) |
13259                         ((ctx->opcode >> 5) & 0x7);
13260                     gen_arith(ctx, OPC_ADDU, reg32, rz, 0);
13261                 }
13262                 break;
13263             case I8_MOVR32:
13264                 reg32 = ctx->opcode & 0x1f;
13265                 gen_arith(ctx, OPC_ADDU, ry, reg32, 0);
13266                 break;
13267             default:
13268                 gen_reserved_instruction(ctx);
13269                 break;
13270             }
13271         }
13272         break;
13273     case M16_OPC_LI:
13274         {
13275             int16_t imm = (uint8_t) ctx->opcode;
13276 
13277             gen_arith_imm(ctx, OPC_ADDIU, rx, 0, imm);
13278         }
13279         break;
13280     case M16_OPC_CMPI:
13281         {
13282             int16_t imm = (uint8_t) ctx->opcode;
13283             gen_logic_imm(ctx, OPC_XORI, 24, rx, imm);
13284         }
13285         break;
13286 #if defined(TARGET_MIPS64)
13287     case M16_OPC_SD:
13288         check_insn(ctx, ISA_MIPS3);
13289         check_mips_64(ctx);
13290         gen_st(ctx, OPC_SD, ry, rx, offset << 3);
13291         break;
13292 #endif
13293     case M16_OPC_LB:
13294         gen_ld(ctx, OPC_LB, ry, rx, offset);
13295         break;
13296     case M16_OPC_LH:
13297         gen_ld(ctx, OPC_LH, ry, rx, offset << 1);
13298         break;
13299     case M16_OPC_LWSP:
13300         gen_ld(ctx, OPC_LW, rx, 29, ((uint8_t)ctx->opcode) << 2);
13301         break;
13302     case M16_OPC_LW:
13303         gen_ld(ctx, OPC_LW, ry, rx, offset << 2);
13304         break;
13305     case M16_OPC_LBU:
13306         gen_ld(ctx, OPC_LBU, ry, rx, offset);
13307         break;
13308     case M16_OPC_LHU:
13309         gen_ld(ctx, OPC_LHU, ry, rx, offset << 1);
13310         break;
13311     case M16_OPC_LWPC:
13312         gen_ld(ctx, OPC_LWPC, rx, 0, ((uint8_t)ctx->opcode) << 2);
13313         break;
13314 #if defined(TARGET_MIPS64)
13315     case M16_OPC_LWU:
13316         check_insn(ctx, ISA_MIPS3);
13317         check_mips_64(ctx);
13318         gen_ld(ctx, OPC_LWU, ry, rx, offset << 2);
13319         break;
13320 #endif
13321     case M16_OPC_SB:
13322         gen_st(ctx, OPC_SB, ry, rx, offset);
13323         break;
13324     case M16_OPC_SH:
13325         gen_st(ctx, OPC_SH, ry, rx, offset << 1);
13326         break;
13327     case M16_OPC_SWSP:
13328         gen_st(ctx, OPC_SW, rx, 29, ((uint8_t)ctx->opcode) << 2);
13329         break;
13330     case M16_OPC_SW:
13331         gen_st(ctx, OPC_SW, ry, rx, offset << 2);
13332         break;
13333     case M16_OPC_RRR:
13334         {
13335             int rz = xlat((ctx->opcode >> 2) & 0x7);
13336             int mips32_op;
13337 
13338             switch (ctx->opcode & 0x3) {
13339             case RRR_ADDU:
13340                 mips32_op = OPC_ADDU;
13341                 break;
13342             case RRR_SUBU:
13343                 mips32_op = OPC_SUBU;
13344                 break;
13345 #if defined(TARGET_MIPS64)
13346             case RRR_DADDU:
13347                 mips32_op = OPC_DADDU;
13348                 check_insn(ctx, ISA_MIPS3);
13349                 check_mips_64(ctx);
13350                 break;
13351             case RRR_DSUBU:
13352                 mips32_op = OPC_DSUBU;
13353                 check_insn(ctx, ISA_MIPS3);
13354                 check_mips_64(ctx);
13355                 break;
13356 #endif
13357             default:
13358                 gen_reserved_instruction(ctx);
13359                 goto done;
13360             }
13361 
13362             gen_arith(ctx, mips32_op, rz, rx, ry);
13363         done:
13364             ;
13365         }
13366         break;
13367     case M16_OPC_RR:
13368         switch (op1) {
13369         case RR_JR:
13370             {
13371                 int nd = (ctx->opcode >> 7) & 0x1;
13372                 int link = (ctx->opcode >> 6) & 0x1;
13373                 int ra = (ctx->opcode >> 5) & 0x1;
13374 
13375                 if (nd) {
13376                     check_insn(ctx, ISA_MIPS_R1);
13377                 }
13378 
13379                 if (link) {
13380                     op = OPC_JALR;
13381                 } else {
13382                     op = OPC_JR;
13383                 }
13384 
13385                 gen_compute_branch(ctx, op, 2, ra ? 31 : rx, 31, 0,
13386                                    (nd ? 0 : 2));
13387             }
13388             break;
13389         case RR_SDBBP:
13390             if (is_uhi(extract32(ctx->opcode, 5, 6))) {
13391                 gen_helper_do_semihosting(cpu_env);
13392             } else {
13393                 /*
13394                  * XXX: not clear which exception should be raised
13395                  *      when in debug mode...
13396                  */
13397                 check_insn(ctx, ISA_MIPS_R1);
13398                 generate_exception_end(ctx, EXCP_DBp);
13399             }
13400             break;
13401         case RR_SLT:
13402             gen_slt(ctx, OPC_SLT, 24, rx, ry);
13403             break;
13404         case RR_SLTU:
13405             gen_slt(ctx, OPC_SLTU, 24, rx, ry);
13406             break;
13407         case RR_BREAK:
13408             generate_exception_end(ctx, EXCP_BREAK);
13409             break;
13410         case RR_SLLV:
13411             gen_shift(ctx, OPC_SLLV, ry, rx, ry);
13412             break;
13413         case RR_SRLV:
13414             gen_shift(ctx, OPC_SRLV, ry, rx, ry);
13415             break;
13416         case RR_SRAV:
13417             gen_shift(ctx, OPC_SRAV, ry, rx, ry);
13418             break;
13419 #if defined(TARGET_MIPS64)
13420         case RR_DSRL:
13421             check_insn(ctx, ISA_MIPS3);
13422             check_mips_64(ctx);
13423             gen_shift_imm(ctx, OPC_DSRL, ry, ry, sa);
13424             break;
13425 #endif
13426         case RR_CMP:
13427             gen_logic(ctx, OPC_XOR, 24, rx, ry);
13428             break;
13429         case RR_NEG:
13430             gen_arith(ctx, OPC_SUBU, rx, 0, ry);
13431             break;
13432         case RR_AND:
13433             gen_logic(ctx, OPC_AND, rx, rx, ry);
13434             break;
13435         case RR_OR:
13436             gen_logic(ctx, OPC_OR, rx, rx, ry);
13437             break;
13438         case RR_XOR:
13439             gen_logic(ctx, OPC_XOR, rx, rx, ry);
13440             break;
13441         case RR_NOT:
13442             gen_logic(ctx, OPC_NOR, rx, ry, 0);
13443             break;
13444         case RR_MFHI:
13445             gen_HILO(ctx, OPC_MFHI, 0, rx);
13446             break;
13447         case RR_CNVT:
13448             check_insn(ctx, ISA_MIPS_R1);
13449             switch (cnvt_op) {
13450             case RR_RY_CNVT_ZEB:
13451                 tcg_gen_ext8u_tl(cpu_gpr[rx], cpu_gpr[rx]);
13452                 break;
13453             case RR_RY_CNVT_ZEH:
13454                 tcg_gen_ext16u_tl(cpu_gpr[rx], cpu_gpr[rx]);
13455                 break;
13456             case RR_RY_CNVT_SEB:
13457                 tcg_gen_ext8s_tl(cpu_gpr[rx], cpu_gpr[rx]);
13458                 break;
13459             case RR_RY_CNVT_SEH:
13460                 tcg_gen_ext16s_tl(cpu_gpr[rx], cpu_gpr[rx]);
13461                 break;
13462 #if defined(TARGET_MIPS64)
13463             case RR_RY_CNVT_ZEW:
13464                 check_insn(ctx, ISA_MIPS_R1);
13465                 check_mips_64(ctx);
13466                 tcg_gen_ext32u_tl(cpu_gpr[rx], cpu_gpr[rx]);
13467                 break;
13468             case RR_RY_CNVT_SEW:
13469                 check_insn(ctx, ISA_MIPS_R1);
13470                 check_mips_64(ctx);
13471                 tcg_gen_ext32s_tl(cpu_gpr[rx], cpu_gpr[rx]);
13472                 break;
13473 #endif
13474             default:
13475                 gen_reserved_instruction(ctx);
13476                 break;
13477             }
13478             break;
13479         case RR_MFLO:
13480             gen_HILO(ctx, OPC_MFLO, 0, rx);
13481             break;
13482 #if defined(TARGET_MIPS64)
13483         case RR_DSRA:
13484             check_insn(ctx, ISA_MIPS3);
13485             check_mips_64(ctx);
13486             gen_shift_imm(ctx, OPC_DSRA, ry, ry, sa);
13487             break;
13488         case RR_DSLLV:
13489             check_insn(ctx, ISA_MIPS3);
13490             check_mips_64(ctx);
13491             gen_shift(ctx, OPC_DSLLV, ry, rx, ry);
13492             break;
13493         case RR_DSRLV:
13494             check_insn(ctx, ISA_MIPS3);
13495             check_mips_64(ctx);
13496             gen_shift(ctx, OPC_DSRLV, ry, rx, ry);
13497             break;
13498         case RR_DSRAV:
13499             check_insn(ctx, ISA_MIPS3);
13500             check_mips_64(ctx);
13501             gen_shift(ctx, OPC_DSRAV, ry, rx, ry);
13502             break;
13503 #endif
13504         case RR_MULT:
13505             gen_muldiv(ctx, OPC_MULT, 0, rx, ry);
13506             break;
13507         case RR_MULTU:
13508             gen_muldiv(ctx, OPC_MULTU, 0, rx, ry);
13509             break;
13510         case RR_DIV:
13511             gen_muldiv(ctx, OPC_DIV, 0, rx, ry);
13512             break;
13513         case RR_DIVU:
13514             gen_muldiv(ctx, OPC_DIVU, 0, rx, ry);
13515             break;
13516 #if defined(TARGET_MIPS64)
13517         case RR_DMULT:
13518             check_insn(ctx, ISA_MIPS3);
13519             check_mips_64(ctx);
13520             gen_muldiv(ctx, OPC_DMULT, 0, rx, ry);
13521             break;
13522         case RR_DMULTU:
13523             check_insn(ctx, ISA_MIPS3);
13524             check_mips_64(ctx);
13525             gen_muldiv(ctx, OPC_DMULTU, 0, rx, ry);
13526             break;
13527         case RR_DDIV:
13528             check_insn(ctx, ISA_MIPS3);
13529             check_mips_64(ctx);
13530             gen_muldiv(ctx, OPC_DDIV, 0, rx, ry);
13531             break;
13532         case RR_DDIVU:
13533             check_insn(ctx, ISA_MIPS3);
13534             check_mips_64(ctx);
13535             gen_muldiv(ctx, OPC_DDIVU, 0, rx, ry);
13536             break;
13537 #endif
13538         default:
13539             gen_reserved_instruction(ctx);
13540             break;
13541         }
13542         break;
13543     case M16_OPC_EXTEND:
13544         decode_extended_mips16_opc(env, ctx);
13545         n_bytes = 4;
13546         break;
13547 #if defined(TARGET_MIPS64)
13548     case M16_OPC_I64:
13549         funct = (ctx->opcode >> 8) & 0x7;
13550         decode_i64_mips16(ctx, ry, funct, offset, 0);
13551         break;
13552 #endif
13553     default:
13554         gen_reserved_instruction(ctx);
13555         break;
13556     }
13557 
13558     return n_bytes;
13559 }
13560 
13561 /* microMIPS extension to MIPS32/MIPS64 */
13562 
13563 /*
13564  * microMIPS32/microMIPS64 major opcodes
13565  *
13566  * 1. MIPS Architecture for Programmers Volume II-B:
13567  *      The microMIPS32 Instruction Set (Revision 3.05)
13568  *
13569  *    Table 6.2 microMIPS32 Encoding of Major Opcode Field
13570  *
13571  * 2. MIPS Architecture For Programmers Volume II-A:
13572  *      The MIPS64 Instruction Set (Revision 3.51)
13573  */
13574 
13575 enum {
13576     POOL32A = 0x00,
13577     POOL16A = 0x01,
13578     LBU16 = 0x02,
13579     MOVE16 = 0x03,
13580     ADDI32 = 0x04,
13581     R6_LUI = 0x04,
13582     AUI = 0x04,
13583     LBU32 = 0x05,
13584     SB32 = 0x06,
13585     LB32 = 0x07,
13586 
13587     POOL32B = 0x08,
13588     POOL16B = 0x09,
13589     LHU16 = 0x0a,
13590     ANDI16 = 0x0b,
13591     ADDIU32 = 0x0c,
13592     LHU32 = 0x0d,
13593     SH32 = 0x0e,
13594     LH32 = 0x0f,
13595 
13596     POOL32I = 0x10,
13597     POOL16C = 0x11,
13598     LWSP16 = 0x12,
13599     POOL16D = 0x13,
13600     ORI32 = 0x14,
13601     POOL32F = 0x15,
13602     POOL32S = 0x16,  /* MIPS64 */
13603     DADDIU32 = 0x17, /* MIPS64 */
13604 
13605     POOL32C = 0x18,
13606     LWGP16 = 0x19,
13607     LW16 = 0x1a,
13608     POOL16E = 0x1b,
13609     XORI32 = 0x1c,
13610     JALS32 = 0x1d,
13611     BOVC = 0x1d,
13612     BEQC = 0x1d,
13613     BEQZALC = 0x1d,
13614     ADDIUPC = 0x1e,
13615     PCREL = 0x1e,
13616     BNVC = 0x1f,
13617     BNEC = 0x1f,
13618     BNEZALC = 0x1f,
13619 
13620     R6_BEQZC = 0x20,
13621     JIC = 0x20,
13622     POOL16F = 0x21,
13623     SB16 = 0x22,
13624     BEQZ16 = 0x23,
13625     BEQZC16 = 0x23,
13626     SLTI32 = 0x24,
13627     BEQ32 = 0x25,
13628     BC = 0x25,
13629     SWC132 = 0x26,
13630     LWC132 = 0x27,
13631 
13632     /* 0x29 is reserved */
13633     RES_29 = 0x29,
13634     R6_BNEZC = 0x28,
13635     JIALC = 0x28,
13636     SH16 = 0x2a,
13637     BNEZ16 = 0x2b,
13638     BNEZC16 = 0x2b,
13639     SLTIU32 = 0x2c,
13640     BNE32 = 0x2d,
13641     BALC = 0x2d,
13642     SDC132 = 0x2e,
13643     LDC132 = 0x2f,
13644 
13645     /* 0x31 is reserved */
13646     RES_31 = 0x31,
13647     BLEZALC = 0x30,
13648     BGEZALC = 0x30,
13649     BGEUC = 0x30,
13650     SWSP16 = 0x32,
13651     B16 = 0x33,
13652     BC16 = 0x33,
13653     ANDI32 = 0x34,
13654     J32 = 0x35,
13655     BGTZC = 0x35,
13656     BLTZC = 0x35,
13657     BLTC = 0x35,
13658     SD32 = 0x36, /* MIPS64 */
13659     LD32 = 0x37, /* MIPS64 */
13660 
13661     /* 0x39 is reserved */
13662     RES_39 = 0x39,
13663     BGTZALC = 0x38,
13664     BLTZALC = 0x38,
13665     BLTUC = 0x38,
13666     SW16 = 0x3a,
13667     LI16 = 0x3b,
13668     JALX32 = 0x3c,
13669     JAL32 = 0x3d,
13670     BLEZC = 0x3d,
13671     BGEZC = 0x3d,
13672     BGEC = 0x3d,
13673     SW32 = 0x3e,
13674     LW32 = 0x3f
13675 };
13676 
13677 /* PCREL Instructions perform PC-Relative address calculation. bits 20..16 */
13678 enum {
13679     ADDIUPC_00 = 0x00,
13680     ADDIUPC_01 = 0x01,
13681     ADDIUPC_02 = 0x02,
13682     ADDIUPC_03 = 0x03,
13683     ADDIUPC_04 = 0x04,
13684     ADDIUPC_05 = 0x05,
13685     ADDIUPC_06 = 0x06,
13686     ADDIUPC_07 = 0x07,
13687     AUIPC = 0x1e,
13688     ALUIPC = 0x1f,
13689     LWPC_08 = 0x08,
13690     LWPC_09 = 0x09,
13691     LWPC_0A = 0x0A,
13692     LWPC_0B = 0x0B,
13693     LWPC_0C = 0x0C,
13694     LWPC_0D = 0x0D,
13695     LWPC_0E = 0x0E,
13696     LWPC_0F = 0x0F,
13697 };
13698 
13699 /* POOL32A encoding of minor opcode field */
13700 
13701 enum {
13702     /*
13703      * These opcodes are distinguished only by bits 9..6; those bits are
13704      * what are recorded below.
13705      */
13706     SLL32 = 0x0,
13707     SRL32 = 0x1,
13708     SRA = 0x2,
13709     ROTR = 0x3,
13710     SELEQZ = 0x5,
13711     SELNEZ = 0x6,
13712     R6_RDHWR = 0x7,
13713 
13714     SLLV = 0x0,
13715     SRLV = 0x1,
13716     SRAV = 0x2,
13717     ROTRV = 0x3,
13718     ADD = 0x4,
13719     ADDU32 = 0x5,
13720     SUB = 0x6,
13721     SUBU32 = 0x7,
13722     MUL = 0x8,
13723     AND = 0x9,
13724     OR32 = 0xa,
13725     NOR = 0xb,
13726     XOR32 = 0xc,
13727     SLT = 0xd,
13728     SLTU = 0xe,
13729 
13730     MOVN = 0x0,
13731     R6_MUL  = 0x0,
13732     MOVZ = 0x1,
13733     MUH  = 0x1,
13734     MULU = 0x2,
13735     MUHU = 0x3,
13736     LWXS = 0x4,
13737     R6_DIV  = 0x4,
13738     MOD  = 0x5,
13739     R6_DIVU = 0x6,
13740     MODU = 0x7,
13741 
13742     /* The following can be distinguished by their lower 6 bits. */
13743     BREAK32 = 0x07,
13744     INS = 0x0c,
13745     LSA = 0x0f,
13746     ALIGN = 0x1f,
13747     EXT = 0x2c,
13748     POOL32AXF = 0x3c,
13749     SIGRIE = 0x3f
13750 };
13751 
13752 /* POOL32AXF encoding of minor opcode field extension */
13753 
13754 /*
13755  * 1. MIPS Architecture for Programmers Volume II-B:
13756  *      The microMIPS32 Instruction Set (Revision 3.05)
13757  *
13758  *    Table 6.5 POOL32Axf Encoding of Minor Opcode Extension Field
13759  *
13760  * 2. MIPS Architecture for Programmers VolumeIV-e:
13761  *      The MIPS DSP Application-Specific Extension
13762  *        to the microMIPS32 Architecture (Revision 2.34)
13763  *
13764  *    Table 5.5 POOL32Axf Encoding of Minor Opcode Extension Field
13765  */
13766 
13767 enum {
13768     /* bits 11..6 */
13769     TEQ = 0x00,
13770     TGE = 0x08,
13771     TGEU = 0x10,
13772     TLT = 0x20,
13773     TLTU = 0x28,
13774     TNE = 0x30,
13775 
13776     MFC0 = 0x03,
13777     MTC0 = 0x0b,
13778 
13779     /* begin of microMIPS32 DSP */
13780 
13781     /* bits 13..12 for 0x01 */
13782     MFHI_ACC = 0x0,
13783     MFLO_ACC = 0x1,
13784     MTHI_ACC = 0x2,
13785     MTLO_ACC = 0x3,
13786 
13787     /* bits 13..12 for 0x2a */
13788     MADD_ACC = 0x0,
13789     MADDU_ACC = 0x1,
13790     MSUB_ACC = 0x2,
13791     MSUBU_ACC = 0x3,
13792 
13793     /* bits 13..12 for 0x32 */
13794     MULT_ACC = 0x0,
13795     MULTU_ACC = 0x1,
13796 
13797     /* end of microMIPS32 DSP */
13798 
13799     /* bits 15..12 for 0x2c */
13800     BITSWAP = 0x0,
13801     SEB = 0x2,
13802     SEH = 0x3,
13803     CLO = 0x4,
13804     CLZ = 0x5,
13805     RDHWR = 0x6,
13806     WSBH = 0x7,
13807     MULT = 0x8,
13808     MULTU = 0x9,
13809     DIV = 0xa,
13810     DIVU = 0xb,
13811     MADD = 0xc,
13812     MADDU = 0xd,
13813     MSUB = 0xe,
13814     MSUBU = 0xf,
13815 
13816     /* bits 15..12 for 0x34 */
13817     MFC2 = 0x4,
13818     MTC2 = 0x5,
13819     MFHC2 = 0x8,
13820     MTHC2 = 0x9,
13821     CFC2 = 0xc,
13822     CTC2 = 0xd,
13823 
13824     /* bits 15..12 for 0x3c */
13825     JALR = 0x0,
13826     JR = 0x0,                   /* alias */
13827     JALRC = 0x0,
13828     JRC = 0x0,
13829     JALR_HB = 0x1,
13830     JALRC_HB = 0x1,
13831     JALRS = 0x4,
13832     JALRS_HB = 0x5,
13833 
13834     /* bits 15..12 for 0x05 */
13835     RDPGPR = 0xe,
13836     WRPGPR = 0xf,
13837 
13838     /* bits 15..12 for 0x0d */
13839     TLBP = 0x0,
13840     TLBR = 0x1,
13841     TLBWI = 0x2,
13842     TLBWR = 0x3,
13843     TLBINV = 0x4,
13844     TLBINVF = 0x5,
13845     WAIT = 0x9,
13846     IRET = 0xd,
13847     DERET = 0xe,
13848     ERET = 0xf,
13849 
13850     /* bits 15..12 for 0x15 */
13851     DMT = 0x0,
13852     DVPE = 0x1,
13853     EMT = 0x2,
13854     EVPE = 0x3,
13855 
13856     /* bits 15..12 for 0x1d */
13857     DI = 0x4,
13858     EI = 0x5,
13859 
13860     /* bits 15..12 for 0x2d */
13861     SYNC = 0x6,
13862     SYSCALL = 0x8,
13863     SDBBP = 0xd,
13864 
13865     /* bits 15..12 for 0x35 */
13866     MFHI32 = 0x0,
13867     MFLO32 = 0x1,
13868     MTHI32 = 0x2,
13869     MTLO32 = 0x3,
13870 };
13871 
13872 /* POOL32B encoding of minor opcode field (bits 15..12) */
13873 
13874 enum {
13875     LWC2 = 0x0,
13876     LWP = 0x1,
13877     LDP = 0x4,
13878     LWM32 = 0x5,
13879     CACHE = 0x6,
13880     LDM = 0x7,
13881     SWC2 = 0x8,
13882     SWP = 0x9,
13883     SDP = 0xc,
13884     SWM32 = 0xd,
13885     SDM = 0xf
13886 };
13887 
13888 /* POOL32C encoding of minor opcode field (bits 15..12) */
13889 
13890 enum {
13891     LWL = 0x0,
13892     SWL = 0x8,
13893     LWR = 0x1,
13894     SWR = 0x9,
13895     PREF = 0x2,
13896     ST_EVA = 0xa,
13897     LL = 0x3,
13898     SC = 0xb,
13899     LDL = 0x4,
13900     SDL = 0xc,
13901     LDR = 0x5,
13902     SDR = 0xd,
13903     LD_EVA = 0x6,
13904     LWU = 0xe,
13905     LLD = 0x7,
13906     SCD = 0xf
13907 };
13908 
13909 /* POOL32C LD-EVA encoding of minor opcode field (bits 11..9) */
13910 
13911 enum {
13912     LBUE = 0x0,
13913     LHUE = 0x1,
13914     LWLE = 0x2,
13915     LWRE = 0x3,
13916     LBE = 0x4,
13917     LHE = 0x5,
13918     LLE = 0x6,
13919     LWE = 0x7,
13920 };
13921 
13922 /* POOL32C ST-EVA encoding of minor opcode field (bits 11..9) */
13923 
13924 enum {
13925     SWLE = 0x0,
13926     SWRE = 0x1,
13927     PREFE = 0x2,
13928     CACHEE = 0x3,
13929     SBE = 0x4,
13930     SHE = 0x5,
13931     SCE = 0x6,
13932     SWE = 0x7,
13933 };
13934 
13935 /* POOL32F encoding of minor opcode field (bits 5..0) */
13936 
13937 enum {
13938     /* These are the bit 7..6 values */
13939     ADD_FMT = 0x0,
13940 
13941     SUB_FMT = 0x1,
13942 
13943     MUL_FMT = 0x2,
13944 
13945     DIV_FMT = 0x3,
13946 
13947     /* These are the bit 8..6 values */
13948     MOVN_FMT = 0x0,
13949     RSQRT2_FMT = 0x0,
13950     MOVF_FMT = 0x0,
13951     RINT_FMT = 0x0,
13952     SELNEZ_FMT = 0x0,
13953 
13954     MOVZ_FMT = 0x1,
13955     LWXC1 = 0x1,
13956     MOVT_FMT = 0x1,
13957     CLASS_FMT = 0x1,
13958     SELEQZ_FMT = 0x1,
13959 
13960     PLL_PS = 0x2,
13961     SWXC1 = 0x2,
13962     SEL_FMT = 0x2,
13963 
13964     PLU_PS = 0x3,
13965     LDXC1 = 0x3,
13966 
13967     MOVN_FMT_04 = 0x4,
13968     PUL_PS = 0x4,
13969     SDXC1 = 0x4,
13970     RECIP2_FMT = 0x4,
13971 
13972     MOVZ_FMT_05 = 0x05,
13973     PUU_PS = 0x5,
13974     LUXC1 = 0x5,
13975 
13976     CVT_PS_S = 0x6,
13977     SUXC1 = 0x6,
13978     ADDR_PS = 0x6,
13979     PREFX = 0x6,
13980     MADDF_FMT = 0x6,
13981 
13982     MULR_PS = 0x7,
13983     MSUBF_FMT = 0x7,
13984 
13985     MADD_S = 0x01,
13986     MADD_D = 0x09,
13987     MADD_PS = 0x11,
13988     ALNV_PS = 0x19,
13989     MSUB_S = 0x21,
13990     MSUB_D = 0x29,
13991     MSUB_PS = 0x31,
13992 
13993     NMADD_S = 0x02,
13994     NMADD_D = 0x0a,
13995     NMADD_PS = 0x12,
13996     NMSUB_S = 0x22,
13997     NMSUB_D = 0x2a,
13998     NMSUB_PS = 0x32,
13999 
14000     MIN_FMT = 0x3,
14001     MAX_FMT = 0xb,
14002     MINA_FMT = 0x23,
14003     MAXA_FMT = 0x2b,
14004     POOL32FXF = 0x3b,
14005 
14006     CABS_COND_FMT = 0x1c,              /* MIPS3D */
14007     C_COND_FMT = 0x3c,
14008 
14009     CMP_CONDN_S = 0x5,
14010     CMP_CONDN_D = 0x15
14011 };
14012 
14013 /* POOL32Fxf encoding of minor opcode extension field */
14014 
14015 enum {
14016     CVT_L = 0x04,
14017     RSQRT_FMT = 0x08,
14018     FLOOR_L = 0x0c,
14019     CVT_PW_PS = 0x1c,
14020     CVT_W = 0x24,
14021     SQRT_FMT = 0x28,
14022     FLOOR_W = 0x2c,
14023     CVT_PS_PW = 0x3c,
14024     CFC1 = 0x40,
14025     RECIP_FMT = 0x48,
14026     CEIL_L = 0x4c,
14027     CTC1 = 0x60,
14028     CEIL_W = 0x6c,
14029     MFC1 = 0x80,
14030     CVT_S_PL = 0x84,
14031     TRUNC_L = 0x8c,
14032     MTC1 = 0xa0,
14033     CVT_S_PU = 0xa4,
14034     TRUNC_W = 0xac,
14035     MFHC1 = 0xc0,
14036     ROUND_L = 0xcc,
14037     MTHC1 = 0xe0,
14038     ROUND_W = 0xec,
14039 
14040     MOV_FMT = 0x01,
14041     MOVF = 0x05,
14042     ABS_FMT = 0x0d,
14043     RSQRT1_FMT = 0x1d,
14044     MOVT = 0x25,
14045     NEG_FMT = 0x2d,
14046     CVT_D = 0x4d,
14047     RECIP1_FMT = 0x5d,
14048     CVT_S = 0x6d
14049 };
14050 
14051 /* POOL32I encoding of minor opcode field (bits 25..21) */
14052 
14053 enum {
14054     BLTZ = 0x00,
14055     BLTZAL = 0x01,
14056     BGEZ = 0x02,
14057     BGEZAL = 0x03,
14058     BLEZ = 0x04,
14059     BNEZC = 0x05,
14060     BGTZ = 0x06,
14061     BEQZC = 0x07,
14062     TLTI = 0x08,
14063     BC1EQZC = 0x08,
14064     TGEI = 0x09,
14065     BC1NEZC = 0x09,
14066     TLTIU = 0x0a,
14067     BC2EQZC = 0x0a,
14068     TGEIU = 0x0b,
14069     BC2NEZC = 0x0a,
14070     TNEI = 0x0c,
14071     R6_SYNCI = 0x0c,
14072     LUI = 0x0d,
14073     TEQI = 0x0e,
14074     SYNCI = 0x10,
14075     BLTZALS = 0x11,
14076     BGEZALS = 0x13,
14077     BC2F = 0x14,
14078     BC2T = 0x15,
14079     /* These overlap and are distinguished by bit16 of the instruction */
14080     BC1F = 0x1c,
14081     BC1T = 0x1d,
14082     BC1ANY2F = 0x1c,
14083     BC1ANY2T = 0x1d,
14084     BC1ANY4F = 0x1e,
14085     BC1ANY4T = 0x1f
14086 };
14087 
14088 /* POOL16A encoding of minor opcode field */
14089 
14090 enum {
14091     ADDU16 = 0x0,
14092     SUBU16 = 0x1
14093 };
14094 
14095 /* POOL16B encoding of minor opcode field */
14096 
14097 enum {
14098     SLL16 = 0x0,
14099     SRL16 = 0x1
14100 };
14101 
14102 /* POOL16C encoding of minor opcode field */
14103 
14104 enum {
14105     NOT16 = 0x00,
14106     XOR16 = 0x04,
14107     AND16 = 0x08,
14108     OR16 = 0x0c,
14109     LWM16 = 0x10,
14110     SWM16 = 0x14,
14111     JR16 = 0x18,
14112     JRC16 = 0x1a,
14113     JALR16 = 0x1c,
14114     JALR16S = 0x1e,
14115     MFHI16 = 0x20,
14116     MFLO16 = 0x24,
14117     BREAK16 = 0x28,
14118     SDBBP16 = 0x2c,
14119     JRADDIUSP = 0x30
14120 };
14121 
14122 /* R6 POOL16C encoding of minor opcode field (bits 0..5) */
14123 
14124 enum {
14125     R6_NOT16    = 0x00,
14126     R6_AND16    = 0x01,
14127     R6_LWM16    = 0x02,
14128     R6_JRC16    = 0x03,
14129     MOVEP       = 0x04,
14130     MOVEP_05    = 0x05,
14131     MOVEP_06    = 0x06,
14132     MOVEP_07    = 0x07,
14133     R6_XOR16    = 0x08,
14134     R6_OR16     = 0x09,
14135     R6_SWM16    = 0x0a,
14136     JALRC16     = 0x0b,
14137     MOVEP_0C    = 0x0c,
14138     MOVEP_0D    = 0x0d,
14139     MOVEP_0E    = 0x0e,
14140     MOVEP_0F    = 0x0f,
14141     JRCADDIUSP  = 0x13,
14142     R6_BREAK16  = 0x1b,
14143     R6_SDBBP16  = 0x3b
14144 };
14145 
14146 /* POOL16D encoding of minor opcode field */
14147 
14148 enum {
14149     ADDIUS5 = 0x0,
14150     ADDIUSP = 0x1
14151 };
14152 
14153 /* POOL16E encoding of minor opcode field */
14154 
14155 enum {
14156     ADDIUR2 = 0x0,
14157     ADDIUR1SP = 0x1
14158 };
14159 
14160 static int mmreg(int r)
14161 {
14162     static const int map[] = { 16, 17, 2, 3, 4, 5, 6, 7 };
14163 
14164     return map[r];
14165 }
14166 
14167 /* Used for 16-bit store instructions.  */
14168 static int mmreg2(int r)
14169 {
14170     static const int map[] = { 0, 17, 2, 3, 4, 5, 6, 7 };
14171 
14172     return map[r];
14173 }
14174 
14175 #define uMIPS_RD(op) ((op >> 7) & 0x7)
14176 #define uMIPS_RS(op) ((op >> 4) & 0x7)
14177 #define uMIPS_RS2(op) uMIPS_RS(op)
14178 #define uMIPS_RS1(op) ((op >> 1) & 0x7)
14179 #define uMIPS_RD5(op) ((op >> 5) & 0x1f)
14180 #define uMIPS_RS5(op) (op & 0x1f)
14181 
14182 /* Signed immediate */
14183 #define SIMM(op, start, width)                                          \
14184     ((int32_t)(((op >> start) & ((~0U) >> (32 - width)))                \
14185                << (32 - width))                                         \
14186      >> (32 - width))
14187 /* Zero-extended immediate */
14188 #define ZIMM(op, start, width) ((op >> start) & ((~0U) >> (32 - width)))
14189 
14190 static void gen_addiur1sp(DisasContext *ctx)
14191 {
14192     int rd = mmreg(uMIPS_RD(ctx->opcode));
14193 
14194     gen_arith_imm(ctx, OPC_ADDIU, rd, 29, ((ctx->opcode >> 1) & 0x3f) << 2);
14195 }
14196 
14197 static void gen_addiur2(DisasContext *ctx)
14198 {
14199     static const int decoded_imm[] = { 1, 4, 8, 12, 16, 20, 24, -1 };
14200     int rd = mmreg(uMIPS_RD(ctx->opcode));
14201     int rs = mmreg(uMIPS_RS(ctx->opcode));
14202 
14203     gen_arith_imm(ctx, OPC_ADDIU, rd, rs, decoded_imm[ZIMM(ctx->opcode, 1, 3)]);
14204 }
14205 
14206 static void gen_addiusp(DisasContext *ctx)
14207 {
14208     int encoded = ZIMM(ctx->opcode, 1, 9);
14209     int decoded;
14210 
14211     if (encoded <= 1) {
14212         decoded = 256 + encoded;
14213     } else if (encoded <= 255) {
14214         decoded = encoded;
14215     } else if (encoded <= 509) {
14216         decoded = encoded - 512;
14217     } else {
14218         decoded = encoded - 768;
14219     }
14220 
14221     gen_arith_imm(ctx, OPC_ADDIU, 29, 29, decoded << 2);
14222 }
14223 
14224 static void gen_addius5(DisasContext *ctx)
14225 {
14226     int imm = SIMM(ctx->opcode, 1, 4);
14227     int rd = (ctx->opcode >> 5) & 0x1f;
14228 
14229     gen_arith_imm(ctx, OPC_ADDIU, rd, rd, imm);
14230 }
14231 
14232 static void gen_andi16(DisasContext *ctx)
14233 {
14234     static const int decoded_imm[] = { 128, 1, 2, 3, 4, 7, 8, 15, 16,
14235                                  31, 32, 63, 64, 255, 32768, 65535 };
14236     int rd = mmreg(uMIPS_RD(ctx->opcode));
14237     int rs = mmreg(uMIPS_RS(ctx->opcode));
14238     int encoded = ZIMM(ctx->opcode, 0, 4);
14239 
14240     gen_logic_imm(ctx, OPC_ANDI, rd, rs, decoded_imm[encoded]);
14241 }
14242 
14243 static void gen_ldst_multiple(DisasContext *ctx, uint32_t opc, int reglist,
14244                               int base, int16_t offset)
14245 {
14246     TCGv t0, t1;
14247     TCGv_i32 t2;
14248 
14249     if (ctx->hflags & MIPS_HFLAG_BMASK) {
14250         gen_reserved_instruction(ctx);
14251         return;
14252     }
14253 
14254     t0 = tcg_temp_new();
14255 
14256     gen_base_offset_addr(ctx, t0, base, offset);
14257 
14258     t1 = tcg_const_tl(reglist);
14259     t2 = tcg_const_i32(ctx->mem_idx);
14260 
14261     save_cpu_state(ctx, 1);
14262     switch (opc) {
14263     case LWM32:
14264         gen_helper_lwm(cpu_env, t0, t1, t2);
14265         break;
14266     case SWM32:
14267         gen_helper_swm(cpu_env, t0, t1, t2);
14268         break;
14269 #ifdef TARGET_MIPS64
14270     case LDM:
14271         gen_helper_ldm(cpu_env, t0, t1, t2);
14272         break;
14273     case SDM:
14274         gen_helper_sdm(cpu_env, t0, t1, t2);
14275         break;
14276 #endif
14277     }
14278     tcg_temp_free(t0);
14279     tcg_temp_free(t1);
14280     tcg_temp_free_i32(t2);
14281 }
14282 
14283 
14284 static void gen_pool16c_insn(DisasContext *ctx)
14285 {
14286     int rd = mmreg((ctx->opcode >> 3) & 0x7);
14287     int rs = mmreg(ctx->opcode & 0x7);
14288 
14289     switch (((ctx->opcode) >> 4) & 0x3f) {
14290     case NOT16 + 0:
14291     case NOT16 + 1:
14292     case NOT16 + 2:
14293     case NOT16 + 3:
14294         gen_logic(ctx, OPC_NOR, rd, rs, 0);
14295         break;
14296     case XOR16 + 0:
14297     case XOR16 + 1:
14298     case XOR16 + 2:
14299     case XOR16 + 3:
14300         gen_logic(ctx, OPC_XOR, rd, rd, rs);
14301         break;
14302     case AND16 + 0:
14303     case AND16 + 1:
14304     case AND16 + 2:
14305     case AND16 + 3:
14306         gen_logic(ctx, OPC_AND, rd, rd, rs);
14307         break;
14308     case OR16 + 0:
14309     case OR16 + 1:
14310     case OR16 + 2:
14311     case OR16 + 3:
14312         gen_logic(ctx, OPC_OR, rd, rd, rs);
14313         break;
14314     case LWM16 + 0:
14315     case LWM16 + 1:
14316     case LWM16 + 2:
14317     case LWM16 + 3:
14318         {
14319             static const int lwm_convert[] = { 0x11, 0x12, 0x13, 0x14 };
14320             int offset = ZIMM(ctx->opcode, 0, 4);
14321 
14322             gen_ldst_multiple(ctx, LWM32, lwm_convert[(ctx->opcode >> 4) & 0x3],
14323                               29, offset << 2);
14324         }
14325         break;
14326     case SWM16 + 0:
14327     case SWM16 + 1:
14328     case SWM16 + 2:
14329     case SWM16 + 3:
14330         {
14331             static const int swm_convert[] = { 0x11, 0x12, 0x13, 0x14 };
14332             int offset = ZIMM(ctx->opcode, 0, 4);
14333 
14334             gen_ldst_multiple(ctx, SWM32, swm_convert[(ctx->opcode >> 4) & 0x3],
14335                               29, offset << 2);
14336         }
14337         break;
14338     case JR16 + 0:
14339     case JR16 + 1:
14340         {
14341             int reg = ctx->opcode & 0x1f;
14342 
14343             gen_compute_branch(ctx, OPC_JR, 2, reg, 0, 0, 4);
14344         }
14345         break;
14346     case JRC16 + 0:
14347     case JRC16 + 1:
14348         {
14349             int reg = ctx->opcode & 0x1f;
14350             gen_compute_branch(ctx, OPC_JR, 2, reg, 0, 0, 0);
14351             /*
14352              * Let normal delay slot handling in our caller take us
14353              * to the branch target.
14354              */
14355         }
14356         break;
14357     case JALR16 + 0:
14358     case JALR16 + 1:
14359         gen_compute_branch(ctx, OPC_JALR, 2, ctx->opcode & 0x1f, 31, 0, 4);
14360         ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
14361         break;
14362     case JALR16S + 0:
14363     case JALR16S + 1:
14364         gen_compute_branch(ctx, OPC_JALR, 2, ctx->opcode & 0x1f, 31, 0, 2);
14365         ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
14366         break;
14367     case MFHI16 + 0:
14368     case MFHI16 + 1:
14369         gen_HILO(ctx, OPC_MFHI, 0, uMIPS_RS5(ctx->opcode));
14370         break;
14371     case MFLO16 + 0:
14372     case MFLO16 + 1:
14373         gen_HILO(ctx, OPC_MFLO, 0, uMIPS_RS5(ctx->opcode));
14374         break;
14375     case BREAK16:
14376         generate_exception_end(ctx, EXCP_BREAK);
14377         break;
14378     case SDBBP16:
14379         if (is_uhi(extract32(ctx->opcode, 0, 4))) {
14380             gen_helper_do_semihosting(cpu_env);
14381         } else {
14382             /*
14383              * XXX: not clear which exception should be raised
14384              *      when in debug mode...
14385              */
14386             check_insn(ctx, ISA_MIPS_R1);
14387             generate_exception_end(ctx, EXCP_DBp);
14388         }
14389         break;
14390     case JRADDIUSP + 0:
14391     case JRADDIUSP + 1:
14392         {
14393             int imm = ZIMM(ctx->opcode, 0, 5);
14394             gen_compute_branch(ctx, OPC_JR, 2, 31, 0, 0, 0);
14395             gen_arith_imm(ctx, OPC_ADDIU, 29, 29, imm << 2);
14396             /*
14397              * Let normal delay slot handling in our caller take us
14398              * to the branch target.
14399              */
14400         }
14401         break;
14402     default:
14403         gen_reserved_instruction(ctx);
14404         break;
14405     }
14406 }
14407 
14408 static inline void gen_movep(DisasContext *ctx, int enc_dest, int enc_rt,
14409                              int enc_rs)
14410 {
14411     int rd, re;
14412     static const int rd_enc[] = { 5, 5, 6, 4, 4, 4, 4, 4 };
14413     static const int re_enc[] = { 6, 7, 7, 21, 22, 5, 6, 7 };
14414     static const int rs_rt_enc[] = { 0, 17, 2, 3, 16, 18, 19, 20 };
14415 
14416     rd = rd_enc[enc_dest];
14417     re = re_enc[enc_dest];
14418     gen_load_gpr(cpu_gpr[rd], rs_rt_enc[enc_rs]);
14419     gen_load_gpr(cpu_gpr[re], rs_rt_enc[enc_rt]);
14420 }
14421 
14422 static void gen_pool16c_r6_insn(DisasContext *ctx)
14423 {
14424     int rt = mmreg((ctx->opcode >> 7) & 0x7);
14425     int rs = mmreg((ctx->opcode >> 4) & 0x7);
14426 
14427     switch (ctx->opcode & 0xf) {
14428     case R6_NOT16:
14429         gen_logic(ctx, OPC_NOR, rt, rs, 0);
14430         break;
14431     case R6_AND16:
14432         gen_logic(ctx, OPC_AND, rt, rt, rs);
14433         break;
14434     case R6_LWM16:
14435         {
14436             int lwm_converted = 0x11 + extract32(ctx->opcode, 8, 2);
14437             int offset = extract32(ctx->opcode, 4, 4);
14438             gen_ldst_multiple(ctx, LWM32, lwm_converted, 29, offset << 2);
14439         }
14440         break;
14441     case R6_JRC16: /* JRCADDIUSP */
14442         if ((ctx->opcode >> 4) & 1) {
14443             /* JRCADDIUSP */
14444             int imm = extract32(ctx->opcode, 5, 5);
14445             gen_compute_branch(ctx, OPC_JR, 2, 31, 0, 0, 0);
14446             gen_arith_imm(ctx, OPC_ADDIU, 29, 29, imm << 2);
14447         } else {
14448             /* JRC16 */
14449             rs = extract32(ctx->opcode, 5, 5);
14450             gen_compute_branch(ctx, OPC_JR, 2, rs, 0, 0, 0);
14451         }
14452         break;
14453     case MOVEP:
14454     case MOVEP_05:
14455     case MOVEP_06:
14456     case MOVEP_07:
14457     case MOVEP_0C:
14458     case MOVEP_0D:
14459     case MOVEP_0E:
14460     case MOVEP_0F:
14461         {
14462             int enc_dest = uMIPS_RD(ctx->opcode);
14463             int enc_rt = uMIPS_RS2(ctx->opcode);
14464             int enc_rs = (ctx->opcode & 3) | ((ctx->opcode >> 1) & 4);
14465             gen_movep(ctx, enc_dest, enc_rt, enc_rs);
14466         }
14467         break;
14468     case R6_XOR16:
14469         gen_logic(ctx, OPC_XOR, rt, rt, rs);
14470         break;
14471     case R6_OR16:
14472         gen_logic(ctx, OPC_OR, rt, rt, rs);
14473         break;
14474     case R6_SWM16:
14475         {
14476             int swm_converted = 0x11 + extract32(ctx->opcode, 8, 2);
14477             int offset = extract32(ctx->opcode, 4, 4);
14478             gen_ldst_multiple(ctx, SWM32, swm_converted, 29, offset << 2);
14479         }
14480         break;
14481     case JALRC16: /* BREAK16, SDBBP16 */
14482         switch (ctx->opcode & 0x3f) {
14483         case JALRC16:
14484         case JALRC16 + 0x20:
14485             /* JALRC16 */
14486             gen_compute_branch(ctx, OPC_JALR, 2, (ctx->opcode >> 5) & 0x1f,
14487                                31, 0, 0);
14488             break;
14489         case R6_BREAK16:
14490             /* BREAK16 */
14491             generate_exception(ctx, EXCP_BREAK);
14492             break;
14493         case R6_SDBBP16:
14494             /* SDBBP16 */
14495             if (is_uhi(extract32(ctx->opcode, 6, 4))) {
14496                 gen_helper_do_semihosting(cpu_env);
14497             } else {
14498                 if (ctx->hflags & MIPS_HFLAG_SBRI) {
14499                     generate_exception(ctx, EXCP_RI);
14500                 } else {
14501                     generate_exception(ctx, EXCP_DBp);
14502                 }
14503             }
14504             break;
14505         }
14506         break;
14507     default:
14508         generate_exception(ctx, EXCP_RI);
14509         break;
14510     }
14511 }
14512 
14513 static void gen_ldxs(DisasContext *ctx, int base, int index, int rd)
14514 {
14515     TCGv t0 = tcg_temp_new();
14516     TCGv t1 = tcg_temp_new();
14517 
14518     gen_load_gpr(t0, base);
14519 
14520     if (index != 0) {
14521         gen_load_gpr(t1, index);
14522         tcg_gen_shli_tl(t1, t1, 2);
14523         gen_op_addr_add(ctx, t0, t1, t0);
14524     }
14525 
14526     tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL);
14527     gen_store_gpr(t1, rd);
14528 
14529     tcg_temp_free(t0);
14530     tcg_temp_free(t1);
14531 }
14532 
14533 static void gen_ldst_pair(DisasContext *ctx, uint32_t opc, int rd,
14534                           int base, int16_t offset)
14535 {
14536     TCGv t0, t1;
14537 
14538     if (ctx->hflags & MIPS_HFLAG_BMASK || rd == 31) {
14539         gen_reserved_instruction(ctx);
14540         return;
14541     }
14542 
14543     t0 = tcg_temp_new();
14544     t1 = tcg_temp_new();
14545 
14546     gen_base_offset_addr(ctx, t0, base, offset);
14547 
14548     switch (opc) {
14549     case LWP:
14550         if (rd == base) {
14551             gen_reserved_instruction(ctx);
14552             return;
14553         }
14554         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL);
14555         gen_store_gpr(t1, rd);
14556         tcg_gen_movi_tl(t1, 4);
14557         gen_op_addr_add(ctx, t0, t0, t1);
14558         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TESL);
14559         gen_store_gpr(t1, rd + 1);
14560         break;
14561     case SWP:
14562         gen_load_gpr(t1, rd);
14563         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
14564         tcg_gen_movi_tl(t1, 4);
14565         gen_op_addr_add(ctx, t0, t0, t1);
14566         gen_load_gpr(t1, rd + 1);
14567         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
14568         break;
14569 #ifdef TARGET_MIPS64
14570     case LDP:
14571         if (rd == base) {
14572             gen_reserved_instruction(ctx);
14573             return;
14574         }
14575         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TEQ);
14576         gen_store_gpr(t1, rd);
14577         tcg_gen_movi_tl(t1, 8);
14578         gen_op_addr_add(ctx, t0, t0, t1);
14579         tcg_gen_qemu_ld_tl(t1, t0, ctx->mem_idx, MO_TEQ);
14580         gen_store_gpr(t1, rd + 1);
14581         break;
14582     case SDP:
14583         gen_load_gpr(t1, rd);
14584         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ);
14585         tcg_gen_movi_tl(t1, 8);
14586         gen_op_addr_add(ctx, t0, t0, t1);
14587         gen_load_gpr(t1, rd + 1);
14588         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEQ);
14589         break;
14590 #endif
14591     }
14592     tcg_temp_free(t0);
14593     tcg_temp_free(t1);
14594 }
14595 
14596 static void gen_sync(int stype)
14597 {
14598     TCGBar tcg_mo = TCG_BAR_SC;
14599 
14600     switch (stype) {
14601     case 0x4: /* SYNC_WMB */
14602         tcg_mo |= TCG_MO_ST_ST;
14603         break;
14604     case 0x10: /* SYNC_MB */
14605         tcg_mo |= TCG_MO_ALL;
14606         break;
14607     case 0x11: /* SYNC_ACQUIRE */
14608         tcg_mo |= TCG_MO_LD_LD | TCG_MO_LD_ST;
14609         break;
14610     case 0x12: /* SYNC_RELEASE */
14611         tcg_mo |= TCG_MO_ST_ST | TCG_MO_LD_ST;
14612         break;
14613     case 0x13: /* SYNC_RMB */
14614         tcg_mo |= TCG_MO_LD_LD;
14615         break;
14616     default:
14617         tcg_mo |= TCG_MO_ALL;
14618         break;
14619     }
14620 
14621     tcg_gen_mb(tcg_mo);
14622 }
14623 
14624 static void gen_pool32axf(CPUMIPSState *env, DisasContext *ctx, int rt, int rs)
14625 {
14626     int extension = (ctx->opcode >> 6) & 0x3f;
14627     int minor = (ctx->opcode >> 12) & 0xf;
14628     uint32_t mips32_op;
14629 
14630     switch (extension) {
14631     case TEQ:
14632         mips32_op = OPC_TEQ;
14633         goto do_trap;
14634     case TGE:
14635         mips32_op = OPC_TGE;
14636         goto do_trap;
14637     case TGEU:
14638         mips32_op = OPC_TGEU;
14639         goto do_trap;
14640     case TLT:
14641         mips32_op = OPC_TLT;
14642         goto do_trap;
14643     case TLTU:
14644         mips32_op = OPC_TLTU;
14645         goto do_trap;
14646     case TNE:
14647         mips32_op = OPC_TNE;
14648     do_trap:
14649         gen_trap(ctx, mips32_op, rs, rt, -1);
14650         break;
14651 #ifndef CONFIG_USER_ONLY
14652     case MFC0:
14653     case MFC0 + 32:
14654         check_cp0_enabled(ctx);
14655         if (rt == 0) {
14656             /* Treat as NOP. */
14657             break;
14658         }
14659         gen_mfc0(ctx, cpu_gpr[rt], rs, (ctx->opcode >> 11) & 0x7);
14660         break;
14661     case MTC0:
14662     case MTC0 + 32:
14663         check_cp0_enabled(ctx);
14664         {
14665             TCGv t0 = tcg_temp_new();
14666 
14667             gen_load_gpr(t0, rt);
14668             gen_mtc0(ctx, t0, rs, (ctx->opcode >> 11) & 0x7);
14669             tcg_temp_free(t0);
14670         }
14671         break;
14672 #endif
14673     case 0x2a:
14674         switch (minor & 3) {
14675         case MADD_ACC:
14676             gen_muldiv(ctx, OPC_MADD, (ctx->opcode >> 14) & 3, rs, rt);
14677             break;
14678         case MADDU_ACC:
14679             gen_muldiv(ctx, OPC_MADDU, (ctx->opcode >> 14) & 3, rs, rt);
14680             break;
14681         case MSUB_ACC:
14682             gen_muldiv(ctx, OPC_MSUB, (ctx->opcode >> 14) & 3, rs, rt);
14683             break;
14684         case MSUBU_ACC:
14685             gen_muldiv(ctx, OPC_MSUBU, (ctx->opcode >> 14) & 3, rs, rt);
14686             break;
14687         default:
14688             goto pool32axf_invalid;
14689         }
14690         break;
14691     case 0x32:
14692         switch (minor & 3) {
14693         case MULT_ACC:
14694             gen_muldiv(ctx, OPC_MULT, (ctx->opcode >> 14) & 3, rs, rt);
14695             break;
14696         case MULTU_ACC:
14697             gen_muldiv(ctx, OPC_MULTU, (ctx->opcode >> 14) & 3, rs, rt);
14698             break;
14699         default:
14700             goto pool32axf_invalid;
14701         }
14702         break;
14703     case 0x2c:
14704         switch (minor) {
14705         case BITSWAP:
14706             check_insn(ctx, ISA_MIPS_R6);
14707             gen_bitswap(ctx, OPC_BITSWAP, rs, rt);
14708             break;
14709         case SEB:
14710             gen_bshfl(ctx, OPC_SEB, rs, rt);
14711             break;
14712         case SEH:
14713             gen_bshfl(ctx, OPC_SEH, rs, rt);
14714             break;
14715         case CLO:
14716             mips32_op = OPC_CLO;
14717             goto do_cl;
14718         case CLZ:
14719             mips32_op = OPC_CLZ;
14720         do_cl:
14721             check_insn(ctx, ISA_MIPS_R1);
14722             gen_cl(ctx, mips32_op, rt, rs);
14723             break;
14724         case RDHWR:
14725             check_insn_opc_removed(ctx, ISA_MIPS_R6);
14726             gen_rdhwr(ctx, rt, rs, 0);
14727             break;
14728         case WSBH:
14729             gen_bshfl(ctx, OPC_WSBH, rs, rt);
14730             break;
14731         case MULT:
14732             check_insn_opc_removed(ctx, ISA_MIPS_R6);
14733             mips32_op = OPC_MULT;
14734             goto do_mul;
14735         case MULTU:
14736             check_insn_opc_removed(ctx, ISA_MIPS_R6);
14737             mips32_op = OPC_MULTU;
14738             goto do_mul;
14739         case DIV:
14740             check_insn_opc_removed(ctx, ISA_MIPS_R6);
14741             mips32_op = OPC_DIV;
14742             goto do_div;
14743         case DIVU:
14744             check_insn_opc_removed(ctx, ISA_MIPS_R6);
14745             mips32_op = OPC_DIVU;
14746             goto do_div;
14747         do_div:
14748             check_insn(ctx, ISA_MIPS_R1);
14749             gen_muldiv(ctx, mips32_op, 0, rs, rt);
14750             break;
14751         case MADD:
14752             check_insn_opc_removed(ctx, ISA_MIPS_R6);
14753             mips32_op = OPC_MADD;
14754             goto do_mul;
14755         case MADDU:
14756             check_insn_opc_removed(ctx, ISA_MIPS_R6);
14757             mips32_op = OPC_MADDU;
14758             goto do_mul;
14759         case MSUB:
14760             check_insn_opc_removed(ctx, ISA_MIPS_R6);
14761             mips32_op = OPC_MSUB;
14762             goto do_mul;
14763         case MSUBU:
14764             check_insn_opc_removed(ctx, ISA_MIPS_R6);
14765             mips32_op = OPC_MSUBU;
14766         do_mul:
14767             check_insn(ctx, ISA_MIPS_R1);
14768             gen_muldiv(ctx, mips32_op, 0, rs, rt);
14769             break;
14770         default:
14771             goto pool32axf_invalid;
14772         }
14773         break;
14774     case 0x34:
14775         switch (minor) {
14776         case MFC2:
14777         case MTC2:
14778         case MFHC2:
14779         case MTHC2:
14780         case CFC2:
14781         case CTC2:
14782             generate_exception_err(ctx, EXCP_CpU, 2);
14783             break;
14784         default:
14785             goto pool32axf_invalid;
14786         }
14787         break;
14788     case 0x3c:
14789         switch (minor) {
14790         case JALR:    /* JALRC */
14791         case JALR_HB: /* JALRC_HB */
14792             if (ctx->insn_flags & ISA_MIPS_R6) {
14793                 /* JALRC, JALRC_HB */
14794                 gen_compute_branch(ctx, OPC_JALR, 4, rs, rt, 0, 0);
14795             } else {
14796                 /* JALR, JALR_HB */
14797                 gen_compute_branch(ctx, OPC_JALR, 4, rs, rt, 0, 4);
14798                 ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
14799             }
14800             break;
14801         case JALRS:
14802         case JALRS_HB:
14803             check_insn_opc_removed(ctx, ISA_MIPS_R6);
14804             gen_compute_branch(ctx, OPC_JALR, 4, rs, rt, 0, 2);
14805             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
14806             break;
14807         default:
14808             goto pool32axf_invalid;
14809         }
14810         break;
14811     case 0x05:
14812         switch (minor) {
14813         case RDPGPR:
14814             check_cp0_enabled(ctx);
14815             check_insn(ctx, ISA_MIPS_R2);
14816             gen_load_srsgpr(rs, rt);
14817             break;
14818         case WRPGPR:
14819             check_cp0_enabled(ctx);
14820             check_insn(ctx, ISA_MIPS_R2);
14821             gen_store_srsgpr(rs, rt);
14822             break;
14823         default:
14824             goto pool32axf_invalid;
14825         }
14826         break;
14827 #ifndef CONFIG_USER_ONLY
14828     case 0x0d:
14829         switch (minor) {
14830         case TLBP:
14831             mips32_op = OPC_TLBP;
14832             goto do_cp0;
14833         case TLBR:
14834             mips32_op = OPC_TLBR;
14835             goto do_cp0;
14836         case TLBWI:
14837             mips32_op = OPC_TLBWI;
14838             goto do_cp0;
14839         case TLBWR:
14840             mips32_op = OPC_TLBWR;
14841             goto do_cp0;
14842         case TLBINV:
14843             mips32_op = OPC_TLBINV;
14844             goto do_cp0;
14845         case TLBINVF:
14846             mips32_op = OPC_TLBINVF;
14847             goto do_cp0;
14848         case WAIT:
14849             mips32_op = OPC_WAIT;
14850             goto do_cp0;
14851         case DERET:
14852             mips32_op = OPC_DERET;
14853             goto do_cp0;
14854         case ERET:
14855             mips32_op = OPC_ERET;
14856         do_cp0:
14857             gen_cp0(env, ctx, mips32_op, rt, rs);
14858             break;
14859         default:
14860             goto pool32axf_invalid;
14861         }
14862         break;
14863     case 0x1d:
14864         switch (minor) {
14865         case DI:
14866             check_cp0_enabled(ctx);
14867             {
14868                 TCGv t0 = tcg_temp_new();
14869 
14870                 save_cpu_state(ctx, 1);
14871                 gen_helper_di(t0, cpu_env);
14872                 gen_store_gpr(t0, rs);
14873                 /*
14874                  * Stop translation as we may have switched the execution
14875                  * mode.
14876                  */
14877                 ctx->base.is_jmp = DISAS_STOP;
14878                 tcg_temp_free(t0);
14879             }
14880             break;
14881         case EI:
14882             check_cp0_enabled(ctx);
14883             {
14884                 TCGv t0 = tcg_temp_new();
14885 
14886                 save_cpu_state(ctx, 1);
14887                 gen_helper_ei(t0, cpu_env);
14888                 gen_store_gpr(t0, rs);
14889                 /*
14890                  * DISAS_STOP isn't sufficient, we need to ensure we break out
14891                  * of translated code to check for pending interrupts.
14892                  */
14893                 gen_save_pc(ctx->base.pc_next + 4);
14894                 ctx->base.is_jmp = DISAS_EXIT;
14895                 tcg_temp_free(t0);
14896             }
14897             break;
14898         default:
14899             goto pool32axf_invalid;
14900         }
14901         break;
14902 #endif
14903     case 0x2d:
14904         switch (minor) {
14905         case SYNC:
14906             gen_sync(extract32(ctx->opcode, 16, 5));
14907             break;
14908         case SYSCALL:
14909             generate_exception_end(ctx, EXCP_SYSCALL);
14910             break;
14911         case SDBBP:
14912             if (is_uhi(extract32(ctx->opcode, 16, 10))) {
14913                 gen_helper_do_semihosting(cpu_env);
14914             } else {
14915                 check_insn(ctx, ISA_MIPS_R1);
14916                 if (ctx->hflags & MIPS_HFLAG_SBRI) {
14917                     gen_reserved_instruction(ctx);
14918                 } else {
14919                     generate_exception_end(ctx, EXCP_DBp);
14920                 }
14921             }
14922             break;
14923         default:
14924             goto pool32axf_invalid;
14925         }
14926         break;
14927     case 0x01:
14928         switch (minor & 3) {
14929         case MFHI_ACC:
14930             gen_HILO(ctx, OPC_MFHI, minor >> 2, rs);
14931             break;
14932         case MFLO_ACC:
14933             gen_HILO(ctx, OPC_MFLO, minor >> 2, rs);
14934             break;
14935         case MTHI_ACC:
14936             gen_HILO(ctx, OPC_MTHI, minor >> 2, rs);
14937             break;
14938         case MTLO_ACC:
14939             gen_HILO(ctx, OPC_MTLO, minor >> 2, rs);
14940             break;
14941         default:
14942             goto pool32axf_invalid;
14943         }
14944         break;
14945     case 0x35:
14946         check_insn_opc_removed(ctx, ISA_MIPS_R6);
14947         switch (minor) {
14948         case MFHI32:
14949             gen_HILO(ctx, OPC_MFHI, 0, rs);
14950             break;
14951         case MFLO32:
14952             gen_HILO(ctx, OPC_MFLO, 0, rs);
14953             break;
14954         case MTHI32:
14955             gen_HILO(ctx, OPC_MTHI, 0, rs);
14956             break;
14957         case MTLO32:
14958             gen_HILO(ctx, OPC_MTLO, 0, rs);
14959             break;
14960         default:
14961             goto pool32axf_invalid;
14962         }
14963         break;
14964     default:
14965     pool32axf_invalid:
14966         MIPS_INVAL("pool32axf");
14967         gen_reserved_instruction(ctx);
14968         break;
14969     }
14970 }
14971 
14972 /*
14973  * Values for microMIPS fmt field.  Variable-width, depending on which
14974  * formats the instruction supports.
14975  */
14976 enum {
14977     FMT_SD_S = 0,
14978     FMT_SD_D = 1,
14979 
14980     FMT_SDPS_S = 0,
14981     FMT_SDPS_D = 1,
14982     FMT_SDPS_PS = 2,
14983 
14984     FMT_SWL_S = 0,
14985     FMT_SWL_W = 1,
14986     FMT_SWL_L = 2,
14987 
14988     FMT_DWL_D = 0,
14989     FMT_DWL_W = 1,
14990     FMT_DWL_L = 2
14991 };
14992 
14993 static void gen_pool32fxf(DisasContext *ctx, int rt, int rs)
14994 {
14995     int extension = (ctx->opcode >> 6) & 0x3ff;
14996     uint32_t mips32_op;
14997 
14998 #define FLOAT_1BIT_FMT(opc, fmt)    ((fmt << 8) | opc)
14999 #define FLOAT_2BIT_FMT(opc, fmt)    ((fmt << 7) | opc)
15000 #define COND_FLOAT_MOV(opc, cond)   ((cond << 7) | opc)
15001 
15002     switch (extension) {
15003     case FLOAT_1BIT_FMT(CFC1, 0):
15004         mips32_op = OPC_CFC1;
15005         goto do_cp1;
15006     case FLOAT_1BIT_FMT(CTC1, 0):
15007         mips32_op = OPC_CTC1;
15008         goto do_cp1;
15009     case FLOAT_1BIT_FMT(MFC1, 0):
15010         mips32_op = OPC_MFC1;
15011         goto do_cp1;
15012     case FLOAT_1BIT_FMT(MTC1, 0):
15013         mips32_op = OPC_MTC1;
15014         goto do_cp1;
15015     case FLOAT_1BIT_FMT(MFHC1, 0):
15016         mips32_op = OPC_MFHC1;
15017         goto do_cp1;
15018     case FLOAT_1BIT_FMT(MTHC1, 0):
15019         mips32_op = OPC_MTHC1;
15020     do_cp1:
15021         gen_cp1(ctx, mips32_op, rt, rs);
15022         break;
15023 
15024         /* Reciprocal square root */
15025     case FLOAT_1BIT_FMT(RSQRT_FMT, FMT_SD_S):
15026         mips32_op = OPC_RSQRT_S;
15027         goto do_unaryfp;
15028     case FLOAT_1BIT_FMT(RSQRT_FMT, FMT_SD_D):
15029         mips32_op = OPC_RSQRT_D;
15030         goto do_unaryfp;
15031 
15032         /* Square root */
15033     case FLOAT_1BIT_FMT(SQRT_FMT, FMT_SD_S):
15034         mips32_op = OPC_SQRT_S;
15035         goto do_unaryfp;
15036     case FLOAT_1BIT_FMT(SQRT_FMT, FMT_SD_D):
15037         mips32_op = OPC_SQRT_D;
15038         goto do_unaryfp;
15039 
15040         /* Reciprocal */
15041     case FLOAT_1BIT_FMT(RECIP_FMT, FMT_SD_S):
15042         mips32_op = OPC_RECIP_S;
15043         goto do_unaryfp;
15044     case FLOAT_1BIT_FMT(RECIP_FMT, FMT_SD_D):
15045         mips32_op = OPC_RECIP_D;
15046         goto do_unaryfp;
15047 
15048         /* Floor */
15049     case FLOAT_1BIT_FMT(FLOOR_L, FMT_SD_S):
15050         mips32_op = OPC_FLOOR_L_S;
15051         goto do_unaryfp;
15052     case FLOAT_1BIT_FMT(FLOOR_L, FMT_SD_D):
15053         mips32_op = OPC_FLOOR_L_D;
15054         goto do_unaryfp;
15055     case FLOAT_1BIT_FMT(FLOOR_W, FMT_SD_S):
15056         mips32_op = OPC_FLOOR_W_S;
15057         goto do_unaryfp;
15058     case FLOAT_1BIT_FMT(FLOOR_W, FMT_SD_D):
15059         mips32_op = OPC_FLOOR_W_D;
15060         goto do_unaryfp;
15061 
15062         /* Ceiling */
15063     case FLOAT_1BIT_FMT(CEIL_L, FMT_SD_S):
15064         mips32_op = OPC_CEIL_L_S;
15065         goto do_unaryfp;
15066     case FLOAT_1BIT_FMT(CEIL_L, FMT_SD_D):
15067         mips32_op = OPC_CEIL_L_D;
15068         goto do_unaryfp;
15069     case FLOAT_1BIT_FMT(CEIL_W, FMT_SD_S):
15070         mips32_op = OPC_CEIL_W_S;
15071         goto do_unaryfp;
15072     case FLOAT_1BIT_FMT(CEIL_W, FMT_SD_D):
15073         mips32_op = OPC_CEIL_W_D;
15074         goto do_unaryfp;
15075 
15076         /* Truncation */
15077     case FLOAT_1BIT_FMT(TRUNC_L, FMT_SD_S):
15078         mips32_op = OPC_TRUNC_L_S;
15079         goto do_unaryfp;
15080     case FLOAT_1BIT_FMT(TRUNC_L, FMT_SD_D):
15081         mips32_op = OPC_TRUNC_L_D;
15082         goto do_unaryfp;
15083     case FLOAT_1BIT_FMT(TRUNC_W, FMT_SD_S):
15084         mips32_op = OPC_TRUNC_W_S;
15085         goto do_unaryfp;
15086     case FLOAT_1BIT_FMT(TRUNC_W, FMT_SD_D):
15087         mips32_op = OPC_TRUNC_W_D;
15088         goto do_unaryfp;
15089 
15090         /* Round */
15091     case FLOAT_1BIT_FMT(ROUND_L, FMT_SD_S):
15092         mips32_op = OPC_ROUND_L_S;
15093         goto do_unaryfp;
15094     case FLOAT_1BIT_FMT(ROUND_L, FMT_SD_D):
15095         mips32_op = OPC_ROUND_L_D;
15096         goto do_unaryfp;
15097     case FLOAT_1BIT_FMT(ROUND_W, FMT_SD_S):
15098         mips32_op = OPC_ROUND_W_S;
15099         goto do_unaryfp;
15100     case FLOAT_1BIT_FMT(ROUND_W, FMT_SD_D):
15101         mips32_op = OPC_ROUND_W_D;
15102         goto do_unaryfp;
15103 
15104         /* Integer to floating-point conversion */
15105     case FLOAT_1BIT_FMT(CVT_L, FMT_SD_S):
15106         mips32_op = OPC_CVT_L_S;
15107         goto do_unaryfp;
15108     case FLOAT_1BIT_FMT(CVT_L, FMT_SD_D):
15109         mips32_op = OPC_CVT_L_D;
15110         goto do_unaryfp;
15111     case FLOAT_1BIT_FMT(CVT_W, FMT_SD_S):
15112         mips32_op = OPC_CVT_W_S;
15113         goto do_unaryfp;
15114     case FLOAT_1BIT_FMT(CVT_W, FMT_SD_D):
15115         mips32_op = OPC_CVT_W_D;
15116         goto do_unaryfp;
15117 
15118         /* Paired-foo conversions */
15119     case FLOAT_1BIT_FMT(CVT_S_PL, 0):
15120         mips32_op = OPC_CVT_S_PL;
15121         goto do_unaryfp;
15122     case FLOAT_1BIT_FMT(CVT_S_PU, 0):
15123         mips32_op = OPC_CVT_S_PU;
15124         goto do_unaryfp;
15125     case FLOAT_1BIT_FMT(CVT_PW_PS, 0):
15126         mips32_op = OPC_CVT_PW_PS;
15127         goto do_unaryfp;
15128     case FLOAT_1BIT_FMT(CVT_PS_PW, 0):
15129         mips32_op = OPC_CVT_PS_PW;
15130         goto do_unaryfp;
15131 
15132         /* Floating-point moves */
15133     case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_S):
15134         mips32_op = OPC_MOV_S;
15135         goto do_unaryfp;
15136     case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_D):
15137         mips32_op = OPC_MOV_D;
15138         goto do_unaryfp;
15139     case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_PS):
15140         mips32_op = OPC_MOV_PS;
15141         goto do_unaryfp;
15142 
15143         /* Absolute value */
15144     case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_S):
15145         mips32_op = OPC_ABS_S;
15146         goto do_unaryfp;
15147     case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_D):
15148         mips32_op = OPC_ABS_D;
15149         goto do_unaryfp;
15150     case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_PS):
15151         mips32_op = OPC_ABS_PS;
15152         goto do_unaryfp;
15153 
15154         /* Negation */
15155     case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_S):
15156         mips32_op = OPC_NEG_S;
15157         goto do_unaryfp;
15158     case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_D):
15159         mips32_op = OPC_NEG_D;
15160         goto do_unaryfp;
15161     case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_PS):
15162         mips32_op = OPC_NEG_PS;
15163         goto do_unaryfp;
15164 
15165         /* Reciprocal square root step */
15166     case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_S):
15167         mips32_op = OPC_RSQRT1_S;
15168         goto do_unaryfp;
15169     case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_D):
15170         mips32_op = OPC_RSQRT1_D;
15171         goto do_unaryfp;
15172     case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_PS):
15173         mips32_op = OPC_RSQRT1_PS;
15174         goto do_unaryfp;
15175 
15176         /* Reciprocal step */
15177     case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_S):
15178         mips32_op = OPC_RECIP1_S;
15179         goto do_unaryfp;
15180     case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_D):
15181         mips32_op = OPC_RECIP1_S;
15182         goto do_unaryfp;
15183     case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_PS):
15184         mips32_op = OPC_RECIP1_PS;
15185         goto do_unaryfp;
15186 
15187         /* Conversions from double */
15188     case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_S):
15189         mips32_op = OPC_CVT_D_S;
15190         goto do_unaryfp;
15191     case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_W):
15192         mips32_op = OPC_CVT_D_W;
15193         goto do_unaryfp;
15194     case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_L):
15195         mips32_op = OPC_CVT_D_L;
15196         goto do_unaryfp;
15197 
15198         /* Conversions from single */
15199     case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_D):
15200         mips32_op = OPC_CVT_S_D;
15201         goto do_unaryfp;
15202     case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_W):
15203         mips32_op = OPC_CVT_S_W;
15204         goto do_unaryfp;
15205     case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_L):
15206         mips32_op = OPC_CVT_S_L;
15207     do_unaryfp:
15208         gen_farith(ctx, mips32_op, -1, rs, rt, 0);
15209         break;
15210 
15211         /* Conditional moves on floating-point codes */
15212     case COND_FLOAT_MOV(MOVT, 0):
15213     case COND_FLOAT_MOV(MOVT, 1):
15214     case COND_FLOAT_MOV(MOVT, 2):
15215     case COND_FLOAT_MOV(MOVT, 3):
15216     case COND_FLOAT_MOV(MOVT, 4):
15217     case COND_FLOAT_MOV(MOVT, 5):
15218     case COND_FLOAT_MOV(MOVT, 6):
15219     case COND_FLOAT_MOV(MOVT, 7):
15220         check_insn_opc_removed(ctx, ISA_MIPS_R6);
15221         gen_movci(ctx, rt, rs, (ctx->opcode >> 13) & 0x7, 1);
15222         break;
15223     case COND_FLOAT_MOV(MOVF, 0):
15224     case COND_FLOAT_MOV(MOVF, 1):
15225     case COND_FLOAT_MOV(MOVF, 2):
15226     case COND_FLOAT_MOV(MOVF, 3):
15227     case COND_FLOAT_MOV(MOVF, 4):
15228     case COND_FLOAT_MOV(MOVF, 5):
15229     case COND_FLOAT_MOV(MOVF, 6):
15230     case COND_FLOAT_MOV(MOVF, 7):
15231         check_insn_opc_removed(ctx, ISA_MIPS_R6);
15232         gen_movci(ctx, rt, rs, (ctx->opcode >> 13) & 0x7, 0);
15233         break;
15234     default:
15235         MIPS_INVAL("pool32fxf");
15236         gen_reserved_instruction(ctx);
15237         break;
15238     }
15239 }
15240 
15241 static void decode_micromips32_opc(CPUMIPSState *env, DisasContext *ctx)
15242 {
15243     int32_t offset;
15244     uint16_t insn;
15245     int rt, rs, rd, rr;
15246     int16_t imm;
15247     uint32_t op, minor, minor2, mips32_op;
15248     uint32_t cond, fmt, cc;
15249 
15250     insn = translator_lduw(env, ctx->base.pc_next + 2);
15251     ctx->opcode = (ctx->opcode << 16) | insn;
15252 
15253     rt = (ctx->opcode >> 21) & 0x1f;
15254     rs = (ctx->opcode >> 16) & 0x1f;
15255     rd = (ctx->opcode >> 11) & 0x1f;
15256     rr = (ctx->opcode >> 6) & 0x1f;
15257     imm = (int16_t) ctx->opcode;
15258 
15259     op = (ctx->opcode >> 26) & 0x3f;
15260     switch (op) {
15261     case POOL32A:
15262         minor = ctx->opcode & 0x3f;
15263         switch (minor) {
15264         case 0x00:
15265             minor = (ctx->opcode >> 6) & 0xf;
15266             switch (minor) {
15267             case SLL32:
15268                 mips32_op = OPC_SLL;
15269                 goto do_shifti;
15270             case SRA:
15271                 mips32_op = OPC_SRA;
15272                 goto do_shifti;
15273             case SRL32:
15274                 mips32_op = OPC_SRL;
15275                 goto do_shifti;
15276             case ROTR:
15277                 mips32_op = OPC_ROTR;
15278             do_shifti:
15279                 gen_shift_imm(ctx, mips32_op, rt, rs, rd);
15280                 break;
15281             case SELEQZ:
15282                 check_insn(ctx, ISA_MIPS_R6);
15283                 gen_cond_move(ctx, OPC_SELEQZ, rd, rs, rt);
15284                 break;
15285             case SELNEZ:
15286                 check_insn(ctx, ISA_MIPS_R6);
15287                 gen_cond_move(ctx, OPC_SELNEZ, rd, rs, rt);
15288                 break;
15289             case R6_RDHWR:
15290                 check_insn(ctx, ISA_MIPS_R6);
15291                 gen_rdhwr(ctx, rt, rs, extract32(ctx->opcode, 11, 3));
15292                 break;
15293             default:
15294                 goto pool32a_invalid;
15295             }
15296             break;
15297         case 0x10:
15298             minor = (ctx->opcode >> 6) & 0xf;
15299             switch (minor) {
15300                 /* Arithmetic */
15301             case ADD:
15302                 mips32_op = OPC_ADD;
15303                 goto do_arith;
15304             case ADDU32:
15305                 mips32_op = OPC_ADDU;
15306                 goto do_arith;
15307             case SUB:
15308                 mips32_op = OPC_SUB;
15309                 goto do_arith;
15310             case SUBU32:
15311                 mips32_op = OPC_SUBU;
15312                 goto do_arith;
15313             case MUL:
15314                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
15315                 mips32_op = OPC_MUL;
15316             do_arith:
15317                 gen_arith(ctx, mips32_op, rd, rs, rt);
15318                 break;
15319                 /* Shifts */
15320             case SLLV:
15321                 mips32_op = OPC_SLLV;
15322                 goto do_shift;
15323             case SRLV:
15324                 mips32_op = OPC_SRLV;
15325                 goto do_shift;
15326             case SRAV:
15327                 mips32_op = OPC_SRAV;
15328                 goto do_shift;
15329             case ROTRV:
15330                 mips32_op = OPC_ROTRV;
15331             do_shift:
15332                 gen_shift(ctx, mips32_op, rd, rs, rt);
15333                 break;
15334                 /* Logical operations */
15335             case AND:
15336                 mips32_op = OPC_AND;
15337                 goto do_logic;
15338             case OR32:
15339                 mips32_op = OPC_OR;
15340                 goto do_logic;
15341             case NOR:
15342                 mips32_op = OPC_NOR;
15343                 goto do_logic;
15344             case XOR32:
15345                 mips32_op = OPC_XOR;
15346             do_logic:
15347                 gen_logic(ctx, mips32_op, rd, rs, rt);
15348                 break;
15349                 /* Set less than */
15350             case SLT:
15351                 mips32_op = OPC_SLT;
15352                 goto do_slt;
15353             case SLTU:
15354                 mips32_op = OPC_SLTU;
15355             do_slt:
15356                 gen_slt(ctx, mips32_op, rd, rs, rt);
15357                 break;
15358             default:
15359                 goto pool32a_invalid;
15360             }
15361             break;
15362         case 0x18:
15363             minor = (ctx->opcode >> 6) & 0xf;
15364             switch (minor) {
15365                 /* Conditional moves */
15366             case MOVN: /* MUL */
15367                 if (ctx->insn_flags & ISA_MIPS_R6) {
15368                     /* MUL */
15369                     gen_r6_muldiv(ctx, R6_OPC_MUL, rd, rs, rt);
15370                 } else {
15371                     /* MOVN */
15372                     gen_cond_move(ctx, OPC_MOVN, rd, rs, rt);
15373                 }
15374                 break;
15375             case MOVZ: /* MUH */
15376                 if (ctx->insn_flags & ISA_MIPS_R6) {
15377                     /* MUH */
15378                     gen_r6_muldiv(ctx, R6_OPC_MUH, rd, rs, rt);
15379                 } else {
15380                     /* MOVZ */
15381                     gen_cond_move(ctx, OPC_MOVZ, rd, rs, rt);
15382                 }
15383                 break;
15384             case MULU:
15385                 check_insn(ctx, ISA_MIPS_R6);
15386                 gen_r6_muldiv(ctx, R6_OPC_MULU, rd, rs, rt);
15387                 break;
15388             case MUHU:
15389                 check_insn(ctx, ISA_MIPS_R6);
15390                 gen_r6_muldiv(ctx, R6_OPC_MUHU, rd, rs, rt);
15391                 break;
15392             case LWXS: /* DIV */
15393                 if (ctx->insn_flags & ISA_MIPS_R6) {
15394                     /* DIV */
15395                     gen_r6_muldiv(ctx, R6_OPC_DIV, rd, rs, rt);
15396                 } else {
15397                     /* LWXS */
15398                     gen_ldxs(ctx, rs, rt, rd);
15399                 }
15400                 break;
15401             case MOD:
15402                 check_insn(ctx, ISA_MIPS_R6);
15403                 gen_r6_muldiv(ctx, R6_OPC_MOD, rd, rs, rt);
15404                 break;
15405             case R6_DIVU:
15406                 check_insn(ctx, ISA_MIPS_R6);
15407                 gen_r6_muldiv(ctx, R6_OPC_DIVU, rd, rs, rt);
15408                 break;
15409             case MODU:
15410                 check_insn(ctx, ISA_MIPS_R6);
15411                 gen_r6_muldiv(ctx, R6_OPC_MODU, rd, rs, rt);
15412                 break;
15413             default:
15414                 goto pool32a_invalid;
15415             }
15416             break;
15417         case INS:
15418             gen_bitops(ctx, OPC_INS, rt, rs, rr, rd);
15419             return;
15420         case LSA:
15421             check_insn(ctx, ISA_MIPS_R6);
15422             gen_lsa(ctx, rd, rt, rs, extract32(ctx->opcode, 9, 2));
15423             break;
15424         case ALIGN:
15425             check_insn(ctx, ISA_MIPS_R6);
15426             gen_align(ctx, 32, rd, rs, rt, extract32(ctx->opcode, 9, 2));
15427             break;
15428         case EXT:
15429             gen_bitops(ctx, OPC_EXT, rt, rs, rr, rd);
15430             return;
15431         case POOL32AXF:
15432             gen_pool32axf(env, ctx, rt, rs);
15433             break;
15434         case BREAK32:
15435             generate_exception_end(ctx, EXCP_BREAK);
15436             break;
15437         case SIGRIE:
15438             check_insn(ctx, ISA_MIPS_R6);
15439             gen_reserved_instruction(ctx);
15440             break;
15441         default:
15442         pool32a_invalid:
15443                 MIPS_INVAL("pool32a");
15444                 gen_reserved_instruction(ctx);
15445                 break;
15446         }
15447         break;
15448     case POOL32B:
15449         minor = (ctx->opcode >> 12) & 0xf;
15450         switch (minor) {
15451         case CACHE:
15452             check_cp0_enabled(ctx);
15453             if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
15454                 gen_cache_operation(ctx, rt, rs, imm);
15455             }
15456             break;
15457         case LWC2:
15458         case SWC2:
15459             /* COP2: Not implemented. */
15460             generate_exception_err(ctx, EXCP_CpU, 2);
15461             break;
15462 #ifdef TARGET_MIPS64
15463         case LDP:
15464         case SDP:
15465             check_insn(ctx, ISA_MIPS3);
15466             check_mips_64(ctx);
15467 #endif
15468             /* fall through */
15469         case LWP:
15470         case SWP:
15471             gen_ldst_pair(ctx, minor, rt, rs, SIMM(ctx->opcode, 0, 12));
15472             break;
15473 #ifdef TARGET_MIPS64
15474         case LDM:
15475         case SDM:
15476             check_insn(ctx, ISA_MIPS3);
15477             check_mips_64(ctx);
15478 #endif
15479             /* fall through */
15480         case LWM32:
15481         case SWM32:
15482             gen_ldst_multiple(ctx, minor, rt, rs, SIMM(ctx->opcode, 0, 12));
15483             break;
15484         default:
15485             MIPS_INVAL("pool32b");
15486             gen_reserved_instruction(ctx);
15487             break;
15488         }
15489         break;
15490     case POOL32F:
15491         if (ctx->CP0_Config1 & (1 << CP0C1_FP)) {
15492             minor = ctx->opcode & 0x3f;
15493             check_cp1_enabled(ctx);
15494             switch (minor) {
15495             case ALNV_PS:
15496                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
15497                 mips32_op = OPC_ALNV_PS;
15498                 goto do_madd;
15499             case MADD_S:
15500                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
15501                 mips32_op = OPC_MADD_S;
15502                 goto do_madd;
15503             case MADD_D:
15504                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
15505                 mips32_op = OPC_MADD_D;
15506                 goto do_madd;
15507             case MADD_PS:
15508                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
15509                 mips32_op = OPC_MADD_PS;
15510                 goto do_madd;
15511             case MSUB_S:
15512                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
15513                 mips32_op = OPC_MSUB_S;
15514                 goto do_madd;
15515             case MSUB_D:
15516                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
15517                 mips32_op = OPC_MSUB_D;
15518                 goto do_madd;
15519             case MSUB_PS:
15520                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
15521                 mips32_op = OPC_MSUB_PS;
15522                 goto do_madd;
15523             case NMADD_S:
15524                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
15525                 mips32_op = OPC_NMADD_S;
15526                 goto do_madd;
15527             case NMADD_D:
15528                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
15529                 mips32_op = OPC_NMADD_D;
15530                 goto do_madd;
15531             case NMADD_PS:
15532                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
15533                 mips32_op = OPC_NMADD_PS;
15534                 goto do_madd;
15535             case NMSUB_S:
15536                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
15537                 mips32_op = OPC_NMSUB_S;
15538                 goto do_madd;
15539             case NMSUB_D:
15540                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
15541                 mips32_op = OPC_NMSUB_D;
15542                 goto do_madd;
15543             case NMSUB_PS:
15544                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
15545                 mips32_op = OPC_NMSUB_PS;
15546             do_madd:
15547                 gen_flt3_arith(ctx, mips32_op, rd, rr, rs, rt);
15548                 break;
15549             case CABS_COND_FMT:
15550                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
15551                 cond = (ctx->opcode >> 6) & 0xf;
15552                 cc = (ctx->opcode >> 13) & 0x7;
15553                 fmt = (ctx->opcode >> 10) & 0x3;
15554                 switch (fmt) {
15555                 case 0x0:
15556                     gen_cmpabs_s(ctx, cond, rt, rs, cc);
15557                     break;
15558                 case 0x1:
15559                     gen_cmpabs_d(ctx, cond, rt, rs, cc);
15560                     break;
15561                 case 0x2:
15562                     gen_cmpabs_ps(ctx, cond, rt, rs, cc);
15563                     break;
15564                 default:
15565                     goto pool32f_invalid;
15566                 }
15567                 break;
15568             case C_COND_FMT:
15569                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
15570                 cond = (ctx->opcode >> 6) & 0xf;
15571                 cc = (ctx->opcode >> 13) & 0x7;
15572                 fmt = (ctx->opcode >> 10) & 0x3;
15573                 switch (fmt) {
15574                 case 0x0:
15575                     gen_cmp_s(ctx, cond, rt, rs, cc);
15576                     break;
15577                 case 0x1:
15578                     gen_cmp_d(ctx, cond, rt, rs, cc);
15579                     break;
15580                 case 0x2:
15581                     gen_cmp_ps(ctx, cond, rt, rs, cc);
15582                     break;
15583                 default:
15584                     goto pool32f_invalid;
15585                 }
15586                 break;
15587             case CMP_CONDN_S:
15588                 check_insn(ctx, ISA_MIPS_R6);
15589                 gen_r6_cmp_s(ctx, (ctx->opcode >> 6) & 0x1f, rt, rs, rd);
15590                 break;
15591             case CMP_CONDN_D:
15592                 check_insn(ctx, ISA_MIPS_R6);
15593                 gen_r6_cmp_d(ctx, (ctx->opcode >> 6) & 0x1f, rt, rs, rd);
15594                 break;
15595             case POOL32FXF:
15596                 gen_pool32fxf(ctx, rt, rs);
15597                 break;
15598             case 0x00:
15599                 /* PLL foo */
15600                 switch ((ctx->opcode >> 6) & 0x7) {
15601                 case PLL_PS:
15602                     mips32_op = OPC_PLL_PS;
15603                     goto do_ps;
15604                 case PLU_PS:
15605                     mips32_op = OPC_PLU_PS;
15606                     goto do_ps;
15607                 case PUL_PS:
15608                     mips32_op = OPC_PUL_PS;
15609                     goto do_ps;
15610                 case PUU_PS:
15611                     mips32_op = OPC_PUU_PS;
15612                     goto do_ps;
15613                 case CVT_PS_S:
15614                     check_insn_opc_removed(ctx, ISA_MIPS_R6);
15615                     mips32_op = OPC_CVT_PS_S;
15616                 do_ps:
15617                     gen_farith(ctx, mips32_op, rt, rs, rd, 0);
15618                     break;
15619                 default:
15620                     goto pool32f_invalid;
15621                 }
15622                 break;
15623             case MIN_FMT:
15624                 check_insn(ctx, ISA_MIPS_R6);
15625                 switch ((ctx->opcode >> 9) & 0x3) {
15626                 case FMT_SDPS_S:
15627                     gen_farith(ctx, OPC_MIN_S, rt, rs, rd, 0);
15628                     break;
15629                 case FMT_SDPS_D:
15630                     gen_farith(ctx, OPC_MIN_D, rt, rs, rd, 0);
15631                     break;
15632                 default:
15633                     goto pool32f_invalid;
15634                 }
15635                 break;
15636             case 0x08:
15637                 /* [LS][WDU]XC1 */
15638                 switch ((ctx->opcode >> 6) & 0x7) {
15639                 case LWXC1:
15640                     check_insn_opc_removed(ctx, ISA_MIPS_R6);
15641                     mips32_op = OPC_LWXC1;
15642                     goto do_ldst_cp1;
15643                 case SWXC1:
15644                     check_insn_opc_removed(ctx, ISA_MIPS_R6);
15645                     mips32_op = OPC_SWXC1;
15646                     goto do_ldst_cp1;
15647                 case LDXC1:
15648                     check_insn_opc_removed(ctx, ISA_MIPS_R6);
15649                     mips32_op = OPC_LDXC1;
15650                     goto do_ldst_cp1;
15651                 case SDXC1:
15652                     check_insn_opc_removed(ctx, ISA_MIPS_R6);
15653                     mips32_op = OPC_SDXC1;
15654                     goto do_ldst_cp1;
15655                 case LUXC1:
15656                     check_insn_opc_removed(ctx, ISA_MIPS_R6);
15657                     mips32_op = OPC_LUXC1;
15658                     goto do_ldst_cp1;
15659                 case SUXC1:
15660                     check_insn_opc_removed(ctx, ISA_MIPS_R6);
15661                     mips32_op = OPC_SUXC1;
15662                 do_ldst_cp1:
15663                     gen_flt3_ldst(ctx, mips32_op, rd, rd, rt, rs);
15664                     break;
15665                 default:
15666                     goto pool32f_invalid;
15667                 }
15668                 break;
15669             case MAX_FMT:
15670                 check_insn(ctx, ISA_MIPS_R6);
15671                 switch ((ctx->opcode >> 9) & 0x3) {
15672                 case FMT_SDPS_S:
15673                     gen_farith(ctx, OPC_MAX_S, rt, rs, rd, 0);
15674                     break;
15675                 case FMT_SDPS_D:
15676                     gen_farith(ctx, OPC_MAX_D, rt, rs, rd, 0);
15677                     break;
15678                 default:
15679                     goto pool32f_invalid;
15680                 }
15681                 break;
15682             case 0x18:
15683                 /* 3D insns */
15684                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
15685                 fmt = (ctx->opcode >> 9) & 0x3;
15686                 switch ((ctx->opcode >> 6) & 0x7) {
15687                 case RSQRT2_FMT:
15688                     switch (fmt) {
15689                     case FMT_SDPS_S:
15690                         mips32_op = OPC_RSQRT2_S;
15691                         goto do_3d;
15692                     case FMT_SDPS_D:
15693                         mips32_op = OPC_RSQRT2_D;
15694                         goto do_3d;
15695                     case FMT_SDPS_PS:
15696                         mips32_op = OPC_RSQRT2_PS;
15697                         goto do_3d;
15698                     default:
15699                         goto pool32f_invalid;
15700                     }
15701                     break;
15702                 case RECIP2_FMT:
15703                     switch (fmt) {
15704                     case FMT_SDPS_S:
15705                         mips32_op = OPC_RECIP2_S;
15706                         goto do_3d;
15707                     case FMT_SDPS_D:
15708                         mips32_op = OPC_RECIP2_D;
15709                         goto do_3d;
15710                     case FMT_SDPS_PS:
15711                         mips32_op = OPC_RECIP2_PS;
15712                         goto do_3d;
15713                     default:
15714                         goto pool32f_invalid;
15715                     }
15716                     break;
15717                 case ADDR_PS:
15718                     mips32_op = OPC_ADDR_PS;
15719                     goto do_3d;
15720                 case MULR_PS:
15721                     mips32_op = OPC_MULR_PS;
15722                 do_3d:
15723                     gen_farith(ctx, mips32_op, rt, rs, rd, 0);
15724                     break;
15725                 default:
15726                     goto pool32f_invalid;
15727                 }
15728                 break;
15729             case 0x20:
15730                 /* MOV[FT].fmt, PREFX, RINT.fmt, CLASS.fmt*/
15731                 cc = (ctx->opcode >> 13) & 0x7;
15732                 fmt = (ctx->opcode >> 9) & 0x3;
15733                 switch ((ctx->opcode >> 6) & 0x7) {
15734                 case MOVF_FMT: /* RINT_FMT */
15735                     if (ctx->insn_flags & ISA_MIPS_R6) {
15736                         /* RINT_FMT */
15737                         switch (fmt) {
15738                         case FMT_SDPS_S:
15739                             gen_farith(ctx, OPC_RINT_S, 0, rt, rs, 0);
15740                             break;
15741                         case FMT_SDPS_D:
15742                             gen_farith(ctx, OPC_RINT_D, 0, rt, rs, 0);
15743                             break;
15744                         default:
15745                             goto pool32f_invalid;
15746                         }
15747                     } else {
15748                         /* MOVF_FMT */
15749                         switch (fmt) {
15750                         case FMT_SDPS_S:
15751                             gen_movcf_s(ctx, rs, rt, cc, 0);
15752                             break;
15753                         case FMT_SDPS_D:
15754                             gen_movcf_d(ctx, rs, rt, cc, 0);
15755                             break;
15756                         case FMT_SDPS_PS:
15757                             check_ps(ctx);
15758                             gen_movcf_ps(ctx, rs, rt, cc, 0);
15759                             break;
15760                         default:
15761                             goto pool32f_invalid;
15762                         }
15763                     }
15764                     break;
15765                 case MOVT_FMT: /* CLASS_FMT */
15766                     if (ctx->insn_flags & ISA_MIPS_R6) {
15767                         /* CLASS_FMT */
15768                         switch (fmt) {
15769                         case FMT_SDPS_S:
15770                             gen_farith(ctx, OPC_CLASS_S, 0, rt, rs, 0);
15771                             break;
15772                         case FMT_SDPS_D:
15773                             gen_farith(ctx, OPC_CLASS_D, 0, rt, rs, 0);
15774                             break;
15775                         default:
15776                             goto pool32f_invalid;
15777                         }
15778                     } else {
15779                         /* MOVT_FMT */
15780                         switch (fmt) {
15781                         case FMT_SDPS_S:
15782                             gen_movcf_s(ctx, rs, rt, cc, 1);
15783                             break;
15784                         case FMT_SDPS_D:
15785                             gen_movcf_d(ctx, rs, rt, cc, 1);
15786                             break;
15787                         case FMT_SDPS_PS:
15788                             check_ps(ctx);
15789                             gen_movcf_ps(ctx, rs, rt, cc, 1);
15790                             break;
15791                         default:
15792                             goto pool32f_invalid;
15793                         }
15794                     }
15795                     break;
15796                 case PREFX:
15797                     check_insn_opc_removed(ctx, ISA_MIPS_R6);
15798                     break;
15799                 default:
15800                     goto pool32f_invalid;
15801                 }
15802                 break;
15803 #define FINSN_3ARG_SDPS(prfx)                           \
15804                 switch ((ctx->opcode >> 8) & 0x3) {     \
15805                 case FMT_SDPS_S:                        \
15806                     mips32_op = OPC_##prfx##_S;         \
15807                     goto do_fpop;                       \
15808                 case FMT_SDPS_D:                        \
15809                     mips32_op = OPC_##prfx##_D;         \
15810                     goto do_fpop;                       \
15811                 case FMT_SDPS_PS:                       \
15812                     check_ps(ctx);                      \
15813                     mips32_op = OPC_##prfx##_PS;        \
15814                     goto do_fpop;                       \
15815                 default:                                \
15816                     goto pool32f_invalid;               \
15817                 }
15818             case MINA_FMT:
15819                 check_insn(ctx, ISA_MIPS_R6);
15820                 switch ((ctx->opcode >> 9) & 0x3) {
15821                 case FMT_SDPS_S:
15822                     gen_farith(ctx, OPC_MINA_S, rt, rs, rd, 0);
15823                     break;
15824                 case FMT_SDPS_D:
15825                     gen_farith(ctx, OPC_MINA_D, rt, rs, rd, 0);
15826                     break;
15827                 default:
15828                     goto pool32f_invalid;
15829                 }
15830                 break;
15831             case MAXA_FMT:
15832                 check_insn(ctx, ISA_MIPS_R6);
15833                 switch ((ctx->opcode >> 9) & 0x3) {
15834                 case FMT_SDPS_S:
15835                     gen_farith(ctx, OPC_MAXA_S, rt, rs, rd, 0);
15836                     break;
15837                 case FMT_SDPS_D:
15838                     gen_farith(ctx, OPC_MAXA_D, rt, rs, rd, 0);
15839                     break;
15840                 default:
15841                     goto pool32f_invalid;
15842                 }
15843                 break;
15844             case 0x30:
15845                 /* regular FP ops */
15846                 switch ((ctx->opcode >> 6) & 0x3) {
15847                 case ADD_FMT:
15848                     FINSN_3ARG_SDPS(ADD);
15849                     break;
15850                 case SUB_FMT:
15851                     FINSN_3ARG_SDPS(SUB);
15852                     break;
15853                 case MUL_FMT:
15854                     FINSN_3ARG_SDPS(MUL);
15855                     break;
15856                 case DIV_FMT:
15857                     fmt = (ctx->opcode >> 8) & 0x3;
15858                     if (fmt == 1) {
15859                         mips32_op = OPC_DIV_D;
15860                     } else if (fmt == 0) {
15861                         mips32_op = OPC_DIV_S;
15862                     } else {
15863                         goto pool32f_invalid;
15864                     }
15865                     goto do_fpop;
15866                 default:
15867                     goto pool32f_invalid;
15868                 }
15869                 break;
15870             case 0x38:
15871                 /* cmovs */
15872                 switch ((ctx->opcode >> 6) & 0x7) {
15873                 case MOVN_FMT: /* SELEQZ_FMT */
15874                     if (ctx->insn_flags & ISA_MIPS_R6) {
15875                         /* SELEQZ_FMT */
15876                         switch ((ctx->opcode >> 9) & 0x3) {
15877                         case FMT_SDPS_S:
15878                             gen_sel_s(ctx, OPC_SELEQZ_S, rd, rt, rs);
15879                             break;
15880                         case FMT_SDPS_D:
15881                             gen_sel_d(ctx, OPC_SELEQZ_D, rd, rt, rs);
15882                             break;
15883                         default:
15884                             goto pool32f_invalid;
15885                         }
15886                     } else {
15887                         /* MOVN_FMT */
15888                         FINSN_3ARG_SDPS(MOVN);
15889                     }
15890                     break;
15891                 case MOVN_FMT_04:
15892                     check_insn_opc_removed(ctx, ISA_MIPS_R6);
15893                     FINSN_3ARG_SDPS(MOVN);
15894                     break;
15895                 case MOVZ_FMT: /* SELNEZ_FMT */
15896                     if (ctx->insn_flags & ISA_MIPS_R6) {
15897                         /* SELNEZ_FMT */
15898                         switch ((ctx->opcode >> 9) & 0x3) {
15899                         case FMT_SDPS_S:
15900                             gen_sel_s(ctx, OPC_SELNEZ_S, rd, rt, rs);
15901                             break;
15902                         case FMT_SDPS_D:
15903                             gen_sel_d(ctx, OPC_SELNEZ_D, rd, rt, rs);
15904                             break;
15905                         default:
15906                             goto pool32f_invalid;
15907                         }
15908                     } else {
15909                         /* MOVZ_FMT */
15910                         FINSN_3ARG_SDPS(MOVZ);
15911                     }
15912                     break;
15913                 case MOVZ_FMT_05:
15914                     check_insn_opc_removed(ctx, ISA_MIPS_R6);
15915                     FINSN_3ARG_SDPS(MOVZ);
15916                     break;
15917                 case SEL_FMT:
15918                     check_insn(ctx, ISA_MIPS_R6);
15919                     switch ((ctx->opcode >> 9) & 0x3) {
15920                     case FMT_SDPS_S:
15921                         gen_sel_s(ctx, OPC_SEL_S, rd, rt, rs);
15922                         break;
15923                     case FMT_SDPS_D:
15924                         gen_sel_d(ctx, OPC_SEL_D, rd, rt, rs);
15925                         break;
15926                     default:
15927                         goto pool32f_invalid;
15928                     }
15929                     break;
15930                 case MADDF_FMT:
15931                     check_insn(ctx, ISA_MIPS_R6);
15932                     switch ((ctx->opcode >> 9) & 0x3) {
15933                     case FMT_SDPS_S:
15934                         mips32_op = OPC_MADDF_S;
15935                         goto do_fpop;
15936                     case FMT_SDPS_D:
15937                         mips32_op = OPC_MADDF_D;
15938                         goto do_fpop;
15939                     default:
15940                         goto pool32f_invalid;
15941                     }
15942                     break;
15943                 case MSUBF_FMT:
15944                     check_insn(ctx, ISA_MIPS_R6);
15945                     switch ((ctx->opcode >> 9) & 0x3) {
15946                     case FMT_SDPS_S:
15947                         mips32_op = OPC_MSUBF_S;
15948                         goto do_fpop;
15949                     case FMT_SDPS_D:
15950                         mips32_op = OPC_MSUBF_D;
15951                         goto do_fpop;
15952                     default:
15953                         goto pool32f_invalid;
15954                     }
15955                     break;
15956                 default:
15957                     goto pool32f_invalid;
15958                 }
15959                 break;
15960             do_fpop:
15961                 gen_farith(ctx, mips32_op, rt, rs, rd, 0);
15962                 break;
15963             default:
15964             pool32f_invalid:
15965                 MIPS_INVAL("pool32f");
15966                 gen_reserved_instruction(ctx);
15967                 break;
15968             }
15969         } else {
15970             generate_exception_err(ctx, EXCP_CpU, 1);
15971         }
15972         break;
15973     case POOL32I:
15974         minor = (ctx->opcode >> 21) & 0x1f;
15975         switch (minor) {
15976         case BLTZ:
15977             check_insn_opc_removed(ctx, ISA_MIPS_R6);
15978             gen_compute_branch(ctx, OPC_BLTZ, 4, rs, -1, imm << 1, 4);
15979             break;
15980         case BLTZAL:
15981             check_insn_opc_removed(ctx, ISA_MIPS_R6);
15982             gen_compute_branch(ctx, OPC_BLTZAL, 4, rs, -1, imm << 1, 4);
15983             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
15984             break;
15985         case BLTZALS:
15986             check_insn_opc_removed(ctx, ISA_MIPS_R6);
15987             gen_compute_branch(ctx, OPC_BLTZAL, 4, rs, -1, imm << 1, 2);
15988             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
15989             break;
15990         case BGEZ:
15991             check_insn_opc_removed(ctx, ISA_MIPS_R6);
15992             gen_compute_branch(ctx, OPC_BGEZ, 4, rs, -1, imm << 1, 4);
15993             break;
15994         case BGEZAL:
15995             check_insn_opc_removed(ctx, ISA_MIPS_R6);
15996             gen_compute_branch(ctx, OPC_BGEZAL, 4, rs, -1, imm << 1, 4);
15997             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
15998             break;
15999         case BGEZALS:
16000             check_insn_opc_removed(ctx, ISA_MIPS_R6);
16001             gen_compute_branch(ctx, OPC_BGEZAL, 4, rs, -1, imm << 1, 2);
16002             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
16003             break;
16004         case BLEZ:
16005             check_insn_opc_removed(ctx, ISA_MIPS_R6);
16006             gen_compute_branch(ctx, OPC_BLEZ, 4, rs, -1, imm << 1, 4);
16007             break;
16008         case BGTZ:
16009             check_insn_opc_removed(ctx, ISA_MIPS_R6);
16010             gen_compute_branch(ctx, OPC_BGTZ, 4, rs, -1, imm << 1, 4);
16011             break;
16012 
16013             /* Traps */
16014         case TLTI: /* BC1EQZC */
16015             if (ctx->insn_flags & ISA_MIPS_R6) {
16016                 /* BC1EQZC */
16017                 check_cp1_enabled(ctx);
16018                 gen_compute_branch1_r6(ctx, OPC_BC1EQZ, rs, imm << 1, 0);
16019             } else {
16020                 /* TLTI */
16021                 mips32_op = OPC_TLTI;
16022                 goto do_trapi;
16023             }
16024             break;
16025         case TGEI: /* BC1NEZC */
16026             if (ctx->insn_flags & ISA_MIPS_R6) {
16027                 /* BC1NEZC */
16028                 check_cp1_enabled(ctx);
16029                 gen_compute_branch1_r6(ctx, OPC_BC1NEZ, rs, imm << 1, 0);
16030             } else {
16031                 /* TGEI */
16032                 mips32_op = OPC_TGEI;
16033                 goto do_trapi;
16034             }
16035             break;
16036         case TLTIU:
16037             check_insn_opc_removed(ctx, ISA_MIPS_R6);
16038             mips32_op = OPC_TLTIU;
16039             goto do_trapi;
16040         case TGEIU:
16041             check_insn_opc_removed(ctx, ISA_MIPS_R6);
16042             mips32_op = OPC_TGEIU;
16043             goto do_trapi;
16044         case TNEI: /* SYNCI */
16045             if (ctx->insn_flags & ISA_MIPS_R6) {
16046                 /* SYNCI */
16047                 /*
16048                  * Break the TB to be able to sync copied instructions
16049                  * immediately.
16050                  */
16051                 ctx->base.is_jmp = DISAS_STOP;
16052             } else {
16053                 /* TNEI */
16054                 mips32_op = OPC_TNEI;
16055                 goto do_trapi;
16056             }
16057             break;
16058         case TEQI:
16059             check_insn_opc_removed(ctx, ISA_MIPS_R6);
16060             mips32_op = OPC_TEQI;
16061         do_trapi:
16062             gen_trap(ctx, mips32_op, rs, -1, imm);
16063             break;
16064 
16065         case BNEZC:
16066         case BEQZC:
16067             check_insn_opc_removed(ctx, ISA_MIPS_R6);
16068             gen_compute_branch(ctx, minor == BNEZC ? OPC_BNE : OPC_BEQ,
16069                                4, rs, 0, imm << 1, 0);
16070             /*
16071              * Compact branches don't have a delay slot, so just let
16072              * the normal delay slot handling take us to the branch
16073              * target.
16074              */
16075             break;
16076         case LUI:
16077             check_insn_opc_removed(ctx, ISA_MIPS_R6);
16078             gen_logic_imm(ctx, OPC_LUI, rs, 0, imm);
16079             break;
16080         case SYNCI:
16081             check_insn_opc_removed(ctx, ISA_MIPS_R6);
16082             /*
16083              * Break the TB to be able to sync copied instructions
16084              * immediately.
16085              */
16086             ctx->base.is_jmp = DISAS_STOP;
16087             break;
16088         case BC2F:
16089         case BC2T:
16090             check_insn_opc_removed(ctx, ISA_MIPS_R6);
16091             /* COP2: Not implemented. */
16092             generate_exception_err(ctx, EXCP_CpU, 2);
16093             break;
16094         case BC1F:
16095             check_insn_opc_removed(ctx, ISA_MIPS_R6);
16096             mips32_op = (ctx->opcode & (1 << 16)) ? OPC_BC1FANY2 : OPC_BC1F;
16097             goto do_cp1branch;
16098         case BC1T:
16099             check_insn_opc_removed(ctx, ISA_MIPS_R6);
16100             mips32_op = (ctx->opcode & (1 << 16)) ? OPC_BC1TANY2 : OPC_BC1T;
16101             goto do_cp1branch;
16102         case BC1ANY4F:
16103             check_insn_opc_removed(ctx, ISA_MIPS_R6);
16104             mips32_op = OPC_BC1FANY4;
16105             goto do_cp1mips3d;
16106         case BC1ANY4T:
16107             check_insn_opc_removed(ctx, ISA_MIPS_R6);
16108             mips32_op = OPC_BC1TANY4;
16109         do_cp1mips3d:
16110             check_cop1x(ctx);
16111             check_insn(ctx, ASE_MIPS3D);
16112             /* Fall through */
16113         do_cp1branch:
16114             if (env->CP0_Config1 & (1 << CP0C1_FP)) {
16115                 check_cp1_enabled(ctx);
16116                 gen_compute_branch1(ctx, mips32_op,
16117                                     (ctx->opcode >> 18) & 0x7, imm << 1);
16118             } else {
16119                 generate_exception_err(ctx, EXCP_CpU, 1);
16120             }
16121             break;
16122         default:
16123             MIPS_INVAL("pool32i");
16124             gen_reserved_instruction(ctx);
16125             break;
16126         }
16127         break;
16128     case POOL32C:
16129         minor = (ctx->opcode >> 12) & 0xf;
16130         offset = sextract32(ctx->opcode, 0,
16131                             (ctx->insn_flags & ISA_MIPS_R6) ? 9 : 12);
16132         switch (minor) {
16133         case LWL:
16134             check_insn_opc_removed(ctx, ISA_MIPS_R6);
16135             mips32_op = OPC_LWL;
16136             goto do_ld_lr;
16137         case SWL:
16138             check_insn_opc_removed(ctx, ISA_MIPS_R6);
16139             mips32_op = OPC_SWL;
16140             goto do_st_lr;
16141         case LWR:
16142             check_insn_opc_removed(ctx, ISA_MIPS_R6);
16143             mips32_op = OPC_LWR;
16144             goto do_ld_lr;
16145         case SWR:
16146             check_insn_opc_removed(ctx, ISA_MIPS_R6);
16147             mips32_op = OPC_SWR;
16148             goto do_st_lr;
16149 #if defined(TARGET_MIPS64)
16150         case LDL:
16151             check_insn(ctx, ISA_MIPS3);
16152             check_mips_64(ctx);
16153             check_insn_opc_removed(ctx, ISA_MIPS_R6);
16154             mips32_op = OPC_LDL;
16155             goto do_ld_lr;
16156         case SDL:
16157             check_insn(ctx, ISA_MIPS3);
16158             check_mips_64(ctx);
16159             check_insn_opc_removed(ctx, ISA_MIPS_R6);
16160             mips32_op = OPC_SDL;
16161             goto do_st_lr;
16162         case LDR:
16163             check_insn(ctx, ISA_MIPS3);
16164             check_mips_64(ctx);
16165             check_insn_opc_removed(ctx, ISA_MIPS_R6);
16166             mips32_op = OPC_LDR;
16167             goto do_ld_lr;
16168         case SDR:
16169             check_insn(ctx, ISA_MIPS3);
16170             check_mips_64(ctx);
16171             check_insn_opc_removed(ctx, ISA_MIPS_R6);
16172             mips32_op = OPC_SDR;
16173             goto do_st_lr;
16174         case LWU:
16175             check_insn(ctx, ISA_MIPS3);
16176             check_mips_64(ctx);
16177             mips32_op = OPC_LWU;
16178             goto do_ld_lr;
16179         case LLD:
16180             check_insn(ctx, ISA_MIPS3);
16181             check_mips_64(ctx);
16182             mips32_op = OPC_LLD;
16183             goto do_ld_lr;
16184 #endif
16185         case LL:
16186             mips32_op = OPC_LL;
16187             goto do_ld_lr;
16188         do_ld_lr:
16189             gen_ld(ctx, mips32_op, rt, rs, offset);
16190             break;
16191         do_st_lr:
16192             gen_st(ctx, mips32_op, rt, rs, offset);
16193             break;
16194         case SC:
16195             gen_st_cond(ctx, rt, rs, offset, MO_TESL, false);
16196             break;
16197 #if defined(TARGET_MIPS64)
16198         case SCD:
16199             check_insn(ctx, ISA_MIPS3);
16200             check_mips_64(ctx);
16201             gen_st_cond(ctx, rt, rs, offset, MO_TEQ, false);
16202             break;
16203 #endif
16204         case LD_EVA:
16205             if (!ctx->eva) {
16206                 MIPS_INVAL("pool32c ld-eva");
16207                 gen_reserved_instruction(ctx);
16208                 break;
16209             }
16210             check_cp0_enabled(ctx);
16211 
16212             minor2 = (ctx->opcode >> 9) & 0x7;
16213             offset = sextract32(ctx->opcode, 0, 9);
16214             switch (minor2) {
16215             case LBUE:
16216                 mips32_op = OPC_LBUE;
16217                 goto do_ld_lr;
16218             case LHUE:
16219                 mips32_op = OPC_LHUE;
16220                 goto do_ld_lr;
16221             case LWLE:
16222                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
16223                 mips32_op = OPC_LWLE;
16224                 goto do_ld_lr;
16225             case LWRE:
16226                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
16227                 mips32_op = OPC_LWRE;
16228                 goto do_ld_lr;
16229             case LBE:
16230                 mips32_op = OPC_LBE;
16231                 goto do_ld_lr;
16232             case LHE:
16233                 mips32_op = OPC_LHE;
16234                 goto do_ld_lr;
16235             case LLE:
16236                 mips32_op = OPC_LLE;
16237                 goto do_ld_lr;
16238             case LWE:
16239                 mips32_op = OPC_LWE;
16240                 goto do_ld_lr;
16241             };
16242             break;
16243         case ST_EVA:
16244             if (!ctx->eva) {
16245                 MIPS_INVAL("pool32c st-eva");
16246                 gen_reserved_instruction(ctx);
16247                 break;
16248             }
16249             check_cp0_enabled(ctx);
16250 
16251             minor2 = (ctx->opcode >> 9) & 0x7;
16252             offset = sextract32(ctx->opcode, 0, 9);
16253             switch (minor2) {
16254             case SWLE:
16255                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
16256                 mips32_op = OPC_SWLE;
16257                 goto do_st_lr;
16258             case SWRE:
16259                 check_insn_opc_removed(ctx, ISA_MIPS_R6);
16260                 mips32_op = OPC_SWRE;
16261                 goto do_st_lr;
16262             case PREFE:
16263                 /* Treat as no-op */
16264                 if ((ctx->insn_flags & ISA_MIPS_R6) && (rt >= 24)) {
16265                     /* hint codes 24-31 are reserved and signal RI */
16266                     generate_exception(ctx, EXCP_RI);
16267                 }
16268                 break;
16269             case CACHEE:
16270                 /* Treat as no-op */
16271                 if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
16272                     gen_cache_operation(ctx, rt, rs, offset);
16273                 }
16274                 break;
16275             case SBE:
16276                 mips32_op = OPC_SBE;
16277                 goto do_st_lr;
16278             case SHE:
16279                 mips32_op = OPC_SHE;
16280                 goto do_st_lr;
16281             case SCE:
16282                 gen_st_cond(ctx, rt, rs, offset, MO_TESL, true);
16283                 break;
16284             case SWE:
16285                 mips32_op = OPC_SWE;
16286                 goto do_st_lr;
16287             };
16288             break;
16289         case PREF:
16290             /* Treat as no-op */
16291             if ((ctx->insn_flags & ISA_MIPS_R6) && (rt >= 24)) {
16292                 /* hint codes 24-31 are reserved and signal RI */
16293                 generate_exception(ctx, EXCP_RI);
16294             }
16295             break;
16296         default:
16297             MIPS_INVAL("pool32c");
16298             gen_reserved_instruction(ctx);
16299             break;
16300         }
16301         break;
16302     case ADDI32: /* AUI, LUI */
16303         if (ctx->insn_flags & ISA_MIPS_R6) {
16304             /* AUI, LUI */
16305             gen_logic_imm(ctx, OPC_LUI, rt, rs, imm);
16306         } else {
16307             /* ADDI32 */
16308             mips32_op = OPC_ADDI;
16309             goto do_addi;
16310         }
16311         break;
16312     case ADDIU32:
16313         mips32_op = OPC_ADDIU;
16314     do_addi:
16315         gen_arith_imm(ctx, mips32_op, rt, rs, imm);
16316         break;
16317 
16318         /* Logical operations */
16319     case ORI32:
16320         mips32_op = OPC_ORI;
16321         goto do_logici;
16322     case XORI32:
16323         mips32_op = OPC_XORI;
16324         goto do_logici;
16325     case ANDI32:
16326         mips32_op = OPC_ANDI;
16327     do_logici:
16328         gen_logic_imm(ctx, mips32_op, rt, rs, imm);
16329         break;
16330 
16331         /* Set less than immediate */
16332     case SLTI32:
16333         mips32_op = OPC_SLTI;
16334         goto do_slti;
16335     case SLTIU32:
16336         mips32_op = OPC_SLTIU;
16337     do_slti:
16338         gen_slt_imm(ctx, mips32_op, rt, rs, imm);
16339         break;
16340     case JALX32:
16341         check_insn_opc_removed(ctx, ISA_MIPS_R6);
16342         offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
16343         gen_compute_branch(ctx, OPC_JALX, 4, rt, rs, offset, 4);
16344         ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
16345         break;
16346     case JALS32: /* BOVC, BEQC, BEQZALC */
16347         if (ctx->insn_flags & ISA_MIPS_R6) {
16348             if (rs >= rt) {
16349                 /* BOVC */
16350                 mips32_op = OPC_BOVC;
16351             } else if (rs < rt && rs == 0) {
16352                 /* BEQZALC */
16353                 mips32_op = OPC_BEQZALC;
16354             } else {
16355                 /* BEQC */
16356                 mips32_op = OPC_BEQC;
16357             }
16358             gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
16359         } else {
16360             /* JALS32 */
16361             offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 1;
16362             gen_compute_branch(ctx, OPC_JAL, 4, rt, rs, offset, 2);
16363             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
16364         }
16365         break;
16366     case BEQ32: /* BC */
16367         if (ctx->insn_flags & ISA_MIPS_R6) {
16368             /* BC */
16369             gen_compute_compact_branch(ctx, OPC_BC, 0, 0,
16370                                        sextract32(ctx->opcode << 1, 0, 27));
16371         } else {
16372             /* BEQ32 */
16373             gen_compute_branch(ctx, OPC_BEQ, 4, rt, rs, imm << 1, 4);
16374         }
16375         break;
16376     case BNE32: /* BALC */
16377         if (ctx->insn_flags & ISA_MIPS_R6) {
16378             /* BALC */
16379             gen_compute_compact_branch(ctx, OPC_BALC, 0, 0,
16380                                        sextract32(ctx->opcode << 1, 0, 27));
16381         } else {
16382             /* BNE32 */
16383             gen_compute_branch(ctx, OPC_BNE, 4, rt, rs, imm << 1, 4);
16384         }
16385         break;
16386     case J32: /* BGTZC, BLTZC, BLTC */
16387         if (ctx->insn_flags & ISA_MIPS_R6) {
16388             if (rs == 0 && rt != 0) {
16389                 /* BGTZC */
16390                 mips32_op = OPC_BGTZC;
16391             } else if (rs != 0 && rt != 0 && rs == rt) {
16392                 /* BLTZC */
16393                 mips32_op = OPC_BLTZC;
16394             } else {
16395                 /* BLTC */
16396                 mips32_op = OPC_BLTC;
16397             }
16398             gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
16399         } else {
16400             /* J32 */
16401             gen_compute_branch(ctx, OPC_J, 4, rt, rs,
16402                                (int32_t)(ctx->opcode & 0x3FFFFFF) << 1, 4);
16403         }
16404         break;
16405     case JAL32: /* BLEZC, BGEZC, BGEC */
16406         if (ctx->insn_flags & ISA_MIPS_R6) {
16407             if (rs == 0 && rt != 0) {
16408                 /* BLEZC */
16409                 mips32_op = OPC_BLEZC;
16410             } else if (rs != 0 && rt != 0 && rs == rt) {
16411                 /* BGEZC */
16412                 mips32_op = OPC_BGEZC;
16413             } else {
16414                 /* BGEC */
16415                 mips32_op = OPC_BGEC;
16416             }
16417             gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
16418         } else {
16419             /* JAL32 */
16420             gen_compute_branch(ctx, OPC_JAL, 4, rt, rs,
16421                                (int32_t)(ctx->opcode & 0x3FFFFFF) << 1, 4);
16422             ctx->hflags |= MIPS_HFLAG_BDS_STRICT;
16423         }
16424         break;
16425         /* Floating point (COP1) */
16426     case LWC132:
16427         mips32_op = OPC_LWC1;
16428         goto do_cop1;
16429     case LDC132:
16430         mips32_op = OPC_LDC1;
16431         goto do_cop1;
16432     case SWC132:
16433         mips32_op = OPC_SWC1;
16434         goto do_cop1;
16435     case SDC132:
16436         mips32_op = OPC_SDC1;
16437     do_cop1:
16438         gen_cop1_ldst(ctx, mips32_op, rt, rs, imm);
16439         break;
16440     case ADDIUPC: /* PCREL: ADDIUPC, AUIPC, ALUIPC, LWPC */
16441         if (ctx->insn_flags & ISA_MIPS_R6) {
16442             /* PCREL: ADDIUPC, AUIPC, ALUIPC, LWPC */
16443             switch ((ctx->opcode >> 16) & 0x1f) {
16444             case ADDIUPC_00:
16445             case ADDIUPC_01:
16446             case ADDIUPC_02:
16447             case ADDIUPC_03:
16448             case ADDIUPC_04:
16449             case ADDIUPC_05:
16450             case ADDIUPC_06:
16451             case ADDIUPC_07:
16452                 gen_pcrel(ctx, OPC_ADDIUPC, ctx->base.pc_next & ~0x3, rt);
16453                 break;
16454             case AUIPC:
16455                 gen_pcrel(ctx, OPC_AUIPC, ctx->base.pc_next, rt);
16456                 break;
16457             case ALUIPC:
16458                 gen_pcrel(ctx, OPC_ALUIPC, ctx->base.pc_next, rt);
16459                 break;
16460             case LWPC_08:
16461             case LWPC_09:
16462             case LWPC_0A:
16463             case LWPC_0B:
16464             case LWPC_0C:
16465             case LWPC_0D:
16466             case LWPC_0E:
16467             case LWPC_0F:
16468                 gen_pcrel(ctx, R6_OPC_LWPC, ctx->base.pc_next & ~0x3, rt);
16469                 break;
16470             default:
16471                 generate_exception(ctx, EXCP_RI);
16472                 break;
16473             }
16474         } else {
16475             /* ADDIUPC */
16476             int reg = mmreg(ZIMM(ctx->opcode, 23, 3));
16477             offset = SIMM(ctx->opcode, 0, 23) << 2;
16478 
16479             gen_addiupc(ctx, reg, offset, 0, 0);
16480         }
16481         break;
16482     case BNVC: /* BNEC, BNEZALC */
16483         check_insn(ctx, ISA_MIPS_R6);
16484         if (rs >= rt) {
16485             /* BNVC */
16486             mips32_op = OPC_BNVC;
16487         } else if (rs < rt && rs == 0) {
16488             /* BNEZALC */
16489             mips32_op = OPC_BNEZALC;
16490         } else {
16491             /* BNEC */
16492             mips32_op = OPC_BNEC;
16493         }
16494         gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
16495         break;
16496     case R6_BNEZC: /* JIALC */
16497         check_insn(ctx, ISA_MIPS_R6);
16498         if (rt != 0) {
16499             /* BNEZC */
16500             gen_compute_compact_branch(ctx, OPC_BNEZC, rt, 0,
16501                                        sextract32(ctx->opcode << 1, 0, 22));
16502         } else {
16503             /* JIALC */
16504             gen_compute_compact_branch(ctx, OPC_JIALC, 0, rs, imm);
16505         }
16506         break;
16507     case R6_BEQZC: /* JIC */
16508         check_insn(ctx, ISA_MIPS_R6);
16509         if (rt != 0) {
16510             /* BEQZC */
16511             gen_compute_compact_branch(ctx, OPC_BEQZC, rt, 0,
16512                                        sextract32(ctx->opcode << 1, 0, 22));
16513         } else {
16514             /* JIC */
16515             gen_compute_compact_branch(ctx, OPC_JIC, 0, rs, imm);
16516         }
16517         break;
16518     case BLEZALC: /* BGEZALC, BGEUC */
16519         check_insn(ctx, ISA_MIPS_R6);
16520         if (rs == 0 && rt != 0) {
16521             /* BLEZALC */
16522             mips32_op = OPC_BLEZALC;
16523         } else if (rs != 0 && rt != 0 && rs == rt) {
16524             /* BGEZALC */
16525             mips32_op = OPC_BGEZALC;
16526         } else {
16527             /* BGEUC */
16528             mips32_op = OPC_BGEUC;
16529         }
16530         gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
16531         break;
16532     case BGTZALC: /* BLTZALC, BLTUC */
16533         check_insn(ctx, ISA_MIPS_R6);
16534         if (rs == 0 && rt != 0) {
16535             /* BGTZALC */
16536             mips32_op = OPC_BGTZALC;
16537         } else if (rs != 0 && rt != 0 && rs == rt) {
16538             /* BLTZALC */
16539             mips32_op = OPC_BLTZALC;
16540         } else {
16541             /* BLTUC */
16542             mips32_op = OPC_BLTUC;
16543         }
16544         gen_compute_compact_branch(ctx, mips32_op, rs, rt, imm << 1);
16545         break;
16546         /* Loads and stores */
16547     case LB32:
16548         mips32_op = OPC_LB;
16549         goto do_ld;
16550     case LBU32:
16551         mips32_op = OPC_LBU;
16552         goto do_ld;
16553     case LH32:
16554         mips32_op = OPC_LH;
16555         goto do_ld;
16556     case LHU32:
16557         mips32_op = OPC_LHU;
16558         goto do_ld;
16559     case LW32:
16560         mips32_op = OPC_LW;
16561         goto do_ld;
16562 #ifdef TARGET_MIPS64
16563     case LD32:
16564         check_insn(ctx, ISA_MIPS3);
16565         check_mips_64(ctx);
16566         mips32_op = OPC_LD;
16567         goto do_ld;
16568     case SD32:
16569         check_insn(ctx, ISA_MIPS3);
16570         check_mips_64(ctx);
16571         mips32_op = OPC_SD;
16572         goto do_st;
16573 #endif
16574     case SB32:
16575         mips32_op = OPC_SB;
16576         goto do_st;
16577     case SH32:
16578         mips32_op = OPC_SH;
16579         goto do_st;
16580     case SW32:
16581         mips32_op = OPC_SW;
16582         goto do_st;
16583     do_ld:
16584         gen_ld(ctx, mips32_op, rt, rs, imm);
16585         break;
16586     do_st:
16587         gen_st(ctx, mips32_op, rt, rs, imm);
16588         break;
16589     default:
16590         gen_reserved_instruction(ctx);
16591         break;
16592     }
16593 }
16594 
16595 static int decode_micromips_opc(CPUMIPSState *env, DisasContext *ctx)
16596 {
16597     uint32_t op;
16598 
16599     /* make sure instructions are on a halfword boundary */
16600     if (ctx->base.pc_next & 0x1) {
16601         env->CP0_BadVAddr = ctx->base.pc_next;
16602         generate_exception_end(ctx, EXCP_AdEL);
16603         return 2;
16604     }
16605 
16606     op = (ctx->opcode >> 10) & 0x3f;
16607     /* Enforce properly-sized instructions in a delay slot */
16608     if (ctx->hflags & MIPS_HFLAG_BDS_STRICT) {
16609         switch (op & 0x7) { /* MSB-3..MSB-5 */
16610         case 0:
16611         /* POOL32A, POOL32B, POOL32I, POOL32C */
16612         case 4:
16613         /* ADDI32, ADDIU32, ORI32, XORI32, SLTI32, SLTIU32, ANDI32, JALX32 */
16614         case 5:
16615         /* LBU32, LHU32, POOL32F, JALS32, BEQ32, BNE32, J32, JAL32 */
16616         case 6:
16617         /* SB32, SH32, ADDIUPC, SWC132, SDC132, SW32 */
16618         case 7:
16619         /* LB32, LH32, LWC132, LDC132, LW32 */
16620             if (ctx->hflags & MIPS_HFLAG_BDS16) {
16621                 gen_reserved_instruction(ctx);
16622                 return 2;
16623             }
16624             break;
16625         case 1:
16626         /* POOL16A, POOL16B, POOL16C, LWGP16, POOL16F */
16627         case 2:
16628         /* LBU16, LHU16, LWSP16, LW16, SB16, SH16, SWSP16, SW16 */
16629         case 3:
16630         /* MOVE16, ANDI16, POOL16D, POOL16E, BEQZ16, BNEZ16, B16, LI16 */
16631             if (ctx->hflags & MIPS_HFLAG_BDS32) {
16632                 gen_reserved_instruction(ctx);
16633                 return 2;
16634             }
16635             break;
16636         }
16637     }
16638 
16639     switch (op) {
16640     case POOL16A:
16641         {
16642             int rd = mmreg(uMIPS_RD(ctx->opcode));
16643             int rs1 = mmreg(uMIPS_RS1(ctx->opcode));
16644             int rs2 = mmreg(uMIPS_RS2(ctx->opcode));
16645             uint32_t opc = 0;
16646 
16647             switch (ctx->opcode & 0x1) {
16648             case ADDU16:
16649                 opc = OPC_ADDU;
16650                 break;
16651             case SUBU16:
16652                 opc = OPC_SUBU;
16653                 break;
16654             }
16655             if (ctx->insn_flags & ISA_MIPS_R6) {
16656                 /*
16657                  * In the Release 6, the register number location in
16658                  * the instruction encoding has changed.
16659                  */
16660                 gen_arith(ctx, opc, rs1, rd, rs2);
16661             } else {
16662                 gen_arith(ctx, opc, rd, rs1, rs2);
16663             }
16664         }
16665         break;
16666     case POOL16B:
16667         {
16668             int rd = mmreg(uMIPS_RD(ctx->opcode));
16669             int rs = mmreg(uMIPS_RS(ctx->opcode));
16670             int amount = (ctx->opcode >> 1) & 0x7;
16671             uint32_t opc = 0;
16672             amount = amount == 0 ? 8 : amount;
16673 
16674             switch (ctx->opcode & 0x1) {
16675             case SLL16:
16676                 opc = OPC_SLL;
16677                 break;
16678             case SRL16:
16679                 opc = OPC_SRL;
16680                 break;
16681             }
16682 
16683             gen_shift_imm(ctx, opc, rd, rs, amount);
16684         }
16685         break;
16686     case POOL16C:
16687         if (ctx->insn_flags & ISA_MIPS_R6) {
16688             gen_pool16c_r6_insn(ctx);
16689         } else {
16690             gen_pool16c_insn(ctx);
16691         }
16692         break;
16693     case LWGP16:
16694         {
16695             int rd = mmreg(uMIPS_RD(ctx->opcode));
16696             int rb = 28;            /* GP */
16697             int16_t offset = SIMM(ctx->opcode, 0, 7) << 2;
16698 
16699             gen_ld(ctx, OPC_LW, rd, rb, offset);
16700         }
16701         break;
16702     case POOL16F:
16703         check_insn_opc_removed(ctx, ISA_MIPS_R6);
16704         if (ctx->opcode & 1) {
16705             gen_reserved_instruction(ctx);
16706         } else {
16707             /* MOVEP */
16708             int enc_dest = uMIPS_RD(ctx->opcode);
16709             int enc_rt = uMIPS_RS2(ctx->opcode);
16710             int enc_rs = uMIPS_RS1(ctx->opcode);
16711             gen_movep(ctx, enc_dest, enc_rt, enc_rs);
16712         }
16713         break;
16714     case LBU16:
16715         {
16716             int rd = mmreg(uMIPS_RD(ctx->opcode));
16717             int rb = mmreg(uMIPS_RS(ctx->opcode));
16718             int16_t offset = ZIMM(ctx->opcode, 0, 4);
16719             offset = (offset == 0xf ? -1 : offset);
16720 
16721             gen_ld(ctx, OPC_LBU, rd, rb, offset);
16722         }
16723         break;
16724     case LHU16:
16725         {
16726             int rd = mmreg(uMIPS_RD(ctx->opcode));
16727             int rb = mmreg(uMIPS_RS(ctx->opcode));
16728             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 1;
16729 
16730             gen_ld(ctx, OPC_LHU, rd, rb, offset);
16731         }
16732         break;
16733     case LWSP16:
16734         {
16735             int rd = (ctx->opcode >> 5) & 0x1f;
16736             int rb = 29;            /* SP */
16737             int16_t offset = ZIMM(ctx->opcode, 0, 5) << 2;
16738 
16739             gen_ld(ctx, OPC_LW, rd, rb, offset);
16740         }
16741         break;
16742     case LW16:
16743         {
16744             int rd = mmreg(uMIPS_RD(ctx->opcode));
16745             int rb = mmreg(uMIPS_RS(ctx->opcode));
16746             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 2;
16747 
16748             gen_ld(ctx, OPC_LW, rd, rb, offset);
16749         }
16750         break;
16751     case SB16:
16752         {
16753             int rd = mmreg2(uMIPS_RD(ctx->opcode));
16754             int rb = mmreg(uMIPS_RS(ctx->opcode));
16755             int16_t offset = ZIMM(ctx->opcode, 0, 4);
16756 
16757             gen_st(ctx, OPC_SB, rd, rb, offset);
16758         }
16759         break;
16760     case SH16:
16761         {
16762             int rd = mmreg2(uMIPS_RD(ctx->opcode));
16763             int rb = mmreg(uMIPS_RS(ctx->opcode));
16764             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 1;
16765 
16766             gen_st(ctx, OPC_SH, rd, rb, offset);
16767         }
16768         break;
16769     case SWSP16:
16770         {
16771             int rd = (ctx->opcode >> 5) & 0x1f;
16772             int rb = 29;            /* SP */
16773             int16_t offset = ZIMM(ctx->opcode, 0, 5) << 2;
16774 
16775             gen_st(ctx, OPC_SW, rd, rb, offset);
16776         }
16777         break;
16778     case SW16:
16779         {
16780             int rd = mmreg2(uMIPS_RD(ctx->opcode));
16781             int rb = mmreg(uMIPS_RS(ctx->opcode));
16782             int16_t offset = ZIMM(ctx->opcode, 0, 4) << 2;
16783 
16784             gen_st(ctx, OPC_SW, rd, rb, offset);
16785         }
16786         break;
16787     case MOVE16:
16788         {
16789             int rd = uMIPS_RD5(ctx->opcode);
16790             int rs = uMIPS_RS5(ctx->opcode);
16791 
16792             gen_arith(ctx, OPC_ADDU, rd, rs, 0);
16793         }
16794         break;
16795     case ANDI16:
16796         gen_andi16(ctx);
16797         break;
16798     case POOL16D:
16799         switch (ctx->opcode & 0x1) {
16800         case ADDIUS5:
16801             gen_addius5(ctx);
16802             break;
16803         case ADDIUSP:
16804             gen_addiusp(ctx);
16805             break;
16806         }
16807         break;
16808     case POOL16E:
16809         switch (ctx->opcode & 0x1) {
16810         case ADDIUR2:
16811             gen_addiur2(ctx);
16812             break;
16813         case ADDIUR1SP:
16814             gen_addiur1sp(ctx);
16815             break;
16816         }
16817         break;
16818     case B16: /* BC16 */
16819         gen_compute_branch(ctx, OPC_BEQ, 2, 0, 0,
16820                            sextract32(ctx->opcode, 0, 10) << 1,
16821                            (ctx->insn_flags & ISA_MIPS_R6) ? 0 : 4);
16822         break;
16823     case BNEZ16: /* BNEZC16 */
16824     case BEQZ16: /* BEQZC16 */
16825         gen_compute_branch(ctx, op == BNEZ16 ? OPC_BNE : OPC_BEQ, 2,
16826                            mmreg(uMIPS_RD(ctx->opcode)),
16827                            0, sextract32(ctx->opcode, 0, 7) << 1,
16828                            (ctx->insn_flags & ISA_MIPS_R6) ? 0 : 4);
16829 
16830         break;
16831     case LI16:
16832         {
16833             int reg = mmreg(uMIPS_RD(ctx->opcode));
16834             int imm = ZIMM(ctx->opcode, 0, 7);
16835 
16836             imm = (imm == 0x7f ? -1 : imm);
16837             tcg_gen_movi_tl(cpu_gpr[reg], imm);
16838         }
16839         break;
16840     case RES_29:
16841     case RES_31:
16842     case RES_39:
16843         gen_reserved_instruction(ctx);
16844         break;
16845     default:
16846         decode_micromips32_opc(env, ctx);
16847         return 4;
16848     }
16849 
16850     return 2;
16851 }
16852 
16853 /*
16854  *
16855  * nanoMIPS opcodes
16856  *
16857  */
16858 
16859 /* MAJOR, P16, and P32 pools opcodes */
16860 enum {
16861     NM_P_ADDIU      = 0x00,
16862     NM_ADDIUPC      = 0x01,
16863     NM_MOVE_BALC    = 0x02,
16864     NM_P16_MV       = 0x04,
16865     NM_LW16         = 0x05,
16866     NM_BC16         = 0x06,
16867     NM_P16_SR       = 0x07,
16868 
16869     NM_POOL32A      = 0x08,
16870     NM_P_BAL        = 0x0a,
16871     NM_P16_SHIFT    = 0x0c,
16872     NM_LWSP16       = 0x0d,
16873     NM_BALC16       = 0x0e,
16874     NM_P16_4X4      = 0x0f,
16875 
16876     NM_P_GP_W       = 0x10,
16877     NM_P_GP_BH      = 0x11,
16878     NM_P_J          = 0x12,
16879     NM_P16C         = 0x14,
16880     NM_LWGP16       = 0x15,
16881     NM_P16_LB       = 0x17,
16882 
16883     NM_P48I         = 0x18,
16884     NM_P16_A1       = 0x1c,
16885     NM_LW4X4        = 0x1d,
16886     NM_P16_LH       = 0x1f,
16887 
16888     NM_P_U12        = 0x20,
16889     NM_P_LS_U12     = 0x21,
16890     NM_P_BR1        = 0x22,
16891     NM_P16_A2       = 0x24,
16892     NM_SW16         = 0x25,
16893     NM_BEQZC16      = 0x26,
16894 
16895     NM_POOL32F      = 0x28,
16896     NM_P_LS_S9      = 0x29,
16897     NM_P_BR2        = 0x2a,
16898 
16899     NM_P16_ADDU     = 0x2c,
16900     NM_SWSP16       = 0x2d,
16901     NM_BNEZC16      = 0x2e,
16902     NM_MOVEP        = 0x2f,
16903 
16904     NM_POOL32S      = 0x30,
16905     NM_P_BRI        = 0x32,
16906     NM_LI16         = 0x34,
16907     NM_SWGP16       = 0x35,
16908     NM_P16_BR       = 0x36,
16909 
16910     NM_P_LUI        = 0x38,
16911     NM_ANDI16       = 0x3c,
16912     NM_SW4X4        = 0x3d,
16913     NM_MOVEPREV     = 0x3f,
16914 };
16915 
16916 /* POOL32A instruction pool */
16917 enum {
16918     NM_POOL32A0    = 0x00,
16919     NM_SPECIAL2    = 0x01,
16920     NM_COP2_1      = 0x02,
16921     NM_UDI         = 0x03,
16922     NM_POOL32A5    = 0x05,
16923     NM_POOL32A7    = 0x07,
16924 };
16925 
16926 /* P.GP.W instruction pool */
16927 enum {
16928     NM_ADDIUGP_W = 0x00,
16929     NM_LWGP      = 0x02,
16930     NM_SWGP      = 0x03,
16931 };
16932 
16933 /* P48I instruction pool */
16934 enum {
16935     NM_LI48        = 0x00,
16936     NM_ADDIU48     = 0x01,
16937     NM_ADDIUGP48   = 0x02,
16938     NM_ADDIUPC48   = 0x03,
16939     NM_LWPC48      = 0x0b,
16940     NM_SWPC48      = 0x0f,
16941 };
16942 
16943 /* P.U12 instruction pool */
16944 enum {
16945     NM_ORI      = 0x00,
16946     NM_XORI     = 0x01,
16947     NM_ANDI     = 0x02,
16948     NM_P_SR     = 0x03,
16949     NM_SLTI     = 0x04,
16950     NM_SLTIU    = 0x05,
16951     NM_SEQI     = 0x06,
16952     NM_ADDIUNEG = 0x08,
16953     NM_P_SHIFT  = 0x0c,
16954     NM_P_ROTX   = 0x0d,
16955     NM_P_INS    = 0x0e,
16956     NM_P_EXT    = 0x0f,
16957 };
16958 
16959 /* POOL32F instruction pool */
16960 enum {
16961     NM_POOL32F_0   = 0x00,
16962     NM_POOL32F_3   = 0x03,
16963     NM_POOL32F_5   = 0x05,
16964 };
16965 
16966 /* POOL32S instruction pool */
16967 enum {
16968     NM_POOL32S_0   = 0x00,
16969     NM_POOL32S_4   = 0x04,
16970 };
16971 
16972 /* P.LUI instruction pool */
16973 enum {
16974     NM_LUI      = 0x00,
16975     NM_ALUIPC   = 0x01,
16976 };
16977 
16978 /* P.GP.BH instruction pool */
16979 enum {
16980     NM_LBGP      = 0x00,
16981     NM_SBGP      = 0x01,
16982     NM_LBUGP     = 0x02,
16983     NM_ADDIUGP_B = 0x03,
16984     NM_P_GP_LH   = 0x04,
16985     NM_P_GP_SH   = 0x05,
16986     NM_P_GP_CP1  = 0x06,
16987 };
16988 
16989 /* P.LS.U12 instruction pool */
16990 enum {
16991     NM_LB        = 0x00,
16992     NM_SB        = 0x01,
16993     NM_LBU       = 0x02,
16994     NM_P_PREFU12 = 0x03,
16995     NM_LH        = 0x04,
16996     NM_SH        = 0x05,
16997     NM_LHU       = 0x06,
16998     NM_LWU       = 0x07,
16999     NM_LW        = 0x08,
17000     NM_SW        = 0x09,
17001     NM_LWC1      = 0x0a,
17002     NM_SWC1      = 0x0b,
17003     NM_LDC1      = 0x0e,
17004     NM_SDC1      = 0x0f,
17005 };
17006 
17007 /* P.LS.S9 instruction pool */
17008 enum {
17009     NM_P_LS_S0         = 0x00,
17010     NM_P_LS_S1         = 0x01,
17011     NM_P_LS_E0         = 0x02,
17012     NM_P_LS_WM         = 0x04,
17013     NM_P_LS_UAWM       = 0x05,
17014 };
17015 
17016 /* P.BAL instruction pool */
17017 enum {
17018     NM_BC       = 0x00,
17019     NM_BALC     = 0x01,
17020 };
17021 
17022 /* P.J instruction pool */
17023 enum {
17024     NM_JALRC    = 0x00,
17025     NM_JALRC_HB = 0x01,
17026     NM_P_BALRSC = 0x08,
17027 };
17028 
17029 /* P.BR1 instruction pool */
17030 enum {
17031     NM_BEQC     = 0x00,
17032     NM_P_BR3A   = 0x01,
17033     NM_BGEC     = 0x02,
17034     NM_BGEUC    = 0x03,
17035 };
17036 
17037 /* P.BR2 instruction pool */
17038 enum {
17039     NM_BNEC     = 0x00,
17040     NM_BLTC     = 0x02,
17041     NM_BLTUC    = 0x03,
17042 };
17043 
17044 /* P.BRI instruction pool */
17045 enum {
17046     NM_BEQIC    = 0x00,
17047     NM_BBEQZC   = 0x01,
17048     NM_BGEIC    = 0x02,
17049     NM_BGEIUC   = 0x03,
17050     NM_BNEIC    = 0x04,
17051     NM_BBNEZC   = 0x05,
17052     NM_BLTIC    = 0x06,
17053     NM_BLTIUC   = 0x07,
17054 };
17055 
17056 /* P16.SHIFT instruction pool */
17057 enum {
17058     NM_SLL16    = 0x00,
17059     NM_SRL16    = 0x01,
17060 };
17061 
17062 /* POOL16C instruction pool */
17063 enum {
17064     NM_POOL16C_0  = 0x00,
17065     NM_LWXS16     = 0x01,
17066 };
17067 
17068 /* P16.A1 instruction pool */
17069 enum {
17070     NM_ADDIUR1SP = 0x01,
17071 };
17072 
17073 /* P16.A2 instruction pool */
17074 enum {
17075     NM_ADDIUR2  = 0x00,
17076     NM_P_ADDIURS5  = 0x01,
17077 };
17078 
17079 /* P16.ADDU instruction pool */
17080 enum {
17081     NM_ADDU16     = 0x00,
17082     NM_SUBU16     = 0x01,
17083 };
17084 
17085 /* P16.SR instruction pool */
17086 enum {
17087     NM_SAVE16        = 0x00,
17088     NM_RESTORE_JRC16 = 0x01,
17089 };
17090 
17091 /* P16.4X4 instruction pool */
17092 enum {
17093     NM_ADDU4X4      = 0x00,
17094     NM_MUL4X4       = 0x01,
17095 };
17096 
17097 /* P16.LB instruction pool */
17098 enum {
17099     NM_LB16       = 0x00,
17100     NM_SB16       = 0x01,
17101     NM_LBU16      = 0x02,
17102 };
17103 
17104 /* P16.LH  instruction pool */
17105 enum {
17106     NM_LH16     = 0x00,
17107     NM_SH16     = 0x01,
17108     NM_LHU16    = 0x02,
17109 };
17110 
17111 /* P.RI instruction pool */
17112 enum {
17113     NM_SIGRIE       = 0x00,
17114     NM_P_SYSCALL    = 0x01,
17115     NM_BREAK        = 0x02,
17116     NM_SDBBP        = 0x03,
17117 };
17118 
17119 /* POOL32A0 instruction pool */
17120 enum {
17121     NM_P_TRAP   = 0x00,
17122     NM_SEB      = 0x01,
17123     NM_SLLV     = 0x02,
17124     NM_MUL      = 0x03,
17125     NM_MFC0     = 0x06,
17126     NM_MFHC0    = 0x07,
17127     NM_SEH      = 0x09,
17128     NM_SRLV     = 0x0a,
17129     NM_MUH      = 0x0b,
17130     NM_MTC0     = 0x0e,
17131     NM_MTHC0    = 0x0f,
17132     NM_SRAV     = 0x12,
17133     NM_MULU     = 0x13,
17134     NM_ROTRV    = 0x1a,
17135     NM_MUHU     = 0x1b,
17136     NM_ADD      = 0x22,
17137     NM_DIV      = 0x23,
17138     NM_ADDU     = 0x2a,
17139     NM_MOD      = 0x2b,
17140     NM_SUB      = 0x32,
17141     NM_DIVU     = 0x33,
17142     NM_RDHWR    = 0x38,
17143     NM_SUBU     = 0x3a,
17144     NM_MODU     = 0x3b,
17145     NM_P_CMOVE  = 0x42,
17146     NM_FORK     = 0x45,
17147     NM_MFTR     = 0x46,
17148     NM_MFHTR    = 0x47,
17149     NM_AND      = 0x4a,
17150     NM_YIELD    = 0x4d,
17151     NM_MTTR     = 0x4e,
17152     NM_MTHTR    = 0x4f,
17153     NM_OR       = 0x52,
17154     NM_D_E_MT_VPE = 0x56,
17155     NM_NOR      = 0x5a,
17156     NM_XOR      = 0x62,
17157     NM_SLT      = 0x6a,
17158     NM_P_SLTU   = 0x72,
17159     NM_SOV      = 0x7a,
17160 };
17161 
17162 /* CRC32 instruction pool */
17163 enum {
17164     NM_CRC32B   = 0x00,
17165     NM_CRC32H   = 0x01,
17166     NM_CRC32W   = 0x02,
17167     NM_CRC32CB  = 0x04,
17168     NM_CRC32CH  = 0x05,
17169     NM_CRC32CW  = 0x06,
17170 };
17171 
17172 /* POOL32A5 instruction pool */
17173 enum {
17174     NM_CMP_EQ_PH        = 0x00,
17175     NM_CMP_LT_PH        = 0x08,
17176     NM_CMP_LE_PH        = 0x10,
17177     NM_CMPGU_EQ_QB      = 0x18,
17178     NM_CMPGU_LT_QB      = 0x20,
17179     NM_CMPGU_LE_QB      = 0x28,
17180     NM_CMPGDU_EQ_QB     = 0x30,
17181     NM_CMPGDU_LT_QB     = 0x38,
17182     NM_CMPGDU_LE_QB     = 0x40,
17183     NM_CMPU_EQ_QB       = 0x48,
17184     NM_CMPU_LT_QB       = 0x50,
17185     NM_CMPU_LE_QB       = 0x58,
17186     NM_ADDQ_S_W         = 0x60,
17187     NM_SUBQ_S_W         = 0x68,
17188     NM_ADDSC            = 0x70,
17189     NM_ADDWC            = 0x78,
17190 
17191     NM_ADDQ_S_PH   = 0x01,
17192     NM_ADDQH_R_PH  = 0x09,
17193     NM_ADDQH_R_W   = 0x11,
17194     NM_ADDU_S_QB   = 0x19,
17195     NM_ADDU_S_PH   = 0x21,
17196     NM_ADDUH_R_QB  = 0x29,
17197     NM_SHRAV_R_PH  = 0x31,
17198     NM_SHRAV_R_QB  = 0x39,
17199     NM_SUBQ_S_PH   = 0x41,
17200     NM_SUBQH_R_PH  = 0x49,
17201     NM_SUBQH_R_W   = 0x51,
17202     NM_SUBU_S_QB   = 0x59,
17203     NM_SUBU_S_PH   = 0x61,
17204     NM_SUBUH_R_QB  = 0x69,
17205     NM_SHLLV_S_PH  = 0x71,
17206     NM_PRECR_SRA_R_PH_W = 0x79,
17207 
17208     NM_MULEU_S_PH_QBL   = 0x12,
17209     NM_MULEU_S_PH_QBR   = 0x1a,
17210     NM_MULQ_RS_PH       = 0x22,
17211     NM_MULQ_S_PH        = 0x2a,
17212     NM_MULQ_RS_W        = 0x32,
17213     NM_MULQ_S_W         = 0x3a,
17214     NM_APPEND           = 0x42,
17215     NM_MODSUB           = 0x52,
17216     NM_SHRAV_R_W        = 0x5a,
17217     NM_SHRLV_PH         = 0x62,
17218     NM_SHRLV_QB         = 0x6a,
17219     NM_SHLLV_QB         = 0x72,
17220     NM_SHLLV_S_W        = 0x7a,
17221 
17222     NM_SHILO            = 0x03,
17223 
17224     NM_MULEQ_S_W_PHL    = 0x04,
17225     NM_MULEQ_S_W_PHR    = 0x0c,
17226 
17227     NM_MUL_S_PH         = 0x05,
17228     NM_PRECR_QB_PH      = 0x0d,
17229     NM_PRECRQ_QB_PH     = 0x15,
17230     NM_PRECRQ_PH_W      = 0x1d,
17231     NM_PRECRQ_RS_PH_W   = 0x25,
17232     NM_PRECRQU_S_QB_PH  = 0x2d,
17233     NM_PACKRL_PH        = 0x35,
17234     NM_PICK_QB          = 0x3d,
17235     NM_PICK_PH          = 0x45,
17236 
17237     NM_SHRA_R_W         = 0x5e,
17238     NM_SHRA_R_PH        = 0x66,
17239     NM_SHLL_S_PH        = 0x76,
17240     NM_SHLL_S_W         = 0x7e,
17241 
17242     NM_REPL_PH          = 0x07
17243 };
17244 
17245 /* POOL32A7 instruction pool */
17246 enum {
17247     NM_P_LSX        = 0x00,
17248     NM_LSA          = 0x01,
17249     NM_EXTW         = 0x03,
17250     NM_POOL32AXF    = 0x07,
17251 };
17252 
17253 /* P.SR instruction pool */
17254 enum {
17255     NM_PP_SR           = 0x00,
17256     NM_P_SR_F          = 0x01,
17257 };
17258 
17259 /* P.SHIFT instruction pool */
17260 enum {
17261     NM_P_SLL        = 0x00,
17262     NM_SRL          = 0x02,
17263     NM_SRA          = 0x04,
17264     NM_ROTR         = 0x06,
17265 };
17266 
17267 /* P.ROTX instruction pool */
17268 enum {
17269     NM_ROTX         = 0x00,
17270 };
17271 
17272 /* P.INS instruction pool */
17273 enum {
17274     NM_INS          = 0x00,
17275 };
17276 
17277 /* P.EXT instruction pool */
17278 enum {
17279     NM_EXT          = 0x00,
17280 };
17281 
17282 /* POOL32F_0 (fmt) instruction pool */
17283 enum {
17284     NM_RINT_S              = 0x04,
17285     NM_RINT_D              = 0x44,
17286     NM_ADD_S               = 0x06,
17287     NM_SELEQZ_S            = 0x07,
17288     NM_SELEQZ_D            = 0x47,
17289     NM_CLASS_S             = 0x0c,
17290     NM_CLASS_D             = 0x4c,
17291     NM_SUB_S               = 0x0e,
17292     NM_SELNEZ_S            = 0x0f,
17293     NM_SELNEZ_D            = 0x4f,
17294     NM_MUL_S               = 0x16,
17295     NM_SEL_S               = 0x17,
17296     NM_SEL_D               = 0x57,
17297     NM_DIV_S               = 0x1e,
17298     NM_ADD_D               = 0x26,
17299     NM_SUB_D               = 0x2e,
17300     NM_MUL_D               = 0x36,
17301     NM_MADDF_S             = 0x37,
17302     NM_MADDF_D             = 0x77,
17303     NM_DIV_D               = 0x3e,
17304     NM_MSUBF_S             = 0x3f,
17305     NM_MSUBF_D             = 0x7f,
17306 };
17307 
17308 /* POOL32F_3  instruction pool */
17309 enum {
17310     NM_MIN_FMT         = 0x00,
17311     NM_MAX_FMT         = 0x01,
17312     NM_MINA_FMT        = 0x04,
17313     NM_MAXA_FMT        = 0x05,
17314     NM_POOL32FXF       = 0x07,
17315 };
17316 
17317 /* POOL32F_5  instruction pool */
17318 enum {
17319     NM_CMP_CONDN_S     = 0x00,
17320     NM_CMP_CONDN_D     = 0x02,
17321 };
17322 
17323 /* P.GP.LH instruction pool */
17324 enum {
17325     NM_LHGP    = 0x00,
17326     NM_LHUGP   = 0x01,
17327 };
17328 
17329 /* P.GP.SH instruction pool */
17330 enum {
17331     NM_SHGP    = 0x00,
17332 };
17333 
17334 /* P.GP.CP1 instruction pool */
17335 enum {
17336     NM_LWC1GP       = 0x00,
17337     NM_SWC1GP       = 0x01,
17338     NM_LDC1GP       = 0x02,
17339     NM_SDC1GP       = 0x03,
17340 };
17341 
17342 /* P.LS.S0 instruction pool */
17343 enum {
17344     NM_LBS9     = 0x00,
17345     NM_LHS9     = 0x04,
17346     NM_LWS9     = 0x08,
17347     NM_LDS9     = 0x0c,
17348 
17349     NM_SBS9     = 0x01,
17350     NM_SHS9     = 0x05,
17351     NM_SWS9     = 0x09,
17352     NM_SDS9     = 0x0d,
17353 
17354     NM_LBUS9    = 0x02,
17355     NM_LHUS9    = 0x06,
17356     NM_LWC1S9   = 0x0a,
17357     NM_LDC1S9   = 0x0e,
17358 
17359     NM_P_PREFS9 = 0x03,
17360     NM_LWUS9    = 0x07,
17361     NM_SWC1S9   = 0x0b,
17362     NM_SDC1S9   = 0x0f,
17363 };
17364 
17365 /* P.LS.S1 instruction pool */
17366 enum {
17367     NM_ASET_ACLR = 0x02,
17368     NM_UALH      = 0x04,
17369     NM_UASH      = 0x05,
17370     NM_CACHE     = 0x07,
17371     NM_P_LL      = 0x0a,
17372     NM_P_SC      = 0x0b,
17373 };
17374 
17375 /* P.LS.E0 instruction pool */
17376 enum {
17377     NM_LBE      = 0x00,
17378     NM_SBE      = 0x01,
17379     NM_LBUE     = 0x02,
17380     NM_P_PREFE  = 0x03,
17381     NM_LHE      = 0x04,
17382     NM_SHE      = 0x05,
17383     NM_LHUE     = 0x06,
17384     NM_CACHEE   = 0x07,
17385     NM_LWE      = 0x08,
17386     NM_SWE      = 0x09,
17387     NM_P_LLE    = 0x0a,
17388     NM_P_SCE    = 0x0b,
17389 };
17390 
17391 /* P.PREFE instruction pool */
17392 enum {
17393     NM_SYNCIE   = 0x00,
17394     NM_PREFE    = 0x01,
17395 };
17396 
17397 /* P.LLE instruction pool */
17398 enum {
17399     NM_LLE      = 0x00,
17400     NM_LLWPE    = 0x01,
17401 };
17402 
17403 /* P.SCE instruction pool */
17404 enum {
17405     NM_SCE      = 0x00,
17406     NM_SCWPE    = 0x01,
17407 };
17408 
17409 /* P.LS.WM instruction pool */
17410 enum {
17411     NM_LWM       = 0x00,
17412     NM_SWM       = 0x01,
17413 };
17414 
17415 /* P.LS.UAWM instruction pool */
17416 enum {
17417     NM_UALWM       = 0x00,
17418     NM_UASWM       = 0x01,
17419 };
17420 
17421 /* P.BR3A instruction pool */
17422 enum {
17423     NM_BC1EQZC          = 0x00,
17424     NM_BC1NEZC          = 0x01,
17425     NM_BC2EQZC          = 0x02,
17426     NM_BC2NEZC          = 0x03,
17427     NM_BPOSGE32C        = 0x04,
17428 };
17429 
17430 /* P16.RI instruction pool */
17431 enum {
17432     NM_P16_SYSCALL  = 0x01,
17433     NM_BREAK16      = 0x02,
17434     NM_SDBBP16      = 0x03,
17435 };
17436 
17437 /* POOL16C_0 instruction pool */
17438 enum {
17439     NM_POOL16C_00      = 0x00,
17440 };
17441 
17442 /* P16.JRC instruction pool */
17443 enum {
17444     NM_JRC          = 0x00,
17445     NM_JALRC16      = 0x01,
17446 };
17447 
17448 /* P.SYSCALL instruction pool */
17449 enum {
17450     NM_SYSCALL      = 0x00,
17451     NM_HYPCALL      = 0x01,
17452 };
17453 
17454 /* P.TRAP instruction pool */
17455 enum {
17456     NM_TEQ          = 0x00,
17457     NM_TNE          = 0x01,
17458 };
17459 
17460 /* P.CMOVE instruction pool */
17461 enum {
17462     NM_MOVZ            = 0x00,
17463     NM_MOVN            = 0x01,
17464 };
17465 
17466 /* POOL32Axf instruction pool */
17467 enum {
17468     NM_POOL32AXF_1 = 0x01,
17469     NM_POOL32AXF_2 = 0x02,
17470     NM_POOL32AXF_4 = 0x04,
17471     NM_POOL32AXF_5 = 0x05,
17472     NM_POOL32AXF_7 = 0x07,
17473 };
17474 
17475 /* POOL32Axf_1 instruction pool */
17476 enum {
17477     NM_POOL32AXF_1_0 = 0x00,
17478     NM_POOL32AXF_1_1 = 0x01,
17479     NM_POOL32AXF_1_3 = 0x03,
17480     NM_POOL32AXF_1_4 = 0x04,
17481     NM_POOL32AXF_1_5 = 0x05,
17482     NM_POOL32AXF_1_7 = 0x07,
17483 };
17484 
17485 /* POOL32Axf_2 instruction pool */
17486 enum {
17487     NM_POOL32AXF_2_0_7     = 0x00,
17488     NM_POOL32AXF_2_8_15    = 0x01,
17489     NM_POOL32AXF_2_16_23   = 0x02,
17490     NM_POOL32AXF_2_24_31   = 0x03,
17491 };
17492 
17493 /* POOL32Axf_7 instruction pool */
17494 enum {
17495     NM_SHRA_R_QB    = 0x0,
17496     NM_SHRL_PH      = 0x1,
17497     NM_REPL_QB      = 0x2,
17498 };
17499 
17500 /* POOL32Axf_1_0 instruction pool */
17501 enum {
17502     NM_MFHI = 0x0,
17503     NM_MFLO = 0x1,
17504     NM_MTHI = 0x2,
17505     NM_MTLO = 0x3,
17506 };
17507 
17508 /* POOL32Axf_1_1 instruction pool */
17509 enum {
17510     NM_MTHLIP = 0x0,
17511     NM_SHILOV = 0x1,
17512 };
17513 
17514 /* POOL32Axf_1_3 instruction pool */
17515 enum {
17516     NM_RDDSP    = 0x0,
17517     NM_WRDSP    = 0x1,
17518     NM_EXTP     = 0x2,
17519     NM_EXTPDP   = 0x3,
17520 };
17521 
17522 /* POOL32Axf_1_4 instruction pool */
17523 enum {
17524     NM_SHLL_QB  = 0x0,
17525     NM_SHRL_QB  = 0x1,
17526 };
17527 
17528 /* POOL32Axf_1_5 instruction pool */
17529 enum {
17530     NM_MAQ_S_W_PHR   = 0x0,
17531     NM_MAQ_S_W_PHL   = 0x1,
17532     NM_MAQ_SA_W_PHR  = 0x2,
17533     NM_MAQ_SA_W_PHL  = 0x3,
17534 };
17535 
17536 /* POOL32Axf_1_7 instruction pool */
17537 enum {
17538     NM_EXTR_W       = 0x0,
17539     NM_EXTR_R_W     = 0x1,
17540     NM_EXTR_RS_W    = 0x2,
17541     NM_EXTR_S_H     = 0x3,
17542 };
17543 
17544 /* POOL32Axf_2_0_7 instruction pool */
17545 enum {
17546     NM_DPA_W_PH     = 0x0,
17547     NM_DPAQ_S_W_PH  = 0x1,
17548     NM_DPS_W_PH     = 0x2,
17549     NM_DPSQ_S_W_PH  = 0x3,
17550     NM_BALIGN       = 0x4,
17551     NM_MADD         = 0x5,
17552     NM_MULT         = 0x6,
17553     NM_EXTRV_W      = 0x7,
17554 };
17555 
17556 /* POOL32Axf_2_8_15 instruction pool */
17557 enum {
17558     NM_DPAX_W_PH    = 0x0,
17559     NM_DPAQ_SA_L_W  = 0x1,
17560     NM_DPSX_W_PH    = 0x2,
17561     NM_DPSQ_SA_L_W  = 0x3,
17562     NM_MADDU        = 0x5,
17563     NM_MULTU        = 0x6,
17564     NM_EXTRV_R_W    = 0x7,
17565 };
17566 
17567 /* POOL32Axf_2_16_23 instruction pool */
17568 enum {
17569     NM_DPAU_H_QBL       = 0x0,
17570     NM_DPAQX_S_W_PH     = 0x1,
17571     NM_DPSU_H_QBL       = 0x2,
17572     NM_DPSQX_S_W_PH     = 0x3,
17573     NM_EXTPV            = 0x4,
17574     NM_MSUB             = 0x5,
17575     NM_MULSA_W_PH       = 0x6,
17576     NM_EXTRV_RS_W       = 0x7,
17577 };
17578 
17579 /* POOL32Axf_2_24_31 instruction pool */
17580 enum {
17581     NM_DPAU_H_QBR       = 0x0,
17582     NM_DPAQX_SA_W_PH    = 0x1,
17583     NM_DPSU_H_QBR       = 0x2,
17584     NM_DPSQX_SA_W_PH    = 0x3,
17585     NM_EXTPDPV          = 0x4,
17586     NM_MSUBU            = 0x5,
17587     NM_MULSAQ_S_W_PH    = 0x6,
17588     NM_EXTRV_S_H        = 0x7,
17589 };
17590 
17591 /* POOL32Axf_{4, 5} instruction pool */
17592 enum {
17593     NM_CLO      = 0x25,
17594     NM_CLZ      = 0x2d,
17595 
17596     NM_TLBP     = 0x01,
17597     NM_TLBR     = 0x09,
17598     NM_TLBWI    = 0x11,
17599     NM_TLBWR    = 0x19,
17600     NM_TLBINV   = 0x03,
17601     NM_TLBINVF  = 0x0b,
17602     NM_DI       = 0x23,
17603     NM_EI       = 0x2b,
17604     NM_RDPGPR   = 0x70,
17605     NM_WRPGPR   = 0x78,
17606     NM_WAIT     = 0x61,
17607     NM_DERET    = 0x71,
17608     NM_ERETX    = 0x79,
17609 
17610     /* nanoMIPS DSP instructions */
17611     NM_ABSQ_S_QB        = 0x00,
17612     NM_ABSQ_S_PH        = 0x08,
17613     NM_ABSQ_S_W         = 0x10,
17614     NM_PRECEQ_W_PHL     = 0x28,
17615     NM_PRECEQ_W_PHR     = 0x30,
17616     NM_PRECEQU_PH_QBL   = 0x38,
17617     NM_PRECEQU_PH_QBR   = 0x48,
17618     NM_PRECEU_PH_QBL    = 0x58,
17619     NM_PRECEU_PH_QBR    = 0x68,
17620     NM_PRECEQU_PH_QBLA  = 0x39,
17621     NM_PRECEQU_PH_QBRA  = 0x49,
17622     NM_PRECEU_PH_QBLA   = 0x59,
17623     NM_PRECEU_PH_QBRA   = 0x69,
17624     NM_REPLV_PH         = 0x01,
17625     NM_REPLV_QB         = 0x09,
17626     NM_BITREV           = 0x18,
17627     NM_INSV             = 0x20,
17628     NM_RADDU_W_QB       = 0x78,
17629 
17630     NM_BITSWAP          = 0x05,
17631     NM_WSBH             = 0x3d,
17632 };
17633 
17634 /* PP.SR instruction pool */
17635 enum {
17636     NM_SAVE         = 0x00,
17637     NM_RESTORE      = 0x02,
17638     NM_RESTORE_JRC  = 0x03,
17639 };
17640 
17641 /* P.SR.F instruction pool */
17642 enum {
17643     NM_SAVEF        = 0x00,
17644     NM_RESTOREF     = 0x01,
17645 };
17646 
17647 /* P16.SYSCALL  instruction pool */
17648 enum {
17649     NM_SYSCALL16     = 0x00,
17650     NM_HYPCALL16     = 0x01,
17651 };
17652 
17653 /* POOL16C_00 instruction pool */
17654 enum {
17655     NM_NOT16           = 0x00,
17656     NM_XOR16           = 0x01,
17657     NM_AND16           = 0x02,
17658     NM_OR16            = 0x03,
17659 };
17660 
17661 /* PP.LSX and PP.LSXS instruction pool */
17662 enum {
17663     NM_LBX      = 0x00,
17664     NM_LHX      = 0x04,
17665     NM_LWX      = 0x08,
17666     NM_LDX      = 0x0c,
17667 
17668     NM_SBX      = 0x01,
17669     NM_SHX      = 0x05,
17670     NM_SWX      = 0x09,
17671     NM_SDX      = 0x0d,
17672 
17673     NM_LBUX     = 0x02,
17674     NM_LHUX     = 0x06,
17675     NM_LWC1X    = 0x0a,
17676     NM_LDC1X    = 0x0e,
17677 
17678     NM_LWUX     = 0x07,
17679     NM_SWC1X    = 0x0b,
17680     NM_SDC1X    = 0x0f,
17681 
17682     NM_LHXS     = 0x04,
17683     NM_LWXS     = 0x08,
17684     NM_LDXS     = 0x0c,
17685 
17686     NM_SHXS     = 0x05,
17687     NM_SWXS     = 0x09,
17688     NM_SDXS     = 0x0d,
17689 
17690     NM_LHUXS    = 0x06,
17691     NM_LWC1XS   = 0x0a,
17692     NM_LDC1XS   = 0x0e,
17693 
17694     NM_LWUXS    = 0x07,
17695     NM_SWC1XS   = 0x0b,
17696     NM_SDC1XS   = 0x0f,
17697 };
17698 
17699 /* ERETx instruction pool */
17700 enum {
17701     NM_ERET     = 0x00,
17702     NM_ERETNC   = 0x01,
17703 };
17704 
17705 /* POOL32FxF_{0, 1} insturction pool */
17706 enum {
17707     NM_CFC1     = 0x40,
17708     NM_CTC1     = 0x60,
17709     NM_MFC1     = 0x80,
17710     NM_MTC1     = 0xa0,
17711     NM_MFHC1    = 0xc0,
17712     NM_MTHC1    = 0xe0,
17713 
17714     NM_CVT_S_PL = 0x84,
17715     NM_CVT_S_PU = 0xa4,
17716 
17717     NM_CVT_L_S     = 0x004,
17718     NM_CVT_L_D     = 0x104,
17719     NM_CVT_W_S     = 0x024,
17720     NM_CVT_W_D     = 0x124,
17721 
17722     NM_RSQRT_S     = 0x008,
17723     NM_RSQRT_D     = 0x108,
17724 
17725     NM_SQRT_S      = 0x028,
17726     NM_SQRT_D      = 0x128,
17727 
17728     NM_RECIP_S     = 0x048,
17729     NM_RECIP_D     = 0x148,
17730 
17731     NM_FLOOR_L_S   = 0x00c,
17732     NM_FLOOR_L_D   = 0x10c,
17733 
17734     NM_FLOOR_W_S   = 0x02c,
17735     NM_FLOOR_W_D   = 0x12c,
17736 
17737     NM_CEIL_L_S    = 0x04c,
17738     NM_CEIL_L_D    = 0x14c,
17739     NM_CEIL_W_S    = 0x06c,
17740     NM_CEIL_W_D    = 0x16c,
17741     NM_TRUNC_L_S   = 0x08c,
17742     NM_TRUNC_L_D   = 0x18c,
17743     NM_TRUNC_W_S   = 0x0ac,
17744     NM_TRUNC_W_D   = 0x1ac,
17745     NM_ROUND_L_S   = 0x0cc,
17746     NM_ROUND_L_D   = 0x1cc,
17747     NM_ROUND_W_S   = 0x0ec,
17748     NM_ROUND_W_D   = 0x1ec,
17749 
17750     NM_MOV_S       = 0x01,
17751     NM_MOV_D       = 0x81,
17752     NM_ABS_S       = 0x0d,
17753     NM_ABS_D       = 0x8d,
17754     NM_NEG_S       = 0x2d,
17755     NM_NEG_D       = 0xad,
17756     NM_CVT_D_S     = 0x04d,
17757     NM_CVT_D_W     = 0x0cd,
17758     NM_CVT_D_L     = 0x14d,
17759     NM_CVT_S_D     = 0x06d,
17760     NM_CVT_S_W     = 0x0ed,
17761     NM_CVT_S_L     = 0x16d,
17762 };
17763 
17764 /* P.LL instruction pool */
17765 enum {
17766     NM_LL       = 0x00,
17767     NM_LLWP     = 0x01,
17768 };
17769 
17770 /* P.SC instruction pool */
17771 enum {
17772     NM_SC       = 0x00,
17773     NM_SCWP     = 0x01,
17774 };
17775 
17776 /* P.DVP instruction pool */
17777 enum {
17778     NM_DVP      = 0x00,
17779     NM_EVP      = 0x01,
17780 };
17781 
17782 
17783 /*
17784  *
17785  * nanoMIPS decoding engine
17786  *
17787  */
17788 
17789 
17790 /* extraction utilities */
17791 
17792 #define NANOMIPS_EXTRACT_RT3(op) ((op >> 7) & 0x7)
17793 #define NANOMIPS_EXTRACT_RS3(op) ((op >> 4) & 0x7)
17794 #define NANOMIPS_EXTRACT_RD3(op) ((op >> 1) & 0x7)
17795 #define NANOMIPS_EXTRACT_RD5(op) ((op >> 5) & 0x1f)
17796 #define NANOMIPS_EXTRACT_RS5(op) (op & 0x1f)
17797 
17798 /* Implement nanoMIPS pseudocode decode_gpr(encoded_gpr, 'gpr3'). */
17799 static inline int decode_gpr_gpr3(int r)
17800 {
17801     static const int map[] = { 16, 17, 18, 19,  4,  5,  6,  7 };
17802 
17803     return map[r & 0x7];
17804 }
17805 
17806 /* Implement nanoMIPS pseudocode decode_gpr(encoded_gpr, 'gpr3.src.store'). */
17807 static inline int decode_gpr_gpr3_src_store(int r)
17808 {
17809     static const int map[] = {  0, 17, 18, 19,  4,  5,  6,  7 };
17810 
17811     return map[r & 0x7];
17812 }
17813 
17814 /* Implement nanoMIPS pseudocode decode_gpr(encoded_gpr, 'gpr4'). */
17815 static inline int decode_gpr_gpr4(int r)
17816 {
17817     static const int map[] = {  8,  9, 10, 11,  4,  5,  6,  7,
17818                                16, 17, 18, 19, 20, 21, 22, 23 };
17819 
17820     return map[r & 0xf];
17821 }
17822 
17823 /* Implement nanoMIPS pseudocode decode_gpr(encoded_gpr, 'gpr4.zero'). */
17824 static inline int decode_gpr_gpr4_zero(int r)
17825 {
17826     static const int map[] = {  8,  9, 10,  0,  4,  5,  6,  7,
17827                                16, 17, 18, 19, 20, 21, 22, 23 };
17828 
17829     return map[r & 0xf];
17830 }
17831 
17832 
17833 static void gen_adjust_sp(DisasContext *ctx, int u)
17834 {
17835     gen_op_addr_addi(ctx, cpu_gpr[29], cpu_gpr[29], u);
17836 }
17837 
17838 static void gen_save(DisasContext *ctx, uint8_t rt, uint8_t count,
17839                      uint8_t gp, uint16_t u)
17840 {
17841     int counter = 0;
17842     TCGv va = tcg_temp_new();
17843     TCGv t0 = tcg_temp_new();
17844 
17845     while (counter != count) {
17846         bool use_gp = gp && (counter == count - 1);
17847         int this_rt = use_gp ? 28 : (rt & 0x10) | ((rt + counter) & 0x1f);
17848         int this_offset = -((counter + 1) << 2);
17849         gen_base_offset_addr(ctx, va, 29, this_offset);
17850         gen_load_gpr(t0, this_rt);
17851         tcg_gen_qemu_st_tl(t0, va, ctx->mem_idx,
17852                            (MO_TEUL | ctx->default_tcg_memop_mask));
17853         counter++;
17854     }
17855 
17856     /* adjust stack pointer */
17857     gen_adjust_sp(ctx, -u);
17858 
17859     tcg_temp_free(t0);
17860     tcg_temp_free(va);
17861 }
17862 
17863 static void gen_restore(DisasContext *ctx, uint8_t rt, uint8_t count,
17864                         uint8_t gp, uint16_t u)
17865 {
17866     int counter = 0;
17867     TCGv va = tcg_temp_new();
17868     TCGv t0 = tcg_temp_new();
17869 
17870     while (counter != count) {
17871         bool use_gp = gp && (counter == count - 1);
17872         int this_rt = use_gp ? 28 : (rt & 0x10) | ((rt + counter) & 0x1f);
17873         int this_offset = u - ((counter + 1) << 2);
17874         gen_base_offset_addr(ctx, va, 29, this_offset);
17875         tcg_gen_qemu_ld_tl(t0, va, ctx->mem_idx, MO_TESL |
17876                         ctx->default_tcg_memop_mask);
17877         tcg_gen_ext32s_tl(t0, t0);
17878         gen_store_gpr(t0, this_rt);
17879         counter++;
17880     }
17881 
17882     /* adjust stack pointer */
17883     gen_adjust_sp(ctx, u);
17884 
17885     tcg_temp_free(t0);
17886     tcg_temp_free(va);
17887 }
17888 
17889 static void gen_pool16c_nanomips_insn(DisasContext *ctx)
17890 {
17891     int rt = decode_gpr_gpr3(NANOMIPS_EXTRACT_RT3(ctx->opcode));
17892     int rs = decode_gpr_gpr3(NANOMIPS_EXTRACT_RS3(ctx->opcode));
17893 
17894     switch (extract32(ctx->opcode, 2, 2)) {
17895     case NM_NOT16:
17896         gen_logic(ctx, OPC_NOR, rt, rs, 0);
17897         break;
17898     case NM_AND16:
17899         gen_logic(ctx, OPC_AND, rt, rt, rs);
17900         break;
17901     case NM_XOR16:
17902         gen_logic(ctx, OPC_XOR, rt, rt, rs);
17903         break;
17904     case NM_OR16:
17905         gen_logic(ctx, OPC_OR, rt, rt, rs);
17906         break;
17907     }
17908 }
17909 
17910 static void gen_pool32a0_nanomips_insn(CPUMIPSState *env, DisasContext *ctx)
17911 {
17912     int rt = extract32(ctx->opcode, 21, 5);
17913     int rs = extract32(ctx->opcode, 16, 5);
17914     int rd = extract32(ctx->opcode, 11, 5);
17915 
17916     switch (extract32(ctx->opcode, 3, 7)) {
17917     case NM_P_TRAP:
17918         switch (extract32(ctx->opcode, 10, 1)) {
17919         case NM_TEQ:
17920             check_nms(ctx);
17921             gen_trap(ctx, OPC_TEQ, rs, rt, -1);
17922             break;
17923         case NM_TNE:
17924             check_nms(ctx);
17925             gen_trap(ctx, OPC_TNE, rs, rt, -1);
17926             break;
17927         }
17928         break;
17929     case NM_RDHWR:
17930         check_nms(ctx);
17931         gen_rdhwr(ctx, rt, rs, extract32(ctx->opcode, 11, 3));
17932         break;
17933     case NM_SEB:
17934         check_nms(ctx);
17935         gen_bshfl(ctx, OPC_SEB, rs, rt);
17936         break;
17937     case NM_SEH:
17938         gen_bshfl(ctx, OPC_SEH, rs, rt);
17939         break;
17940     case NM_SLLV:
17941         gen_shift(ctx, OPC_SLLV, rd, rt, rs);
17942         break;
17943     case NM_SRLV:
17944         gen_shift(ctx, OPC_SRLV, rd, rt, rs);
17945         break;
17946     case NM_SRAV:
17947         gen_shift(ctx, OPC_SRAV, rd, rt, rs);
17948         break;
17949     case NM_ROTRV:
17950         gen_shift(ctx, OPC_ROTRV, rd, rt, rs);
17951         break;
17952     case NM_ADD:
17953         gen_arith(ctx, OPC_ADD, rd, rs, rt);
17954         break;
17955     case NM_ADDU:
17956         gen_arith(ctx, OPC_ADDU, rd, rs, rt);
17957         break;
17958     case NM_SUB:
17959         check_nms(ctx);
17960         gen_arith(ctx, OPC_SUB, rd, rs, rt);
17961         break;
17962     case NM_SUBU:
17963         gen_arith(ctx, OPC_SUBU, rd, rs, rt);
17964         break;
17965     case NM_P_CMOVE:
17966         switch (extract32(ctx->opcode, 10, 1)) {
17967         case NM_MOVZ:
17968             gen_cond_move(ctx, OPC_MOVZ, rd, rs, rt);
17969             break;
17970         case NM_MOVN:
17971             gen_cond_move(ctx, OPC_MOVN, rd, rs, rt);
17972             break;
17973         }
17974         break;
17975     case NM_AND:
17976         gen_logic(ctx, OPC_AND, rd, rs, rt);
17977         break;
17978     case NM_OR:
17979         gen_logic(ctx, OPC_OR, rd, rs, rt);
17980         break;
17981     case NM_NOR:
17982         gen_logic(ctx, OPC_NOR, rd, rs, rt);
17983         break;
17984     case NM_XOR:
17985         gen_logic(ctx, OPC_XOR, rd, rs, rt);
17986         break;
17987     case NM_SLT:
17988         gen_slt(ctx, OPC_SLT, rd, rs, rt);
17989         break;
17990     case NM_P_SLTU:
17991         if (rd == 0) {
17992             /* P_DVP */
17993 #ifndef CONFIG_USER_ONLY
17994             TCGv t0 = tcg_temp_new();
17995             switch (extract32(ctx->opcode, 10, 1)) {
17996             case NM_DVP:
17997                 if (ctx->vp) {
17998                     check_cp0_enabled(ctx);
17999                     gen_helper_dvp(t0, cpu_env);
18000                     gen_store_gpr(t0, rt);
18001                 }
18002                 break;
18003             case NM_EVP:
18004                 if (ctx->vp) {
18005                     check_cp0_enabled(ctx);
18006                     gen_helper_evp(t0, cpu_env);
18007                     gen_store_gpr(t0, rt);
18008                 }
18009                 break;
18010             }
18011             tcg_temp_free(t0);
18012 #endif
18013         } else {
18014             gen_slt(ctx, OPC_SLTU, rd, rs, rt);
18015         }
18016         break;
18017     case NM_SOV:
18018         {
18019             TCGv t0 = tcg_temp_new();
18020             TCGv t1 = tcg_temp_new();
18021             TCGv t2 = tcg_temp_new();
18022 
18023             gen_load_gpr(t1, rs);
18024             gen_load_gpr(t2, rt);
18025             tcg_gen_add_tl(t0, t1, t2);
18026             tcg_gen_ext32s_tl(t0, t0);
18027             tcg_gen_xor_tl(t1, t1, t2);
18028             tcg_gen_xor_tl(t2, t0, t2);
18029             tcg_gen_andc_tl(t1, t2, t1);
18030 
18031             /* operands of same sign, result different sign */
18032             tcg_gen_setcondi_tl(TCG_COND_LT, t0, t1, 0);
18033             gen_store_gpr(t0, rd);
18034 
18035             tcg_temp_free(t0);
18036             tcg_temp_free(t1);
18037             tcg_temp_free(t2);
18038         }
18039         break;
18040     case NM_MUL:
18041         gen_r6_muldiv(ctx, R6_OPC_MUL, rd, rs, rt);
18042         break;
18043     case NM_MUH:
18044         gen_r6_muldiv(ctx, R6_OPC_MUH, rd, rs, rt);
18045         break;
18046     case NM_MULU:
18047         gen_r6_muldiv(ctx, R6_OPC_MULU, rd, rs, rt);
18048         break;
18049     case NM_MUHU:
18050         gen_r6_muldiv(ctx, R6_OPC_MUHU, rd, rs, rt);
18051         break;
18052     case NM_DIV:
18053         gen_r6_muldiv(ctx, R6_OPC_DIV, rd, rs, rt);
18054         break;
18055     case NM_MOD:
18056         gen_r6_muldiv(ctx, R6_OPC_MOD, rd, rs, rt);
18057         break;
18058     case NM_DIVU:
18059         gen_r6_muldiv(ctx, R6_OPC_DIVU, rd, rs, rt);
18060         break;
18061     case NM_MODU:
18062         gen_r6_muldiv(ctx, R6_OPC_MODU, rd, rs, rt);
18063         break;
18064 #ifndef CONFIG_USER_ONLY
18065     case NM_MFC0:
18066         check_cp0_enabled(ctx);
18067         if (rt == 0) {
18068             /* Treat as NOP. */
18069             break;
18070         }
18071         gen_mfc0(ctx, cpu_gpr[rt], rs, extract32(ctx->opcode, 11, 3));
18072         break;
18073     case NM_MTC0:
18074         check_cp0_enabled(ctx);
18075         {
18076             TCGv t0 = tcg_temp_new();
18077 
18078             gen_load_gpr(t0, rt);
18079             gen_mtc0(ctx, t0, rs, extract32(ctx->opcode, 11, 3));
18080             tcg_temp_free(t0);
18081         }
18082         break;
18083     case NM_D_E_MT_VPE:
18084         {
18085             uint8_t sc = extract32(ctx->opcode, 10, 1);
18086             TCGv t0 = tcg_temp_new();
18087 
18088             switch (sc) {
18089             case 0:
18090                 if (rs == 1) {
18091                     /* DMT */
18092                     check_cp0_mt(ctx);
18093                     gen_helper_dmt(t0);
18094                     gen_store_gpr(t0, rt);
18095                 } else if (rs == 0) {
18096                     /* DVPE */
18097                     check_cp0_mt(ctx);
18098                     gen_helper_dvpe(t0, cpu_env);
18099                     gen_store_gpr(t0, rt);
18100                 } else {
18101                     gen_reserved_instruction(ctx);
18102                 }
18103                 break;
18104             case 1:
18105                 if (rs == 1) {
18106                     /* EMT */
18107                     check_cp0_mt(ctx);
18108                     gen_helper_emt(t0);
18109                     gen_store_gpr(t0, rt);
18110                 } else if (rs == 0) {
18111                     /* EVPE */
18112                     check_cp0_mt(ctx);
18113                     gen_helper_evpe(t0, cpu_env);
18114                     gen_store_gpr(t0, rt);
18115                 } else {
18116                     gen_reserved_instruction(ctx);
18117                 }
18118                 break;
18119             }
18120 
18121             tcg_temp_free(t0);
18122         }
18123         break;
18124     case NM_FORK:
18125         check_mt(ctx);
18126         {
18127             TCGv t0 = tcg_temp_new();
18128             TCGv t1 = tcg_temp_new();
18129 
18130             gen_load_gpr(t0, rt);
18131             gen_load_gpr(t1, rs);
18132             gen_helper_fork(t0, t1);
18133             tcg_temp_free(t0);
18134             tcg_temp_free(t1);
18135         }
18136         break;
18137     case NM_MFTR:
18138     case NM_MFHTR:
18139         check_cp0_enabled(ctx);
18140         if (rd == 0) {
18141             /* Treat as NOP. */
18142             return;
18143         }
18144         gen_mftr(env, ctx, rs, rt, extract32(ctx->opcode, 10, 1),
18145                  extract32(ctx->opcode, 11, 5), extract32(ctx->opcode, 3, 1));
18146         break;
18147     case NM_MTTR:
18148     case NM_MTHTR:
18149         check_cp0_enabled(ctx);
18150         gen_mttr(env, ctx, rs, rt, extract32(ctx->opcode, 10, 1),
18151                  extract32(ctx->opcode, 11, 5), extract32(ctx->opcode, 3, 1));
18152         break;
18153     case NM_YIELD:
18154         check_mt(ctx);
18155         {
18156             TCGv t0 = tcg_temp_new();
18157 
18158             gen_load_gpr(t0, rs);
18159             gen_helper_yield(t0, cpu_env, t0);
18160             gen_store_gpr(t0, rt);
18161             tcg_temp_free(t0);
18162         }
18163         break;
18164 #endif
18165     default:
18166         gen_reserved_instruction(ctx);
18167         break;
18168     }
18169 }
18170 
18171 /* dsp */
18172 static void gen_pool32axf_1_5_nanomips_insn(DisasContext *ctx, uint32_t opc,
18173                                             int ret, int v1, int v2)
18174 {
18175     TCGv_i32 t0;
18176     TCGv v0_t;
18177     TCGv v1_t;
18178 
18179     t0 = tcg_temp_new_i32();
18180 
18181     v0_t = tcg_temp_new();
18182     v1_t = tcg_temp_new();
18183 
18184     tcg_gen_movi_i32(t0, v2 >> 3);
18185 
18186     gen_load_gpr(v0_t, ret);
18187     gen_load_gpr(v1_t, v1);
18188 
18189     switch (opc) {
18190     case NM_MAQ_S_W_PHR:
18191         check_dsp(ctx);
18192         gen_helper_maq_s_w_phr(t0, v1_t, v0_t, cpu_env);
18193         break;
18194     case NM_MAQ_S_W_PHL:
18195         check_dsp(ctx);
18196         gen_helper_maq_s_w_phl(t0, v1_t, v0_t, cpu_env);
18197         break;
18198     case NM_MAQ_SA_W_PHR:
18199         check_dsp(ctx);
18200         gen_helper_maq_sa_w_phr(t0, v1_t, v0_t, cpu_env);
18201         break;
18202     case NM_MAQ_SA_W_PHL:
18203         check_dsp(ctx);
18204         gen_helper_maq_sa_w_phl(t0, v1_t, v0_t, cpu_env);
18205         break;
18206     default:
18207         gen_reserved_instruction(ctx);
18208         break;
18209     }
18210 
18211     tcg_temp_free_i32(t0);
18212 
18213     tcg_temp_free(v0_t);
18214     tcg_temp_free(v1_t);
18215 }
18216 
18217 
18218 static void gen_pool32axf_1_nanomips_insn(DisasContext *ctx, uint32_t opc,
18219                                     int ret, int v1, int v2)
18220 {
18221     int16_t imm;
18222     TCGv t0 = tcg_temp_new();
18223     TCGv t1 = tcg_temp_new();
18224     TCGv v0_t = tcg_temp_new();
18225 
18226     gen_load_gpr(v0_t, v1);
18227 
18228     switch (opc) {
18229     case NM_POOL32AXF_1_0:
18230         check_dsp(ctx);
18231         switch (extract32(ctx->opcode, 12, 2)) {
18232         case NM_MFHI:
18233             gen_HILO(ctx, OPC_MFHI, v2 >> 3, ret);
18234             break;
18235         case NM_MFLO:
18236             gen_HILO(ctx, OPC_MFLO, v2 >> 3, ret);
18237             break;
18238         case NM_MTHI:
18239             gen_HILO(ctx, OPC_MTHI, v2 >> 3, v1);
18240             break;
18241         case NM_MTLO:
18242             gen_HILO(ctx, OPC_MTLO, v2 >> 3, v1);
18243             break;
18244         }
18245         break;
18246     case NM_POOL32AXF_1_1:
18247         check_dsp(ctx);
18248         switch (extract32(ctx->opcode, 12, 2)) {
18249         case NM_MTHLIP:
18250             tcg_gen_movi_tl(t0, v2);
18251             gen_helper_mthlip(t0, v0_t, cpu_env);
18252             break;
18253         case NM_SHILOV:
18254             tcg_gen_movi_tl(t0, v2 >> 3);
18255             gen_helper_shilo(t0, v0_t, cpu_env);
18256             break;
18257         default:
18258             gen_reserved_instruction(ctx);
18259             break;
18260         }
18261         break;
18262     case NM_POOL32AXF_1_3:
18263         check_dsp(ctx);
18264         imm = extract32(ctx->opcode, 14, 7);
18265         switch (extract32(ctx->opcode, 12, 2)) {
18266         case NM_RDDSP:
18267             tcg_gen_movi_tl(t0, imm);
18268             gen_helper_rddsp(t0, t0, cpu_env);
18269             gen_store_gpr(t0, ret);
18270             break;
18271         case NM_WRDSP:
18272             gen_load_gpr(t0, ret);
18273             tcg_gen_movi_tl(t1, imm);
18274             gen_helper_wrdsp(t0, t1, cpu_env);
18275             break;
18276         case NM_EXTP:
18277             tcg_gen_movi_tl(t0, v2 >> 3);
18278             tcg_gen_movi_tl(t1, v1);
18279             gen_helper_extp(t0, t0, t1, cpu_env);
18280             gen_store_gpr(t0, ret);
18281             break;
18282         case NM_EXTPDP:
18283             tcg_gen_movi_tl(t0, v2 >> 3);
18284             tcg_gen_movi_tl(t1, v1);
18285             gen_helper_extpdp(t0, t0, t1, cpu_env);
18286             gen_store_gpr(t0, ret);
18287             break;
18288         }
18289         break;
18290     case NM_POOL32AXF_1_4:
18291         check_dsp(ctx);
18292         tcg_gen_movi_tl(t0, v2 >> 2);
18293         switch (extract32(ctx->opcode, 12, 1)) {
18294         case NM_SHLL_QB:
18295             gen_helper_shll_qb(t0, t0, v0_t, cpu_env);
18296             gen_store_gpr(t0, ret);
18297             break;
18298         case NM_SHRL_QB:
18299             gen_helper_shrl_qb(t0, t0, v0_t);
18300             gen_store_gpr(t0, ret);
18301             break;
18302         }
18303         break;
18304     case NM_POOL32AXF_1_5:
18305         opc = extract32(ctx->opcode, 12, 2);
18306         gen_pool32axf_1_5_nanomips_insn(ctx, opc, ret, v1, v2);
18307         break;
18308     case NM_POOL32AXF_1_7:
18309         check_dsp(ctx);
18310         tcg_gen_movi_tl(t0, v2 >> 3);
18311         tcg_gen_movi_tl(t1, v1);
18312         switch (extract32(ctx->opcode, 12, 2)) {
18313         case NM_EXTR_W:
18314             gen_helper_extr_w(t0, t0, t1, cpu_env);
18315             gen_store_gpr(t0, ret);
18316             break;
18317         case NM_EXTR_R_W:
18318             gen_helper_extr_r_w(t0, t0, t1, cpu_env);
18319             gen_store_gpr(t0, ret);
18320             break;
18321         case NM_EXTR_RS_W:
18322             gen_helper_extr_rs_w(t0, t0, t1, cpu_env);
18323             gen_store_gpr(t0, ret);
18324             break;
18325         case NM_EXTR_S_H:
18326             gen_helper_extr_s_h(t0, t0, t1, cpu_env);
18327             gen_store_gpr(t0, ret);
18328             break;
18329         }
18330         break;
18331     default:
18332         gen_reserved_instruction(ctx);
18333         break;
18334     }
18335 
18336     tcg_temp_free(t0);
18337     tcg_temp_free(t1);
18338     tcg_temp_free(v0_t);
18339 }
18340 
18341 static void gen_pool32axf_2_multiply(DisasContext *ctx, uint32_t opc,
18342                                     TCGv v0, TCGv v1, int rd)
18343 {
18344     TCGv_i32 t0;
18345 
18346     t0 = tcg_temp_new_i32();
18347 
18348     tcg_gen_movi_i32(t0, rd >> 3);
18349 
18350     switch (opc) {
18351     case NM_POOL32AXF_2_0_7:
18352         switch (extract32(ctx->opcode, 9, 3)) {
18353         case NM_DPA_W_PH:
18354             check_dsp_r2(ctx);
18355             gen_helper_dpa_w_ph(t0, v1, v0, cpu_env);
18356             break;
18357         case NM_DPAQ_S_W_PH:
18358             check_dsp(ctx);
18359             gen_helper_dpaq_s_w_ph(t0, v1, v0, cpu_env);
18360             break;
18361         case NM_DPS_W_PH:
18362             check_dsp_r2(ctx);
18363             gen_helper_dps_w_ph(t0, v1, v0, cpu_env);
18364             break;
18365         case NM_DPSQ_S_W_PH:
18366             check_dsp(ctx);
18367             gen_helper_dpsq_s_w_ph(t0, v1, v0, cpu_env);
18368             break;
18369         default:
18370             gen_reserved_instruction(ctx);
18371             break;
18372         }
18373         break;
18374     case NM_POOL32AXF_2_8_15:
18375         switch (extract32(ctx->opcode, 9, 3)) {
18376         case NM_DPAX_W_PH:
18377             check_dsp_r2(ctx);
18378             gen_helper_dpax_w_ph(t0, v0, v1, cpu_env);
18379             break;
18380         case NM_DPAQ_SA_L_W:
18381             check_dsp(ctx);
18382             gen_helper_dpaq_sa_l_w(t0, v0, v1, cpu_env);
18383             break;
18384         case NM_DPSX_W_PH:
18385             check_dsp_r2(ctx);
18386             gen_helper_dpsx_w_ph(t0, v0, v1, cpu_env);
18387             break;
18388         case NM_DPSQ_SA_L_W:
18389             check_dsp(ctx);
18390             gen_helper_dpsq_sa_l_w(t0, v0, v1, cpu_env);
18391             break;
18392         default:
18393             gen_reserved_instruction(ctx);
18394             break;
18395         }
18396         break;
18397     case NM_POOL32AXF_2_16_23:
18398         switch (extract32(ctx->opcode, 9, 3)) {
18399         case NM_DPAU_H_QBL:
18400             check_dsp(ctx);
18401             gen_helper_dpau_h_qbl(t0, v0, v1, cpu_env);
18402             break;
18403         case NM_DPAQX_S_W_PH:
18404             check_dsp_r2(ctx);
18405             gen_helper_dpaqx_s_w_ph(t0, v0, v1, cpu_env);
18406             break;
18407         case NM_DPSU_H_QBL:
18408             check_dsp(ctx);
18409             gen_helper_dpsu_h_qbl(t0, v0, v1, cpu_env);
18410             break;
18411         case NM_DPSQX_S_W_PH:
18412             check_dsp_r2(ctx);
18413             gen_helper_dpsqx_s_w_ph(t0, v0, v1, cpu_env);
18414             break;
18415         case NM_MULSA_W_PH:
18416             check_dsp_r2(ctx);
18417             gen_helper_mulsa_w_ph(t0, v0, v1, cpu_env);
18418             break;
18419         default:
18420             gen_reserved_instruction(ctx);
18421             break;
18422         }
18423         break;
18424     case NM_POOL32AXF_2_24_31:
18425         switch (extract32(ctx->opcode, 9, 3)) {
18426         case NM_DPAU_H_QBR:
18427             check_dsp(ctx);
18428             gen_helper_dpau_h_qbr(t0, v1, v0, cpu_env);
18429             break;
18430         case NM_DPAQX_SA_W_PH:
18431             check_dsp_r2(ctx);
18432             gen_helper_dpaqx_sa_w_ph(t0, v1, v0, cpu_env);
18433             break;
18434         case NM_DPSU_H_QBR:
18435             check_dsp(ctx);
18436             gen_helper_dpsu_h_qbr(t0, v1, v0, cpu_env);
18437             break;
18438         case NM_DPSQX_SA_W_PH:
18439             check_dsp_r2(ctx);
18440             gen_helper_dpsqx_sa_w_ph(t0, v1, v0, cpu_env);
18441             break;
18442         case NM_MULSAQ_S_W_PH:
18443             check_dsp(ctx);
18444             gen_helper_mulsaq_s_w_ph(t0, v1, v0, cpu_env);
18445             break;
18446         default:
18447             gen_reserved_instruction(ctx);
18448             break;
18449         }
18450         break;
18451     default:
18452         gen_reserved_instruction(ctx);
18453         break;
18454     }
18455 
18456     tcg_temp_free_i32(t0);
18457 }
18458 
18459 static void gen_pool32axf_2_nanomips_insn(DisasContext *ctx, uint32_t opc,
18460                                           int rt, int rs, int rd)
18461 {
18462     int ret = rt;
18463     TCGv t0 = tcg_temp_new();
18464     TCGv t1 = tcg_temp_new();
18465     TCGv v0_t = tcg_temp_new();
18466     TCGv v1_t = tcg_temp_new();
18467 
18468     gen_load_gpr(v0_t, rt);
18469     gen_load_gpr(v1_t, rs);
18470 
18471     switch (opc) {
18472     case NM_POOL32AXF_2_0_7:
18473         switch (extract32(ctx->opcode, 9, 3)) {
18474         case NM_DPA_W_PH:
18475         case NM_DPAQ_S_W_PH:
18476         case NM_DPS_W_PH:
18477         case NM_DPSQ_S_W_PH:
18478             gen_pool32axf_2_multiply(ctx, opc, v0_t, v1_t, rd);
18479             break;
18480         case NM_BALIGN:
18481             check_dsp_r2(ctx);
18482             if (rt != 0) {
18483                 gen_load_gpr(t0, rs);
18484                 rd &= 3;
18485                 if (rd != 0 && rd != 2) {
18486                     tcg_gen_shli_tl(cpu_gpr[ret], cpu_gpr[ret], 8 * rd);
18487                     tcg_gen_ext32u_tl(t0, t0);
18488                     tcg_gen_shri_tl(t0, t0, 8 * (4 - rd));
18489                     tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
18490                 }
18491                 tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
18492             }
18493             break;
18494         case NM_MADD:
18495             check_dsp(ctx);
18496             {
18497                 int acc = extract32(ctx->opcode, 14, 2);
18498                 TCGv_i64 t2 = tcg_temp_new_i64();
18499                 TCGv_i64 t3 = tcg_temp_new_i64();
18500 
18501                 gen_load_gpr(t0, rt);
18502                 gen_load_gpr(t1, rs);
18503                 tcg_gen_ext_tl_i64(t2, t0);
18504                 tcg_gen_ext_tl_i64(t3, t1);
18505                 tcg_gen_mul_i64(t2, t2, t3);
18506                 tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
18507                 tcg_gen_add_i64(t2, t2, t3);
18508                 tcg_temp_free_i64(t3);
18509                 gen_move_low32(cpu_LO[acc], t2);
18510                 gen_move_high32(cpu_HI[acc], t2);
18511                 tcg_temp_free_i64(t2);
18512             }
18513             break;
18514         case NM_MULT:
18515             check_dsp(ctx);
18516             {
18517                 int acc = extract32(ctx->opcode, 14, 2);
18518                 TCGv_i32 t2 = tcg_temp_new_i32();
18519                 TCGv_i32 t3 = tcg_temp_new_i32();
18520 
18521                 gen_load_gpr(t0, rs);
18522                 gen_load_gpr(t1, rt);
18523                 tcg_gen_trunc_tl_i32(t2, t0);
18524                 tcg_gen_trunc_tl_i32(t3, t1);
18525                 tcg_gen_muls2_i32(t2, t3, t2, t3);
18526                 tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
18527                 tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
18528                 tcg_temp_free_i32(t2);
18529                 tcg_temp_free_i32(t3);
18530             }
18531             break;
18532         case NM_EXTRV_W:
18533             check_dsp(ctx);
18534             gen_load_gpr(v1_t, rs);
18535             tcg_gen_movi_tl(t0, rd >> 3);
18536             gen_helper_extr_w(t0, t0, v1_t, cpu_env);
18537             gen_store_gpr(t0, ret);
18538             break;
18539         }
18540         break;
18541     case NM_POOL32AXF_2_8_15:
18542         switch (extract32(ctx->opcode, 9, 3)) {
18543         case NM_DPAX_W_PH:
18544         case NM_DPAQ_SA_L_W:
18545         case NM_DPSX_W_PH:
18546         case NM_DPSQ_SA_L_W:
18547             gen_pool32axf_2_multiply(ctx, opc, v0_t, v1_t, rd);
18548             break;
18549         case NM_MADDU:
18550             check_dsp(ctx);
18551             {
18552                 int acc = extract32(ctx->opcode, 14, 2);
18553                 TCGv_i64 t2 = tcg_temp_new_i64();
18554                 TCGv_i64 t3 = tcg_temp_new_i64();
18555 
18556                 gen_load_gpr(t0, rs);
18557                 gen_load_gpr(t1, rt);
18558                 tcg_gen_ext32u_tl(t0, t0);
18559                 tcg_gen_ext32u_tl(t1, t1);
18560                 tcg_gen_extu_tl_i64(t2, t0);
18561                 tcg_gen_extu_tl_i64(t3, t1);
18562                 tcg_gen_mul_i64(t2, t2, t3);
18563                 tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
18564                 tcg_gen_add_i64(t2, t2, t3);
18565                 tcg_temp_free_i64(t3);
18566                 gen_move_low32(cpu_LO[acc], t2);
18567                 gen_move_high32(cpu_HI[acc], t2);
18568                 tcg_temp_free_i64(t2);
18569             }
18570             break;
18571         case NM_MULTU:
18572             check_dsp(ctx);
18573             {
18574                 int acc = extract32(ctx->opcode, 14, 2);
18575                 TCGv_i32 t2 = tcg_temp_new_i32();
18576                 TCGv_i32 t3 = tcg_temp_new_i32();
18577 
18578                 gen_load_gpr(t0, rs);
18579                 gen_load_gpr(t1, rt);
18580                 tcg_gen_trunc_tl_i32(t2, t0);
18581                 tcg_gen_trunc_tl_i32(t3, t1);
18582                 tcg_gen_mulu2_i32(t2, t3, t2, t3);
18583                 tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
18584                 tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
18585                 tcg_temp_free_i32(t2);
18586                 tcg_temp_free_i32(t3);
18587             }
18588             break;
18589         case NM_EXTRV_R_W:
18590             check_dsp(ctx);
18591             tcg_gen_movi_tl(t0, rd >> 3);
18592             gen_helper_extr_r_w(t0, t0, v1_t, cpu_env);
18593             gen_store_gpr(t0, ret);
18594             break;
18595         default:
18596             gen_reserved_instruction(ctx);
18597             break;
18598         }
18599         break;
18600     case NM_POOL32AXF_2_16_23:
18601         switch (extract32(ctx->opcode, 9, 3)) {
18602         case NM_DPAU_H_QBL:
18603         case NM_DPAQX_S_W_PH:
18604         case NM_DPSU_H_QBL:
18605         case NM_DPSQX_S_W_PH:
18606         case NM_MULSA_W_PH:
18607             gen_pool32axf_2_multiply(ctx, opc, v0_t, v1_t, rd);
18608             break;
18609         case NM_EXTPV:
18610             check_dsp(ctx);
18611             tcg_gen_movi_tl(t0, rd >> 3);
18612             gen_helper_extp(t0, t0, v1_t, cpu_env);
18613             gen_store_gpr(t0, ret);
18614             break;
18615         case NM_MSUB:
18616             check_dsp(ctx);
18617             {
18618                 int acc = extract32(ctx->opcode, 14, 2);
18619                 TCGv_i64 t2 = tcg_temp_new_i64();
18620                 TCGv_i64 t3 = tcg_temp_new_i64();
18621 
18622                 gen_load_gpr(t0, rs);
18623                 gen_load_gpr(t1, rt);
18624                 tcg_gen_ext_tl_i64(t2, t0);
18625                 tcg_gen_ext_tl_i64(t3, t1);
18626                 tcg_gen_mul_i64(t2, t2, t3);
18627                 tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
18628                 tcg_gen_sub_i64(t2, t3, t2);
18629                 tcg_temp_free_i64(t3);
18630                 gen_move_low32(cpu_LO[acc], t2);
18631                 gen_move_high32(cpu_HI[acc], t2);
18632                 tcg_temp_free_i64(t2);
18633             }
18634             break;
18635         case NM_EXTRV_RS_W:
18636             check_dsp(ctx);
18637             tcg_gen_movi_tl(t0, rd >> 3);
18638             gen_helper_extr_rs_w(t0, t0, v1_t, cpu_env);
18639             gen_store_gpr(t0, ret);
18640             break;
18641         }
18642         break;
18643     case NM_POOL32AXF_2_24_31:
18644         switch (extract32(ctx->opcode, 9, 3)) {
18645         case NM_DPAU_H_QBR:
18646         case NM_DPAQX_SA_W_PH:
18647         case NM_DPSU_H_QBR:
18648         case NM_DPSQX_SA_W_PH:
18649         case NM_MULSAQ_S_W_PH:
18650             gen_pool32axf_2_multiply(ctx, opc, v0_t, v1_t, rd);
18651             break;
18652         case NM_EXTPDPV:
18653             check_dsp(ctx);
18654             tcg_gen_movi_tl(t0, rd >> 3);
18655             gen_helper_extpdp(t0, t0, v1_t, cpu_env);
18656             gen_store_gpr(t0, ret);
18657             break;
18658         case NM_MSUBU:
18659             check_dsp(ctx);
18660             {
18661                 int acc = extract32(ctx->opcode, 14, 2);
18662                 TCGv_i64 t2 = tcg_temp_new_i64();
18663                 TCGv_i64 t3 = tcg_temp_new_i64();
18664 
18665                 gen_load_gpr(t0, rs);
18666                 gen_load_gpr(t1, rt);
18667                 tcg_gen_ext32u_tl(t0, t0);
18668                 tcg_gen_ext32u_tl(t1, t1);
18669                 tcg_gen_extu_tl_i64(t2, t0);
18670                 tcg_gen_extu_tl_i64(t3, t1);
18671                 tcg_gen_mul_i64(t2, t2, t3);
18672                 tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
18673                 tcg_gen_sub_i64(t2, t3, t2);
18674                 tcg_temp_free_i64(t3);
18675                 gen_move_low32(cpu_LO[acc], t2);
18676                 gen_move_high32(cpu_HI[acc], t2);
18677                 tcg_temp_free_i64(t2);
18678             }
18679             break;
18680         case NM_EXTRV_S_H:
18681             check_dsp(ctx);
18682             tcg_gen_movi_tl(t0, rd >> 3);
18683             gen_helper_extr_s_h(t0, t0, v0_t, cpu_env);
18684             gen_store_gpr(t0, ret);
18685             break;
18686         }
18687         break;
18688     default:
18689         gen_reserved_instruction(ctx);
18690         break;
18691     }
18692 
18693     tcg_temp_free(t0);
18694     tcg_temp_free(t1);
18695 
18696     tcg_temp_free(v0_t);
18697     tcg_temp_free(v1_t);
18698 }
18699 
18700 static void gen_pool32axf_4_nanomips_insn(DisasContext *ctx, uint32_t opc,
18701                                           int rt, int rs)
18702 {
18703     int ret = rt;
18704     TCGv t0 = tcg_temp_new();
18705     TCGv v0_t = tcg_temp_new();
18706 
18707     gen_load_gpr(v0_t, rs);
18708 
18709     switch (opc) {
18710     case NM_ABSQ_S_QB:
18711         check_dsp_r2(ctx);
18712         gen_helper_absq_s_qb(v0_t, v0_t, cpu_env);
18713         gen_store_gpr(v0_t, ret);
18714         break;
18715     case NM_ABSQ_S_PH:
18716         check_dsp(ctx);
18717         gen_helper_absq_s_ph(v0_t, v0_t, cpu_env);
18718         gen_store_gpr(v0_t, ret);
18719         break;
18720     case NM_ABSQ_S_W:
18721         check_dsp(ctx);
18722         gen_helper_absq_s_w(v0_t, v0_t, cpu_env);
18723         gen_store_gpr(v0_t, ret);
18724         break;
18725     case NM_PRECEQ_W_PHL:
18726         check_dsp(ctx);
18727         tcg_gen_andi_tl(v0_t, v0_t, 0xFFFF0000);
18728         tcg_gen_ext32s_tl(v0_t, v0_t);
18729         gen_store_gpr(v0_t, ret);
18730         break;
18731     case NM_PRECEQ_W_PHR:
18732         check_dsp(ctx);
18733         tcg_gen_andi_tl(v0_t, v0_t, 0x0000FFFF);
18734         tcg_gen_shli_tl(v0_t, v0_t, 16);
18735         tcg_gen_ext32s_tl(v0_t, v0_t);
18736         gen_store_gpr(v0_t, ret);
18737         break;
18738     case NM_PRECEQU_PH_QBL:
18739         check_dsp(ctx);
18740         gen_helper_precequ_ph_qbl(v0_t, v0_t);
18741         gen_store_gpr(v0_t, ret);
18742         break;
18743     case NM_PRECEQU_PH_QBR:
18744         check_dsp(ctx);
18745         gen_helper_precequ_ph_qbr(v0_t, v0_t);
18746         gen_store_gpr(v0_t, ret);
18747         break;
18748     case NM_PRECEQU_PH_QBLA:
18749         check_dsp(ctx);
18750         gen_helper_precequ_ph_qbla(v0_t, v0_t);
18751         gen_store_gpr(v0_t, ret);
18752         break;
18753     case NM_PRECEQU_PH_QBRA:
18754         check_dsp(ctx);
18755         gen_helper_precequ_ph_qbra(v0_t, v0_t);
18756         gen_store_gpr(v0_t, ret);
18757         break;
18758     case NM_PRECEU_PH_QBL:
18759         check_dsp(ctx);
18760         gen_helper_preceu_ph_qbl(v0_t, v0_t);
18761         gen_store_gpr(v0_t, ret);
18762         break;
18763     case NM_PRECEU_PH_QBR:
18764         check_dsp(ctx);
18765         gen_helper_preceu_ph_qbr(v0_t, v0_t);
18766         gen_store_gpr(v0_t, ret);
18767         break;
18768     case NM_PRECEU_PH_QBLA:
18769         check_dsp(ctx);
18770         gen_helper_preceu_ph_qbla(v0_t, v0_t);
18771         gen_store_gpr(v0_t, ret);
18772         break;
18773     case NM_PRECEU_PH_QBRA:
18774         check_dsp(ctx);
18775         gen_helper_preceu_ph_qbra(v0_t, v0_t);
18776         gen_store_gpr(v0_t, ret);
18777         break;
18778     case NM_REPLV_PH:
18779         check_dsp(ctx);
18780         tcg_gen_ext16u_tl(v0_t, v0_t);
18781         tcg_gen_shli_tl(t0, v0_t, 16);
18782         tcg_gen_or_tl(v0_t, v0_t, t0);
18783         tcg_gen_ext32s_tl(v0_t, v0_t);
18784         gen_store_gpr(v0_t, ret);
18785         break;
18786     case NM_REPLV_QB:
18787         check_dsp(ctx);
18788         tcg_gen_ext8u_tl(v0_t, v0_t);
18789         tcg_gen_shli_tl(t0, v0_t, 8);
18790         tcg_gen_or_tl(v0_t, v0_t, t0);
18791         tcg_gen_shli_tl(t0, v0_t, 16);
18792         tcg_gen_or_tl(v0_t, v0_t, t0);
18793         tcg_gen_ext32s_tl(v0_t, v0_t);
18794         gen_store_gpr(v0_t, ret);
18795         break;
18796     case NM_BITREV:
18797         check_dsp(ctx);
18798         gen_helper_bitrev(v0_t, v0_t);
18799         gen_store_gpr(v0_t, ret);
18800         break;
18801     case NM_INSV:
18802         check_dsp(ctx);
18803         {
18804             TCGv tv0 = tcg_temp_new();
18805 
18806             gen_load_gpr(tv0, rt);
18807             gen_helper_insv(v0_t, cpu_env, v0_t, tv0);
18808             gen_store_gpr(v0_t, ret);
18809             tcg_temp_free(tv0);
18810         }
18811         break;
18812     case NM_RADDU_W_QB:
18813         check_dsp(ctx);
18814         gen_helper_raddu_w_qb(v0_t, v0_t);
18815         gen_store_gpr(v0_t, ret);
18816         break;
18817     case NM_BITSWAP:
18818         gen_bitswap(ctx, OPC_BITSWAP, ret, rs);
18819         break;
18820     case NM_CLO:
18821         check_nms(ctx);
18822         gen_cl(ctx, OPC_CLO, ret, rs);
18823         break;
18824     case NM_CLZ:
18825         check_nms(ctx);
18826         gen_cl(ctx, OPC_CLZ, ret, rs);
18827         break;
18828     case NM_WSBH:
18829         gen_bshfl(ctx, OPC_WSBH, ret, rs);
18830         break;
18831     default:
18832         gen_reserved_instruction(ctx);
18833         break;
18834     }
18835 
18836     tcg_temp_free(v0_t);
18837     tcg_temp_free(t0);
18838 }
18839 
18840 static void gen_pool32axf_7_nanomips_insn(DisasContext *ctx, uint32_t opc,
18841                                           int rt, int rs, int rd)
18842 {
18843     TCGv t0 = tcg_temp_new();
18844     TCGv rs_t = tcg_temp_new();
18845 
18846     gen_load_gpr(rs_t, rs);
18847 
18848     switch (opc) {
18849     case NM_SHRA_R_QB:
18850         check_dsp_r2(ctx);
18851         tcg_gen_movi_tl(t0, rd >> 2);
18852         switch (extract32(ctx->opcode, 12, 1)) {
18853         case 0:
18854             /* NM_SHRA_QB */
18855             gen_helper_shra_qb(t0, t0, rs_t);
18856             gen_store_gpr(t0, rt);
18857             break;
18858         case 1:
18859             /* NM_SHRA_R_QB */
18860             gen_helper_shra_r_qb(t0, t0, rs_t);
18861             gen_store_gpr(t0, rt);
18862             break;
18863         }
18864         break;
18865     case NM_SHRL_PH:
18866         check_dsp_r2(ctx);
18867         tcg_gen_movi_tl(t0, rd >> 1);
18868         gen_helper_shrl_ph(t0, t0, rs_t);
18869         gen_store_gpr(t0, rt);
18870         break;
18871     case NM_REPL_QB:
18872         check_dsp(ctx);
18873         {
18874             int16_t imm;
18875             target_long result;
18876             imm = extract32(ctx->opcode, 13, 8);
18877             result = (uint32_t)imm << 24 |
18878                      (uint32_t)imm << 16 |
18879                      (uint32_t)imm << 8  |
18880                      (uint32_t)imm;
18881             result = (int32_t)result;
18882             tcg_gen_movi_tl(t0, result);
18883             gen_store_gpr(t0, rt);
18884         }
18885         break;
18886     default:
18887         gen_reserved_instruction(ctx);
18888         break;
18889     }
18890     tcg_temp_free(t0);
18891     tcg_temp_free(rs_t);
18892 }
18893 
18894 
18895 static void gen_pool32axf_nanomips_insn(CPUMIPSState *env, DisasContext *ctx)
18896 {
18897     int rt = extract32(ctx->opcode, 21, 5);
18898     int rs = extract32(ctx->opcode, 16, 5);
18899     int rd = extract32(ctx->opcode, 11, 5);
18900 
18901     switch (extract32(ctx->opcode, 6, 3)) {
18902     case NM_POOL32AXF_1:
18903         {
18904             int32_t op1 = extract32(ctx->opcode, 9, 3);
18905             gen_pool32axf_1_nanomips_insn(ctx, op1, rt, rs, rd);
18906         }
18907         break;
18908     case NM_POOL32AXF_2:
18909         {
18910             int32_t op1 = extract32(ctx->opcode, 12, 2);
18911             gen_pool32axf_2_nanomips_insn(ctx, op1, rt, rs, rd);
18912         }
18913         break;
18914     case NM_POOL32AXF_4:
18915         {
18916             int32_t op1 = extract32(ctx->opcode, 9, 7);
18917             gen_pool32axf_4_nanomips_insn(ctx, op1, rt, rs);
18918         }
18919         break;
18920     case NM_POOL32AXF_5:
18921         switch (extract32(ctx->opcode, 9, 7)) {
18922 #ifndef CONFIG_USER_ONLY
18923         case NM_TLBP:
18924             gen_cp0(env, ctx, OPC_TLBP, 0, 0);
18925             break;
18926         case NM_TLBR:
18927             gen_cp0(env, ctx, OPC_TLBR, 0, 0);
18928             break;
18929         case NM_TLBWI:
18930             gen_cp0(env, ctx, OPC_TLBWI, 0, 0);
18931             break;
18932         case NM_TLBWR:
18933             gen_cp0(env, ctx, OPC_TLBWR, 0, 0);
18934             break;
18935         case NM_TLBINV:
18936             gen_cp0(env, ctx, OPC_TLBINV, 0, 0);
18937             break;
18938         case NM_TLBINVF:
18939             gen_cp0(env, ctx, OPC_TLBINVF, 0, 0);
18940             break;
18941         case NM_DI:
18942             check_cp0_enabled(ctx);
18943             {
18944                 TCGv t0 = tcg_temp_new();
18945 
18946                 save_cpu_state(ctx, 1);
18947                 gen_helper_di(t0, cpu_env);
18948                 gen_store_gpr(t0, rt);
18949             /* Stop translation as we may have switched the execution mode */
18950                 ctx->base.is_jmp = DISAS_STOP;
18951                 tcg_temp_free(t0);
18952             }
18953             break;
18954         case NM_EI:
18955             check_cp0_enabled(ctx);
18956             {
18957                 TCGv t0 = tcg_temp_new();
18958 
18959                 save_cpu_state(ctx, 1);
18960                 gen_helper_ei(t0, cpu_env);
18961                 gen_store_gpr(t0, rt);
18962             /* Stop translation as we may have switched the execution mode */
18963                 ctx->base.is_jmp = DISAS_STOP;
18964                 tcg_temp_free(t0);
18965             }
18966             break;
18967         case NM_RDPGPR:
18968             check_cp0_enabled(ctx);
18969             gen_load_srsgpr(rs, rt);
18970             break;
18971         case NM_WRPGPR:
18972             check_cp0_enabled(ctx);
18973             gen_store_srsgpr(rs, rt);
18974             break;
18975         case NM_WAIT:
18976             gen_cp0(env, ctx, OPC_WAIT, 0, 0);
18977             break;
18978         case NM_DERET:
18979             gen_cp0(env, ctx, OPC_DERET, 0, 0);
18980             break;
18981         case NM_ERETX:
18982             gen_cp0(env, ctx, OPC_ERET, 0, 0);
18983             break;
18984 #endif
18985         default:
18986             gen_reserved_instruction(ctx);
18987             break;
18988         }
18989         break;
18990     case NM_POOL32AXF_7:
18991         {
18992             int32_t op1 = extract32(ctx->opcode, 9, 3);
18993             gen_pool32axf_7_nanomips_insn(ctx, op1, rt, rs, rd);
18994         }
18995         break;
18996     default:
18997         gen_reserved_instruction(ctx);
18998         break;
18999     }
19000 }
19001 
19002 /* Immediate Value Compact Branches */
19003 static void gen_compute_imm_branch(DisasContext *ctx, uint32_t opc,
19004                                    int rt, int32_t imm, int32_t offset)
19005 {
19006     TCGCond cond = TCG_COND_ALWAYS;
19007     TCGv t0 = tcg_temp_new();
19008     TCGv t1 = tcg_temp_new();
19009 
19010     gen_load_gpr(t0, rt);
19011     tcg_gen_movi_tl(t1, imm);
19012     ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
19013 
19014     /* Load needed operands and calculate btarget */
19015     switch (opc) {
19016     case NM_BEQIC:
19017         if (rt == 0 && imm == 0) {
19018             /* Unconditional branch */
19019         } else if (rt == 0 && imm != 0) {
19020             /* Treat as NOP */
19021             goto out;
19022         } else {
19023             cond = TCG_COND_EQ;
19024         }
19025         break;
19026     case NM_BBEQZC:
19027     case NM_BBNEZC:
19028         check_nms(ctx);
19029         if (imm >= 32 && !(ctx->hflags & MIPS_HFLAG_64)) {
19030             gen_reserved_instruction(ctx);
19031             goto out;
19032         } else if (rt == 0 && opc == NM_BBEQZC) {
19033             /* Unconditional branch */
19034         } else if (rt == 0 && opc == NM_BBNEZC) {
19035             /* Treat as NOP */
19036             goto out;
19037         } else {
19038             tcg_gen_shri_tl(t0, t0, imm);
19039             tcg_gen_andi_tl(t0, t0, 1);
19040             tcg_gen_movi_tl(t1, 0);
19041             if (opc == NM_BBEQZC) {
19042                 cond = TCG_COND_EQ;
19043             } else {
19044                 cond = TCG_COND_NE;
19045             }
19046         }
19047         break;
19048     case NM_BNEIC:
19049         if (rt == 0 && imm == 0) {
19050             /* Treat as NOP */
19051             goto out;
19052         } else if (rt == 0 && imm != 0) {
19053             /* Unconditional branch */
19054         } else {
19055             cond = TCG_COND_NE;
19056         }
19057         break;
19058     case NM_BGEIC:
19059         if (rt == 0 && imm == 0) {
19060             /* Unconditional branch */
19061         } else  {
19062             cond = TCG_COND_GE;
19063         }
19064         break;
19065     case NM_BLTIC:
19066         cond = TCG_COND_LT;
19067         break;
19068     case NM_BGEIUC:
19069         if (rt == 0 && imm == 0) {
19070             /* Unconditional branch */
19071         } else  {
19072             cond = TCG_COND_GEU;
19073         }
19074         break;
19075     case NM_BLTIUC:
19076         cond = TCG_COND_LTU;
19077         break;
19078     default:
19079         MIPS_INVAL("Immediate Value Compact branch");
19080         gen_reserved_instruction(ctx);
19081         goto out;
19082     }
19083 
19084     /* branch completion */
19085     clear_branch_hflags(ctx);
19086     ctx->base.is_jmp = DISAS_NORETURN;
19087 
19088     if (cond == TCG_COND_ALWAYS) {
19089         /* Unconditional compact branch */
19090         gen_goto_tb(ctx, 0, ctx->btarget);
19091     } else {
19092         /* Conditional compact branch */
19093         TCGLabel *fs = gen_new_label();
19094 
19095         tcg_gen_brcond_tl(tcg_invert_cond(cond), t0, t1, fs);
19096 
19097         gen_goto_tb(ctx, 1, ctx->btarget);
19098         gen_set_label(fs);
19099 
19100         gen_goto_tb(ctx, 0, ctx->base.pc_next + 4);
19101     }
19102 
19103 out:
19104     tcg_temp_free(t0);
19105     tcg_temp_free(t1);
19106 }
19107 
19108 /* P.BALRSC type nanoMIPS R6 branches: BALRSC and BRSC */
19109 static void gen_compute_nanomips_pbalrsc_branch(DisasContext *ctx, int rs,
19110                                                 int rt)
19111 {
19112     TCGv t0 = tcg_temp_new();
19113     TCGv t1 = tcg_temp_new();
19114 
19115     /* load rs */
19116     gen_load_gpr(t0, rs);
19117 
19118     /* link */
19119     if (rt != 0) {
19120         tcg_gen_movi_tl(cpu_gpr[rt], ctx->base.pc_next + 4);
19121     }
19122 
19123     /* calculate btarget */
19124     tcg_gen_shli_tl(t0, t0, 1);
19125     tcg_gen_movi_tl(t1, ctx->base.pc_next + 4);
19126     gen_op_addr_add(ctx, btarget, t1, t0);
19127 
19128     /* branch completion */
19129     clear_branch_hflags(ctx);
19130     ctx->base.is_jmp = DISAS_NORETURN;
19131 
19132     /* unconditional branch to register */
19133     tcg_gen_mov_tl(cpu_PC, btarget);
19134     tcg_gen_lookup_and_goto_ptr();
19135 
19136     tcg_temp_free(t0);
19137     tcg_temp_free(t1);
19138 }
19139 
19140 /* nanoMIPS Branches */
19141 static void gen_compute_compact_branch_nm(DisasContext *ctx, uint32_t opc,
19142                                        int rs, int rt, int32_t offset)
19143 {
19144     int bcond_compute = 0;
19145     TCGv t0 = tcg_temp_new();
19146     TCGv t1 = tcg_temp_new();
19147 
19148     /* Load needed operands and calculate btarget */
19149     switch (opc) {
19150     /* compact branch */
19151     case OPC_BGEC:
19152     case OPC_BLTC:
19153         gen_load_gpr(t0, rs);
19154         gen_load_gpr(t1, rt);
19155         bcond_compute = 1;
19156         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
19157         break;
19158     case OPC_BGEUC:
19159     case OPC_BLTUC:
19160         if (rs == 0 || rs == rt) {
19161             /* OPC_BLEZALC, OPC_BGEZALC */
19162             /* OPC_BGTZALC, OPC_BLTZALC */
19163             tcg_gen_movi_tl(cpu_gpr[31], ctx->base.pc_next + 4);
19164         }
19165         gen_load_gpr(t0, rs);
19166         gen_load_gpr(t1, rt);
19167         bcond_compute = 1;
19168         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
19169         break;
19170     case OPC_BC:
19171         ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
19172         break;
19173     case OPC_BEQZC:
19174         if (rs != 0) {
19175             /* OPC_BEQZC, OPC_BNEZC */
19176             gen_load_gpr(t0, rs);
19177             bcond_compute = 1;
19178             ctx->btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
19179         } else {
19180             /* OPC_JIC, OPC_JIALC */
19181             TCGv tbase = tcg_temp_new();
19182             TCGv toffset = tcg_temp_new();
19183 
19184             gen_load_gpr(tbase, rt);
19185             tcg_gen_movi_tl(toffset, offset);
19186             gen_op_addr_add(ctx, btarget, tbase, toffset);
19187             tcg_temp_free(tbase);
19188             tcg_temp_free(toffset);
19189         }
19190         break;
19191     default:
19192         MIPS_INVAL("Compact branch/jump");
19193         gen_reserved_instruction(ctx);
19194         goto out;
19195     }
19196 
19197     if (bcond_compute == 0) {
19198         /* Unconditional compact branch */
19199         switch (opc) {
19200         case OPC_BC:
19201             gen_goto_tb(ctx, 0, ctx->btarget);
19202             break;
19203         default:
19204             MIPS_INVAL("Compact branch/jump");
19205             gen_reserved_instruction(ctx);
19206             goto out;
19207         }
19208     } else {
19209         /* Conditional compact branch */
19210         TCGLabel *fs = gen_new_label();
19211 
19212         switch (opc) {
19213         case OPC_BGEUC:
19214             if (rs == 0 && rt != 0) {
19215                 /* OPC_BLEZALC */
19216                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LE), t1, 0, fs);
19217             } else if (rs != 0 && rt != 0 && rs == rt) {
19218                 /* OPC_BGEZALC */
19219                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GE), t1, 0, fs);
19220             } else {
19221                 /* OPC_BGEUC */
19222                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_GEU), t0, t1, fs);
19223             }
19224             break;
19225         case OPC_BLTUC:
19226             if (rs == 0 && rt != 0) {
19227                 /* OPC_BGTZALC */
19228                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GT), t1, 0, fs);
19229             } else if (rs != 0 && rt != 0 && rs == rt) {
19230                 /* OPC_BLTZALC */
19231                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LT), t1, 0, fs);
19232             } else {
19233                 /* OPC_BLTUC */
19234                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_LTU), t0, t1, fs);
19235             }
19236             break;
19237         case OPC_BGEC:
19238             if (rs == 0 && rt != 0) {
19239                 /* OPC_BLEZC */
19240                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LE), t1, 0, fs);
19241             } else if (rs != 0 && rt != 0 && rs == rt) {
19242                 /* OPC_BGEZC */
19243                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GE), t1, 0, fs);
19244             } else {
19245                 /* OPC_BGEC */
19246                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_GE), t0, t1, fs);
19247             }
19248             break;
19249         case OPC_BLTC:
19250             if (rs == 0 && rt != 0) {
19251                 /* OPC_BGTZC */
19252                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_GT), t1, 0, fs);
19253             } else if (rs != 0 && rt != 0 && rs == rt) {
19254                 /* OPC_BLTZC */
19255                 tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_LT), t1, 0, fs);
19256             } else {
19257                 /* OPC_BLTC */
19258                 tcg_gen_brcond_tl(tcg_invert_cond(TCG_COND_LT), t0, t1, fs);
19259             }
19260             break;
19261         case OPC_BEQZC:
19262             tcg_gen_brcondi_tl(tcg_invert_cond(TCG_COND_EQ), t0, 0, fs);
19263             break;
19264         default:
19265             MIPS_INVAL("Compact conditional branch/jump");
19266             gen_reserved_instruction(ctx);
19267             goto out;
19268         }
19269 
19270         /* branch completion */
19271         clear_branch_hflags(ctx);
19272         ctx->base.is_jmp = DISAS_NORETURN;
19273 
19274         /* Generating branch here as compact branches don't have delay slot */
19275         gen_goto_tb(ctx, 1, ctx->btarget);
19276         gen_set_label(fs);
19277 
19278         gen_goto_tb(ctx, 0, ctx->base.pc_next + 4);
19279     }
19280 
19281 out:
19282     tcg_temp_free(t0);
19283     tcg_temp_free(t1);
19284 }
19285 
19286 
19287 /* nanoMIPS CP1 Branches */
19288 static void gen_compute_branch_cp1_nm(DisasContext *ctx, uint32_t op,
19289                                    int32_t ft, int32_t offset)
19290 {
19291     target_ulong btarget;
19292     TCGv_i64 t0 = tcg_temp_new_i64();
19293 
19294     gen_load_fpr64(ctx, t0, ft);
19295     tcg_gen_andi_i64(t0, t0, 1);
19296 
19297     btarget = addr_add(ctx, ctx->base.pc_next + 4, offset);
19298 
19299     switch (op) {
19300     case NM_BC1EQZC:
19301         tcg_gen_xori_i64(t0, t0, 1);
19302         ctx->hflags |= MIPS_HFLAG_BC;
19303         break;
19304     case NM_BC1NEZC:
19305         /* t0 already set */
19306         ctx->hflags |= MIPS_HFLAG_BC;
19307         break;
19308     default:
19309         MIPS_INVAL("cp1 cond branch");
19310         gen_reserved_instruction(ctx);
19311         goto out;
19312     }
19313 
19314     tcg_gen_trunc_i64_tl(bcond, t0);
19315 
19316     ctx->btarget = btarget;
19317 
19318 out:
19319     tcg_temp_free_i64(t0);
19320 }
19321 
19322 
19323 static void gen_p_lsx(DisasContext *ctx, int rd, int rs, int rt)
19324 {
19325     TCGv t0, t1;
19326     t0 = tcg_temp_new();
19327     t1 = tcg_temp_new();
19328 
19329     gen_load_gpr(t0, rs);
19330     gen_load_gpr(t1, rt);
19331 
19332     if ((extract32(ctx->opcode, 6, 1)) == 1) {
19333         /* PP.LSXS instructions require shifting */
19334         switch (extract32(ctx->opcode, 7, 4)) {
19335         case NM_SHXS:
19336             check_nms(ctx);
19337             /* fall through */
19338         case NM_LHXS:
19339         case NM_LHUXS:
19340             tcg_gen_shli_tl(t0, t0, 1);
19341             break;
19342         case NM_SWXS:
19343             check_nms(ctx);
19344             /* fall through */
19345         case NM_LWXS:
19346         case NM_LWC1XS:
19347         case NM_SWC1XS:
19348             tcg_gen_shli_tl(t0, t0, 2);
19349             break;
19350         case NM_LDC1XS:
19351         case NM_SDC1XS:
19352             tcg_gen_shli_tl(t0, t0, 3);
19353             break;
19354         }
19355     }
19356     gen_op_addr_add(ctx, t0, t0, t1);
19357 
19358     switch (extract32(ctx->opcode, 7, 4)) {
19359     case NM_LBX:
19360         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx,
19361                            MO_SB);
19362         gen_store_gpr(t0, rd);
19363         break;
19364     case NM_LHX:
19365     /*case NM_LHXS:*/
19366         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx,
19367                            MO_TESW);
19368         gen_store_gpr(t0, rd);
19369         break;
19370     case NM_LWX:
19371     /*case NM_LWXS:*/
19372         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx,
19373                            MO_TESL);
19374         gen_store_gpr(t0, rd);
19375         break;
19376     case NM_LBUX:
19377         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx,
19378                            MO_UB);
19379         gen_store_gpr(t0, rd);
19380         break;
19381     case NM_LHUX:
19382     /*case NM_LHUXS:*/
19383         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx,
19384                            MO_TEUW);
19385         gen_store_gpr(t0, rd);
19386         break;
19387     case NM_SBX:
19388         check_nms(ctx);
19389         gen_load_gpr(t1, rd);
19390         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx,
19391                            MO_8);
19392         break;
19393     case NM_SHX:
19394     /*case NM_SHXS:*/
19395         check_nms(ctx);
19396         gen_load_gpr(t1, rd);
19397         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx,
19398                            MO_TEUW);
19399         break;
19400     case NM_SWX:
19401     /*case NM_SWXS:*/
19402         check_nms(ctx);
19403         gen_load_gpr(t1, rd);
19404         tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx,
19405                            MO_TEUL);
19406         break;
19407     case NM_LWC1X:
19408     /*case NM_LWC1XS:*/
19409     case NM_LDC1X:
19410     /*case NM_LDC1XS:*/
19411     case NM_SWC1X:
19412     /*case NM_SWC1XS:*/
19413     case NM_SDC1X:
19414     /*case NM_SDC1XS:*/
19415         if (ctx->CP0_Config1 & (1 << CP0C1_FP)) {
19416             check_cp1_enabled(ctx);
19417             switch (extract32(ctx->opcode, 7, 4)) {
19418             case NM_LWC1X:
19419             /*case NM_LWC1XS:*/
19420                 gen_flt_ldst(ctx, OPC_LWC1, rd, t0);
19421                 break;
19422             case NM_LDC1X:
19423             /*case NM_LDC1XS:*/
19424                 gen_flt_ldst(ctx, OPC_LDC1, rd, t0);
19425                 break;
19426             case NM_SWC1X:
19427             /*case NM_SWC1XS:*/
19428                 gen_flt_ldst(ctx, OPC_SWC1, rd, t0);
19429                 break;
19430             case NM_SDC1X:
19431             /*case NM_SDC1XS:*/
19432                 gen_flt_ldst(ctx, OPC_SDC1, rd, t0);
19433                 break;
19434             }
19435         } else {
19436             generate_exception_err(ctx, EXCP_CpU, 1);
19437         }
19438         break;
19439     default:
19440         gen_reserved_instruction(ctx);
19441         break;
19442     }
19443 
19444     tcg_temp_free(t0);
19445     tcg_temp_free(t1);
19446 }
19447 
19448 static void gen_pool32f_nanomips_insn(DisasContext *ctx)
19449 {
19450     int rt, rs, rd;
19451 
19452     rt = extract32(ctx->opcode, 21, 5);
19453     rs = extract32(ctx->opcode, 16, 5);
19454     rd = extract32(ctx->opcode, 11, 5);
19455 
19456     if (!(ctx->CP0_Config1 & (1 << CP0C1_FP))) {
19457         gen_reserved_instruction(ctx);
19458         return;
19459     }
19460     check_cp1_enabled(ctx);
19461     switch (extract32(ctx->opcode, 0, 3)) {
19462     case NM_POOL32F_0:
19463         switch (extract32(ctx->opcode, 3, 7)) {
19464         case NM_RINT_S:
19465             gen_farith(ctx, OPC_RINT_S, 0, rt, rs, 0);
19466             break;
19467         case NM_RINT_D:
19468             gen_farith(ctx, OPC_RINT_D, 0, rt, rs, 0);
19469             break;
19470         case NM_CLASS_S:
19471             gen_farith(ctx, OPC_CLASS_S, 0, rt, rs, 0);
19472             break;
19473         case NM_CLASS_D:
19474             gen_farith(ctx, OPC_CLASS_D, 0, rt, rs, 0);
19475             break;
19476         case NM_ADD_S:
19477             gen_farith(ctx, OPC_ADD_S, rt, rs, rd, 0);
19478             break;
19479         case NM_ADD_D:
19480             gen_farith(ctx, OPC_ADD_D, rt, rs, rd, 0);
19481             break;
19482         case NM_SUB_S:
19483             gen_farith(ctx, OPC_SUB_S, rt, rs, rd, 0);
19484             break;
19485         case NM_SUB_D:
19486             gen_farith(ctx, OPC_SUB_D, rt, rs, rd, 0);
19487             break;
19488         case NM_MUL_S:
19489             gen_farith(ctx, OPC_MUL_S, rt, rs, rd, 0);
19490             break;
19491         case NM_MUL_D:
19492             gen_farith(ctx, OPC_MUL_D, rt, rs, rd, 0);
19493             break;
19494         case NM_DIV_S:
19495             gen_farith(ctx, OPC_DIV_S, rt, rs, rd, 0);
19496             break;
19497         case NM_DIV_D:
19498             gen_farith(ctx, OPC_DIV_D, rt, rs, rd, 0);
19499             break;
19500         case NM_SELEQZ_S:
19501             gen_sel_s(ctx, OPC_SELEQZ_S, rd, rt, rs);
19502             break;
19503         case NM_SELEQZ_D:
19504             gen_sel_d(ctx, OPC_SELEQZ_D, rd, rt, rs);
19505             break;
19506         case NM_SELNEZ_S:
19507             gen_sel_s(ctx, OPC_SELNEZ_S, rd, rt, rs);
19508             break;
19509         case NM_SELNEZ_D:
19510             gen_sel_d(ctx, OPC_SELNEZ_D, rd, rt, rs);
19511             break;
19512         case NM_SEL_S:
19513             gen_sel_s(ctx, OPC_SEL_S, rd, rt, rs);
19514             break;
19515         case NM_SEL_D:
19516             gen_sel_d(ctx, OPC_SEL_D, rd, rt, rs);
19517             break;
19518         case NM_MADDF_S:
19519             gen_farith(ctx, OPC_MADDF_S, rt, rs, rd, 0);
19520             break;
19521         case NM_MADDF_D:
19522             gen_farith(ctx, OPC_MADDF_D, rt, rs, rd, 0);
19523             break;
19524         case NM_MSUBF_S:
19525             gen_farith(ctx, OPC_MSUBF_S, rt, rs, rd, 0);
19526             break;
19527         case NM_MSUBF_D:
19528             gen_farith(ctx, OPC_MSUBF_D, rt, rs, rd, 0);
19529             break;
19530         default:
19531             gen_reserved_instruction(ctx);
19532             break;
19533         }
19534         break;
19535     case NM_POOL32F_3:
19536         switch (extract32(ctx->opcode, 3, 3)) {
19537         case NM_MIN_FMT:
19538             switch (extract32(ctx->opcode, 9, 1)) {
19539             case FMT_SDPS_S:
19540                 gen_farith(ctx, OPC_MIN_S, rt, rs, rd, 0);
19541                 break;
19542             case FMT_SDPS_D:
19543                 gen_farith(ctx, OPC_MIN_D, rt, rs, rd, 0);
19544                 break;
19545             }
19546             break;
19547         case NM_MAX_FMT:
19548             switch (extract32(ctx->opcode, 9, 1)) {
19549             case FMT_SDPS_S:
19550                 gen_farith(ctx, OPC_MAX_S, rt, rs, rd, 0);
19551                 break;
19552             case FMT_SDPS_D:
19553                 gen_farith(ctx, OPC_MAX_D, rt, rs, rd, 0);
19554                 break;
19555             }
19556             break;
19557         case NM_MINA_FMT:
19558             switch (extract32(ctx->opcode, 9, 1)) {
19559             case FMT_SDPS_S:
19560                 gen_farith(ctx, OPC_MINA_S, rt, rs, rd, 0);
19561                 break;
19562             case FMT_SDPS_D:
19563                 gen_farith(ctx, OPC_MINA_D, rt, rs, rd, 0);
19564                 break;
19565             }
19566             break;
19567         case NM_MAXA_FMT:
19568             switch (extract32(ctx->opcode, 9, 1)) {
19569             case FMT_SDPS_S:
19570                 gen_farith(ctx, OPC_MAXA_S, rt, rs, rd, 0);
19571                 break;
19572             case FMT_SDPS_D:
19573                 gen_farith(ctx, OPC_MAXA_D, rt, rs, rd, 0);
19574                 break;
19575             }
19576             break;
19577         case NM_POOL32FXF:
19578             switch (extract32(ctx->opcode, 6, 8)) {
19579             case NM_CFC1:
19580                 gen_cp1(ctx, OPC_CFC1, rt, rs);
19581                 break;
19582             case NM_CTC1:
19583                 gen_cp1(ctx, OPC_CTC1, rt, rs);
19584                 break;
19585             case NM_MFC1:
19586                 gen_cp1(ctx, OPC_MFC1, rt, rs);
19587                 break;
19588             case NM_MTC1:
19589                 gen_cp1(ctx, OPC_MTC1, rt, rs);
19590                 break;
19591             case NM_MFHC1:
19592                 gen_cp1(ctx, OPC_MFHC1, rt, rs);
19593                 break;
19594             case NM_MTHC1:
19595                 gen_cp1(ctx, OPC_MTHC1, rt, rs);
19596                 break;
19597             case NM_CVT_S_PL:
19598                 gen_farith(ctx, OPC_CVT_S_PL, -1, rs, rt, 0);
19599                 break;
19600             case NM_CVT_S_PU:
19601                 gen_farith(ctx, OPC_CVT_S_PU, -1, rs, rt, 0);
19602                 break;
19603             default:
19604                 switch (extract32(ctx->opcode, 6, 9)) {
19605                 case NM_CVT_L_S:
19606                     gen_farith(ctx, OPC_CVT_L_S, -1, rs, rt, 0);
19607                     break;
19608                 case NM_CVT_L_D:
19609                     gen_farith(ctx, OPC_CVT_L_D, -1, rs, rt, 0);
19610                     break;
19611                 case NM_CVT_W_S:
19612                     gen_farith(ctx, OPC_CVT_W_S, -1, rs, rt, 0);
19613                     break;
19614                 case NM_CVT_W_D:
19615                     gen_farith(ctx, OPC_CVT_W_D, -1, rs, rt, 0);
19616                     break;
19617                 case NM_RSQRT_S:
19618                     gen_farith(ctx, OPC_RSQRT_S, -1, rs, rt, 0);
19619                     break;
19620                 case NM_RSQRT_D:
19621                     gen_farith(ctx, OPC_RSQRT_D, -1, rs, rt, 0);
19622                     break;
19623                 case NM_SQRT_S:
19624                     gen_farith(ctx, OPC_SQRT_S, -1, rs, rt, 0);
19625                     break;
19626                 case NM_SQRT_D:
19627                     gen_farith(ctx, OPC_SQRT_D, -1, rs, rt, 0);
19628                     break;
19629                 case NM_RECIP_S:
19630                     gen_farith(ctx, OPC_RECIP_S, -1, rs, rt, 0);
19631                     break;
19632                 case NM_RECIP_D:
19633                     gen_farith(ctx, OPC_RECIP_D, -1, rs, rt, 0);
19634                     break;
19635                 case NM_FLOOR_L_S:
19636                     gen_farith(ctx, OPC_FLOOR_L_S, -1, rs, rt, 0);
19637                     break;
19638                 case NM_FLOOR_L_D:
19639                     gen_farith(ctx, OPC_FLOOR_L_D, -1, rs, rt, 0);
19640                     break;
19641                 case NM_FLOOR_W_S:
19642                     gen_farith(ctx, OPC_FLOOR_W_S, -1, rs, rt, 0);
19643                     break;
19644                 case NM_FLOOR_W_D:
19645                     gen_farith(ctx, OPC_FLOOR_W_D, -1, rs, rt, 0);
19646                     break;
19647                 case NM_CEIL_L_S:
19648                     gen_farith(ctx, OPC_CEIL_L_S, -1, rs, rt, 0);
19649                     break;
19650                 case NM_CEIL_L_D:
19651                     gen_farith(ctx, OPC_CEIL_L_D, -1, rs, rt, 0);
19652                     break;
19653                 case NM_CEIL_W_S:
19654                     gen_farith(ctx, OPC_CEIL_W_S, -1, rs, rt, 0);
19655                     break;
19656                 case NM_CEIL_W_D:
19657                     gen_farith(ctx, OPC_CEIL_W_D, -1, rs, rt, 0);
19658                     break;
19659                 case NM_TRUNC_L_S:
19660                     gen_farith(ctx, OPC_TRUNC_L_S, -1, rs, rt, 0);
19661                     break;
19662                 case NM_TRUNC_L_D:
19663                     gen_farith(ctx, OPC_TRUNC_L_D, -1, rs, rt, 0);
19664                     break;
19665                 case NM_TRUNC_W_S:
19666                     gen_farith(ctx, OPC_TRUNC_W_S, -1, rs, rt, 0);
19667                     break;
19668                 case NM_TRUNC_W_D:
19669                     gen_farith(ctx, OPC_TRUNC_W_D, -1, rs, rt, 0);
19670                     break;
19671                 case NM_ROUND_L_S:
19672                     gen_farith(ctx, OPC_ROUND_L_S, -1, rs, rt, 0);
19673                     break;
19674                 case NM_ROUND_L_D:
19675                     gen_farith(ctx, OPC_ROUND_L_D, -1, rs, rt, 0);
19676                     break;
19677                 case NM_ROUND_W_S:
19678                     gen_farith(ctx, OPC_ROUND_W_S, -1, rs, rt, 0);
19679                     break;
19680                 case NM_ROUND_W_D:
19681                     gen_farith(ctx, OPC_ROUND_W_D, -1, rs, rt, 0);
19682                     break;
19683                 case NM_MOV_S:
19684                     gen_farith(ctx, OPC_MOV_S, -1, rs, rt, 0);
19685                     break;
19686                 case NM_MOV_D:
19687                     gen_farith(ctx, OPC_MOV_D, -1, rs, rt, 0);
19688                     break;
19689                 case NM_ABS_S:
19690                     gen_farith(ctx, OPC_ABS_S, -1, rs, rt, 0);
19691                     break;
19692                 case NM_ABS_D:
19693                     gen_farith(ctx, OPC_ABS_D, -1, rs, rt, 0);
19694                     break;
19695                 case NM_NEG_S:
19696                     gen_farith(ctx, OPC_NEG_S, -1, rs, rt, 0);
19697                     break;
19698                 case NM_NEG_D:
19699                     gen_farith(ctx, OPC_NEG_D, -1, rs, rt, 0);
19700                     break;
19701                 case NM_CVT_D_S:
19702                     gen_farith(ctx, OPC_CVT_D_S, -1, rs, rt, 0);
19703                     break;
19704                 case NM_CVT_D_W:
19705                     gen_farith(ctx, OPC_CVT_D_W, -1, rs, rt, 0);
19706                     break;
19707                 case NM_CVT_D_L:
19708                     gen_farith(ctx, OPC_CVT_D_L, -1, rs, rt, 0);
19709                     break;
19710                 case NM_CVT_S_D:
19711                     gen_farith(ctx, OPC_CVT_S_D, -1, rs, rt, 0);
19712                     break;
19713                 case NM_CVT_S_W:
19714                     gen_farith(ctx, OPC_CVT_S_W, -1, rs, rt, 0);
19715                     break;
19716                 case NM_CVT_S_L:
19717                     gen_farith(ctx, OPC_CVT_S_L, -1, rs, rt, 0);
19718                     break;
19719                 default:
19720                     gen_reserved_instruction(ctx);
19721                     break;
19722                 }
19723                 break;
19724             }
19725             break;
19726         }
19727         break;
19728     case NM_POOL32F_5:
19729         switch (extract32(ctx->opcode, 3, 3)) {
19730         case NM_CMP_CONDN_S:
19731             gen_r6_cmp_s(ctx, extract32(ctx->opcode, 6, 5), rt, rs, rd);
19732             break;
19733         case NM_CMP_CONDN_D:
19734             gen_r6_cmp_d(ctx, extract32(ctx->opcode, 6, 5), rt, rs, rd);
19735             break;
19736         default:
19737             gen_reserved_instruction(ctx);
19738             break;
19739         }
19740         break;
19741     default:
19742         gen_reserved_instruction(ctx);
19743         break;
19744     }
19745 }
19746 
19747 static void gen_pool32a5_nanomips_insn(DisasContext *ctx, int opc,
19748                                        int rd, int rs, int rt)
19749 {
19750     int ret = rd;
19751     TCGv t0 = tcg_temp_new();
19752     TCGv v1_t = tcg_temp_new();
19753     TCGv v2_t = tcg_temp_new();
19754 
19755     gen_load_gpr(v1_t, rs);
19756     gen_load_gpr(v2_t, rt);
19757 
19758     switch (opc) {
19759     case NM_CMP_EQ_PH:
19760         check_dsp(ctx);
19761         gen_helper_cmp_eq_ph(v1_t, v2_t, cpu_env);
19762         break;
19763     case NM_CMP_LT_PH:
19764         check_dsp(ctx);
19765         gen_helper_cmp_lt_ph(v1_t, v2_t, cpu_env);
19766         break;
19767     case NM_CMP_LE_PH:
19768         check_dsp(ctx);
19769         gen_helper_cmp_le_ph(v1_t, v2_t, cpu_env);
19770         break;
19771     case NM_CMPU_EQ_QB:
19772         check_dsp(ctx);
19773         gen_helper_cmpu_eq_qb(v1_t, v2_t, cpu_env);
19774         break;
19775     case NM_CMPU_LT_QB:
19776         check_dsp(ctx);
19777         gen_helper_cmpu_lt_qb(v1_t, v2_t, cpu_env);
19778         break;
19779     case NM_CMPU_LE_QB:
19780         check_dsp(ctx);
19781         gen_helper_cmpu_le_qb(v1_t, v2_t, cpu_env);
19782         break;
19783     case NM_CMPGU_EQ_QB:
19784         check_dsp(ctx);
19785         gen_helper_cmpgu_eq_qb(v1_t, v1_t, v2_t);
19786         gen_store_gpr(v1_t, ret);
19787         break;
19788     case NM_CMPGU_LT_QB:
19789         check_dsp(ctx);
19790         gen_helper_cmpgu_lt_qb(v1_t, v1_t, v2_t);
19791         gen_store_gpr(v1_t, ret);
19792         break;
19793     case NM_CMPGU_LE_QB:
19794         check_dsp(ctx);
19795         gen_helper_cmpgu_le_qb(v1_t, v1_t, v2_t);
19796         gen_store_gpr(v1_t, ret);
19797         break;
19798     case NM_CMPGDU_EQ_QB:
19799         check_dsp_r2(ctx);
19800         gen_helper_cmpgu_eq_qb(v1_t, v1_t, v2_t);
19801         tcg_gen_deposit_tl(cpu_dspctrl, cpu_dspctrl, v1_t, 24, 4);
19802         gen_store_gpr(v1_t, ret);
19803         break;
19804     case NM_CMPGDU_LT_QB:
19805         check_dsp_r2(ctx);
19806         gen_helper_cmpgu_lt_qb(v1_t, v1_t, v2_t);
19807         tcg_gen_deposit_tl(cpu_dspctrl, cpu_dspctrl, v1_t, 24, 4);
19808         gen_store_gpr(v1_t, ret);
19809         break;
19810     case NM_CMPGDU_LE_QB:
19811         check_dsp_r2(ctx);
19812         gen_helper_cmpgu_le_qb(v1_t, v1_t, v2_t);
19813         tcg_gen_deposit_tl(cpu_dspctrl, cpu_dspctrl, v1_t, 24, 4);
19814         gen_store_gpr(v1_t, ret);
19815         break;
19816     case NM_PACKRL_PH:
19817         check_dsp(ctx);
19818         gen_helper_packrl_ph(v1_t, v1_t, v2_t);
19819         gen_store_gpr(v1_t, ret);
19820         break;
19821     case NM_PICK_QB:
19822         check_dsp(ctx);
19823         gen_helper_pick_qb(v1_t, v1_t, v2_t, cpu_env);
19824         gen_store_gpr(v1_t, ret);
19825         break;
19826     case NM_PICK_PH:
19827         check_dsp(ctx);
19828         gen_helper_pick_ph(v1_t, v1_t, v2_t, cpu_env);
19829         gen_store_gpr(v1_t, ret);
19830         break;
19831     case NM_ADDQ_S_W:
19832         check_dsp(ctx);
19833         gen_helper_addq_s_w(v1_t, v1_t, v2_t, cpu_env);
19834         gen_store_gpr(v1_t, ret);
19835         break;
19836     case NM_SUBQ_S_W:
19837         check_dsp(ctx);
19838         gen_helper_subq_s_w(v1_t, v1_t, v2_t, cpu_env);
19839         gen_store_gpr(v1_t, ret);
19840         break;
19841     case NM_ADDSC:
19842         check_dsp(ctx);
19843         gen_helper_addsc(v1_t, v1_t, v2_t, cpu_env);
19844         gen_store_gpr(v1_t, ret);
19845         break;
19846     case NM_ADDWC:
19847         check_dsp(ctx);
19848         gen_helper_addwc(v1_t, v1_t, v2_t, cpu_env);
19849         gen_store_gpr(v1_t, ret);
19850         break;
19851     case NM_ADDQ_S_PH:
19852         check_dsp(ctx);
19853         switch (extract32(ctx->opcode, 10, 1)) {
19854         case 0:
19855             /* ADDQ_PH */
19856             gen_helper_addq_ph(v1_t, v1_t, v2_t, cpu_env);
19857             gen_store_gpr(v1_t, ret);
19858             break;
19859         case 1:
19860             /* ADDQ_S_PH */
19861             gen_helper_addq_s_ph(v1_t, v1_t, v2_t, cpu_env);
19862             gen_store_gpr(v1_t, ret);
19863             break;
19864         }
19865         break;
19866     case NM_ADDQH_R_PH:
19867         check_dsp_r2(ctx);
19868         switch (extract32(ctx->opcode, 10, 1)) {
19869         case 0:
19870             /* ADDQH_PH */
19871             gen_helper_addqh_ph(v1_t, v1_t, v2_t);
19872             gen_store_gpr(v1_t, ret);
19873             break;
19874         case 1:
19875             /* ADDQH_R_PH */
19876             gen_helper_addqh_r_ph(v1_t, v1_t, v2_t);
19877             gen_store_gpr(v1_t, ret);
19878             break;
19879         }
19880         break;
19881     case NM_ADDQH_R_W:
19882         check_dsp_r2(ctx);
19883         switch (extract32(ctx->opcode, 10, 1)) {
19884         case 0:
19885             /* ADDQH_W */
19886             gen_helper_addqh_w(v1_t, v1_t, v2_t);
19887             gen_store_gpr(v1_t, ret);
19888             break;
19889         case 1:
19890             /* ADDQH_R_W */
19891             gen_helper_addqh_r_w(v1_t, v1_t, v2_t);
19892             gen_store_gpr(v1_t, ret);
19893             break;
19894         }
19895         break;
19896     case NM_ADDU_S_QB:
19897         check_dsp(ctx);
19898         switch (extract32(ctx->opcode, 10, 1)) {
19899         case 0:
19900             /* ADDU_QB */
19901             gen_helper_addu_qb(v1_t, v1_t, v2_t, cpu_env);
19902             gen_store_gpr(v1_t, ret);
19903             break;
19904         case 1:
19905             /* ADDU_S_QB */
19906             gen_helper_addu_s_qb(v1_t, v1_t, v2_t, cpu_env);
19907             gen_store_gpr(v1_t, ret);
19908             break;
19909         }
19910         break;
19911     case NM_ADDU_S_PH:
19912         check_dsp_r2(ctx);
19913         switch (extract32(ctx->opcode, 10, 1)) {
19914         case 0:
19915             /* ADDU_PH */
19916             gen_helper_addu_ph(v1_t, v1_t, v2_t, cpu_env);
19917             gen_store_gpr(v1_t, ret);
19918             break;
19919         case 1:
19920             /* ADDU_S_PH */
19921             gen_helper_addu_s_ph(v1_t, v1_t, v2_t, cpu_env);
19922             gen_store_gpr(v1_t, ret);
19923             break;
19924         }
19925         break;
19926     case NM_ADDUH_R_QB:
19927         check_dsp_r2(ctx);
19928         switch (extract32(ctx->opcode, 10, 1)) {
19929         case 0:
19930             /* ADDUH_QB */
19931             gen_helper_adduh_qb(v1_t, v1_t, v2_t);
19932             gen_store_gpr(v1_t, ret);
19933             break;
19934         case 1:
19935             /* ADDUH_R_QB */
19936             gen_helper_adduh_r_qb(v1_t, v1_t, v2_t);
19937             gen_store_gpr(v1_t, ret);
19938             break;
19939         }
19940         break;
19941     case NM_SHRAV_R_PH:
19942         check_dsp(ctx);
19943         switch (extract32(ctx->opcode, 10, 1)) {
19944         case 0:
19945             /* SHRAV_PH */
19946             gen_helper_shra_ph(v1_t, v1_t, v2_t);
19947             gen_store_gpr(v1_t, ret);
19948             break;
19949         case 1:
19950             /* SHRAV_R_PH */
19951             gen_helper_shra_r_ph(v1_t, v1_t, v2_t);
19952             gen_store_gpr(v1_t, ret);
19953             break;
19954         }
19955         break;
19956     case NM_SHRAV_R_QB:
19957         check_dsp_r2(ctx);
19958         switch (extract32(ctx->opcode, 10, 1)) {
19959         case 0:
19960             /* SHRAV_QB */
19961             gen_helper_shra_qb(v1_t, v1_t, v2_t);
19962             gen_store_gpr(v1_t, ret);
19963             break;
19964         case 1:
19965             /* SHRAV_R_QB */
19966             gen_helper_shra_r_qb(v1_t, v1_t, v2_t);
19967             gen_store_gpr(v1_t, ret);
19968             break;
19969         }
19970         break;
19971     case NM_SUBQ_S_PH:
19972         check_dsp(ctx);
19973         switch (extract32(ctx->opcode, 10, 1)) {
19974         case 0:
19975             /* SUBQ_PH */
19976             gen_helper_subq_ph(v1_t, v1_t, v2_t, cpu_env);
19977             gen_store_gpr(v1_t, ret);
19978             break;
19979         case 1:
19980             /* SUBQ_S_PH */
19981             gen_helper_subq_s_ph(v1_t, v1_t, v2_t, cpu_env);
19982             gen_store_gpr(v1_t, ret);
19983             break;
19984         }
19985         break;
19986     case NM_SUBQH_R_PH:
19987         check_dsp_r2(ctx);
19988         switch (extract32(ctx->opcode, 10, 1)) {
19989         case 0:
19990             /* SUBQH_PH */
19991             gen_helper_subqh_ph(v1_t, v1_t, v2_t);
19992             gen_store_gpr(v1_t, ret);
19993             break;
19994         case 1:
19995             /* SUBQH_R_PH */
19996             gen_helper_subqh_r_ph(v1_t, v1_t, v2_t);
19997             gen_store_gpr(v1_t, ret);
19998             break;
19999         }
20000         break;
20001     case NM_SUBQH_R_W:
20002         check_dsp_r2(ctx);
20003         switch (extract32(ctx->opcode, 10, 1)) {
20004         case 0:
20005             /* SUBQH_W */
20006             gen_helper_subqh_w(v1_t, v1_t, v2_t);
20007             gen_store_gpr(v1_t, ret);
20008             break;
20009         case 1:
20010             /* SUBQH_R_W */
20011             gen_helper_subqh_r_w(v1_t, v1_t, v2_t);
20012             gen_store_gpr(v1_t, ret);
20013             break;
20014         }
20015         break;
20016     case NM_SUBU_S_QB:
20017         check_dsp(ctx);
20018         switch (extract32(ctx->opcode, 10, 1)) {
20019         case 0:
20020             /* SUBU_QB */
20021             gen_helper_subu_qb(v1_t, v1_t, v2_t, cpu_env);
20022             gen_store_gpr(v1_t, ret);
20023             break;
20024         case 1:
20025             /* SUBU_S_QB */
20026             gen_helper_subu_s_qb(v1_t, v1_t, v2_t, cpu_env);
20027             gen_store_gpr(v1_t, ret);
20028             break;
20029         }
20030         break;
20031     case NM_SUBU_S_PH:
20032         check_dsp_r2(ctx);
20033         switch (extract32(ctx->opcode, 10, 1)) {
20034         case 0:
20035             /* SUBU_PH */
20036             gen_helper_subu_ph(v1_t, v1_t, v2_t, cpu_env);
20037             gen_store_gpr(v1_t, ret);
20038             break;
20039         case 1:
20040             /* SUBU_S_PH */
20041             gen_helper_subu_s_ph(v1_t, v1_t, v2_t, cpu_env);
20042             gen_store_gpr(v1_t, ret);
20043             break;
20044         }
20045         break;
20046     case NM_SUBUH_R_QB:
20047         check_dsp_r2(ctx);
20048         switch (extract32(ctx->opcode, 10, 1)) {
20049         case 0:
20050             /* SUBUH_QB */
20051             gen_helper_subuh_qb(v1_t, v1_t, v2_t);
20052             gen_store_gpr(v1_t, ret);
20053             break;
20054         case 1:
20055             /* SUBUH_R_QB */
20056             gen_helper_subuh_r_qb(v1_t, v1_t, v2_t);
20057             gen_store_gpr(v1_t, ret);
20058             break;
20059         }
20060         break;
20061     case NM_SHLLV_S_PH:
20062         check_dsp(ctx);
20063         switch (extract32(ctx->opcode, 10, 1)) {
20064         case 0:
20065             /* SHLLV_PH */
20066             gen_helper_shll_ph(v1_t, v1_t, v2_t, cpu_env);
20067             gen_store_gpr(v1_t, ret);
20068             break;
20069         case 1:
20070             /* SHLLV_S_PH */
20071             gen_helper_shll_s_ph(v1_t, v1_t, v2_t, cpu_env);
20072             gen_store_gpr(v1_t, ret);
20073             break;
20074         }
20075         break;
20076     case NM_PRECR_SRA_R_PH_W:
20077         check_dsp_r2(ctx);
20078         switch (extract32(ctx->opcode, 10, 1)) {
20079         case 0:
20080             /* PRECR_SRA_PH_W */
20081             {
20082                 TCGv_i32 sa_t = tcg_const_i32(rd);
20083                 gen_helper_precr_sra_ph_w(v1_t, sa_t, v1_t,
20084                                           cpu_gpr[rt]);
20085                 gen_store_gpr(v1_t, rt);
20086                 tcg_temp_free_i32(sa_t);
20087             }
20088             break;
20089         case 1:
20090             /* PRECR_SRA_R_PH_W */
20091             {
20092                 TCGv_i32 sa_t = tcg_const_i32(rd);
20093                 gen_helper_precr_sra_r_ph_w(v1_t, sa_t, v1_t,
20094                                             cpu_gpr[rt]);
20095                 gen_store_gpr(v1_t, rt);
20096                 tcg_temp_free_i32(sa_t);
20097             }
20098             break;
20099        }
20100         break;
20101     case NM_MULEU_S_PH_QBL:
20102         check_dsp(ctx);
20103         gen_helper_muleu_s_ph_qbl(v1_t, v1_t, v2_t, cpu_env);
20104         gen_store_gpr(v1_t, ret);
20105         break;
20106     case NM_MULEU_S_PH_QBR:
20107         check_dsp(ctx);
20108         gen_helper_muleu_s_ph_qbr(v1_t, v1_t, v2_t, cpu_env);
20109         gen_store_gpr(v1_t, ret);
20110         break;
20111     case NM_MULQ_RS_PH:
20112         check_dsp(ctx);
20113         gen_helper_mulq_rs_ph(v1_t, v1_t, v2_t, cpu_env);
20114         gen_store_gpr(v1_t, ret);
20115         break;
20116     case NM_MULQ_S_PH:
20117         check_dsp_r2(ctx);
20118         gen_helper_mulq_s_ph(v1_t, v1_t, v2_t, cpu_env);
20119         gen_store_gpr(v1_t, ret);
20120         break;
20121     case NM_MULQ_RS_W:
20122         check_dsp_r2(ctx);
20123         gen_helper_mulq_rs_w(v1_t, v1_t, v2_t, cpu_env);
20124         gen_store_gpr(v1_t, ret);
20125         break;
20126     case NM_MULQ_S_W:
20127         check_dsp_r2(ctx);
20128         gen_helper_mulq_s_w(v1_t, v1_t, v2_t, cpu_env);
20129         gen_store_gpr(v1_t, ret);
20130         break;
20131     case NM_APPEND:
20132         check_dsp_r2(ctx);
20133         gen_load_gpr(t0, rs);
20134         if (rd != 0) {
20135             tcg_gen_deposit_tl(cpu_gpr[rt], t0, cpu_gpr[rt], rd, 32 - rd);
20136         }
20137         tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
20138         break;
20139     case NM_MODSUB:
20140         check_dsp(ctx);
20141         gen_helper_modsub(v1_t, v1_t, v2_t);
20142         gen_store_gpr(v1_t, ret);
20143         break;
20144     case NM_SHRAV_R_W:
20145         check_dsp(ctx);
20146         gen_helper_shra_r_w(v1_t, v1_t, v2_t);
20147         gen_store_gpr(v1_t, ret);
20148         break;
20149     case NM_SHRLV_PH:
20150         check_dsp_r2(ctx);
20151         gen_helper_shrl_ph(v1_t, v1_t, v2_t);
20152         gen_store_gpr(v1_t, ret);
20153         break;
20154     case NM_SHRLV_QB:
20155         check_dsp(ctx);
20156         gen_helper_shrl_qb(v1_t, v1_t, v2_t);
20157         gen_store_gpr(v1_t, ret);
20158         break;
20159     case NM_SHLLV_QB:
20160         check_dsp(ctx);
20161         gen_helper_shll_qb(v1_t, v1_t, v2_t, cpu_env);
20162         gen_store_gpr(v1_t, ret);
20163         break;
20164     case NM_SHLLV_S_W:
20165         check_dsp(ctx);
20166         gen_helper_shll_s_w(v1_t, v1_t, v2_t, cpu_env);
20167         gen_store_gpr(v1_t, ret);
20168         break;
20169     case NM_SHILO:
20170         check_dsp(ctx);
20171         {
20172             TCGv tv0 = tcg_temp_new();
20173             TCGv tv1 = tcg_temp_new();
20174             int16_t imm = extract32(ctx->opcode, 16, 7);
20175 
20176             tcg_gen_movi_tl(tv0, rd >> 3);
20177             tcg_gen_movi_tl(tv1, imm);
20178             gen_helper_shilo(tv0, tv1, cpu_env);
20179             tcg_temp_free(tv1);
20180             tcg_temp_free(tv0);
20181         }
20182         break;
20183     case NM_MULEQ_S_W_PHL:
20184         check_dsp(ctx);
20185         gen_helper_muleq_s_w_phl(v1_t, v1_t, v2_t, cpu_env);
20186         gen_store_gpr(v1_t, ret);
20187         break;
20188     case NM_MULEQ_S_W_PHR:
20189         check_dsp(ctx);
20190         gen_helper_muleq_s_w_phr(v1_t, v1_t, v2_t, cpu_env);
20191         gen_store_gpr(v1_t, ret);
20192         break;
20193     case NM_MUL_S_PH:
20194         check_dsp_r2(ctx);
20195         switch (extract32(ctx->opcode, 10, 1)) {
20196         case 0:
20197             /* MUL_PH */
20198             gen_helper_mul_ph(v1_t, v1_t, v2_t, cpu_env);
20199             gen_store_gpr(v1_t, ret);
20200             break;
20201         case 1:
20202             /* MUL_S_PH */
20203             gen_helper_mul_s_ph(v1_t, v1_t, v2_t, cpu_env);
20204             gen_store_gpr(v1_t, ret);
20205             break;
20206         }
20207         break;
20208     case NM_PRECR_QB_PH:
20209         check_dsp_r2(ctx);
20210         gen_helper_precr_qb_ph(v1_t, v1_t, v2_t);
20211         gen_store_gpr(v1_t, ret);
20212         break;
20213     case NM_PRECRQ_QB_PH:
20214         check_dsp(ctx);
20215         gen_helper_precrq_qb_ph(v1_t, v1_t, v2_t);
20216         gen_store_gpr(v1_t, ret);
20217         break;
20218     case NM_PRECRQ_PH_W:
20219         check_dsp(ctx);
20220         gen_helper_precrq_ph_w(v1_t, v1_t, v2_t);
20221         gen_store_gpr(v1_t, ret);
20222         break;
20223     case NM_PRECRQ_RS_PH_W:
20224         check_dsp(ctx);
20225         gen_helper_precrq_rs_ph_w(v1_t, v1_t, v2_t, cpu_env);
20226         gen_store_gpr(v1_t, ret);
20227         break;
20228     case NM_PRECRQU_S_QB_PH:
20229         check_dsp(ctx);
20230         gen_helper_precrqu_s_qb_ph(v1_t, v1_t, v2_t, cpu_env);
20231         gen_store_gpr(v1_t, ret);
20232         break;
20233     case NM_SHRA_R_W:
20234         check_dsp(ctx);
20235         tcg_gen_movi_tl(t0, rd);
20236         gen_helper_shra_r_w(v1_t, t0, v1_t);
20237         gen_store_gpr(v1_t, rt);
20238         break;
20239     case NM_SHRA_R_PH:
20240         check_dsp(ctx);
20241         tcg_gen_movi_tl(t0, rd >> 1);
20242         switch (extract32(ctx->opcode, 10, 1)) {
20243         case 0:
20244             /* SHRA_PH */
20245             gen_helper_shra_ph(v1_t, t0, v1_t);
20246             gen_store_gpr(v1_t, rt);
20247             break;
20248         case 1:
20249             /* SHRA_R_PH */
20250             gen_helper_shra_r_ph(v1_t, t0, v1_t);
20251             gen_store_gpr(v1_t, rt);
20252             break;
20253         }
20254         break;
20255     case NM_SHLL_S_PH:
20256         check_dsp(ctx);
20257         tcg_gen_movi_tl(t0, rd >> 1);
20258         switch (extract32(ctx->opcode, 10, 2)) {
20259         case 0:
20260             /* SHLL_PH */
20261             gen_helper_shll_ph(v1_t, t0, v1_t, cpu_env);
20262             gen_store_gpr(v1_t, rt);
20263             break;
20264         case 2:
20265             /* SHLL_S_PH */
20266             gen_helper_shll_s_ph(v1_t, t0, v1_t, cpu_env);
20267             gen_store_gpr(v1_t, rt);
20268             break;
20269         default:
20270             gen_reserved_instruction(ctx);
20271             break;
20272         }
20273         break;
20274     case NM_SHLL_S_W:
20275         check_dsp(ctx);
20276         tcg_gen_movi_tl(t0, rd);
20277         gen_helper_shll_s_w(v1_t, t0, v1_t, cpu_env);
20278         gen_store_gpr(v1_t, rt);
20279         break;
20280     case NM_REPL_PH:
20281         check_dsp(ctx);
20282         {
20283             int16_t imm;
20284             imm = sextract32(ctx->opcode, 11, 11);
20285             imm = (int16_t)(imm << 6) >> 6;
20286             if (rt != 0) {
20287                 tcg_gen_movi_tl(cpu_gpr[rt], dup_const(MO_16, imm));
20288             }
20289         }
20290         break;
20291     default:
20292         gen_reserved_instruction(ctx);
20293         break;
20294     }
20295 
20296     tcg_temp_free(v2_t);
20297     tcg_temp_free(v1_t);
20298     tcg_temp_free(t0);
20299 }
20300 
20301 static int decode_nanomips_32_48_opc(CPUMIPSState *env, DisasContext *ctx)
20302 {
20303     uint16_t insn;
20304     uint32_t op;
20305     int rt, rs, rd;
20306     int offset;
20307     int imm;
20308 
20309     insn = translator_lduw(env, ctx->base.pc_next + 2);
20310     ctx->opcode = (ctx->opcode << 16) | insn;
20311 
20312     rt = extract32(ctx->opcode, 21, 5);
20313     rs = extract32(ctx->opcode, 16, 5);
20314     rd = extract32(ctx->opcode, 11, 5);
20315 
20316     op = extract32(ctx->opcode, 26, 6);
20317     switch (op) {
20318     case NM_P_ADDIU:
20319         if (rt == 0) {
20320             /* P.RI */
20321             switch (extract32(ctx->opcode, 19, 2)) {
20322             case NM_SIGRIE:
20323             default:
20324                 gen_reserved_instruction(ctx);
20325                 break;
20326             case NM_P_SYSCALL:
20327                 if ((extract32(ctx->opcode, 18, 1)) == NM_SYSCALL) {
20328                     generate_exception_end(ctx, EXCP_SYSCALL);
20329                 } else {
20330                     gen_reserved_instruction(ctx);
20331                 }
20332                 break;
20333             case NM_BREAK:
20334                 generate_exception_end(ctx, EXCP_BREAK);
20335                 break;
20336             case NM_SDBBP:
20337                 if (is_uhi(extract32(ctx->opcode, 0, 19))) {
20338                     gen_helper_do_semihosting(cpu_env);
20339                 } else {
20340                     if (ctx->hflags & MIPS_HFLAG_SBRI) {
20341                         gen_reserved_instruction(ctx);
20342                     } else {
20343                         generate_exception_end(ctx, EXCP_DBp);
20344                     }
20345                 }
20346                 break;
20347             }
20348         } else {
20349             /* NM_ADDIU */
20350             imm = extract32(ctx->opcode, 0, 16);
20351             if (rs != 0) {
20352                 tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], imm);
20353             } else {
20354                 tcg_gen_movi_tl(cpu_gpr[rt], imm);
20355             }
20356             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
20357         }
20358         break;
20359     case NM_ADDIUPC:
20360         if (rt != 0) {
20361             offset = sextract32(ctx->opcode, 0, 1) << 21 |
20362                      extract32(ctx->opcode, 1, 20) << 1;
20363             target_long addr = addr_add(ctx, ctx->base.pc_next + 4, offset);
20364             tcg_gen_movi_tl(cpu_gpr[rt], addr);
20365         }
20366         break;
20367     case NM_POOL32A:
20368         switch (ctx->opcode & 0x07) {
20369         case NM_POOL32A0:
20370             gen_pool32a0_nanomips_insn(env, ctx);
20371             break;
20372         case NM_POOL32A5:
20373             {
20374                 int32_t op1 = extract32(ctx->opcode, 3, 7);
20375                 gen_pool32a5_nanomips_insn(ctx, op1, rd, rs, rt);
20376             }
20377             break;
20378         case NM_POOL32A7:
20379             switch (extract32(ctx->opcode, 3, 3)) {
20380             case NM_P_LSX:
20381                 gen_p_lsx(ctx, rd, rs, rt);
20382                 break;
20383             case NM_LSA:
20384                 /*
20385                  * In nanoMIPS, the shift field directly encodes the shift
20386                  * amount, meaning that the supported shift values are in
20387                  * the range 0 to 3 (instead of 1 to 4 in MIPSR6).
20388                  */
20389                 gen_lsa(ctx, rd, rt, rs, extract32(ctx->opcode, 9, 2) - 1);
20390                 break;
20391             case NM_EXTW:
20392                 gen_ext(ctx, 32, rd, rs, rt, extract32(ctx->opcode, 6, 5));
20393                 break;
20394             case NM_POOL32AXF:
20395                 gen_pool32axf_nanomips_insn(env, ctx);
20396                 break;
20397             default:
20398                 gen_reserved_instruction(ctx);
20399                 break;
20400             }
20401             break;
20402         default:
20403             gen_reserved_instruction(ctx);
20404             break;
20405         }
20406         break;
20407     case NM_P_GP_W:
20408         switch (ctx->opcode & 0x03) {
20409         case NM_ADDIUGP_W:
20410             if (rt != 0) {
20411                 offset = extract32(ctx->opcode, 0, 21);
20412                 gen_op_addr_addi(ctx, cpu_gpr[rt], cpu_gpr[28], offset);
20413             }
20414             break;
20415         case NM_LWGP:
20416             gen_ld(ctx, OPC_LW, rt, 28, extract32(ctx->opcode, 2, 19) << 2);
20417             break;
20418         case NM_SWGP:
20419             gen_st(ctx, OPC_SW, rt, 28, extract32(ctx->opcode, 2, 19) << 2);
20420             break;
20421         default:
20422             gen_reserved_instruction(ctx);
20423             break;
20424         }
20425         break;
20426     case NM_P48I:
20427         {
20428             insn = translator_lduw(env, ctx->base.pc_next + 4);
20429             target_long addr_off = extract32(ctx->opcode, 0, 16) | insn << 16;
20430             switch (extract32(ctx->opcode, 16, 5)) {
20431             case NM_LI48:
20432                 check_nms(ctx);
20433                 if (rt != 0) {
20434                     tcg_gen_movi_tl(cpu_gpr[rt], addr_off);
20435                 }
20436                 break;
20437             case NM_ADDIU48:
20438                 check_nms(ctx);
20439                 if (rt != 0) {
20440                     tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rt], addr_off);
20441                     tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
20442                 }
20443                 break;
20444             case NM_ADDIUGP48:
20445                 check_nms(ctx);
20446                 if (rt != 0) {
20447                     gen_op_addr_addi(ctx, cpu_gpr[rt], cpu_gpr[28], addr_off);
20448                 }
20449                 break;
20450             case NM_ADDIUPC48:
20451                 check_nms(ctx);
20452                 if (rt != 0) {
20453                     target_long addr = addr_add(ctx, ctx->base.pc_next + 6,
20454                                                 addr_off);
20455 
20456                     tcg_gen_movi_tl(cpu_gpr[rt], addr);
20457                 }
20458                 break;
20459             case NM_LWPC48:
20460                 check_nms(ctx);
20461                 if (rt != 0) {
20462                     TCGv t0;
20463                     t0 = tcg_temp_new();
20464 
20465                     target_long addr = addr_add(ctx, ctx->base.pc_next + 6,
20466                                                 addr_off);
20467 
20468                     tcg_gen_movi_tl(t0, addr);
20469                     tcg_gen_qemu_ld_tl(cpu_gpr[rt], t0, ctx->mem_idx, MO_TESL);
20470                     tcg_temp_free(t0);
20471                 }
20472                 break;
20473             case NM_SWPC48:
20474                 check_nms(ctx);
20475                 {
20476                     TCGv t0, t1;
20477                     t0 = tcg_temp_new();
20478                     t1 = tcg_temp_new();
20479 
20480                     target_long addr = addr_add(ctx, ctx->base.pc_next + 6,
20481                                                 addr_off);
20482 
20483                     tcg_gen_movi_tl(t0, addr);
20484                     gen_load_gpr(t1, rt);
20485 
20486                     tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUL);
20487 
20488                     tcg_temp_free(t0);
20489                     tcg_temp_free(t1);
20490                 }
20491                 break;
20492             default:
20493                 gen_reserved_instruction(ctx);
20494                 break;
20495             }
20496             return 6;
20497         }
20498     case NM_P_U12:
20499         switch (extract32(ctx->opcode, 12, 4)) {
20500         case NM_ORI:
20501             gen_logic_imm(ctx, OPC_ORI, rt, rs, extract32(ctx->opcode, 0, 12));
20502             break;
20503         case NM_XORI:
20504             gen_logic_imm(ctx, OPC_XORI, rt, rs, extract32(ctx->opcode, 0, 12));
20505             break;
20506         case NM_ANDI:
20507             gen_logic_imm(ctx, OPC_ANDI, rt, rs, extract32(ctx->opcode, 0, 12));
20508             break;
20509         case NM_P_SR:
20510             switch (extract32(ctx->opcode, 20, 1)) {
20511             case NM_PP_SR:
20512                 switch (ctx->opcode & 3) {
20513                 case NM_SAVE:
20514                     gen_save(ctx, rt, extract32(ctx->opcode, 16, 4),
20515                              extract32(ctx->opcode, 2, 1),
20516                              extract32(ctx->opcode, 3, 9) << 3);
20517                     break;
20518                 case NM_RESTORE:
20519                 case NM_RESTORE_JRC:
20520                     gen_restore(ctx, rt, extract32(ctx->opcode, 16, 4),
20521                                 extract32(ctx->opcode, 2, 1),
20522                                 extract32(ctx->opcode, 3, 9) << 3);
20523                     if ((ctx->opcode & 3) == NM_RESTORE_JRC) {
20524                         gen_compute_branch_nm(ctx, OPC_JR, 2, 31, 0, 0);
20525                     }
20526                     break;
20527                 default:
20528                     gen_reserved_instruction(ctx);
20529                     break;
20530                 }
20531                 break;
20532             case NM_P_SR_F:
20533                 gen_reserved_instruction(ctx);
20534                 break;
20535             }
20536             break;
20537         case NM_SLTI:
20538             gen_slt_imm(ctx, OPC_SLTI, rt, rs, extract32(ctx->opcode, 0, 12));
20539             break;
20540         case NM_SLTIU:
20541             gen_slt_imm(ctx, OPC_SLTIU, rt, rs, extract32(ctx->opcode, 0, 12));
20542             break;
20543         case NM_SEQI:
20544             {
20545                 TCGv t0 = tcg_temp_new();
20546 
20547                 imm = extract32(ctx->opcode, 0, 12);
20548                 gen_load_gpr(t0, rs);
20549                 tcg_gen_setcondi_tl(TCG_COND_EQ, t0, t0, imm);
20550                 gen_store_gpr(t0, rt);
20551 
20552                 tcg_temp_free(t0);
20553             }
20554             break;
20555         case NM_ADDIUNEG:
20556             imm = (int16_t) extract32(ctx->opcode, 0, 12);
20557             gen_arith_imm(ctx, OPC_ADDIU, rt, rs, -imm);
20558             break;
20559         case NM_P_SHIFT:
20560             {
20561                 int shift = extract32(ctx->opcode, 0, 5);
20562                 switch (extract32(ctx->opcode, 5, 4)) {
20563                 case NM_P_SLL:
20564                     if (rt == 0 && shift == 0) {
20565                         /* NOP */
20566                     } else if (rt == 0 && shift == 3) {
20567                         /* EHB - treat as NOP */
20568                     } else if (rt == 0 && shift == 5) {
20569                         /* PAUSE - treat as NOP */
20570                     } else if (rt == 0 && shift == 6) {
20571                         /* SYNC */
20572                         gen_sync(extract32(ctx->opcode, 16, 5));
20573                     } else {
20574                         /* SLL */
20575                         gen_shift_imm(ctx, OPC_SLL, rt, rs,
20576                                       extract32(ctx->opcode, 0, 5));
20577                     }
20578                     break;
20579                 case NM_SRL:
20580                     gen_shift_imm(ctx, OPC_SRL, rt, rs,
20581                                   extract32(ctx->opcode, 0, 5));
20582                     break;
20583                 case NM_SRA:
20584                     gen_shift_imm(ctx, OPC_SRA, rt, rs,
20585                                   extract32(ctx->opcode, 0, 5));
20586                     break;
20587                 case NM_ROTR:
20588                     gen_shift_imm(ctx, OPC_ROTR, rt, rs,
20589                                   extract32(ctx->opcode, 0, 5));
20590                     break;
20591                 }
20592             }
20593             break;
20594         case NM_P_ROTX:
20595             check_nms(ctx);
20596             if (rt != 0) {
20597                 TCGv t0 = tcg_temp_new();
20598                 TCGv_i32 shift = tcg_const_i32(extract32(ctx->opcode, 0, 5));
20599                 TCGv_i32 shiftx = tcg_const_i32(extract32(ctx->opcode, 7, 4)
20600                                                 << 1);
20601                 TCGv_i32 stripe = tcg_const_i32(extract32(ctx->opcode, 6, 1));
20602 
20603                 gen_load_gpr(t0, rs);
20604                 gen_helper_rotx(cpu_gpr[rt], t0, shift, shiftx, stripe);
20605                 tcg_temp_free(t0);
20606 
20607                 tcg_temp_free_i32(shift);
20608                 tcg_temp_free_i32(shiftx);
20609                 tcg_temp_free_i32(stripe);
20610             }
20611             break;
20612         case NM_P_INS:
20613             switch (((ctx->opcode >> 10) & 2) |
20614                     (extract32(ctx->opcode, 5, 1))) {
20615             case NM_INS:
20616                 check_nms(ctx);
20617                 gen_bitops(ctx, OPC_INS, rt, rs, extract32(ctx->opcode, 0, 5),
20618                            extract32(ctx->opcode, 6, 5));
20619                 break;
20620             default:
20621                 gen_reserved_instruction(ctx);
20622                 break;
20623             }
20624             break;
20625         case NM_P_EXT:
20626             switch (((ctx->opcode >> 10) & 2) |
20627                     (extract32(ctx->opcode, 5, 1))) {
20628             case NM_EXT:
20629                 check_nms(ctx);
20630                 gen_bitops(ctx, OPC_EXT, rt, rs, extract32(ctx->opcode, 0, 5),
20631                            extract32(ctx->opcode, 6, 5));
20632                 break;
20633             default:
20634                 gen_reserved_instruction(ctx);
20635                 break;
20636             }
20637             break;
20638         default:
20639             gen_reserved_instruction(ctx);
20640             break;
20641         }
20642         break;
20643     case NM_POOL32F:
20644         gen_pool32f_nanomips_insn(ctx);
20645         break;
20646     case NM_POOL32S:
20647         break;
20648     case NM_P_LUI:
20649         switch (extract32(ctx->opcode, 1, 1)) {
20650         case NM_LUI:
20651             if (rt != 0) {
20652                 tcg_gen_movi_tl(cpu_gpr[rt],
20653                                 sextract32(ctx->opcode, 0, 1) << 31 |
20654                                 extract32(ctx->opcode, 2, 10) << 21 |
20655                                 extract32(ctx->opcode, 12, 9) << 12);
20656             }
20657             break;
20658         case NM_ALUIPC:
20659             if (rt != 0) {
20660                 offset = sextract32(ctx->opcode, 0, 1) << 31 |
20661                          extract32(ctx->opcode, 2, 10) << 21 |
20662                          extract32(ctx->opcode, 12, 9) << 12;
20663                 target_long addr;
20664                 addr = ~0xFFF & addr_add(ctx, ctx->base.pc_next + 4, offset);
20665                 tcg_gen_movi_tl(cpu_gpr[rt], addr);
20666             }
20667             break;
20668         }
20669         break;
20670     case NM_P_GP_BH:
20671         {
20672             uint32_t u = extract32(ctx->opcode, 0, 18);
20673 
20674             switch (extract32(ctx->opcode, 18, 3)) {
20675             case NM_LBGP:
20676                 gen_ld(ctx, OPC_LB, rt, 28, u);
20677                 break;
20678             case NM_SBGP:
20679                 gen_st(ctx, OPC_SB, rt, 28, u);
20680                 break;
20681             case NM_LBUGP:
20682                 gen_ld(ctx, OPC_LBU, rt, 28, u);
20683                 break;
20684             case NM_ADDIUGP_B:
20685                 if (rt != 0) {
20686                     gen_op_addr_addi(ctx, cpu_gpr[rt], cpu_gpr[28], u);
20687                 }
20688                 break;
20689             case NM_P_GP_LH:
20690                 u &= ~1;
20691                 switch (ctx->opcode & 1) {
20692                 case NM_LHGP:
20693                     gen_ld(ctx, OPC_LH, rt, 28, u);
20694                     break;
20695                 case NM_LHUGP:
20696                     gen_ld(ctx, OPC_LHU, rt, 28, u);
20697                     break;
20698                 }
20699                 break;
20700             case NM_P_GP_SH:
20701                 u &= ~1;
20702                 switch (ctx->opcode & 1) {
20703                 case NM_SHGP:
20704                     gen_st(ctx, OPC_SH, rt, 28, u);
20705                     break;
20706                 default:
20707                     gen_reserved_instruction(ctx);
20708                     break;
20709                 }
20710                 break;
20711             case NM_P_GP_CP1:
20712                 u &= ~0x3;
20713                 switch (ctx->opcode & 0x3) {
20714                 case NM_LWC1GP:
20715                     gen_cop1_ldst(ctx, OPC_LWC1, rt, 28, u);
20716                     break;
20717                 case NM_LDC1GP:
20718                     gen_cop1_ldst(ctx, OPC_LDC1, rt, 28, u);
20719                     break;
20720                 case NM_SWC1GP:
20721                     gen_cop1_ldst(ctx, OPC_SWC1, rt, 28, u);
20722                     break;
20723                 case NM_SDC1GP:
20724                     gen_cop1_ldst(ctx, OPC_SDC1, rt, 28, u);
20725                     break;
20726                 }
20727                 break;
20728             default:
20729                 gen_reserved_instruction(ctx);
20730                 break;
20731             }
20732         }
20733         break;
20734     case NM_P_LS_U12:
20735         {
20736             uint32_t u = extract32(ctx->opcode, 0, 12);
20737 
20738             switch (extract32(ctx->opcode, 12, 4)) {
20739             case NM_P_PREFU12:
20740                 if (rt == 31) {
20741                     /* SYNCI */
20742                     /*
20743                      * Break the TB to be able to sync copied instructions
20744                      * immediately.
20745                      */
20746                     ctx->base.is_jmp = DISAS_STOP;
20747                 } else {
20748                     /* PREF */
20749                     /* Treat as NOP. */
20750                 }
20751                 break;
20752             case NM_LB:
20753                 gen_ld(ctx, OPC_LB, rt, rs, u);
20754                 break;
20755             case NM_LH:
20756                 gen_ld(ctx, OPC_LH, rt, rs, u);
20757                 break;
20758             case NM_LW:
20759                 gen_ld(ctx, OPC_LW, rt, rs, u);
20760                 break;
20761             case NM_LBU:
20762                 gen_ld(ctx, OPC_LBU, rt, rs, u);
20763                 break;
20764             case NM_LHU:
20765                 gen_ld(ctx, OPC_LHU, rt, rs, u);
20766                 break;
20767             case NM_SB:
20768                 gen_st(ctx, OPC_SB, rt, rs, u);
20769                 break;
20770             case NM_SH:
20771                 gen_st(ctx, OPC_SH, rt, rs, u);
20772                 break;
20773             case NM_SW:
20774                 gen_st(ctx, OPC_SW, rt, rs, u);
20775                 break;
20776             case NM_LWC1:
20777                 gen_cop1_ldst(ctx, OPC_LWC1, rt, rs, u);
20778                 break;
20779             case NM_LDC1:
20780                 gen_cop1_ldst(ctx, OPC_LDC1, rt, rs, u);
20781                 break;
20782             case NM_SWC1:
20783                 gen_cop1_ldst(ctx, OPC_SWC1, rt, rs, u);
20784                 break;
20785             case NM_SDC1:
20786                 gen_cop1_ldst(ctx, OPC_SDC1, rt, rs, u);
20787                 break;
20788             default:
20789                 gen_reserved_instruction(ctx);
20790                 break;
20791             }
20792         }
20793         break;
20794     case NM_P_LS_S9:
20795         {
20796             int32_t s = (sextract32(ctx->opcode, 15, 1) << 8) |
20797                         extract32(ctx->opcode, 0, 8);
20798 
20799             switch (extract32(ctx->opcode, 8, 3)) {
20800             case NM_P_LS_S0:
20801                 switch (extract32(ctx->opcode, 11, 4)) {
20802                 case NM_LBS9:
20803                     gen_ld(ctx, OPC_LB, rt, rs, s);
20804                     break;
20805                 case NM_LHS9:
20806                     gen_ld(ctx, OPC_LH, rt, rs, s);
20807                     break;
20808                 case NM_LWS9:
20809                     gen_ld(ctx, OPC_LW, rt, rs, s);
20810                     break;
20811                 case NM_LBUS9:
20812                     gen_ld(ctx, OPC_LBU, rt, rs, s);
20813                     break;
20814                 case NM_LHUS9:
20815                     gen_ld(ctx, OPC_LHU, rt, rs, s);
20816                     break;
20817                 case NM_SBS9:
20818                     gen_st(ctx, OPC_SB, rt, rs, s);
20819                     break;
20820                 case NM_SHS9:
20821                     gen_st(ctx, OPC_SH, rt, rs, s);
20822                     break;
20823                 case NM_SWS9:
20824                     gen_st(ctx, OPC_SW, rt, rs, s);
20825                     break;
20826                 case NM_LWC1S9:
20827                     gen_cop1_ldst(ctx, OPC_LWC1, rt, rs, s);
20828                     break;
20829                 case NM_LDC1S9:
20830                     gen_cop1_ldst(ctx, OPC_LDC1, rt, rs, s);
20831                     break;
20832                 case NM_SWC1S9:
20833                     gen_cop1_ldst(ctx, OPC_SWC1, rt, rs, s);
20834                     break;
20835                 case NM_SDC1S9:
20836                     gen_cop1_ldst(ctx, OPC_SDC1, rt, rs, s);
20837                     break;
20838                 case NM_P_PREFS9:
20839                     if (rt == 31) {
20840                         /* SYNCI */
20841                         /*
20842                          * Break the TB to be able to sync copied instructions
20843                          * immediately.
20844                          */
20845                         ctx->base.is_jmp = DISAS_STOP;
20846                     } else {
20847                         /* PREF */
20848                         /* Treat as NOP. */
20849                     }
20850                     break;
20851                 default:
20852                     gen_reserved_instruction(ctx);
20853                     break;
20854                 }
20855                 break;
20856             case NM_P_LS_S1:
20857                 switch (extract32(ctx->opcode, 11, 4)) {
20858                 case NM_UALH:
20859                 case NM_UASH:
20860                     check_nms(ctx);
20861                     {
20862                         TCGv t0 = tcg_temp_new();
20863                         TCGv t1 = tcg_temp_new();
20864 
20865                         gen_base_offset_addr(ctx, t0, rs, s);
20866 
20867                         switch (extract32(ctx->opcode, 11, 4)) {
20868                         case NM_UALH:
20869                             tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESW |
20870                                                MO_UNALN);
20871                             gen_store_gpr(t0, rt);
20872                             break;
20873                         case NM_UASH:
20874                             gen_load_gpr(t1, rt);
20875                             tcg_gen_qemu_st_tl(t1, t0, ctx->mem_idx, MO_TEUW |
20876                                                MO_UNALN);
20877                             break;
20878                         }
20879                         tcg_temp_free(t0);
20880                         tcg_temp_free(t1);
20881                     }
20882                     break;
20883                 case NM_P_LL:
20884                     switch (ctx->opcode & 0x03) {
20885                     case NM_LL:
20886                         gen_ld(ctx, OPC_LL, rt, rs, s);
20887                         break;
20888                     case NM_LLWP:
20889                         check_xnp(ctx);
20890                         gen_llwp(ctx, rs, 0, rt, extract32(ctx->opcode, 3, 5));
20891                         break;
20892                     }
20893                     break;
20894                 case NM_P_SC:
20895                     switch (ctx->opcode & 0x03) {
20896                     case NM_SC:
20897                         gen_st_cond(ctx, rt, rs, s, MO_TESL, false);
20898                         break;
20899                     case NM_SCWP:
20900                         check_xnp(ctx);
20901                         gen_scwp(ctx, rs, 0, rt, extract32(ctx->opcode, 3, 5),
20902                                  false);
20903                         break;
20904                     }
20905                     break;
20906                 case NM_CACHE:
20907                     check_cp0_enabled(ctx);
20908                     if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
20909                         gen_cache_operation(ctx, rt, rs, s);
20910                     }
20911                     break;
20912                 }
20913                 break;
20914             case NM_P_LS_E0:
20915                 switch (extract32(ctx->opcode, 11, 4)) {
20916                 case NM_LBE:
20917                     check_eva(ctx);
20918                     check_cp0_enabled(ctx);
20919                     gen_ld(ctx, OPC_LBE, rt, rs, s);
20920                     break;
20921                 case NM_SBE:
20922                     check_eva(ctx);
20923                     check_cp0_enabled(ctx);
20924                     gen_st(ctx, OPC_SBE, rt, rs, s);
20925                     break;
20926                 case NM_LBUE:
20927                     check_eva(ctx);
20928                     check_cp0_enabled(ctx);
20929                     gen_ld(ctx, OPC_LBUE, rt, rs, s);
20930                     break;
20931                 case NM_P_PREFE:
20932                     if (rt == 31) {
20933                         /* case NM_SYNCIE */
20934                         check_eva(ctx);
20935                         check_cp0_enabled(ctx);
20936                         /*
20937                          * Break the TB to be able to sync copied instructions
20938                          * immediately.
20939                          */
20940                         ctx->base.is_jmp = DISAS_STOP;
20941                     } else {
20942                         /* case NM_PREFE */
20943                         check_eva(ctx);
20944                         check_cp0_enabled(ctx);
20945                         /* Treat as NOP. */
20946                     }
20947                     break;
20948                 case NM_LHE:
20949                     check_eva(ctx);
20950                     check_cp0_enabled(ctx);
20951                     gen_ld(ctx, OPC_LHE, rt, rs, s);
20952                     break;
20953                 case NM_SHE:
20954                     check_eva(ctx);
20955                     check_cp0_enabled(ctx);
20956                     gen_st(ctx, OPC_SHE, rt, rs, s);
20957                     break;
20958                 case NM_LHUE:
20959                     check_eva(ctx);
20960                     check_cp0_enabled(ctx);
20961                     gen_ld(ctx, OPC_LHUE, rt, rs, s);
20962                     break;
20963                 case NM_CACHEE:
20964                     check_eva(ctx);
20965                     check_cp0_enabled(ctx);
20966                     check_nms_dl_il_sl_tl_l2c(ctx);
20967                     gen_cache_operation(ctx, rt, rs, s);
20968                     break;
20969                 case NM_LWE:
20970                     check_eva(ctx);
20971                     check_cp0_enabled(ctx);
20972                     gen_ld(ctx, OPC_LWE, rt, rs, s);
20973                     break;
20974                 case NM_SWE:
20975                     check_eva(ctx);
20976                     check_cp0_enabled(ctx);
20977                     gen_st(ctx, OPC_SWE, rt, rs, s);
20978                     break;
20979                 case NM_P_LLE:
20980                     switch (extract32(ctx->opcode, 2, 2)) {
20981                     case NM_LLE:
20982                         check_xnp(ctx);
20983                         check_eva(ctx);
20984                         check_cp0_enabled(ctx);
20985                         gen_ld(ctx, OPC_LLE, rt, rs, s);
20986                         break;
20987                     case NM_LLWPE:
20988                         check_xnp(ctx);
20989                         check_eva(ctx);
20990                         check_cp0_enabled(ctx);
20991                         gen_llwp(ctx, rs, 0, rt, extract32(ctx->opcode, 3, 5));
20992                         break;
20993                     default:
20994                         gen_reserved_instruction(ctx);
20995                         break;
20996                     }
20997                     break;
20998                 case NM_P_SCE:
20999                     switch (extract32(ctx->opcode, 2, 2)) {
21000                     case NM_SCE:
21001                         check_xnp(ctx);
21002                         check_eva(ctx);
21003                         check_cp0_enabled(ctx);
21004                         gen_st_cond(ctx, rt, rs, s, MO_TESL, true);
21005                         break;
21006                     case NM_SCWPE:
21007                         check_xnp(ctx);
21008                         check_eva(ctx);
21009                         check_cp0_enabled(ctx);
21010                         gen_scwp(ctx, rs, 0, rt, extract32(ctx->opcode, 3, 5),
21011                                  true);
21012                         break;
21013                     default:
21014                         gen_reserved_instruction(ctx);
21015                         break;
21016                     }
21017                     break;
21018                 }
21019                 break;
21020             case NM_P_LS_WM:
21021             case NM_P_LS_UAWM:
21022                 check_nms(ctx);
21023                 {
21024                     int count = extract32(ctx->opcode, 12, 3);
21025                     int counter = 0;
21026 
21027                     offset = sextract32(ctx->opcode, 15, 1) << 8 |
21028                              extract32(ctx->opcode, 0, 8);
21029                     TCGv va = tcg_temp_new();
21030                     TCGv t1 = tcg_temp_new();
21031                     MemOp memop = (extract32(ctx->opcode, 8, 3)) ==
21032                                       NM_P_LS_UAWM ? MO_UNALN : 0;
21033 
21034                     count = (count == 0) ? 8 : count;
21035                     while (counter != count) {
21036                         int this_rt = ((rt + counter) & 0x1f) | (rt & 0x10);
21037                         int this_offset = offset + (counter << 2);
21038 
21039                         gen_base_offset_addr(ctx, va, rs, this_offset);
21040 
21041                         switch (extract32(ctx->opcode, 11, 1)) {
21042                         case NM_LWM:
21043                             tcg_gen_qemu_ld_tl(t1, va, ctx->mem_idx,
21044                                                memop | MO_TESL);
21045                             gen_store_gpr(t1, this_rt);
21046                             if ((this_rt == rs) &&
21047                                 (counter != (count - 1))) {
21048                                 /* UNPREDICTABLE */
21049                             }
21050                             break;
21051                         case NM_SWM:
21052                             this_rt = (rt == 0) ? 0 : this_rt;
21053                             gen_load_gpr(t1, this_rt);
21054                             tcg_gen_qemu_st_tl(t1, va, ctx->mem_idx,
21055                                                memop | MO_TEUL);
21056                             break;
21057                         }
21058                         counter++;
21059                     }
21060                     tcg_temp_free(va);
21061                     tcg_temp_free(t1);
21062                 }
21063                 break;
21064             default:
21065                 gen_reserved_instruction(ctx);
21066                 break;
21067             }
21068         }
21069         break;
21070     case NM_MOVE_BALC:
21071         check_nms(ctx);
21072         {
21073             TCGv t0 = tcg_temp_new();
21074             int32_t s = sextract32(ctx->opcode, 0, 1) << 21 |
21075                         extract32(ctx->opcode, 1, 20) << 1;
21076             rd = (extract32(ctx->opcode, 24, 1)) == 0 ? 4 : 5;
21077             rt = decode_gpr_gpr4_zero(extract32(ctx->opcode, 25, 1) << 3 |
21078                             extract32(ctx->opcode, 21, 3));
21079             gen_load_gpr(t0, rt);
21080             tcg_gen_mov_tl(cpu_gpr[rd], t0);
21081             gen_compute_branch_nm(ctx, OPC_BGEZAL, 4, 0, 0, s);
21082             tcg_temp_free(t0);
21083         }
21084         break;
21085     case NM_P_BAL:
21086         {
21087             int32_t s = sextract32(ctx->opcode, 0, 1) << 25 |
21088                         extract32(ctx->opcode, 1, 24) << 1;
21089 
21090             if ((extract32(ctx->opcode, 25, 1)) == 0) {
21091                 /* BC */
21092                 gen_compute_branch_nm(ctx, OPC_BEQ, 4, 0, 0, s);
21093             } else {
21094                 /* BALC */
21095                 gen_compute_branch_nm(ctx, OPC_BGEZAL, 4, 0, 0, s);
21096             }
21097         }
21098         break;
21099     case NM_P_J:
21100         switch (extract32(ctx->opcode, 12, 4)) {
21101         case NM_JALRC:
21102         case NM_JALRC_HB:
21103             gen_compute_branch_nm(ctx, OPC_JALR, 4, rs, rt, 0);
21104             break;
21105         case NM_P_BALRSC:
21106             gen_compute_nanomips_pbalrsc_branch(ctx, rs, rt);
21107             break;
21108         default:
21109             gen_reserved_instruction(ctx);
21110             break;
21111         }
21112         break;
21113     case NM_P_BR1:
21114         {
21115             int32_t s = sextract32(ctx->opcode, 0, 1) << 14 |
21116                         extract32(ctx->opcode, 1, 13) << 1;
21117             switch (extract32(ctx->opcode, 14, 2)) {
21118             case NM_BEQC:
21119                 check_nms(ctx);
21120                 gen_compute_branch_nm(ctx, OPC_BEQ, 4, rs, rt, s);
21121                 break;
21122             case NM_P_BR3A:
21123                 s = sextract32(ctx->opcode, 0, 1) << 14 |
21124                     extract32(ctx->opcode, 1, 13) << 1;
21125                 check_cp1_enabled(ctx);
21126                 switch (extract32(ctx->opcode, 16, 5)) {
21127                 case NM_BC1EQZC:
21128                     gen_compute_branch_cp1_nm(ctx, OPC_BC1EQZ, rt, s);
21129                     break;
21130                 case NM_BC1NEZC:
21131                     gen_compute_branch_cp1_nm(ctx, OPC_BC1NEZ, rt, s);
21132                     break;
21133                 case NM_BPOSGE32C:
21134                     check_dsp_r3(ctx);
21135                     {
21136                         int32_t imm = extract32(ctx->opcode, 1, 13) |
21137                                       extract32(ctx->opcode, 0, 1) << 13;
21138 
21139                         gen_compute_branch_nm(ctx, OPC_BPOSGE32, 4, -1, -2,
21140                                               imm << 1);
21141                     }
21142                     break;
21143                 default:
21144                     gen_reserved_instruction(ctx);
21145                     break;
21146                 }
21147                 break;
21148             case NM_BGEC:
21149                 if (rs == rt) {
21150                     gen_compute_compact_branch_nm(ctx, OPC_BC, rs, rt, s);
21151                 } else {
21152                     gen_compute_compact_branch_nm(ctx, OPC_BGEC, rs, rt, s);
21153                 }
21154                 break;
21155             case NM_BGEUC:
21156                 if (rs == rt || rt == 0) {
21157                     gen_compute_compact_branch_nm(ctx, OPC_BC, 0, 0, s);
21158                 } else if (rs == 0) {
21159                     gen_compute_compact_branch_nm(ctx, OPC_BEQZC, rt, 0, s);
21160                 } else {
21161                     gen_compute_compact_branch_nm(ctx, OPC_BGEUC, rs, rt, s);
21162                 }
21163                 break;
21164             }
21165         }
21166         break;
21167     case NM_P_BR2:
21168         {
21169             int32_t s = sextract32(ctx->opcode, 0, 1) << 14 |
21170                         extract32(ctx->opcode, 1, 13) << 1;
21171             switch (extract32(ctx->opcode, 14, 2)) {
21172             case NM_BNEC:
21173                 check_nms(ctx);
21174                 gen_compute_branch_nm(ctx, OPC_BNE, 4, rs, rt, s);
21175                 break;
21176             case NM_BLTC:
21177                 if (rs != 0 && rt != 0 && rs == rt) {
21178                     /* NOP */
21179                     ctx->hflags |= MIPS_HFLAG_FBNSLOT;
21180                 } else {
21181                     gen_compute_compact_branch_nm(ctx, OPC_BLTC, rs, rt, s);
21182                 }
21183                 break;
21184             case NM_BLTUC:
21185                 if (rs == 0 || rs == rt) {
21186                     /* NOP */
21187                     ctx->hflags |= MIPS_HFLAG_FBNSLOT;
21188                 } else {
21189                     gen_compute_compact_branch_nm(ctx, OPC_BLTUC, rs, rt, s);
21190                 }
21191                 break;
21192             default:
21193                 gen_reserved_instruction(ctx);
21194                 break;
21195             }
21196         }
21197         break;
21198     case NM_P_BRI:
21199         {
21200             int32_t s = sextract32(ctx->opcode, 0, 1) << 11 |
21201                         extract32(ctx->opcode, 1, 10) << 1;
21202             uint32_t u = extract32(ctx->opcode, 11, 7);
21203 
21204             gen_compute_imm_branch(ctx, extract32(ctx->opcode, 18, 3),
21205                                    rt, u, s);
21206         }
21207         break;
21208     default:
21209         gen_reserved_instruction(ctx);
21210         break;
21211     }
21212     return 4;
21213 }
21214 
21215 static int decode_nanomips_opc(CPUMIPSState *env, DisasContext *ctx)
21216 {
21217     uint32_t op;
21218     int rt = decode_gpr_gpr3(NANOMIPS_EXTRACT_RT3(ctx->opcode));
21219     int rs = decode_gpr_gpr3(NANOMIPS_EXTRACT_RS3(ctx->opcode));
21220     int rd = decode_gpr_gpr3(NANOMIPS_EXTRACT_RD3(ctx->opcode));
21221     int offset;
21222     int imm;
21223 
21224     /* make sure instructions are on a halfword boundary */
21225     if (ctx->base.pc_next & 0x1) {
21226         TCGv tmp = tcg_const_tl(ctx->base.pc_next);
21227         tcg_gen_st_tl(tmp, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));
21228         tcg_temp_free(tmp);
21229         generate_exception_end(ctx, EXCP_AdEL);
21230         return 2;
21231     }
21232 
21233     op = extract32(ctx->opcode, 10, 6);
21234     switch (op) {
21235     case NM_P16_MV:
21236         rt = NANOMIPS_EXTRACT_RD5(ctx->opcode);
21237         if (rt != 0) {
21238             /* MOVE */
21239             rs = NANOMIPS_EXTRACT_RS5(ctx->opcode);
21240             gen_arith(ctx, OPC_ADDU, rt, rs, 0);
21241         } else {
21242             /* P16.RI */
21243             switch (extract32(ctx->opcode, 3, 2)) {
21244             case NM_P16_SYSCALL:
21245                 if (extract32(ctx->opcode, 2, 1) == 0) {
21246                     generate_exception_end(ctx, EXCP_SYSCALL);
21247                 } else {
21248                     gen_reserved_instruction(ctx);
21249                 }
21250                 break;
21251             case NM_BREAK16:
21252                 generate_exception_end(ctx, EXCP_BREAK);
21253                 break;
21254             case NM_SDBBP16:
21255                 if (is_uhi(extract32(ctx->opcode, 0, 3))) {
21256                     gen_helper_do_semihosting(cpu_env);
21257                 } else {
21258                     if (ctx->hflags & MIPS_HFLAG_SBRI) {
21259                         gen_reserved_instruction(ctx);
21260                     } else {
21261                         generate_exception_end(ctx, EXCP_DBp);
21262                     }
21263                 }
21264                 break;
21265             default:
21266                 gen_reserved_instruction(ctx);
21267                 break;
21268             }
21269         }
21270         break;
21271     case NM_P16_SHIFT:
21272         {
21273             int shift = extract32(ctx->opcode, 0, 3);
21274             uint32_t opc = 0;
21275             shift = (shift == 0) ? 8 : shift;
21276 
21277             switch (extract32(ctx->opcode, 3, 1)) {
21278             case NM_SLL16:
21279                 opc = OPC_SLL;
21280                 break;
21281             case NM_SRL16:
21282                 opc = OPC_SRL;
21283                 break;
21284             }
21285             gen_shift_imm(ctx, opc, rt, rs, shift);
21286         }
21287         break;
21288     case NM_P16C:
21289         switch (ctx->opcode & 1) {
21290         case NM_POOL16C_0:
21291             gen_pool16c_nanomips_insn(ctx);
21292             break;
21293         case NM_LWXS16:
21294             gen_ldxs(ctx, rt, rs, rd);
21295             break;
21296         }
21297         break;
21298     case NM_P16_A1:
21299         switch (extract32(ctx->opcode, 6, 1)) {
21300         case NM_ADDIUR1SP:
21301             imm = extract32(ctx->opcode, 0, 6) << 2;
21302             gen_arith_imm(ctx, OPC_ADDIU, rt, 29, imm);
21303             break;
21304         default:
21305             gen_reserved_instruction(ctx);
21306             break;
21307         }
21308         break;
21309     case NM_P16_A2:
21310         switch (extract32(ctx->opcode, 3, 1)) {
21311         case NM_ADDIUR2:
21312             imm = extract32(ctx->opcode, 0, 3) << 2;
21313             gen_arith_imm(ctx, OPC_ADDIU, rt, rs, imm);
21314             break;
21315         case NM_P_ADDIURS5:
21316             rt = extract32(ctx->opcode, 5, 5);
21317             if (rt != 0) {
21318                 /* imm = sign_extend(s[3] . s[2:0] , from_nbits = 4) */
21319                 imm = (sextract32(ctx->opcode, 4, 1) << 3) |
21320                       (extract32(ctx->opcode, 0, 3));
21321                 gen_arith_imm(ctx, OPC_ADDIU, rt, rt, imm);
21322             }
21323             break;
21324         }
21325         break;
21326     case NM_P16_ADDU:
21327         switch (ctx->opcode & 0x1) {
21328         case NM_ADDU16:
21329             gen_arith(ctx, OPC_ADDU, rd, rs, rt);
21330             break;
21331         case NM_SUBU16:
21332             gen_arith(ctx, OPC_SUBU, rd, rs, rt);
21333             break;
21334         }
21335         break;
21336     case NM_P16_4X4:
21337         rt = (extract32(ctx->opcode, 9, 1) << 3) |
21338               extract32(ctx->opcode, 5, 3);
21339         rs = (extract32(ctx->opcode, 4, 1) << 3) |
21340               extract32(ctx->opcode, 0, 3);
21341         rt = decode_gpr_gpr4(rt);
21342         rs = decode_gpr_gpr4(rs);
21343         switch ((extract32(ctx->opcode, 7, 2) & 0x2) |
21344                 (extract32(ctx->opcode, 3, 1))) {
21345         case NM_ADDU4X4:
21346             check_nms(ctx);
21347             gen_arith(ctx, OPC_ADDU, rt, rs, rt);
21348             break;
21349         case NM_MUL4X4:
21350             check_nms(ctx);
21351             gen_r6_muldiv(ctx, R6_OPC_MUL, rt, rs, rt);
21352             break;
21353         default:
21354             gen_reserved_instruction(ctx);
21355             break;
21356         }
21357         break;
21358     case NM_LI16:
21359         {
21360             int imm = extract32(ctx->opcode, 0, 7);
21361             imm = (imm == 0x7f ? -1 : imm);
21362             if (rt != 0) {
21363                 tcg_gen_movi_tl(cpu_gpr[rt], imm);
21364             }
21365         }
21366         break;
21367     case NM_ANDI16:
21368         {
21369             uint32_t u = extract32(ctx->opcode, 0, 4);
21370             u = (u == 12) ? 0xff :
21371                 (u == 13) ? 0xffff : u;
21372             gen_logic_imm(ctx, OPC_ANDI, rt, rs, u);
21373         }
21374         break;
21375     case NM_P16_LB:
21376         offset = extract32(ctx->opcode, 0, 2);
21377         switch (extract32(ctx->opcode, 2, 2)) {
21378         case NM_LB16:
21379             gen_ld(ctx, OPC_LB, rt, rs, offset);
21380             break;
21381         case NM_SB16:
21382             rt = decode_gpr_gpr3_src_store(
21383                      NANOMIPS_EXTRACT_RT3(ctx->opcode));
21384             gen_st(ctx, OPC_SB, rt, rs, offset);
21385             break;
21386         case NM_LBU16:
21387             gen_ld(ctx, OPC_LBU, rt, rs, offset);
21388             break;
21389         default:
21390             gen_reserved_instruction(ctx);
21391             break;
21392         }
21393         break;
21394     case NM_P16_LH:
21395         offset = extract32(ctx->opcode, 1, 2) << 1;
21396         switch ((extract32(ctx->opcode, 3, 1) << 1) | (ctx->opcode & 1)) {
21397         case NM_LH16:
21398             gen_ld(ctx, OPC_LH, rt, rs, offset);
21399             break;
21400         case NM_SH16:
21401             rt = decode_gpr_gpr3_src_store(
21402                      NANOMIPS_EXTRACT_RT3(ctx->opcode));
21403             gen_st(ctx, OPC_SH, rt, rs, offset);
21404             break;
21405         case NM_LHU16:
21406             gen_ld(ctx, OPC_LHU, rt, rs, offset);
21407             break;
21408         default:
21409             gen_reserved_instruction(ctx);
21410             break;
21411         }
21412         break;
21413     case NM_LW16:
21414         offset = extract32(ctx->opcode, 0, 4) << 2;
21415         gen_ld(ctx, OPC_LW, rt, rs, offset);
21416         break;
21417     case NM_LWSP16:
21418         rt = NANOMIPS_EXTRACT_RD5(ctx->opcode);
21419         offset = extract32(ctx->opcode, 0, 5) << 2;
21420         gen_ld(ctx, OPC_LW, rt, 29, offset);
21421         break;
21422     case NM_LW4X4:
21423         check_nms(ctx);
21424         rt = (extract32(ctx->opcode, 9, 1) << 3) |
21425              extract32(ctx->opcode, 5, 3);
21426         rs = (extract32(ctx->opcode, 4, 1) << 3) |
21427              extract32(ctx->opcode, 0, 3);
21428         offset = (extract32(ctx->opcode, 3, 1) << 3) |
21429                  (extract32(ctx->opcode, 8, 1) << 2);
21430         rt = decode_gpr_gpr4(rt);
21431         rs = decode_gpr_gpr4(rs);
21432         gen_ld(ctx, OPC_LW, rt, rs, offset);
21433         break;
21434     case NM_SW4X4:
21435         check_nms(ctx);
21436         rt = (extract32(ctx->opcode, 9, 1) << 3) |
21437              extract32(ctx->opcode, 5, 3);
21438         rs = (extract32(ctx->opcode, 4, 1) << 3) |
21439              extract32(ctx->opcode, 0, 3);
21440         offset = (extract32(ctx->opcode, 3, 1) << 3) |
21441                  (extract32(ctx->opcode, 8, 1) << 2);
21442         rt = decode_gpr_gpr4_zero(rt);
21443         rs = decode_gpr_gpr4(rs);
21444         gen_st(ctx, OPC_SW, rt, rs, offset);
21445         break;
21446     case NM_LWGP16:
21447         offset = extract32(ctx->opcode, 0, 7) << 2;
21448         gen_ld(ctx, OPC_LW, rt, 28, offset);
21449         break;
21450     case NM_SWSP16:
21451         rt = NANOMIPS_EXTRACT_RD5(ctx->opcode);
21452         offset = extract32(ctx->opcode, 0, 5) << 2;
21453         gen_st(ctx, OPC_SW, rt, 29, offset);
21454         break;
21455     case NM_SW16:
21456         rt = decode_gpr_gpr3_src_store(
21457                  NANOMIPS_EXTRACT_RT3(ctx->opcode));
21458         rs = decode_gpr_gpr3(NANOMIPS_EXTRACT_RS3(ctx->opcode));
21459         offset = extract32(ctx->opcode, 0, 4) << 2;
21460         gen_st(ctx, OPC_SW, rt, rs, offset);
21461         break;
21462     case NM_SWGP16:
21463         rt = decode_gpr_gpr3_src_store(
21464                  NANOMIPS_EXTRACT_RT3(ctx->opcode));
21465         offset = extract32(ctx->opcode, 0, 7) << 2;
21466         gen_st(ctx, OPC_SW, rt, 28, offset);
21467         break;
21468     case NM_BC16:
21469         gen_compute_branch_nm(ctx, OPC_BEQ, 2, 0, 0,
21470                            (sextract32(ctx->opcode, 0, 1) << 10) |
21471                            (extract32(ctx->opcode, 1, 9) << 1));
21472         break;
21473     case NM_BALC16:
21474         gen_compute_branch_nm(ctx, OPC_BGEZAL, 2, 0, 0,
21475                            (sextract32(ctx->opcode, 0, 1) << 10) |
21476                            (extract32(ctx->opcode, 1, 9) << 1));
21477         break;
21478     case NM_BEQZC16:
21479         gen_compute_branch_nm(ctx, OPC_BEQ, 2, rt, 0,
21480                            (sextract32(ctx->opcode, 0, 1) << 7) |
21481                            (extract32(ctx->opcode, 1, 6) << 1));
21482         break;
21483     case NM_BNEZC16:
21484         gen_compute_branch_nm(ctx, OPC_BNE, 2, rt, 0,
21485                            (sextract32(ctx->opcode, 0, 1) << 7) |
21486                            (extract32(ctx->opcode, 1, 6) << 1));
21487         break;
21488     case NM_P16_BR:
21489         switch (ctx->opcode & 0xf) {
21490         case 0:
21491             /* P16.JRC */
21492             switch (extract32(ctx->opcode, 4, 1)) {
21493             case NM_JRC:
21494                 gen_compute_branch_nm(ctx, OPC_JR, 2,
21495                                    extract32(ctx->opcode, 5, 5), 0, 0);
21496                 break;
21497             case NM_JALRC16:
21498                 gen_compute_branch_nm(ctx, OPC_JALR, 2,
21499                                    extract32(ctx->opcode, 5, 5), 31, 0);
21500                 break;
21501             }
21502             break;
21503         default:
21504             {
21505                 /* P16.BRI */
21506                 uint32_t opc = extract32(ctx->opcode, 4, 3) <
21507                                extract32(ctx->opcode, 7, 3) ? OPC_BEQ : OPC_BNE;
21508                 gen_compute_branch_nm(ctx, opc, 2, rs, rt,
21509                                    extract32(ctx->opcode, 0, 4) << 1);
21510             }
21511             break;
21512         }
21513         break;
21514     case NM_P16_SR:
21515         {
21516             int count = extract32(ctx->opcode, 0, 4);
21517             int u = extract32(ctx->opcode, 4, 4) << 4;
21518 
21519             rt = 30 + extract32(ctx->opcode, 9, 1);
21520             switch (extract32(ctx->opcode, 8, 1)) {
21521             case NM_SAVE16:
21522                 gen_save(ctx, rt, count, 0, u);
21523                 break;
21524             case NM_RESTORE_JRC16:
21525                 gen_restore(ctx, rt, count, 0, u);
21526                 gen_compute_branch_nm(ctx, OPC_JR, 2, 31, 0, 0);
21527                 break;
21528             }
21529         }
21530         break;
21531     case NM_MOVEP:
21532     case NM_MOVEPREV:
21533         check_nms(ctx);
21534         {
21535             static const int gpr2reg1[] = {4, 5, 6, 7};
21536             static const int gpr2reg2[] = {5, 6, 7, 8};
21537             int re;
21538             int rd2 = extract32(ctx->opcode, 3, 1) << 1 |
21539                       extract32(ctx->opcode, 8, 1);
21540             int r1 = gpr2reg1[rd2];
21541             int r2 = gpr2reg2[rd2];
21542             int r3 = extract32(ctx->opcode, 4, 1) << 3 |
21543                      extract32(ctx->opcode, 0, 3);
21544             int r4 = extract32(ctx->opcode, 9, 1) << 3 |
21545                      extract32(ctx->opcode, 5, 3);
21546             TCGv t0 = tcg_temp_new();
21547             TCGv t1 = tcg_temp_new();
21548             if (op == NM_MOVEP) {
21549                 rd = r1;
21550                 re = r2;
21551                 rs = decode_gpr_gpr4_zero(r3);
21552                 rt = decode_gpr_gpr4_zero(r4);
21553             } else {
21554                 rd = decode_gpr_gpr4(r3);
21555                 re = decode_gpr_gpr4(r4);
21556                 rs = r1;
21557                 rt = r2;
21558             }
21559             gen_load_gpr(t0, rs);
21560             gen_load_gpr(t1, rt);
21561             tcg_gen_mov_tl(cpu_gpr[rd], t0);
21562             tcg_gen_mov_tl(cpu_gpr[re], t1);
21563             tcg_temp_free(t0);
21564             tcg_temp_free(t1);
21565         }
21566         break;
21567     default:
21568         return decode_nanomips_32_48_opc(env, ctx);
21569     }
21570 
21571     return 2;
21572 }
21573 
21574 
21575 /* MIPSDSP functions. */
21576 static void gen_mipsdsp_ld(DisasContext *ctx, uint32_t opc,
21577                            int rd, int base, int offset)
21578 {
21579     TCGv t0;
21580 
21581     check_dsp(ctx);
21582     t0 = tcg_temp_new();
21583 
21584     if (base == 0) {
21585         gen_load_gpr(t0, offset);
21586     } else if (offset == 0) {
21587         gen_load_gpr(t0, base);
21588     } else {
21589         gen_op_addr_add(ctx, t0, cpu_gpr[base], cpu_gpr[offset]);
21590     }
21591 
21592     switch (opc) {
21593     case OPC_LBUX:
21594         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_UB);
21595         gen_store_gpr(t0, rd);
21596         break;
21597     case OPC_LHX:
21598         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESW);
21599         gen_store_gpr(t0, rd);
21600         break;
21601     case OPC_LWX:
21602         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TESL);
21603         gen_store_gpr(t0, rd);
21604         break;
21605 #if defined(TARGET_MIPS64)
21606     case OPC_LDX:
21607         tcg_gen_qemu_ld_tl(t0, t0, ctx->mem_idx, MO_TEQ);
21608         gen_store_gpr(t0, rd);
21609         break;
21610 #endif
21611     }
21612     tcg_temp_free(t0);
21613 }
21614 
21615 static void gen_mipsdsp_arith(DisasContext *ctx, uint32_t op1, uint32_t op2,
21616                               int ret, int v1, int v2)
21617 {
21618     TCGv v1_t;
21619     TCGv v2_t;
21620 
21621     if (ret == 0) {
21622         /* Treat as NOP. */
21623         return;
21624     }
21625 
21626     v1_t = tcg_temp_new();
21627     v2_t = tcg_temp_new();
21628 
21629     gen_load_gpr(v1_t, v1);
21630     gen_load_gpr(v2_t, v2);
21631 
21632     switch (op1) {
21633     /* OPC_MULT_G_2E is equal OPC_ADDUH_QB_DSP */
21634     case OPC_MULT_G_2E:
21635         check_dsp_r2(ctx);
21636         switch (op2) {
21637         case OPC_ADDUH_QB:
21638             gen_helper_adduh_qb(cpu_gpr[ret], v1_t, v2_t);
21639             break;
21640         case OPC_ADDUH_R_QB:
21641             gen_helper_adduh_r_qb(cpu_gpr[ret], v1_t, v2_t);
21642             break;
21643         case OPC_ADDQH_PH:
21644             gen_helper_addqh_ph(cpu_gpr[ret], v1_t, v2_t);
21645             break;
21646         case OPC_ADDQH_R_PH:
21647             gen_helper_addqh_r_ph(cpu_gpr[ret], v1_t, v2_t);
21648             break;
21649         case OPC_ADDQH_W:
21650             gen_helper_addqh_w(cpu_gpr[ret], v1_t, v2_t);
21651             break;
21652         case OPC_ADDQH_R_W:
21653             gen_helper_addqh_r_w(cpu_gpr[ret], v1_t, v2_t);
21654             break;
21655         case OPC_SUBUH_QB:
21656             gen_helper_subuh_qb(cpu_gpr[ret], v1_t, v2_t);
21657             break;
21658         case OPC_SUBUH_R_QB:
21659             gen_helper_subuh_r_qb(cpu_gpr[ret], v1_t, v2_t);
21660             break;
21661         case OPC_SUBQH_PH:
21662             gen_helper_subqh_ph(cpu_gpr[ret], v1_t, v2_t);
21663             break;
21664         case OPC_SUBQH_R_PH:
21665             gen_helper_subqh_r_ph(cpu_gpr[ret], v1_t, v2_t);
21666             break;
21667         case OPC_SUBQH_W:
21668             gen_helper_subqh_w(cpu_gpr[ret], v1_t, v2_t);
21669             break;
21670         case OPC_SUBQH_R_W:
21671             gen_helper_subqh_r_w(cpu_gpr[ret], v1_t, v2_t);
21672             break;
21673         }
21674         break;
21675     case OPC_ABSQ_S_PH_DSP:
21676         switch (op2) {
21677         case OPC_ABSQ_S_QB:
21678             check_dsp_r2(ctx);
21679             gen_helper_absq_s_qb(cpu_gpr[ret], v2_t, cpu_env);
21680             break;
21681         case OPC_ABSQ_S_PH:
21682             check_dsp(ctx);
21683             gen_helper_absq_s_ph(cpu_gpr[ret], v2_t, cpu_env);
21684             break;
21685         case OPC_ABSQ_S_W:
21686             check_dsp(ctx);
21687             gen_helper_absq_s_w(cpu_gpr[ret], v2_t, cpu_env);
21688             break;
21689         case OPC_PRECEQ_W_PHL:
21690             check_dsp(ctx);
21691             tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0xFFFF0000);
21692             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
21693             break;
21694         case OPC_PRECEQ_W_PHR:
21695             check_dsp(ctx);
21696             tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0x0000FFFF);
21697             tcg_gen_shli_tl(cpu_gpr[ret], cpu_gpr[ret], 16);
21698             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
21699             break;
21700         case OPC_PRECEQU_PH_QBL:
21701             check_dsp(ctx);
21702             gen_helper_precequ_ph_qbl(cpu_gpr[ret], v2_t);
21703             break;
21704         case OPC_PRECEQU_PH_QBR:
21705             check_dsp(ctx);
21706             gen_helper_precequ_ph_qbr(cpu_gpr[ret], v2_t);
21707             break;
21708         case OPC_PRECEQU_PH_QBLA:
21709             check_dsp(ctx);
21710             gen_helper_precequ_ph_qbla(cpu_gpr[ret], v2_t);
21711             break;
21712         case OPC_PRECEQU_PH_QBRA:
21713             check_dsp(ctx);
21714             gen_helper_precequ_ph_qbra(cpu_gpr[ret], v2_t);
21715             break;
21716         case OPC_PRECEU_PH_QBL:
21717             check_dsp(ctx);
21718             gen_helper_preceu_ph_qbl(cpu_gpr[ret], v2_t);
21719             break;
21720         case OPC_PRECEU_PH_QBR:
21721             check_dsp(ctx);
21722             gen_helper_preceu_ph_qbr(cpu_gpr[ret], v2_t);
21723             break;
21724         case OPC_PRECEU_PH_QBLA:
21725             check_dsp(ctx);
21726             gen_helper_preceu_ph_qbla(cpu_gpr[ret], v2_t);
21727             break;
21728         case OPC_PRECEU_PH_QBRA:
21729             check_dsp(ctx);
21730             gen_helper_preceu_ph_qbra(cpu_gpr[ret], v2_t);
21731             break;
21732         }
21733         break;
21734     case OPC_ADDU_QB_DSP:
21735         switch (op2) {
21736         case OPC_ADDQ_PH:
21737             check_dsp(ctx);
21738             gen_helper_addq_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21739             break;
21740         case OPC_ADDQ_S_PH:
21741             check_dsp(ctx);
21742             gen_helper_addq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21743             break;
21744         case OPC_ADDQ_S_W:
21745             check_dsp(ctx);
21746             gen_helper_addq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21747             break;
21748         case OPC_ADDU_QB:
21749             check_dsp(ctx);
21750             gen_helper_addu_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21751             break;
21752         case OPC_ADDU_S_QB:
21753             check_dsp(ctx);
21754             gen_helper_addu_s_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21755             break;
21756         case OPC_ADDU_PH:
21757             check_dsp_r2(ctx);
21758             gen_helper_addu_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21759             break;
21760         case OPC_ADDU_S_PH:
21761             check_dsp_r2(ctx);
21762             gen_helper_addu_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21763             break;
21764         case OPC_SUBQ_PH:
21765             check_dsp(ctx);
21766             gen_helper_subq_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21767             break;
21768         case OPC_SUBQ_S_PH:
21769             check_dsp(ctx);
21770             gen_helper_subq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21771             break;
21772         case OPC_SUBQ_S_W:
21773             check_dsp(ctx);
21774             gen_helper_subq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21775             break;
21776         case OPC_SUBU_QB:
21777             check_dsp(ctx);
21778             gen_helper_subu_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21779             break;
21780         case OPC_SUBU_S_QB:
21781             check_dsp(ctx);
21782             gen_helper_subu_s_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21783             break;
21784         case OPC_SUBU_PH:
21785             check_dsp_r2(ctx);
21786             gen_helper_subu_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21787             break;
21788         case OPC_SUBU_S_PH:
21789             check_dsp_r2(ctx);
21790             gen_helper_subu_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21791             break;
21792         case OPC_ADDSC:
21793             check_dsp(ctx);
21794             gen_helper_addsc(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21795             break;
21796         case OPC_ADDWC:
21797             check_dsp(ctx);
21798             gen_helper_addwc(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21799             break;
21800         case OPC_MODSUB:
21801             check_dsp(ctx);
21802             gen_helper_modsub(cpu_gpr[ret], v1_t, v2_t);
21803             break;
21804         case OPC_RADDU_W_QB:
21805             check_dsp(ctx);
21806             gen_helper_raddu_w_qb(cpu_gpr[ret], v1_t);
21807             break;
21808         }
21809         break;
21810     case OPC_CMPU_EQ_QB_DSP:
21811         switch (op2) {
21812         case OPC_PRECR_QB_PH:
21813             check_dsp_r2(ctx);
21814             gen_helper_precr_qb_ph(cpu_gpr[ret], v1_t, v2_t);
21815             break;
21816         case OPC_PRECRQ_QB_PH:
21817             check_dsp(ctx);
21818             gen_helper_precrq_qb_ph(cpu_gpr[ret], v1_t, v2_t);
21819             break;
21820         case OPC_PRECR_SRA_PH_W:
21821             check_dsp_r2(ctx);
21822             {
21823                 TCGv_i32 sa_t = tcg_const_i32(v2);
21824                 gen_helper_precr_sra_ph_w(cpu_gpr[ret], sa_t, v1_t,
21825                                           cpu_gpr[ret]);
21826                 tcg_temp_free_i32(sa_t);
21827                 break;
21828             }
21829         case OPC_PRECR_SRA_R_PH_W:
21830             check_dsp_r2(ctx);
21831             {
21832                 TCGv_i32 sa_t = tcg_const_i32(v2);
21833                 gen_helper_precr_sra_r_ph_w(cpu_gpr[ret], sa_t, v1_t,
21834                                             cpu_gpr[ret]);
21835                 tcg_temp_free_i32(sa_t);
21836                 break;
21837             }
21838         case OPC_PRECRQ_PH_W:
21839             check_dsp(ctx);
21840             gen_helper_precrq_ph_w(cpu_gpr[ret], v1_t, v2_t);
21841             break;
21842         case OPC_PRECRQ_RS_PH_W:
21843             check_dsp(ctx);
21844             gen_helper_precrq_rs_ph_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21845             break;
21846         case OPC_PRECRQU_S_QB_PH:
21847             check_dsp(ctx);
21848             gen_helper_precrqu_s_qb_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21849             break;
21850         }
21851         break;
21852 #ifdef TARGET_MIPS64
21853     case OPC_ABSQ_S_QH_DSP:
21854         switch (op2) {
21855         case OPC_PRECEQ_L_PWL:
21856             check_dsp(ctx);
21857             tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0xFFFFFFFF00000000ull);
21858             break;
21859         case OPC_PRECEQ_L_PWR:
21860             check_dsp(ctx);
21861             tcg_gen_shli_tl(cpu_gpr[ret], v2_t, 32);
21862             break;
21863         case OPC_PRECEQ_PW_QHL:
21864             check_dsp(ctx);
21865             gen_helper_preceq_pw_qhl(cpu_gpr[ret], v2_t);
21866             break;
21867         case OPC_PRECEQ_PW_QHR:
21868             check_dsp(ctx);
21869             gen_helper_preceq_pw_qhr(cpu_gpr[ret], v2_t);
21870             break;
21871         case OPC_PRECEQ_PW_QHLA:
21872             check_dsp(ctx);
21873             gen_helper_preceq_pw_qhla(cpu_gpr[ret], v2_t);
21874             break;
21875         case OPC_PRECEQ_PW_QHRA:
21876             check_dsp(ctx);
21877             gen_helper_preceq_pw_qhra(cpu_gpr[ret], v2_t);
21878             break;
21879         case OPC_PRECEQU_QH_OBL:
21880             check_dsp(ctx);
21881             gen_helper_precequ_qh_obl(cpu_gpr[ret], v2_t);
21882             break;
21883         case OPC_PRECEQU_QH_OBR:
21884             check_dsp(ctx);
21885             gen_helper_precequ_qh_obr(cpu_gpr[ret], v2_t);
21886             break;
21887         case OPC_PRECEQU_QH_OBLA:
21888             check_dsp(ctx);
21889             gen_helper_precequ_qh_obla(cpu_gpr[ret], v2_t);
21890             break;
21891         case OPC_PRECEQU_QH_OBRA:
21892             check_dsp(ctx);
21893             gen_helper_precequ_qh_obra(cpu_gpr[ret], v2_t);
21894             break;
21895         case OPC_PRECEU_QH_OBL:
21896             check_dsp(ctx);
21897             gen_helper_preceu_qh_obl(cpu_gpr[ret], v2_t);
21898             break;
21899         case OPC_PRECEU_QH_OBR:
21900             check_dsp(ctx);
21901             gen_helper_preceu_qh_obr(cpu_gpr[ret], v2_t);
21902             break;
21903         case OPC_PRECEU_QH_OBLA:
21904             check_dsp(ctx);
21905             gen_helper_preceu_qh_obla(cpu_gpr[ret], v2_t);
21906             break;
21907         case OPC_PRECEU_QH_OBRA:
21908             check_dsp(ctx);
21909             gen_helper_preceu_qh_obra(cpu_gpr[ret], v2_t);
21910             break;
21911         case OPC_ABSQ_S_OB:
21912             check_dsp_r2(ctx);
21913             gen_helper_absq_s_ob(cpu_gpr[ret], v2_t, cpu_env);
21914             break;
21915         case OPC_ABSQ_S_PW:
21916             check_dsp(ctx);
21917             gen_helper_absq_s_pw(cpu_gpr[ret], v2_t, cpu_env);
21918             break;
21919         case OPC_ABSQ_S_QH:
21920             check_dsp(ctx);
21921             gen_helper_absq_s_qh(cpu_gpr[ret], v2_t, cpu_env);
21922             break;
21923         }
21924         break;
21925     case OPC_ADDU_OB_DSP:
21926         switch (op2) {
21927         case OPC_RADDU_L_OB:
21928             check_dsp(ctx);
21929             gen_helper_raddu_l_ob(cpu_gpr[ret], v1_t);
21930             break;
21931         case OPC_SUBQ_PW:
21932             check_dsp(ctx);
21933             gen_helper_subq_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21934             break;
21935         case OPC_SUBQ_S_PW:
21936             check_dsp(ctx);
21937             gen_helper_subq_s_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21938             break;
21939         case OPC_SUBQ_QH:
21940             check_dsp(ctx);
21941             gen_helper_subq_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21942             break;
21943         case OPC_SUBQ_S_QH:
21944             check_dsp(ctx);
21945             gen_helper_subq_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21946             break;
21947         case OPC_SUBU_OB:
21948             check_dsp(ctx);
21949             gen_helper_subu_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21950             break;
21951         case OPC_SUBU_S_OB:
21952             check_dsp(ctx);
21953             gen_helper_subu_s_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21954             break;
21955         case OPC_SUBU_QH:
21956             check_dsp_r2(ctx);
21957             gen_helper_subu_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21958             break;
21959         case OPC_SUBU_S_QH:
21960             check_dsp_r2(ctx);
21961             gen_helper_subu_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21962             break;
21963         case OPC_SUBUH_OB:
21964             check_dsp_r2(ctx);
21965             gen_helper_subuh_ob(cpu_gpr[ret], v1_t, v2_t);
21966             break;
21967         case OPC_SUBUH_R_OB:
21968             check_dsp_r2(ctx);
21969             gen_helper_subuh_r_ob(cpu_gpr[ret], v1_t, v2_t);
21970             break;
21971         case OPC_ADDQ_PW:
21972             check_dsp(ctx);
21973             gen_helper_addq_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21974             break;
21975         case OPC_ADDQ_S_PW:
21976             check_dsp(ctx);
21977             gen_helper_addq_s_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21978             break;
21979         case OPC_ADDQ_QH:
21980             check_dsp(ctx);
21981             gen_helper_addq_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21982             break;
21983         case OPC_ADDQ_S_QH:
21984             check_dsp(ctx);
21985             gen_helper_addq_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21986             break;
21987         case OPC_ADDU_OB:
21988             check_dsp(ctx);
21989             gen_helper_addu_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21990             break;
21991         case OPC_ADDU_S_OB:
21992             check_dsp(ctx);
21993             gen_helper_addu_s_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21994             break;
21995         case OPC_ADDU_QH:
21996             check_dsp_r2(ctx);
21997             gen_helper_addu_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
21998             break;
21999         case OPC_ADDU_S_QH:
22000             check_dsp_r2(ctx);
22001             gen_helper_addu_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22002             break;
22003         case OPC_ADDUH_OB:
22004             check_dsp_r2(ctx);
22005             gen_helper_adduh_ob(cpu_gpr[ret], v1_t, v2_t);
22006             break;
22007         case OPC_ADDUH_R_OB:
22008             check_dsp_r2(ctx);
22009             gen_helper_adduh_r_ob(cpu_gpr[ret], v1_t, v2_t);
22010             break;
22011         }
22012         break;
22013     case OPC_CMPU_EQ_OB_DSP:
22014         switch (op2) {
22015         case OPC_PRECR_OB_QH:
22016             check_dsp_r2(ctx);
22017             gen_helper_precr_ob_qh(cpu_gpr[ret], v1_t, v2_t);
22018             break;
22019         case OPC_PRECR_SRA_QH_PW:
22020             check_dsp_r2(ctx);
22021             {
22022                 TCGv_i32 ret_t = tcg_const_i32(ret);
22023                 gen_helper_precr_sra_qh_pw(v2_t, v1_t, v2_t, ret_t);
22024                 tcg_temp_free_i32(ret_t);
22025                 break;
22026             }
22027         case OPC_PRECR_SRA_R_QH_PW:
22028             check_dsp_r2(ctx);
22029             {
22030                 TCGv_i32 sa_v = tcg_const_i32(ret);
22031                 gen_helper_precr_sra_r_qh_pw(v2_t, v1_t, v2_t, sa_v);
22032                 tcg_temp_free_i32(sa_v);
22033                 break;
22034             }
22035         case OPC_PRECRQ_OB_QH:
22036             check_dsp(ctx);
22037             gen_helper_precrq_ob_qh(cpu_gpr[ret], v1_t, v2_t);
22038             break;
22039         case OPC_PRECRQ_PW_L:
22040             check_dsp(ctx);
22041             gen_helper_precrq_pw_l(cpu_gpr[ret], v1_t, v2_t);
22042             break;
22043         case OPC_PRECRQ_QH_PW:
22044             check_dsp(ctx);
22045             gen_helper_precrq_qh_pw(cpu_gpr[ret], v1_t, v2_t);
22046             break;
22047         case OPC_PRECRQ_RS_QH_PW:
22048             check_dsp(ctx);
22049             gen_helper_precrq_rs_qh_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22050             break;
22051         case OPC_PRECRQU_S_OB_QH:
22052             check_dsp(ctx);
22053             gen_helper_precrqu_s_ob_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22054             break;
22055         }
22056         break;
22057 #endif
22058     }
22059 
22060     tcg_temp_free(v1_t);
22061     tcg_temp_free(v2_t);
22062 }
22063 
22064 static void gen_mipsdsp_shift(DisasContext *ctx, uint32_t opc,
22065                               int ret, int v1, int v2)
22066 {
22067     uint32_t op2;
22068     TCGv t0;
22069     TCGv v1_t;
22070     TCGv v2_t;
22071 
22072     if (ret == 0) {
22073         /* Treat as NOP. */
22074         return;
22075     }
22076 
22077     t0 = tcg_temp_new();
22078     v1_t = tcg_temp_new();
22079     v2_t = tcg_temp_new();
22080 
22081     tcg_gen_movi_tl(t0, v1);
22082     gen_load_gpr(v1_t, v1);
22083     gen_load_gpr(v2_t, v2);
22084 
22085     switch (opc) {
22086     case OPC_SHLL_QB_DSP:
22087         {
22088             op2 = MASK_SHLL_QB(ctx->opcode);
22089             switch (op2) {
22090             case OPC_SHLL_QB:
22091                 check_dsp(ctx);
22092                 gen_helper_shll_qb(cpu_gpr[ret], t0, v2_t, cpu_env);
22093                 break;
22094             case OPC_SHLLV_QB:
22095                 check_dsp(ctx);
22096                 gen_helper_shll_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22097                 break;
22098             case OPC_SHLL_PH:
22099                 check_dsp(ctx);
22100                 gen_helper_shll_ph(cpu_gpr[ret], t0, v2_t, cpu_env);
22101                 break;
22102             case OPC_SHLLV_PH:
22103                 check_dsp(ctx);
22104                 gen_helper_shll_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22105                 break;
22106             case OPC_SHLL_S_PH:
22107                 check_dsp(ctx);
22108                 gen_helper_shll_s_ph(cpu_gpr[ret], t0, v2_t, cpu_env);
22109                 break;
22110             case OPC_SHLLV_S_PH:
22111                 check_dsp(ctx);
22112                 gen_helper_shll_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22113                 break;
22114             case OPC_SHLL_S_W:
22115                 check_dsp(ctx);
22116                 gen_helper_shll_s_w(cpu_gpr[ret], t0, v2_t, cpu_env);
22117                 break;
22118             case OPC_SHLLV_S_W:
22119                 check_dsp(ctx);
22120                 gen_helper_shll_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22121                 break;
22122             case OPC_SHRL_QB:
22123                 check_dsp(ctx);
22124                 gen_helper_shrl_qb(cpu_gpr[ret], t0, v2_t);
22125                 break;
22126             case OPC_SHRLV_QB:
22127                 check_dsp(ctx);
22128                 gen_helper_shrl_qb(cpu_gpr[ret], v1_t, v2_t);
22129                 break;
22130             case OPC_SHRL_PH:
22131                 check_dsp_r2(ctx);
22132                 gen_helper_shrl_ph(cpu_gpr[ret], t0, v2_t);
22133                 break;
22134             case OPC_SHRLV_PH:
22135                 check_dsp_r2(ctx);
22136                 gen_helper_shrl_ph(cpu_gpr[ret], v1_t, v2_t);
22137                 break;
22138             case OPC_SHRA_QB:
22139                 check_dsp_r2(ctx);
22140                 gen_helper_shra_qb(cpu_gpr[ret], t0, v2_t);
22141                 break;
22142             case OPC_SHRA_R_QB:
22143                 check_dsp_r2(ctx);
22144                 gen_helper_shra_r_qb(cpu_gpr[ret], t0, v2_t);
22145                 break;
22146             case OPC_SHRAV_QB:
22147                 check_dsp_r2(ctx);
22148                 gen_helper_shra_qb(cpu_gpr[ret], v1_t, v2_t);
22149                 break;
22150             case OPC_SHRAV_R_QB:
22151                 check_dsp_r2(ctx);
22152                 gen_helper_shra_r_qb(cpu_gpr[ret], v1_t, v2_t);
22153                 break;
22154             case OPC_SHRA_PH:
22155                 check_dsp(ctx);
22156                 gen_helper_shra_ph(cpu_gpr[ret], t0, v2_t);
22157                 break;
22158             case OPC_SHRA_R_PH:
22159                 check_dsp(ctx);
22160                 gen_helper_shra_r_ph(cpu_gpr[ret], t0, v2_t);
22161                 break;
22162             case OPC_SHRAV_PH:
22163                 check_dsp(ctx);
22164                 gen_helper_shra_ph(cpu_gpr[ret], v1_t, v2_t);
22165                 break;
22166             case OPC_SHRAV_R_PH:
22167                 check_dsp(ctx);
22168                 gen_helper_shra_r_ph(cpu_gpr[ret], v1_t, v2_t);
22169                 break;
22170             case OPC_SHRA_R_W:
22171                 check_dsp(ctx);
22172                 gen_helper_shra_r_w(cpu_gpr[ret], t0, v2_t);
22173                 break;
22174             case OPC_SHRAV_R_W:
22175                 check_dsp(ctx);
22176                 gen_helper_shra_r_w(cpu_gpr[ret], v1_t, v2_t);
22177                 break;
22178             default:            /* Invalid */
22179                 MIPS_INVAL("MASK SHLL.QB");
22180                 gen_reserved_instruction(ctx);
22181                 break;
22182             }
22183             break;
22184         }
22185 #ifdef TARGET_MIPS64
22186     case OPC_SHLL_OB_DSP:
22187         op2 = MASK_SHLL_OB(ctx->opcode);
22188         switch (op2) {
22189         case OPC_SHLL_PW:
22190             check_dsp(ctx);
22191             gen_helper_shll_pw(cpu_gpr[ret], v2_t, t0, cpu_env);
22192             break;
22193         case OPC_SHLLV_PW:
22194             check_dsp(ctx);
22195             gen_helper_shll_pw(cpu_gpr[ret], v2_t, v1_t, cpu_env);
22196             break;
22197         case OPC_SHLL_S_PW:
22198             check_dsp(ctx);
22199             gen_helper_shll_s_pw(cpu_gpr[ret], v2_t, t0, cpu_env);
22200             break;
22201         case OPC_SHLLV_S_PW:
22202             check_dsp(ctx);
22203             gen_helper_shll_s_pw(cpu_gpr[ret], v2_t, v1_t, cpu_env);
22204             break;
22205         case OPC_SHLL_OB:
22206             check_dsp(ctx);
22207             gen_helper_shll_ob(cpu_gpr[ret], v2_t, t0, cpu_env);
22208             break;
22209         case OPC_SHLLV_OB:
22210             check_dsp(ctx);
22211             gen_helper_shll_ob(cpu_gpr[ret], v2_t, v1_t, cpu_env);
22212             break;
22213         case OPC_SHLL_QH:
22214             check_dsp(ctx);
22215             gen_helper_shll_qh(cpu_gpr[ret], v2_t, t0, cpu_env);
22216             break;
22217         case OPC_SHLLV_QH:
22218             check_dsp(ctx);
22219             gen_helper_shll_qh(cpu_gpr[ret], v2_t, v1_t, cpu_env);
22220             break;
22221         case OPC_SHLL_S_QH:
22222             check_dsp(ctx);
22223             gen_helper_shll_s_qh(cpu_gpr[ret], v2_t, t0, cpu_env);
22224             break;
22225         case OPC_SHLLV_S_QH:
22226             check_dsp(ctx);
22227             gen_helper_shll_s_qh(cpu_gpr[ret], v2_t, v1_t, cpu_env);
22228             break;
22229         case OPC_SHRA_OB:
22230             check_dsp_r2(ctx);
22231             gen_helper_shra_ob(cpu_gpr[ret], v2_t, t0);
22232             break;
22233         case OPC_SHRAV_OB:
22234             check_dsp_r2(ctx);
22235             gen_helper_shra_ob(cpu_gpr[ret], v2_t, v1_t);
22236             break;
22237         case OPC_SHRA_R_OB:
22238             check_dsp_r2(ctx);
22239             gen_helper_shra_r_ob(cpu_gpr[ret], v2_t, t0);
22240             break;
22241         case OPC_SHRAV_R_OB:
22242             check_dsp_r2(ctx);
22243             gen_helper_shra_r_ob(cpu_gpr[ret], v2_t, v1_t);
22244             break;
22245         case OPC_SHRA_PW:
22246             check_dsp(ctx);
22247             gen_helper_shra_pw(cpu_gpr[ret], v2_t, t0);
22248             break;
22249         case OPC_SHRAV_PW:
22250             check_dsp(ctx);
22251             gen_helper_shra_pw(cpu_gpr[ret], v2_t, v1_t);
22252             break;
22253         case OPC_SHRA_R_PW:
22254             check_dsp(ctx);
22255             gen_helper_shra_r_pw(cpu_gpr[ret], v2_t, t0);
22256             break;
22257         case OPC_SHRAV_R_PW:
22258             check_dsp(ctx);
22259             gen_helper_shra_r_pw(cpu_gpr[ret], v2_t, v1_t);
22260             break;
22261         case OPC_SHRA_QH:
22262             check_dsp(ctx);
22263             gen_helper_shra_qh(cpu_gpr[ret], v2_t, t0);
22264             break;
22265         case OPC_SHRAV_QH:
22266             check_dsp(ctx);
22267             gen_helper_shra_qh(cpu_gpr[ret], v2_t, v1_t);
22268             break;
22269         case OPC_SHRA_R_QH:
22270             check_dsp(ctx);
22271             gen_helper_shra_r_qh(cpu_gpr[ret], v2_t, t0);
22272             break;
22273         case OPC_SHRAV_R_QH:
22274             check_dsp(ctx);
22275             gen_helper_shra_r_qh(cpu_gpr[ret], v2_t, v1_t);
22276             break;
22277         case OPC_SHRL_OB:
22278             check_dsp(ctx);
22279             gen_helper_shrl_ob(cpu_gpr[ret], v2_t, t0);
22280             break;
22281         case OPC_SHRLV_OB:
22282             check_dsp(ctx);
22283             gen_helper_shrl_ob(cpu_gpr[ret], v2_t, v1_t);
22284             break;
22285         case OPC_SHRL_QH:
22286             check_dsp_r2(ctx);
22287             gen_helper_shrl_qh(cpu_gpr[ret], v2_t, t0);
22288             break;
22289         case OPC_SHRLV_QH:
22290             check_dsp_r2(ctx);
22291             gen_helper_shrl_qh(cpu_gpr[ret], v2_t, v1_t);
22292             break;
22293         default:            /* Invalid */
22294             MIPS_INVAL("MASK SHLL.OB");
22295             gen_reserved_instruction(ctx);
22296             break;
22297         }
22298         break;
22299 #endif
22300     }
22301 
22302     tcg_temp_free(t0);
22303     tcg_temp_free(v1_t);
22304     tcg_temp_free(v2_t);
22305 }
22306 
22307 static void gen_mipsdsp_multiply(DisasContext *ctx, uint32_t op1, uint32_t op2,
22308                                  int ret, int v1, int v2, int check_ret)
22309 {
22310     TCGv_i32 t0;
22311     TCGv v1_t;
22312     TCGv v2_t;
22313 
22314     if ((ret == 0) && (check_ret == 1)) {
22315         /* Treat as NOP. */
22316         return;
22317     }
22318 
22319     t0 = tcg_temp_new_i32();
22320     v1_t = tcg_temp_new();
22321     v2_t = tcg_temp_new();
22322 
22323     tcg_gen_movi_i32(t0, ret);
22324     gen_load_gpr(v1_t, v1);
22325     gen_load_gpr(v2_t, v2);
22326 
22327     switch (op1) {
22328     /*
22329      * OPC_MULT_G_2E, OPC_ADDUH_QB_DSP, OPC_MUL_PH_DSP have
22330      * the same mask and op1.
22331      */
22332     case OPC_MULT_G_2E:
22333         check_dsp_r2(ctx);
22334         switch (op2) {
22335         case  OPC_MUL_PH:
22336             gen_helper_mul_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22337             break;
22338         case  OPC_MUL_S_PH:
22339             gen_helper_mul_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22340             break;
22341         case OPC_MULQ_S_W:
22342             gen_helper_mulq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22343             break;
22344         case OPC_MULQ_RS_W:
22345             gen_helper_mulq_rs_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22346             break;
22347         }
22348         break;
22349     case OPC_DPA_W_PH_DSP:
22350         switch (op2) {
22351         case OPC_DPAU_H_QBL:
22352             check_dsp(ctx);
22353             gen_helper_dpau_h_qbl(t0, v1_t, v2_t, cpu_env);
22354             break;
22355         case OPC_DPAU_H_QBR:
22356             check_dsp(ctx);
22357             gen_helper_dpau_h_qbr(t0, v1_t, v2_t, cpu_env);
22358             break;
22359         case OPC_DPSU_H_QBL:
22360             check_dsp(ctx);
22361             gen_helper_dpsu_h_qbl(t0, v1_t, v2_t, cpu_env);
22362             break;
22363         case OPC_DPSU_H_QBR:
22364             check_dsp(ctx);
22365             gen_helper_dpsu_h_qbr(t0, v1_t, v2_t, cpu_env);
22366             break;
22367         case OPC_DPA_W_PH:
22368             check_dsp_r2(ctx);
22369             gen_helper_dpa_w_ph(t0, v1_t, v2_t, cpu_env);
22370             break;
22371         case OPC_DPAX_W_PH:
22372             check_dsp_r2(ctx);
22373             gen_helper_dpax_w_ph(t0, v1_t, v2_t, cpu_env);
22374             break;
22375         case OPC_DPAQ_S_W_PH:
22376             check_dsp(ctx);
22377             gen_helper_dpaq_s_w_ph(t0, v1_t, v2_t, cpu_env);
22378             break;
22379         case OPC_DPAQX_S_W_PH:
22380             check_dsp_r2(ctx);
22381             gen_helper_dpaqx_s_w_ph(t0, v1_t, v2_t, cpu_env);
22382             break;
22383         case OPC_DPAQX_SA_W_PH:
22384             check_dsp_r2(ctx);
22385             gen_helper_dpaqx_sa_w_ph(t0, v1_t, v2_t, cpu_env);
22386             break;
22387         case OPC_DPS_W_PH:
22388             check_dsp_r2(ctx);
22389             gen_helper_dps_w_ph(t0, v1_t, v2_t, cpu_env);
22390             break;
22391         case OPC_DPSX_W_PH:
22392             check_dsp_r2(ctx);
22393             gen_helper_dpsx_w_ph(t0, v1_t, v2_t, cpu_env);
22394             break;
22395         case OPC_DPSQ_S_W_PH:
22396             check_dsp(ctx);
22397             gen_helper_dpsq_s_w_ph(t0, v1_t, v2_t, cpu_env);
22398             break;
22399         case OPC_DPSQX_S_W_PH:
22400             check_dsp_r2(ctx);
22401             gen_helper_dpsqx_s_w_ph(t0, v1_t, v2_t, cpu_env);
22402             break;
22403         case OPC_DPSQX_SA_W_PH:
22404             check_dsp_r2(ctx);
22405             gen_helper_dpsqx_sa_w_ph(t0, v1_t, v2_t, cpu_env);
22406             break;
22407         case OPC_MULSAQ_S_W_PH:
22408             check_dsp(ctx);
22409             gen_helper_mulsaq_s_w_ph(t0, v1_t, v2_t, cpu_env);
22410             break;
22411         case OPC_DPAQ_SA_L_W:
22412             check_dsp(ctx);
22413             gen_helper_dpaq_sa_l_w(t0, v1_t, v2_t, cpu_env);
22414             break;
22415         case OPC_DPSQ_SA_L_W:
22416             check_dsp(ctx);
22417             gen_helper_dpsq_sa_l_w(t0, v1_t, v2_t, cpu_env);
22418             break;
22419         case OPC_MAQ_S_W_PHL:
22420             check_dsp(ctx);
22421             gen_helper_maq_s_w_phl(t0, v1_t, v2_t, cpu_env);
22422             break;
22423         case OPC_MAQ_S_W_PHR:
22424             check_dsp(ctx);
22425             gen_helper_maq_s_w_phr(t0, v1_t, v2_t, cpu_env);
22426             break;
22427         case OPC_MAQ_SA_W_PHL:
22428             check_dsp(ctx);
22429             gen_helper_maq_sa_w_phl(t0, v1_t, v2_t, cpu_env);
22430             break;
22431         case OPC_MAQ_SA_W_PHR:
22432             check_dsp(ctx);
22433             gen_helper_maq_sa_w_phr(t0, v1_t, v2_t, cpu_env);
22434             break;
22435         case OPC_MULSA_W_PH:
22436             check_dsp_r2(ctx);
22437             gen_helper_mulsa_w_ph(t0, v1_t, v2_t, cpu_env);
22438             break;
22439         }
22440         break;
22441 #ifdef TARGET_MIPS64
22442     case OPC_DPAQ_W_QH_DSP:
22443         {
22444             int ac = ret & 0x03;
22445             tcg_gen_movi_i32(t0, ac);
22446 
22447             switch (op2) {
22448             case OPC_DMADD:
22449                 check_dsp(ctx);
22450                 gen_helper_dmadd(v1_t, v2_t, t0, cpu_env);
22451                 break;
22452             case OPC_DMADDU:
22453                 check_dsp(ctx);
22454                 gen_helper_dmaddu(v1_t, v2_t, t0, cpu_env);
22455                 break;
22456             case OPC_DMSUB:
22457                 check_dsp(ctx);
22458                 gen_helper_dmsub(v1_t, v2_t, t0, cpu_env);
22459                 break;
22460             case OPC_DMSUBU:
22461                 check_dsp(ctx);
22462                 gen_helper_dmsubu(v1_t, v2_t, t0, cpu_env);
22463                 break;
22464             case OPC_DPA_W_QH:
22465                 check_dsp_r2(ctx);
22466                 gen_helper_dpa_w_qh(v1_t, v2_t, t0, cpu_env);
22467                 break;
22468             case OPC_DPAQ_S_W_QH:
22469                 check_dsp(ctx);
22470                 gen_helper_dpaq_s_w_qh(v1_t, v2_t, t0, cpu_env);
22471                 break;
22472             case OPC_DPAQ_SA_L_PW:
22473                 check_dsp(ctx);
22474                 gen_helper_dpaq_sa_l_pw(v1_t, v2_t, t0, cpu_env);
22475                 break;
22476             case OPC_DPAU_H_OBL:
22477                 check_dsp(ctx);
22478                 gen_helper_dpau_h_obl(v1_t, v2_t, t0, cpu_env);
22479                 break;
22480             case OPC_DPAU_H_OBR:
22481                 check_dsp(ctx);
22482                 gen_helper_dpau_h_obr(v1_t, v2_t, t0, cpu_env);
22483                 break;
22484             case OPC_DPS_W_QH:
22485                 check_dsp_r2(ctx);
22486                 gen_helper_dps_w_qh(v1_t, v2_t, t0, cpu_env);
22487                 break;
22488             case OPC_DPSQ_S_W_QH:
22489                 check_dsp(ctx);
22490                 gen_helper_dpsq_s_w_qh(v1_t, v2_t, t0, cpu_env);
22491                 break;
22492             case OPC_DPSQ_SA_L_PW:
22493                 check_dsp(ctx);
22494                 gen_helper_dpsq_sa_l_pw(v1_t, v2_t, t0, cpu_env);
22495                 break;
22496             case OPC_DPSU_H_OBL:
22497                 check_dsp(ctx);
22498                 gen_helper_dpsu_h_obl(v1_t, v2_t, t0, cpu_env);
22499                 break;
22500             case OPC_DPSU_H_OBR:
22501                 check_dsp(ctx);
22502                 gen_helper_dpsu_h_obr(v1_t, v2_t, t0, cpu_env);
22503                 break;
22504             case OPC_MAQ_S_L_PWL:
22505                 check_dsp(ctx);
22506                 gen_helper_maq_s_l_pwl(v1_t, v2_t, t0, cpu_env);
22507                 break;
22508             case OPC_MAQ_S_L_PWR:
22509                 check_dsp(ctx);
22510                 gen_helper_maq_s_l_pwr(v1_t, v2_t, t0, cpu_env);
22511                 break;
22512             case OPC_MAQ_S_W_QHLL:
22513                 check_dsp(ctx);
22514                 gen_helper_maq_s_w_qhll(v1_t, v2_t, t0, cpu_env);
22515                 break;
22516             case OPC_MAQ_SA_W_QHLL:
22517                 check_dsp(ctx);
22518                 gen_helper_maq_sa_w_qhll(v1_t, v2_t, t0, cpu_env);
22519                 break;
22520             case OPC_MAQ_S_W_QHLR:
22521                 check_dsp(ctx);
22522                 gen_helper_maq_s_w_qhlr(v1_t, v2_t, t0, cpu_env);
22523                 break;
22524             case OPC_MAQ_SA_W_QHLR:
22525                 check_dsp(ctx);
22526                 gen_helper_maq_sa_w_qhlr(v1_t, v2_t, t0, cpu_env);
22527                 break;
22528             case OPC_MAQ_S_W_QHRL:
22529                 check_dsp(ctx);
22530                 gen_helper_maq_s_w_qhrl(v1_t, v2_t, t0, cpu_env);
22531                 break;
22532             case OPC_MAQ_SA_W_QHRL:
22533                 check_dsp(ctx);
22534                 gen_helper_maq_sa_w_qhrl(v1_t, v2_t, t0, cpu_env);
22535                 break;
22536             case OPC_MAQ_S_W_QHRR:
22537                 check_dsp(ctx);
22538                 gen_helper_maq_s_w_qhrr(v1_t, v2_t, t0, cpu_env);
22539                 break;
22540             case OPC_MAQ_SA_W_QHRR:
22541                 check_dsp(ctx);
22542                 gen_helper_maq_sa_w_qhrr(v1_t, v2_t, t0, cpu_env);
22543                 break;
22544             case OPC_MULSAQ_S_L_PW:
22545                 check_dsp(ctx);
22546                 gen_helper_mulsaq_s_l_pw(v1_t, v2_t, t0, cpu_env);
22547                 break;
22548             case OPC_MULSAQ_S_W_QH:
22549                 check_dsp(ctx);
22550                 gen_helper_mulsaq_s_w_qh(v1_t, v2_t, t0, cpu_env);
22551                 break;
22552             }
22553         }
22554         break;
22555 #endif
22556     case OPC_ADDU_QB_DSP:
22557         switch (op2) {
22558         case OPC_MULEU_S_PH_QBL:
22559             check_dsp(ctx);
22560             gen_helper_muleu_s_ph_qbl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22561             break;
22562         case OPC_MULEU_S_PH_QBR:
22563             check_dsp(ctx);
22564             gen_helper_muleu_s_ph_qbr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22565             break;
22566         case OPC_MULQ_RS_PH:
22567             check_dsp(ctx);
22568             gen_helper_mulq_rs_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22569             break;
22570         case OPC_MULEQ_S_W_PHL:
22571             check_dsp(ctx);
22572             gen_helper_muleq_s_w_phl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22573             break;
22574         case OPC_MULEQ_S_W_PHR:
22575             check_dsp(ctx);
22576             gen_helper_muleq_s_w_phr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22577             break;
22578         case OPC_MULQ_S_PH:
22579             check_dsp_r2(ctx);
22580             gen_helper_mulq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22581             break;
22582         }
22583         break;
22584 #ifdef TARGET_MIPS64
22585     case OPC_ADDU_OB_DSP:
22586         switch (op2) {
22587         case OPC_MULEQ_S_PW_QHL:
22588             check_dsp(ctx);
22589             gen_helper_muleq_s_pw_qhl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22590             break;
22591         case OPC_MULEQ_S_PW_QHR:
22592             check_dsp(ctx);
22593             gen_helper_muleq_s_pw_qhr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22594             break;
22595         case OPC_MULEU_S_QH_OBL:
22596             check_dsp(ctx);
22597             gen_helper_muleu_s_qh_obl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22598             break;
22599         case OPC_MULEU_S_QH_OBR:
22600             check_dsp(ctx);
22601             gen_helper_muleu_s_qh_obr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22602             break;
22603         case OPC_MULQ_RS_QH:
22604             check_dsp(ctx);
22605             gen_helper_mulq_rs_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22606             break;
22607         }
22608         break;
22609 #endif
22610     }
22611 
22612     tcg_temp_free_i32(t0);
22613     tcg_temp_free(v1_t);
22614     tcg_temp_free(v2_t);
22615 }
22616 
22617 static void gen_mipsdsp_bitinsn(DisasContext *ctx, uint32_t op1, uint32_t op2,
22618                                 int ret, int val)
22619 {
22620     int16_t imm;
22621     TCGv t0;
22622     TCGv val_t;
22623 
22624     if (ret == 0) {
22625         /* Treat as NOP. */
22626         return;
22627     }
22628 
22629     t0 = tcg_temp_new();
22630     val_t = tcg_temp_new();
22631     gen_load_gpr(val_t, val);
22632 
22633     switch (op1) {
22634     case OPC_ABSQ_S_PH_DSP:
22635         switch (op2) {
22636         case OPC_BITREV:
22637             check_dsp(ctx);
22638             gen_helper_bitrev(cpu_gpr[ret], val_t);
22639             break;
22640         case OPC_REPL_QB:
22641             check_dsp(ctx);
22642             {
22643                 target_long result;
22644                 imm = (ctx->opcode >> 16) & 0xFF;
22645                 result = (uint32_t)imm << 24 |
22646                          (uint32_t)imm << 16 |
22647                          (uint32_t)imm << 8  |
22648                          (uint32_t)imm;
22649                 result = (int32_t)result;
22650                 tcg_gen_movi_tl(cpu_gpr[ret], result);
22651             }
22652             break;
22653         case OPC_REPLV_QB:
22654             check_dsp(ctx);
22655             tcg_gen_ext8u_tl(cpu_gpr[ret], val_t);
22656             tcg_gen_shli_tl(t0, cpu_gpr[ret], 8);
22657             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
22658             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
22659             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
22660             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
22661             break;
22662         case OPC_REPL_PH:
22663             check_dsp(ctx);
22664             {
22665                 imm = (ctx->opcode >> 16) & 0x03FF;
22666                 imm = (int16_t)(imm << 6) >> 6;
22667                 tcg_gen_movi_tl(cpu_gpr[ret], \
22668                                 (target_long)((int32_t)imm << 16 | \
22669                                 (uint16_t)imm));
22670             }
22671             break;
22672         case OPC_REPLV_PH:
22673             check_dsp(ctx);
22674             tcg_gen_ext16u_tl(cpu_gpr[ret], val_t);
22675             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
22676             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
22677             tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
22678             break;
22679         }
22680         break;
22681 #ifdef TARGET_MIPS64
22682     case OPC_ABSQ_S_QH_DSP:
22683         switch (op2) {
22684         case OPC_REPL_OB:
22685             check_dsp(ctx);
22686             {
22687                 target_long temp;
22688 
22689                 imm = (ctx->opcode >> 16) & 0xFF;
22690                 temp = ((uint64_t)imm << 8) | (uint64_t)imm;
22691                 temp = (temp << 16) | temp;
22692                 temp = (temp << 32) | temp;
22693                 tcg_gen_movi_tl(cpu_gpr[ret], temp);
22694                 break;
22695             }
22696         case OPC_REPL_PW:
22697             check_dsp(ctx);
22698             {
22699                 target_long temp;
22700 
22701                 imm = (ctx->opcode >> 16) & 0x03FF;
22702                 imm = (int16_t)(imm << 6) >> 6;
22703                 temp = ((target_long)imm << 32) \
22704                        | ((target_long)imm & 0xFFFFFFFF);
22705                 tcg_gen_movi_tl(cpu_gpr[ret], temp);
22706                 break;
22707             }
22708         case OPC_REPL_QH:
22709             check_dsp(ctx);
22710             {
22711                 target_long temp;
22712 
22713                 imm = (ctx->opcode >> 16) & 0x03FF;
22714                 imm = (int16_t)(imm << 6) >> 6;
22715 
22716                 temp = ((uint64_t)(uint16_t)imm << 48) |
22717                        ((uint64_t)(uint16_t)imm << 32) |
22718                        ((uint64_t)(uint16_t)imm << 16) |
22719                        (uint64_t)(uint16_t)imm;
22720                 tcg_gen_movi_tl(cpu_gpr[ret], temp);
22721                 break;
22722             }
22723         case OPC_REPLV_OB:
22724             check_dsp(ctx);
22725             tcg_gen_ext8u_tl(cpu_gpr[ret], val_t);
22726             tcg_gen_shli_tl(t0, cpu_gpr[ret], 8);
22727             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
22728             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
22729             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
22730             tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
22731             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
22732             break;
22733         case OPC_REPLV_PW:
22734             check_dsp(ctx);
22735             tcg_gen_ext32u_i64(cpu_gpr[ret], val_t);
22736             tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
22737             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
22738             break;
22739         case OPC_REPLV_QH:
22740             check_dsp(ctx);
22741             tcg_gen_ext16u_tl(cpu_gpr[ret], val_t);
22742             tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
22743             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
22744             tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
22745             tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
22746             break;
22747         }
22748         break;
22749 #endif
22750     }
22751     tcg_temp_free(t0);
22752     tcg_temp_free(val_t);
22753 }
22754 
22755 static void gen_mipsdsp_add_cmp_pick(DisasContext *ctx,
22756                                      uint32_t op1, uint32_t op2,
22757                                      int ret, int v1, int v2, int check_ret)
22758 {
22759     TCGv t1;
22760     TCGv v1_t;
22761     TCGv v2_t;
22762 
22763     if ((ret == 0) && (check_ret == 1)) {
22764         /* Treat as NOP. */
22765         return;
22766     }
22767 
22768     t1 = tcg_temp_new();
22769     v1_t = tcg_temp_new();
22770     v2_t = tcg_temp_new();
22771 
22772     gen_load_gpr(v1_t, v1);
22773     gen_load_gpr(v2_t, v2);
22774 
22775     switch (op1) {
22776     case OPC_CMPU_EQ_QB_DSP:
22777         switch (op2) {
22778         case OPC_CMPU_EQ_QB:
22779             check_dsp(ctx);
22780             gen_helper_cmpu_eq_qb(v1_t, v2_t, cpu_env);
22781             break;
22782         case OPC_CMPU_LT_QB:
22783             check_dsp(ctx);
22784             gen_helper_cmpu_lt_qb(v1_t, v2_t, cpu_env);
22785             break;
22786         case OPC_CMPU_LE_QB:
22787             check_dsp(ctx);
22788             gen_helper_cmpu_le_qb(v1_t, v2_t, cpu_env);
22789             break;
22790         case OPC_CMPGU_EQ_QB:
22791             check_dsp(ctx);
22792             gen_helper_cmpgu_eq_qb(cpu_gpr[ret], v1_t, v2_t);
22793             break;
22794         case OPC_CMPGU_LT_QB:
22795             check_dsp(ctx);
22796             gen_helper_cmpgu_lt_qb(cpu_gpr[ret], v1_t, v2_t);
22797             break;
22798         case OPC_CMPGU_LE_QB:
22799             check_dsp(ctx);
22800             gen_helper_cmpgu_le_qb(cpu_gpr[ret], v1_t, v2_t);
22801             break;
22802         case OPC_CMPGDU_EQ_QB:
22803             check_dsp_r2(ctx);
22804             gen_helper_cmpgu_eq_qb(t1, v1_t, v2_t);
22805             tcg_gen_mov_tl(cpu_gpr[ret], t1);
22806             tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
22807             tcg_gen_shli_tl(t1, t1, 24);
22808             tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
22809             break;
22810         case OPC_CMPGDU_LT_QB:
22811             check_dsp_r2(ctx);
22812             gen_helper_cmpgu_lt_qb(t1, v1_t, v2_t);
22813             tcg_gen_mov_tl(cpu_gpr[ret], t1);
22814             tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
22815             tcg_gen_shli_tl(t1, t1, 24);
22816             tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
22817             break;
22818         case OPC_CMPGDU_LE_QB:
22819             check_dsp_r2(ctx);
22820             gen_helper_cmpgu_le_qb(t1, v1_t, v2_t);
22821             tcg_gen_mov_tl(cpu_gpr[ret], t1);
22822             tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
22823             tcg_gen_shli_tl(t1, t1, 24);
22824             tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
22825             break;
22826         case OPC_CMP_EQ_PH:
22827             check_dsp(ctx);
22828             gen_helper_cmp_eq_ph(v1_t, v2_t, cpu_env);
22829             break;
22830         case OPC_CMP_LT_PH:
22831             check_dsp(ctx);
22832             gen_helper_cmp_lt_ph(v1_t, v2_t, cpu_env);
22833             break;
22834         case OPC_CMP_LE_PH:
22835             check_dsp(ctx);
22836             gen_helper_cmp_le_ph(v1_t, v2_t, cpu_env);
22837             break;
22838         case OPC_PICK_QB:
22839             check_dsp(ctx);
22840             gen_helper_pick_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22841             break;
22842         case OPC_PICK_PH:
22843             check_dsp(ctx);
22844             gen_helper_pick_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22845             break;
22846         case OPC_PACKRL_PH:
22847             check_dsp(ctx);
22848             gen_helper_packrl_ph(cpu_gpr[ret], v1_t, v2_t);
22849             break;
22850         }
22851         break;
22852 #ifdef TARGET_MIPS64
22853     case OPC_CMPU_EQ_OB_DSP:
22854         switch (op2) {
22855         case OPC_CMP_EQ_PW:
22856             check_dsp(ctx);
22857             gen_helper_cmp_eq_pw(v1_t, v2_t, cpu_env);
22858             break;
22859         case OPC_CMP_LT_PW:
22860             check_dsp(ctx);
22861             gen_helper_cmp_lt_pw(v1_t, v2_t, cpu_env);
22862             break;
22863         case OPC_CMP_LE_PW:
22864             check_dsp(ctx);
22865             gen_helper_cmp_le_pw(v1_t, v2_t, cpu_env);
22866             break;
22867         case OPC_CMP_EQ_QH:
22868             check_dsp(ctx);
22869             gen_helper_cmp_eq_qh(v1_t, v2_t, cpu_env);
22870             break;
22871         case OPC_CMP_LT_QH:
22872             check_dsp(ctx);
22873             gen_helper_cmp_lt_qh(v1_t, v2_t, cpu_env);
22874             break;
22875         case OPC_CMP_LE_QH:
22876             check_dsp(ctx);
22877             gen_helper_cmp_le_qh(v1_t, v2_t, cpu_env);
22878             break;
22879         case OPC_CMPGDU_EQ_OB:
22880             check_dsp_r2(ctx);
22881             gen_helper_cmpgdu_eq_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22882             break;
22883         case OPC_CMPGDU_LT_OB:
22884             check_dsp_r2(ctx);
22885             gen_helper_cmpgdu_lt_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22886             break;
22887         case OPC_CMPGDU_LE_OB:
22888             check_dsp_r2(ctx);
22889             gen_helper_cmpgdu_le_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22890             break;
22891         case OPC_CMPGU_EQ_OB:
22892             check_dsp(ctx);
22893             gen_helper_cmpgu_eq_ob(cpu_gpr[ret], v1_t, v2_t);
22894             break;
22895         case OPC_CMPGU_LT_OB:
22896             check_dsp(ctx);
22897             gen_helper_cmpgu_lt_ob(cpu_gpr[ret], v1_t, v2_t);
22898             break;
22899         case OPC_CMPGU_LE_OB:
22900             check_dsp(ctx);
22901             gen_helper_cmpgu_le_ob(cpu_gpr[ret], v1_t, v2_t);
22902             break;
22903         case OPC_CMPU_EQ_OB:
22904             check_dsp(ctx);
22905             gen_helper_cmpu_eq_ob(v1_t, v2_t, cpu_env);
22906             break;
22907         case OPC_CMPU_LT_OB:
22908             check_dsp(ctx);
22909             gen_helper_cmpu_lt_ob(v1_t, v2_t, cpu_env);
22910             break;
22911         case OPC_CMPU_LE_OB:
22912             check_dsp(ctx);
22913             gen_helper_cmpu_le_ob(v1_t, v2_t, cpu_env);
22914             break;
22915         case OPC_PACKRL_PW:
22916             check_dsp(ctx);
22917             gen_helper_packrl_pw(cpu_gpr[ret], v1_t, v2_t);
22918             break;
22919         case OPC_PICK_OB:
22920             check_dsp(ctx);
22921             gen_helper_pick_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22922             break;
22923         case OPC_PICK_PW:
22924             check_dsp(ctx);
22925             gen_helper_pick_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22926             break;
22927         case OPC_PICK_QH:
22928             check_dsp(ctx);
22929             gen_helper_pick_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
22930             break;
22931         }
22932         break;
22933 #endif
22934     }
22935 
22936     tcg_temp_free(t1);
22937     tcg_temp_free(v1_t);
22938     tcg_temp_free(v2_t);
22939 }
22940 
22941 static void gen_mipsdsp_append(CPUMIPSState *env, DisasContext *ctx,
22942                                uint32_t op1, int rt, int rs, int sa)
22943 {
22944     TCGv t0;
22945 
22946     check_dsp_r2(ctx);
22947 
22948     if (rt == 0) {
22949         /* Treat as NOP. */
22950         return;
22951     }
22952 
22953     t0 = tcg_temp_new();
22954     gen_load_gpr(t0, rs);
22955 
22956     switch (op1) {
22957     case OPC_APPEND_DSP:
22958         switch (MASK_APPEND(ctx->opcode)) {
22959         case OPC_APPEND:
22960             if (sa != 0) {
22961                 tcg_gen_deposit_tl(cpu_gpr[rt], t0, cpu_gpr[rt], sa, 32 - sa);
22962             }
22963             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
22964             break;
22965         case OPC_PREPEND:
22966             if (sa != 0) {
22967                 tcg_gen_ext32u_tl(cpu_gpr[rt], cpu_gpr[rt]);
22968                 tcg_gen_shri_tl(cpu_gpr[rt], cpu_gpr[rt], sa);
22969                 tcg_gen_shli_tl(t0, t0, 32 - sa);
22970                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
22971             }
22972             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
22973             break;
22974         case OPC_BALIGN:
22975             sa &= 3;
22976             if (sa != 0 && sa != 2) {
22977                 tcg_gen_shli_tl(cpu_gpr[rt], cpu_gpr[rt], 8 * sa);
22978                 tcg_gen_ext32u_tl(t0, t0);
22979                 tcg_gen_shri_tl(t0, t0, 8 * (4 - sa));
22980                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
22981             }
22982             tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
22983             break;
22984         default:            /* Invalid */
22985             MIPS_INVAL("MASK APPEND");
22986             gen_reserved_instruction(ctx);
22987             break;
22988         }
22989         break;
22990 #ifdef TARGET_MIPS64
22991     case OPC_DAPPEND_DSP:
22992         switch (MASK_DAPPEND(ctx->opcode)) {
22993         case OPC_DAPPEND:
22994             if (sa != 0) {
22995                 tcg_gen_deposit_tl(cpu_gpr[rt], t0, cpu_gpr[rt], sa, 64 - sa);
22996             }
22997             break;
22998         case OPC_PREPENDD:
22999             tcg_gen_shri_tl(cpu_gpr[rt], cpu_gpr[rt], 0x20 | sa);
23000             tcg_gen_shli_tl(t0, t0, 64 - (0x20 | sa));
23001             tcg_gen_or_tl(cpu_gpr[rt], t0, t0);
23002             break;
23003         case OPC_PREPENDW:
23004             if (sa != 0) {
23005                 tcg_gen_shri_tl(cpu_gpr[rt], cpu_gpr[rt], sa);
23006                 tcg_gen_shli_tl(t0, t0, 64 - sa);
23007                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
23008             }
23009             break;
23010         case OPC_DBALIGN:
23011             sa &= 7;
23012             if (sa != 0 && sa != 2 && sa != 4) {
23013                 tcg_gen_shli_tl(cpu_gpr[rt], cpu_gpr[rt], 8 * sa);
23014                 tcg_gen_shri_tl(t0, t0, 8 * (8 - sa));
23015                 tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
23016             }
23017             break;
23018         default:            /* Invalid */
23019             MIPS_INVAL("MASK DAPPEND");
23020             gen_reserved_instruction(ctx);
23021             break;
23022         }
23023         break;
23024 #endif
23025     }
23026     tcg_temp_free(t0);
23027 }
23028 
23029 static void gen_mipsdsp_accinsn(DisasContext *ctx, uint32_t op1, uint32_t op2,
23030                                 int ret, int v1, int v2, int check_ret)
23031 
23032 {
23033     TCGv t0;
23034     TCGv t1;
23035     TCGv v1_t;
23036     TCGv v2_t;
23037     int16_t imm;
23038 
23039     if ((ret == 0) && (check_ret == 1)) {
23040         /* Treat as NOP. */
23041         return;
23042     }
23043 
23044     t0 = tcg_temp_new();
23045     t1 = tcg_temp_new();
23046     v1_t = tcg_temp_new();
23047     v2_t = tcg_temp_new();
23048 
23049     gen_load_gpr(v1_t, v1);
23050     gen_load_gpr(v2_t, v2);
23051 
23052     switch (op1) {
23053     case OPC_EXTR_W_DSP:
23054         check_dsp(ctx);
23055         switch (op2) {
23056         case OPC_EXTR_W:
23057             tcg_gen_movi_tl(t0, v2);
23058             tcg_gen_movi_tl(t1, v1);
23059             gen_helper_extr_w(cpu_gpr[ret], t0, t1, cpu_env);
23060             break;
23061         case OPC_EXTR_R_W:
23062             tcg_gen_movi_tl(t0, v2);
23063             tcg_gen_movi_tl(t1, v1);
23064             gen_helper_extr_r_w(cpu_gpr[ret], t0, t1, cpu_env);
23065             break;
23066         case OPC_EXTR_RS_W:
23067             tcg_gen_movi_tl(t0, v2);
23068             tcg_gen_movi_tl(t1, v1);
23069             gen_helper_extr_rs_w(cpu_gpr[ret], t0, t1, cpu_env);
23070             break;
23071         case OPC_EXTR_S_H:
23072             tcg_gen_movi_tl(t0, v2);
23073             tcg_gen_movi_tl(t1, v1);
23074             gen_helper_extr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
23075             break;
23076         case OPC_EXTRV_S_H:
23077             tcg_gen_movi_tl(t0, v2);
23078             gen_helper_extr_s_h(cpu_gpr[ret], t0, v1_t, cpu_env);
23079             break;
23080         case OPC_EXTRV_W:
23081             tcg_gen_movi_tl(t0, v2);
23082             gen_helper_extr_w(cpu_gpr[ret], t0, v1_t, cpu_env);
23083             break;
23084         case OPC_EXTRV_R_W:
23085             tcg_gen_movi_tl(t0, v2);
23086             gen_helper_extr_r_w(cpu_gpr[ret], t0, v1_t, cpu_env);
23087             break;
23088         case OPC_EXTRV_RS_W:
23089             tcg_gen_movi_tl(t0, v2);
23090             gen_helper_extr_rs_w(cpu_gpr[ret], t0, v1_t, cpu_env);
23091             break;
23092         case OPC_EXTP:
23093             tcg_gen_movi_tl(t0, v2);
23094             tcg_gen_movi_tl(t1, v1);
23095             gen_helper_extp(cpu_gpr[ret], t0, t1, cpu_env);
23096             break;
23097         case OPC_EXTPV:
23098             tcg_gen_movi_tl(t0, v2);
23099             gen_helper_extp(cpu_gpr[ret], t0, v1_t, cpu_env);
23100             break;
23101         case OPC_EXTPDP:
23102             tcg_gen_movi_tl(t0, v2);
23103             tcg_gen_movi_tl(t1, v1);
23104             gen_helper_extpdp(cpu_gpr[ret], t0, t1, cpu_env);
23105             break;
23106         case OPC_EXTPDPV:
23107             tcg_gen_movi_tl(t0, v2);
23108             gen_helper_extpdp(cpu_gpr[ret], t0, v1_t, cpu_env);
23109             break;
23110         case OPC_SHILO:
23111             imm = (ctx->opcode >> 20) & 0x3F;
23112             tcg_gen_movi_tl(t0, ret);
23113             tcg_gen_movi_tl(t1, imm);
23114             gen_helper_shilo(t0, t1, cpu_env);
23115             break;
23116         case OPC_SHILOV:
23117             tcg_gen_movi_tl(t0, ret);
23118             gen_helper_shilo(t0, v1_t, cpu_env);
23119             break;
23120         case OPC_MTHLIP:
23121             tcg_gen_movi_tl(t0, ret);
23122             gen_helper_mthlip(t0, v1_t, cpu_env);
23123             break;
23124         case OPC_WRDSP:
23125             imm = (ctx->opcode >> 11) & 0x3FF;
23126             tcg_gen_movi_tl(t0, imm);
23127             gen_helper_wrdsp(v1_t, t0, cpu_env);
23128             break;
23129         case OPC_RDDSP:
23130             imm = (ctx->opcode >> 16) & 0x03FF;
23131             tcg_gen_movi_tl(t0, imm);
23132             gen_helper_rddsp(cpu_gpr[ret], t0, cpu_env);
23133             break;
23134         }
23135         break;
23136 #ifdef TARGET_MIPS64
23137     case OPC_DEXTR_W_DSP:
23138         check_dsp(ctx);
23139         switch (op2) {
23140         case OPC_DMTHLIP:
23141             tcg_gen_movi_tl(t0, ret);
23142             gen_helper_dmthlip(v1_t, t0, cpu_env);
23143             break;
23144         case OPC_DSHILO:
23145             {
23146                 int shift = (ctx->opcode >> 19) & 0x7F;
23147                 int ac = (ctx->opcode >> 11) & 0x03;
23148                 tcg_gen_movi_tl(t0, shift);
23149                 tcg_gen_movi_tl(t1, ac);
23150                 gen_helper_dshilo(t0, t1, cpu_env);
23151                 break;
23152             }
23153         case OPC_DSHILOV:
23154             {
23155                 int ac = (ctx->opcode >> 11) & 0x03;
23156                 tcg_gen_movi_tl(t0, ac);
23157                 gen_helper_dshilo(v1_t, t0, cpu_env);
23158                 break;
23159             }
23160         case OPC_DEXTP:
23161             tcg_gen_movi_tl(t0, v2);
23162             tcg_gen_movi_tl(t1, v1);
23163 
23164             gen_helper_dextp(cpu_gpr[ret], t0, t1, cpu_env);
23165             break;
23166         case OPC_DEXTPV:
23167             tcg_gen_movi_tl(t0, v2);
23168             gen_helper_dextp(cpu_gpr[ret], t0, v1_t, cpu_env);
23169             break;
23170         case OPC_DEXTPDP:
23171             tcg_gen_movi_tl(t0, v2);
23172             tcg_gen_movi_tl(t1, v1);
23173             gen_helper_dextpdp(cpu_gpr[ret], t0, t1, cpu_env);
23174             break;
23175         case OPC_DEXTPDPV:
23176             tcg_gen_movi_tl(t0, v2);
23177             gen_helper_dextpdp(cpu_gpr[ret], t0, v1_t, cpu_env);
23178             break;
23179         case OPC_DEXTR_L:
23180             tcg_gen_movi_tl(t0, v2);
23181             tcg_gen_movi_tl(t1, v1);
23182             gen_helper_dextr_l(cpu_gpr[ret], t0, t1, cpu_env);
23183             break;
23184         case OPC_DEXTR_R_L:
23185             tcg_gen_movi_tl(t0, v2);
23186             tcg_gen_movi_tl(t1, v1);
23187             gen_helper_dextr_r_l(cpu_gpr[ret], t0, t1, cpu_env);
23188             break;
23189         case OPC_DEXTR_RS_L:
23190             tcg_gen_movi_tl(t0, v2);
23191             tcg_gen_movi_tl(t1, v1);
23192             gen_helper_dextr_rs_l(cpu_gpr[ret], t0, t1, cpu_env);
23193             break;
23194         case OPC_DEXTR_W:
23195             tcg_gen_movi_tl(t0, v2);
23196             tcg_gen_movi_tl(t1, v1);
23197             gen_helper_dextr_w(cpu_gpr[ret], t0, t1, cpu_env);
23198             break;
23199         case OPC_DEXTR_R_W:
23200             tcg_gen_movi_tl(t0, v2);
23201             tcg_gen_movi_tl(t1, v1);
23202             gen_helper_dextr_r_w(cpu_gpr[ret], t0, t1, cpu_env);
23203             break;
23204         case OPC_DEXTR_RS_W:
23205             tcg_gen_movi_tl(t0, v2);
23206             tcg_gen_movi_tl(t1, v1);
23207             gen_helper_dextr_rs_w(cpu_gpr[ret], t0, t1, cpu_env);
23208             break;
23209         case OPC_DEXTR_S_H:
23210             tcg_gen_movi_tl(t0, v2);
23211             tcg_gen_movi_tl(t1, v1);
23212             gen_helper_dextr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
23213             break;
23214         case OPC_DEXTRV_S_H:
23215             tcg_gen_movi_tl(t0, v2);
23216             tcg_gen_movi_tl(t1, v1);
23217             gen_helper_dextr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
23218             break;
23219         case OPC_DEXTRV_L:
23220             tcg_gen_movi_tl(t0, v2);
23221             gen_helper_dextr_l(cpu_gpr[ret], t0, v1_t, cpu_env);
23222             break;
23223         case OPC_DEXTRV_R_L:
23224             tcg_gen_movi_tl(t0, v2);
23225             gen_helper_dextr_r_l(cpu_gpr[ret], t0, v1_t, cpu_env);
23226             break;
23227         case OPC_DEXTRV_RS_L:
23228             tcg_gen_movi_tl(t0, v2);
23229             gen_helper_dextr_rs_l(cpu_gpr[ret], t0, v1_t, cpu_env);
23230             break;
23231         case OPC_DEXTRV_W:
23232             tcg_gen_movi_tl(t0, v2);
23233             gen_helper_dextr_w(cpu_gpr[ret], t0, v1_t, cpu_env);
23234             break;
23235         case OPC_DEXTRV_R_W:
23236             tcg_gen_movi_tl(t0, v2);
23237             gen_helper_dextr_r_w(cpu_gpr[ret], t0, v1_t, cpu_env);
23238             break;
23239         case OPC_DEXTRV_RS_W:
23240             tcg_gen_movi_tl(t0, v2);
23241             gen_helper_dextr_rs_w(cpu_gpr[ret], t0, v1_t, cpu_env);
23242             break;
23243         }
23244         break;
23245 #endif
23246     }
23247 
23248     tcg_temp_free(t0);
23249     tcg_temp_free(t1);
23250     tcg_temp_free(v1_t);
23251     tcg_temp_free(v2_t);
23252 }
23253 
23254 /* End MIPSDSP functions. */
23255 
23256 static void decode_opc_special_r6(CPUMIPSState *env, DisasContext *ctx)
23257 {
23258     int rs, rt, rd, sa;
23259     uint32_t op1, op2;
23260 
23261     rs = (ctx->opcode >> 21) & 0x1f;
23262     rt = (ctx->opcode >> 16) & 0x1f;
23263     rd = (ctx->opcode >> 11) & 0x1f;
23264     sa = (ctx->opcode >> 6) & 0x1f;
23265 
23266     op1 = MASK_SPECIAL(ctx->opcode);
23267     switch (op1) {
23268     case OPC_MULT:
23269     case OPC_MULTU:
23270     case OPC_DIV:
23271     case OPC_DIVU:
23272         op2 = MASK_R6_MULDIV(ctx->opcode);
23273         switch (op2) {
23274         case R6_OPC_MUL:
23275         case R6_OPC_MUH:
23276         case R6_OPC_MULU:
23277         case R6_OPC_MUHU:
23278         case R6_OPC_DIV:
23279         case R6_OPC_MOD:
23280         case R6_OPC_DIVU:
23281         case R6_OPC_MODU:
23282             gen_r6_muldiv(ctx, op2, rd, rs, rt);
23283             break;
23284         default:
23285             MIPS_INVAL("special_r6 muldiv");
23286             gen_reserved_instruction(ctx);
23287             break;
23288         }
23289         break;
23290     case OPC_SELEQZ:
23291     case OPC_SELNEZ:
23292         gen_cond_move(ctx, op1, rd, rs, rt);
23293         break;
23294     case R6_OPC_CLO:
23295     case R6_OPC_CLZ:
23296         if (rt == 0 && sa == 1) {
23297             /*
23298              * Major opcode and function field is shared with preR6 MFHI/MTHI.
23299              * We need additionally to check other fields.
23300              */
23301             gen_cl(ctx, op1, rd, rs);
23302         } else {
23303             gen_reserved_instruction(ctx);
23304         }
23305         break;
23306     case R6_OPC_SDBBP:
23307         if (is_uhi(extract32(ctx->opcode, 6, 20))) {
23308             gen_helper_do_semihosting(cpu_env);
23309         } else {
23310             if (ctx->hflags & MIPS_HFLAG_SBRI) {
23311                 gen_reserved_instruction(ctx);
23312             } else {
23313                 generate_exception_end(ctx, EXCP_DBp);
23314             }
23315         }
23316         break;
23317 #if defined(TARGET_MIPS64)
23318     case R6_OPC_DCLO:
23319     case R6_OPC_DCLZ:
23320         if (rt == 0 && sa == 1) {
23321             /*
23322              * Major opcode and function field is shared with preR6 MFHI/MTHI.
23323              * We need additionally to check other fields.
23324              */
23325             check_mips_64(ctx);
23326             gen_cl(ctx, op1, rd, rs);
23327         } else {
23328             gen_reserved_instruction(ctx);
23329         }
23330         break;
23331     case OPC_DMULT:
23332     case OPC_DMULTU:
23333     case OPC_DDIV:
23334     case OPC_DDIVU:
23335 
23336         op2 = MASK_R6_MULDIV(ctx->opcode);
23337         switch (op2) {
23338         case R6_OPC_DMUL:
23339         case R6_OPC_DMUH:
23340         case R6_OPC_DMULU:
23341         case R6_OPC_DMUHU:
23342         case R6_OPC_DDIV:
23343         case R6_OPC_DMOD:
23344         case R6_OPC_DDIVU:
23345         case R6_OPC_DMODU:
23346             check_mips_64(ctx);
23347             gen_r6_muldiv(ctx, op2, rd, rs, rt);
23348             break;
23349         default:
23350             MIPS_INVAL("special_r6 muldiv");
23351             gen_reserved_instruction(ctx);
23352             break;
23353         }
23354         break;
23355 #endif
23356     default:            /* Invalid */
23357         MIPS_INVAL("special_r6");
23358         gen_reserved_instruction(ctx);
23359         break;
23360     }
23361 }
23362 
23363 static void decode_opc_special_tx79(CPUMIPSState *env, DisasContext *ctx)
23364 {
23365     int rs = extract32(ctx->opcode, 21, 5);
23366     int rt = extract32(ctx->opcode, 16, 5);
23367     int rd = extract32(ctx->opcode, 11, 5);
23368     uint32_t op1 = MASK_SPECIAL(ctx->opcode);
23369 
23370     switch (op1) {
23371     case OPC_MOVN:         /* Conditional move */
23372     case OPC_MOVZ:
23373         gen_cond_move(ctx, op1, rd, rs, rt);
23374         break;
23375     case OPC_MFHI:          /* Move from HI/LO */
23376     case OPC_MFLO:
23377         gen_HILO(ctx, op1, 0, rd);
23378         break;
23379     case OPC_MTHI:
23380     case OPC_MTLO:          /* Move to HI/LO */
23381         gen_HILO(ctx, op1, 0, rs);
23382         break;
23383     case OPC_MULT:
23384     case OPC_MULTU:
23385         gen_mul_txx9(ctx, op1, rd, rs, rt);
23386         break;
23387     case OPC_DIV:
23388     case OPC_DIVU:
23389         gen_muldiv(ctx, op1, 0, rs, rt);
23390         break;
23391 #if defined(TARGET_MIPS64)
23392     case OPC_DMULT:
23393     case OPC_DMULTU:
23394     case OPC_DDIV:
23395     case OPC_DDIVU:
23396         check_insn_opc_user_only(ctx, INSN_R5900);
23397         gen_muldiv(ctx, op1, 0, rs, rt);
23398         break;
23399 #endif
23400     case OPC_JR:
23401         gen_compute_branch(ctx, op1, 4, rs, 0, 0, 4);
23402         break;
23403     default:            /* Invalid */
23404         MIPS_INVAL("special_tx79");
23405         gen_reserved_instruction(ctx);
23406         break;
23407     }
23408 }
23409 
23410 static void decode_opc_special_legacy(CPUMIPSState *env, DisasContext *ctx)
23411 {
23412     int rs, rt, rd, sa;
23413     uint32_t op1;
23414 
23415     rs = (ctx->opcode >> 21) & 0x1f;
23416     rt = (ctx->opcode >> 16) & 0x1f;
23417     rd = (ctx->opcode >> 11) & 0x1f;
23418     sa = (ctx->opcode >> 6) & 0x1f;
23419 
23420     op1 = MASK_SPECIAL(ctx->opcode);
23421     switch (op1) {
23422     case OPC_MOVN:         /* Conditional move */
23423     case OPC_MOVZ:
23424         check_insn(ctx, ISA_MIPS4 | ISA_MIPS_R1 |
23425                    INSN_LOONGSON2E | INSN_LOONGSON2F);
23426         gen_cond_move(ctx, op1, rd, rs, rt);
23427         break;
23428     case OPC_MFHI:          /* Move from HI/LO */
23429     case OPC_MFLO:
23430         gen_HILO(ctx, op1, rs & 3, rd);
23431         break;
23432     case OPC_MTHI:
23433     case OPC_MTLO:          /* Move to HI/LO */
23434         gen_HILO(ctx, op1, rd & 3, rs);
23435         break;
23436     case OPC_MOVCI:
23437         check_insn(ctx, ISA_MIPS4 | ISA_MIPS_R1);
23438         if (env->CP0_Config1 & (1 << CP0C1_FP)) {
23439             check_cp1_enabled(ctx);
23440             gen_movci(ctx, rd, rs, (ctx->opcode >> 18) & 0x7,
23441                       (ctx->opcode >> 16) & 1);
23442         } else {
23443             generate_exception_err(ctx, EXCP_CpU, 1);
23444         }
23445         break;
23446     case OPC_MULT:
23447     case OPC_MULTU:
23448         if (sa) {
23449             check_insn(ctx, INSN_VR54XX);
23450             op1 = MASK_MUL_VR54XX(ctx->opcode);
23451             gen_mul_vr54xx(ctx, op1, rd, rs, rt);
23452         } else {
23453             gen_muldiv(ctx, op1, rd & 3, rs, rt);
23454         }
23455         break;
23456     case OPC_DIV:
23457     case OPC_DIVU:
23458         gen_muldiv(ctx, op1, 0, rs, rt);
23459         break;
23460 #if defined(TARGET_MIPS64)
23461     case OPC_DMULT:
23462     case OPC_DMULTU:
23463     case OPC_DDIV:
23464     case OPC_DDIVU:
23465         check_insn(ctx, ISA_MIPS3);
23466         check_mips_64(ctx);
23467         gen_muldiv(ctx, op1, 0, rs, rt);
23468         break;
23469 #endif
23470     case OPC_JR:
23471         gen_compute_branch(ctx, op1, 4, rs, rd, sa, 4);
23472         break;
23473     case OPC_SPIM:
23474 #ifdef MIPS_STRICT_STANDARD
23475         MIPS_INVAL("SPIM");
23476         gen_reserved_instruction(ctx);
23477 #else
23478         /* Implemented as RI exception for now. */
23479         MIPS_INVAL("spim (unofficial)");
23480         gen_reserved_instruction(ctx);
23481 #endif
23482         break;
23483     default:            /* Invalid */
23484         MIPS_INVAL("special_legacy");
23485         gen_reserved_instruction(ctx);
23486         break;
23487     }
23488 }
23489 
23490 static void decode_opc_special(CPUMIPSState *env, DisasContext *ctx)
23491 {
23492     int rs, rt, rd, sa;
23493     uint32_t op1;
23494 
23495     rs = (ctx->opcode >> 21) & 0x1f;
23496     rt = (ctx->opcode >> 16) & 0x1f;
23497     rd = (ctx->opcode >> 11) & 0x1f;
23498     sa = (ctx->opcode >> 6) & 0x1f;
23499 
23500     op1 = MASK_SPECIAL(ctx->opcode);
23501     switch (op1) {
23502     case OPC_SLL:          /* Shift with immediate */
23503         if (sa == 5 && rd == 0 &&
23504             rs == 0 && rt == 0) { /* PAUSE */
23505             if ((ctx->insn_flags & ISA_MIPS_R6) &&
23506                 (ctx->hflags & MIPS_HFLAG_BMASK)) {
23507                 gen_reserved_instruction(ctx);
23508                 break;
23509             }
23510         }
23511         /* Fallthrough */
23512     case OPC_SRA:
23513         gen_shift_imm(ctx, op1, rd, rt, sa);
23514         break;
23515     case OPC_SRL:
23516         switch ((ctx->opcode >> 21) & 0x1f) {
23517         case 1:
23518             /* rotr is decoded as srl on non-R2 CPUs */
23519             if (ctx->insn_flags & ISA_MIPS_R2) {
23520                 op1 = OPC_ROTR;
23521             }
23522             /* Fallthrough */
23523         case 0:
23524             gen_shift_imm(ctx, op1, rd, rt, sa);
23525             break;
23526         default:
23527             gen_reserved_instruction(ctx);
23528             break;
23529         }
23530         break;
23531     case OPC_ADD:
23532     case OPC_ADDU:
23533     case OPC_SUB:
23534     case OPC_SUBU:
23535         gen_arith(ctx, op1, rd, rs, rt);
23536         break;
23537     case OPC_SLLV:         /* Shifts */
23538     case OPC_SRAV:
23539         gen_shift(ctx, op1, rd, rs, rt);
23540         break;
23541     case OPC_SRLV:
23542         switch ((ctx->opcode >> 6) & 0x1f) {
23543         case 1:
23544             /* rotrv is decoded as srlv on non-R2 CPUs */
23545             if (ctx->insn_flags & ISA_MIPS_R2) {
23546                 op1 = OPC_ROTRV;
23547             }
23548             /* Fallthrough */
23549         case 0:
23550             gen_shift(ctx, op1, rd, rs, rt);
23551             break;
23552         default:
23553             gen_reserved_instruction(ctx);
23554             break;
23555         }
23556         break;
23557     case OPC_SLT:          /* Set on less than */
23558     case OPC_SLTU:
23559         gen_slt(ctx, op1, rd, rs, rt);
23560         break;
23561     case OPC_AND:          /* Logic*/
23562     case OPC_OR:
23563     case OPC_NOR:
23564     case OPC_XOR:
23565         gen_logic(ctx, op1, rd, rs, rt);
23566         break;
23567     case OPC_JALR:
23568         gen_compute_branch(ctx, op1, 4, rs, rd, sa, 4);
23569         break;
23570     case OPC_TGE: /* Traps */
23571     case OPC_TGEU:
23572     case OPC_TLT:
23573     case OPC_TLTU:
23574     case OPC_TEQ:
23575     case OPC_TNE:
23576         check_insn(ctx, ISA_MIPS2);
23577         gen_trap(ctx, op1, rs, rt, -1);
23578         break;
23579     case OPC_PMON:
23580         /* Pmon entry point, also R4010 selsl */
23581 #ifdef MIPS_STRICT_STANDARD
23582         MIPS_INVAL("PMON / selsl");
23583         gen_reserved_instruction(ctx);
23584 #else
23585         gen_helper_0e0i(pmon, sa);
23586 #endif
23587         break;
23588     case OPC_SYSCALL:
23589         generate_exception_end(ctx, EXCP_SYSCALL);
23590         break;
23591     case OPC_BREAK:
23592         generate_exception_end(ctx, EXCP_BREAK);
23593         break;
23594     case OPC_SYNC:
23595         check_insn(ctx, ISA_MIPS2);
23596         gen_sync(extract32(ctx->opcode, 6, 5));
23597         break;
23598 
23599 #if defined(TARGET_MIPS64)
23600         /* MIPS64 specific opcodes */
23601     case OPC_DSLL:
23602     case OPC_DSRA:
23603     case OPC_DSLL32:
23604     case OPC_DSRA32:
23605         check_insn(ctx, ISA_MIPS3);
23606         check_mips_64(ctx);
23607         gen_shift_imm(ctx, op1, rd, rt, sa);
23608         break;
23609     case OPC_DSRL:
23610         switch ((ctx->opcode >> 21) & 0x1f) {
23611         case 1:
23612             /* drotr is decoded as dsrl on non-R2 CPUs */
23613             if (ctx->insn_flags & ISA_MIPS_R2) {
23614                 op1 = OPC_DROTR;
23615             }
23616             /* Fallthrough */
23617         case 0:
23618             check_insn(ctx, ISA_MIPS3);
23619             check_mips_64(ctx);
23620             gen_shift_imm(ctx, op1, rd, rt, sa);
23621             break;
23622         default:
23623             gen_reserved_instruction(ctx);
23624             break;
23625         }
23626         break;
23627     case OPC_DSRL32:
23628         switch ((ctx->opcode >> 21) & 0x1f) {
23629         case 1:
23630             /* drotr32 is decoded as dsrl32 on non-R2 CPUs */
23631             if (ctx->insn_flags & ISA_MIPS_R2) {
23632                 op1 = OPC_DROTR32;
23633             }
23634             /* Fallthrough */
23635         case 0:
23636             check_insn(ctx, ISA_MIPS3);
23637             check_mips_64(ctx);
23638             gen_shift_imm(ctx, op1, rd, rt, sa);
23639             break;
23640         default:
23641             gen_reserved_instruction(ctx);
23642             break;
23643         }
23644         break;
23645     case OPC_DADD:
23646     case OPC_DADDU:
23647     case OPC_DSUB:
23648     case OPC_DSUBU:
23649         check_insn(ctx, ISA_MIPS3);
23650         check_mips_64(ctx);
23651         gen_arith(ctx, op1, rd, rs, rt);
23652         break;
23653     case OPC_DSLLV:
23654     case OPC_DSRAV:
23655         check_insn(ctx, ISA_MIPS3);
23656         check_mips_64(ctx);
23657         gen_shift(ctx, op1, rd, rs, rt);
23658         break;
23659     case OPC_DSRLV:
23660         switch ((ctx->opcode >> 6) & 0x1f) {
23661         case 1:
23662             /* drotrv is decoded as dsrlv on non-R2 CPUs */
23663             if (ctx->insn_flags & ISA_MIPS_R2) {
23664                 op1 = OPC_DROTRV;
23665             }
23666             /* Fallthrough */
23667         case 0:
23668             check_insn(ctx, ISA_MIPS3);
23669             check_mips_64(ctx);
23670             gen_shift(ctx, op1, rd, rs, rt);
23671             break;
23672         default:
23673             gen_reserved_instruction(ctx);
23674             break;
23675         }
23676         break;
23677 #endif
23678     default:
23679         if (ctx->insn_flags & ISA_MIPS_R6) {
23680             decode_opc_special_r6(env, ctx);
23681         } else if (ctx->insn_flags & INSN_R5900) {
23682             decode_opc_special_tx79(env, ctx);
23683         } else {
23684             decode_opc_special_legacy(env, ctx);
23685         }
23686     }
23687 }
23688 
23689 
23690 static void decode_opc_special2_legacy(CPUMIPSState *env, DisasContext *ctx)
23691 {
23692     int rs, rt, rd;
23693     uint32_t op1;
23694 
23695     rs = (ctx->opcode >> 21) & 0x1f;
23696     rt = (ctx->opcode >> 16) & 0x1f;
23697     rd = (ctx->opcode >> 11) & 0x1f;
23698 
23699     op1 = MASK_SPECIAL2(ctx->opcode);
23700     switch (op1) {
23701     case OPC_MADD: /* Multiply and add/sub */
23702     case OPC_MADDU:
23703     case OPC_MSUB:
23704     case OPC_MSUBU:
23705         check_insn(ctx, ISA_MIPS_R1);
23706         gen_muldiv(ctx, op1, rd & 3, rs, rt);
23707         break;
23708     case OPC_MUL:
23709         gen_arith(ctx, op1, rd, rs, rt);
23710         break;
23711     case OPC_DIV_G_2F:
23712     case OPC_DIVU_G_2F:
23713     case OPC_MULT_G_2F:
23714     case OPC_MULTU_G_2F:
23715     case OPC_MOD_G_2F:
23716     case OPC_MODU_G_2F:
23717         check_insn(ctx, INSN_LOONGSON2F | ASE_LEXT);
23718         gen_loongson_integer(ctx, op1, rd, rs, rt);
23719         break;
23720     case OPC_CLO:
23721     case OPC_CLZ:
23722         check_insn(ctx, ISA_MIPS_R1);
23723         gen_cl(ctx, op1, rd, rs);
23724         break;
23725     case OPC_SDBBP:
23726         if (is_uhi(extract32(ctx->opcode, 6, 20))) {
23727             gen_helper_do_semihosting(cpu_env);
23728         } else {
23729             /*
23730              * XXX: not clear which exception should be raised
23731              *      when in debug mode...
23732              */
23733             check_insn(ctx, ISA_MIPS_R1);
23734             generate_exception_end(ctx, EXCP_DBp);
23735         }
23736         break;
23737 #if defined(TARGET_MIPS64)
23738     case OPC_DCLO:
23739     case OPC_DCLZ:
23740         check_insn(ctx, ISA_MIPS_R1);
23741         check_mips_64(ctx);
23742         gen_cl(ctx, op1, rd, rs);
23743         break;
23744     case OPC_DMULT_G_2F:
23745     case OPC_DMULTU_G_2F:
23746     case OPC_DDIV_G_2F:
23747     case OPC_DDIVU_G_2F:
23748     case OPC_DMOD_G_2F:
23749     case OPC_DMODU_G_2F:
23750         check_insn(ctx, INSN_LOONGSON2F | ASE_LEXT);
23751         gen_loongson_integer(ctx, op1, rd, rs, rt);
23752         break;
23753 #endif
23754     default:            /* Invalid */
23755         MIPS_INVAL("special2_legacy");
23756         gen_reserved_instruction(ctx);
23757         break;
23758     }
23759 }
23760 
23761 static void decode_opc_special3_r6(CPUMIPSState *env, DisasContext *ctx)
23762 {
23763     int rs, rt, rd, sa;
23764     uint32_t op1, op2;
23765     int16_t imm;
23766 
23767     rs = (ctx->opcode >> 21) & 0x1f;
23768     rt = (ctx->opcode >> 16) & 0x1f;
23769     rd = (ctx->opcode >> 11) & 0x1f;
23770     sa = (ctx->opcode >> 6) & 0x1f;
23771     imm = (int16_t)ctx->opcode >> 7;
23772 
23773     op1 = MASK_SPECIAL3(ctx->opcode);
23774     switch (op1) {
23775     case R6_OPC_PREF:
23776         if (rt >= 24) {
23777             /* hint codes 24-31 are reserved and signal RI */
23778             gen_reserved_instruction(ctx);
23779         }
23780         /* Treat as NOP. */
23781         break;
23782     case R6_OPC_CACHE:
23783         check_cp0_enabled(ctx);
23784         if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
23785             gen_cache_operation(ctx, rt, rs, imm);
23786         }
23787         break;
23788     case R6_OPC_SC:
23789         gen_st_cond(ctx, rt, rs, imm, MO_TESL, false);
23790         break;
23791     case R6_OPC_LL:
23792         gen_ld(ctx, op1, rt, rs, imm);
23793         break;
23794     case OPC_BSHFL:
23795         {
23796             if (rd == 0) {
23797                 /* Treat as NOP. */
23798                 break;
23799             }
23800             op2 = MASK_BSHFL(ctx->opcode);
23801             switch (op2) {
23802             case OPC_ALIGN:
23803             case OPC_ALIGN_1:
23804             case OPC_ALIGN_2:
23805             case OPC_ALIGN_3:
23806                 gen_align(ctx, 32, rd, rs, rt, sa & 3);
23807                 break;
23808             case OPC_BITSWAP:
23809                 gen_bitswap(ctx, op2, rd, rt);
23810                 break;
23811             }
23812         }
23813         break;
23814 #ifndef CONFIG_USER_ONLY
23815     case OPC_GINV:
23816         if (unlikely(ctx->gi <= 1)) {
23817             gen_reserved_instruction(ctx);
23818         }
23819         check_cp0_enabled(ctx);
23820         switch ((ctx->opcode >> 6) & 3) {
23821         case 0:    /* GINVI */
23822             /* Treat as NOP. */
23823             break;
23824         case 2:    /* GINVT */
23825             gen_helper_0e1i(ginvt, cpu_gpr[rs], extract32(ctx->opcode, 8, 2));
23826             break;
23827         default:
23828             gen_reserved_instruction(ctx);
23829             break;
23830         }
23831         break;
23832 #endif
23833 #if defined(TARGET_MIPS64)
23834     case R6_OPC_SCD:
23835         gen_st_cond(ctx, rt, rs, imm, MO_TEQ, false);
23836         break;
23837     case R6_OPC_LLD:
23838         gen_ld(ctx, op1, rt, rs, imm);
23839         break;
23840     case OPC_DBSHFL:
23841         check_mips_64(ctx);
23842         {
23843             if (rd == 0) {
23844                 /* Treat as NOP. */
23845                 break;
23846             }
23847             op2 = MASK_DBSHFL(ctx->opcode);
23848             switch (op2) {
23849             case OPC_DALIGN:
23850             case OPC_DALIGN_1:
23851             case OPC_DALIGN_2:
23852             case OPC_DALIGN_3:
23853             case OPC_DALIGN_4:
23854             case OPC_DALIGN_5:
23855             case OPC_DALIGN_6:
23856             case OPC_DALIGN_7:
23857                 gen_align(ctx, 64, rd, rs, rt, sa & 7);
23858                 break;
23859             case OPC_DBITSWAP:
23860                 gen_bitswap(ctx, op2, rd, rt);
23861                 break;
23862             }
23863 
23864         }
23865         break;
23866 #endif
23867     default:            /* Invalid */
23868         MIPS_INVAL("special3_r6");
23869         gen_reserved_instruction(ctx);
23870         break;
23871     }
23872 }
23873 
23874 static void decode_opc_special3_legacy(CPUMIPSState *env, DisasContext *ctx)
23875 {
23876     int rs, rt, rd;
23877     uint32_t op1, op2;
23878 
23879     rs = (ctx->opcode >> 21) & 0x1f;
23880     rt = (ctx->opcode >> 16) & 0x1f;
23881     rd = (ctx->opcode >> 11) & 0x1f;
23882 
23883     op1 = MASK_SPECIAL3(ctx->opcode);
23884     switch (op1) {
23885     case OPC_DIV_G_2E:
23886     case OPC_DIVU_G_2E:
23887     case OPC_MOD_G_2E:
23888     case OPC_MODU_G_2E:
23889     case OPC_MULT_G_2E:
23890     case OPC_MULTU_G_2E:
23891         /*
23892          * OPC_MULT_G_2E, OPC_ADDUH_QB_DSP, OPC_MUL_PH_DSP have
23893          * the same mask and op1.
23894          */
23895         if ((ctx->insn_flags & ASE_DSP_R2) && (op1 == OPC_MULT_G_2E)) {
23896             op2 = MASK_ADDUH_QB(ctx->opcode);
23897             switch (op2) {
23898             case OPC_ADDUH_QB:
23899             case OPC_ADDUH_R_QB:
23900             case OPC_ADDQH_PH:
23901             case OPC_ADDQH_R_PH:
23902             case OPC_ADDQH_W:
23903             case OPC_ADDQH_R_W:
23904             case OPC_SUBUH_QB:
23905             case OPC_SUBUH_R_QB:
23906             case OPC_SUBQH_PH:
23907             case OPC_SUBQH_R_PH:
23908             case OPC_SUBQH_W:
23909             case OPC_SUBQH_R_W:
23910                 gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
23911                 break;
23912             case OPC_MUL_PH:
23913             case OPC_MUL_S_PH:
23914             case OPC_MULQ_S_W:
23915             case OPC_MULQ_RS_W:
23916                 gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
23917                 break;
23918             default:
23919                 MIPS_INVAL("MASK ADDUH.QB");
23920                 gen_reserved_instruction(ctx);
23921                 break;
23922             }
23923         } else if (ctx->insn_flags & INSN_LOONGSON2E) {
23924             gen_loongson_integer(ctx, op1, rd, rs, rt);
23925         } else {
23926             gen_reserved_instruction(ctx);
23927         }
23928         break;
23929     case OPC_LX_DSP:
23930         op2 = MASK_LX(ctx->opcode);
23931         switch (op2) {
23932 #if defined(TARGET_MIPS64)
23933         case OPC_LDX:
23934 #endif
23935         case OPC_LBUX:
23936         case OPC_LHX:
23937         case OPC_LWX:
23938             gen_mipsdsp_ld(ctx, op2, rd, rs, rt);
23939             break;
23940         default:            /* Invalid */
23941             MIPS_INVAL("MASK LX");
23942             gen_reserved_instruction(ctx);
23943             break;
23944         }
23945         break;
23946     case OPC_ABSQ_S_PH_DSP:
23947         op2 = MASK_ABSQ_S_PH(ctx->opcode);
23948         switch (op2) {
23949         case OPC_ABSQ_S_QB:
23950         case OPC_ABSQ_S_PH:
23951         case OPC_ABSQ_S_W:
23952         case OPC_PRECEQ_W_PHL:
23953         case OPC_PRECEQ_W_PHR:
23954         case OPC_PRECEQU_PH_QBL:
23955         case OPC_PRECEQU_PH_QBR:
23956         case OPC_PRECEQU_PH_QBLA:
23957         case OPC_PRECEQU_PH_QBRA:
23958         case OPC_PRECEU_PH_QBL:
23959         case OPC_PRECEU_PH_QBR:
23960         case OPC_PRECEU_PH_QBLA:
23961         case OPC_PRECEU_PH_QBRA:
23962             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
23963             break;
23964         case OPC_BITREV:
23965         case OPC_REPL_QB:
23966         case OPC_REPLV_QB:
23967         case OPC_REPL_PH:
23968         case OPC_REPLV_PH:
23969             gen_mipsdsp_bitinsn(ctx, op1, op2, rd, rt);
23970             break;
23971         default:
23972             MIPS_INVAL("MASK ABSQ_S.PH");
23973             gen_reserved_instruction(ctx);
23974             break;
23975         }
23976         break;
23977     case OPC_ADDU_QB_DSP:
23978         op2 = MASK_ADDU_QB(ctx->opcode);
23979         switch (op2) {
23980         case OPC_ADDQ_PH:
23981         case OPC_ADDQ_S_PH:
23982         case OPC_ADDQ_S_W:
23983         case OPC_ADDU_QB:
23984         case OPC_ADDU_S_QB:
23985         case OPC_ADDU_PH:
23986         case OPC_ADDU_S_PH:
23987         case OPC_SUBQ_PH:
23988         case OPC_SUBQ_S_PH:
23989         case OPC_SUBQ_S_W:
23990         case OPC_SUBU_QB:
23991         case OPC_SUBU_S_QB:
23992         case OPC_SUBU_PH:
23993         case OPC_SUBU_S_PH:
23994         case OPC_ADDSC:
23995         case OPC_ADDWC:
23996         case OPC_MODSUB:
23997         case OPC_RADDU_W_QB:
23998             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
23999             break;
24000         case OPC_MULEU_S_PH_QBL:
24001         case OPC_MULEU_S_PH_QBR:
24002         case OPC_MULQ_RS_PH:
24003         case OPC_MULEQ_S_W_PHL:
24004         case OPC_MULEQ_S_W_PHR:
24005         case OPC_MULQ_S_PH:
24006             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
24007             break;
24008         default:            /* Invalid */
24009             MIPS_INVAL("MASK ADDU.QB");
24010             gen_reserved_instruction(ctx);
24011             break;
24012 
24013         }
24014         break;
24015     case OPC_CMPU_EQ_QB_DSP:
24016         op2 = MASK_CMPU_EQ_QB(ctx->opcode);
24017         switch (op2) {
24018         case OPC_PRECR_SRA_PH_W:
24019         case OPC_PRECR_SRA_R_PH_W:
24020             gen_mipsdsp_arith(ctx, op1, op2, rt, rs, rd);
24021             break;
24022         case OPC_PRECR_QB_PH:
24023         case OPC_PRECRQ_QB_PH:
24024         case OPC_PRECRQ_PH_W:
24025         case OPC_PRECRQ_RS_PH_W:
24026         case OPC_PRECRQU_S_QB_PH:
24027             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
24028             break;
24029         case OPC_CMPU_EQ_QB:
24030         case OPC_CMPU_LT_QB:
24031         case OPC_CMPU_LE_QB:
24032         case OPC_CMP_EQ_PH:
24033         case OPC_CMP_LT_PH:
24034         case OPC_CMP_LE_PH:
24035             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 0);
24036             break;
24037         case OPC_CMPGU_EQ_QB:
24038         case OPC_CMPGU_LT_QB:
24039         case OPC_CMPGU_LE_QB:
24040         case OPC_CMPGDU_EQ_QB:
24041         case OPC_CMPGDU_LT_QB:
24042         case OPC_CMPGDU_LE_QB:
24043         case OPC_PICK_QB:
24044         case OPC_PICK_PH:
24045         case OPC_PACKRL_PH:
24046             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 1);
24047             break;
24048         default:            /* Invalid */
24049             MIPS_INVAL("MASK CMPU.EQ.QB");
24050             gen_reserved_instruction(ctx);
24051             break;
24052         }
24053         break;
24054     case OPC_SHLL_QB_DSP:
24055         gen_mipsdsp_shift(ctx, op1, rd, rs, rt);
24056         break;
24057     case OPC_DPA_W_PH_DSP:
24058         op2 = MASK_DPA_W_PH(ctx->opcode);
24059         switch (op2) {
24060         case OPC_DPAU_H_QBL:
24061         case OPC_DPAU_H_QBR:
24062         case OPC_DPSU_H_QBL:
24063         case OPC_DPSU_H_QBR:
24064         case OPC_DPA_W_PH:
24065         case OPC_DPAX_W_PH:
24066         case OPC_DPAQ_S_W_PH:
24067         case OPC_DPAQX_S_W_PH:
24068         case OPC_DPAQX_SA_W_PH:
24069         case OPC_DPS_W_PH:
24070         case OPC_DPSX_W_PH:
24071         case OPC_DPSQ_S_W_PH:
24072         case OPC_DPSQX_S_W_PH:
24073         case OPC_DPSQX_SA_W_PH:
24074         case OPC_MULSAQ_S_W_PH:
24075         case OPC_DPAQ_SA_L_W:
24076         case OPC_DPSQ_SA_L_W:
24077         case OPC_MAQ_S_W_PHL:
24078         case OPC_MAQ_S_W_PHR:
24079         case OPC_MAQ_SA_W_PHL:
24080         case OPC_MAQ_SA_W_PHR:
24081         case OPC_MULSA_W_PH:
24082             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
24083             break;
24084         default:            /* Invalid */
24085             MIPS_INVAL("MASK DPAW.PH");
24086             gen_reserved_instruction(ctx);
24087             break;
24088         }
24089         break;
24090     case OPC_INSV_DSP:
24091         op2 = MASK_INSV(ctx->opcode);
24092         switch (op2) {
24093         case OPC_INSV:
24094             check_dsp(ctx);
24095             {
24096                 TCGv t0, t1;
24097 
24098                 if (rt == 0) {
24099                     break;
24100                 }
24101 
24102                 t0 = tcg_temp_new();
24103                 t1 = tcg_temp_new();
24104 
24105                 gen_load_gpr(t0, rt);
24106                 gen_load_gpr(t1, rs);
24107 
24108                 gen_helper_insv(cpu_gpr[rt], cpu_env, t1, t0);
24109 
24110                 tcg_temp_free(t0);
24111                 tcg_temp_free(t1);
24112                 break;
24113             }
24114         default:            /* Invalid */
24115             MIPS_INVAL("MASK INSV");
24116             gen_reserved_instruction(ctx);
24117             break;
24118         }
24119         break;
24120     case OPC_APPEND_DSP:
24121         gen_mipsdsp_append(env, ctx, op1, rt, rs, rd);
24122         break;
24123     case OPC_EXTR_W_DSP:
24124         op2 = MASK_EXTR_W(ctx->opcode);
24125         switch (op2) {
24126         case OPC_EXTR_W:
24127         case OPC_EXTR_R_W:
24128         case OPC_EXTR_RS_W:
24129         case OPC_EXTR_S_H:
24130         case OPC_EXTRV_S_H:
24131         case OPC_EXTRV_W:
24132         case OPC_EXTRV_R_W:
24133         case OPC_EXTRV_RS_W:
24134         case OPC_EXTP:
24135         case OPC_EXTPV:
24136         case OPC_EXTPDP:
24137         case OPC_EXTPDPV:
24138             gen_mipsdsp_accinsn(ctx, op1, op2, rt, rs, rd, 1);
24139             break;
24140         case OPC_RDDSP:
24141             gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 1);
24142             break;
24143         case OPC_SHILO:
24144         case OPC_SHILOV:
24145         case OPC_MTHLIP:
24146         case OPC_WRDSP:
24147             gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 0);
24148             break;
24149         default:            /* Invalid */
24150             MIPS_INVAL("MASK EXTR.W");
24151             gen_reserved_instruction(ctx);
24152             break;
24153         }
24154         break;
24155 #if defined(TARGET_MIPS64)
24156     case OPC_DDIV_G_2E:
24157     case OPC_DDIVU_G_2E:
24158     case OPC_DMULT_G_2E:
24159     case OPC_DMULTU_G_2E:
24160     case OPC_DMOD_G_2E:
24161     case OPC_DMODU_G_2E:
24162         check_insn(ctx, INSN_LOONGSON2E);
24163         gen_loongson_integer(ctx, op1, rd, rs, rt);
24164         break;
24165     case OPC_ABSQ_S_QH_DSP:
24166         op2 = MASK_ABSQ_S_QH(ctx->opcode);
24167         switch (op2) {
24168         case OPC_PRECEQ_L_PWL:
24169         case OPC_PRECEQ_L_PWR:
24170         case OPC_PRECEQ_PW_QHL:
24171         case OPC_PRECEQ_PW_QHR:
24172         case OPC_PRECEQ_PW_QHLA:
24173         case OPC_PRECEQ_PW_QHRA:
24174         case OPC_PRECEQU_QH_OBL:
24175         case OPC_PRECEQU_QH_OBR:
24176         case OPC_PRECEQU_QH_OBLA:
24177         case OPC_PRECEQU_QH_OBRA:
24178         case OPC_PRECEU_QH_OBL:
24179         case OPC_PRECEU_QH_OBR:
24180         case OPC_PRECEU_QH_OBLA:
24181         case OPC_PRECEU_QH_OBRA:
24182         case OPC_ABSQ_S_OB:
24183         case OPC_ABSQ_S_PW:
24184         case OPC_ABSQ_S_QH:
24185             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
24186             break;
24187         case OPC_REPL_OB:
24188         case OPC_REPL_PW:
24189         case OPC_REPL_QH:
24190         case OPC_REPLV_OB:
24191         case OPC_REPLV_PW:
24192         case OPC_REPLV_QH:
24193             gen_mipsdsp_bitinsn(ctx, op1, op2, rd, rt);
24194             break;
24195         default:            /* Invalid */
24196             MIPS_INVAL("MASK ABSQ_S.QH");
24197             gen_reserved_instruction(ctx);
24198             break;
24199         }
24200         break;
24201     case OPC_ADDU_OB_DSP:
24202         op2 = MASK_ADDU_OB(ctx->opcode);
24203         switch (op2) {
24204         case OPC_RADDU_L_OB:
24205         case OPC_SUBQ_PW:
24206         case OPC_SUBQ_S_PW:
24207         case OPC_SUBQ_QH:
24208         case OPC_SUBQ_S_QH:
24209         case OPC_SUBU_OB:
24210         case OPC_SUBU_S_OB:
24211         case OPC_SUBU_QH:
24212         case OPC_SUBU_S_QH:
24213         case OPC_SUBUH_OB:
24214         case OPC_SUBUH_R_OB:
24215         case OPC_ADDQ_PW:
24216         case OPC_ADDQ_S_PW:
24217         case OPC_ADDQ_QH:
24218         case OPC_ADDQ_S_QH:
24219         case OPC_ADDU_OB:
24220         case OPC_ADDU_S_OB:
24221         case OPC_ADDU_QH:
24222         case OPC_ADDU_S_QH:
24223         case OPC_ADDUH_OB:
24224         case OPC_ADDUH_R_OB:
24225             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
24226             break;
24227         case OPC_MULEQ_S_PW_QHL:
24228         case OPC_MULEQ_S_PW_QHR:
24229         case OPC_MULEU_S_QH_OBL:
24230         case OPC_MULEU_S_QH_OBR:
24231         case OPC_MULQ_RS_QH:
24232             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
24233             break;
24234         default:            /* Invalid */
24235             MIPS_INVAL("MASK ADDU.OB");
24236             gen_reserved_instruction(ctx);
24237             break;
24238         }
24239         break;
24240     case OPC_CMPU_EQ_OB_DSP:
24241         op2 = MASK_CMPU_EQ_OB(ctx->opcode);
24242         switch (op2) {
24243         case OPC_PRECR_SRA_QH_PW:
24244         case OPC_PRECR_SRA_R_QH_PW:
24245             /* Return value is rt. */
24246             gen_mipsdsp_arith(ctx, op1, op2, rt, rs, rd);
24247             break;
24248         case OPC_PRECR_OB_QH:
24249         case OPC_PRECRQ_OB_QH:
24250         case OPC_PRECRQ_PW_L:
24251         case OPC_PRECRQ_QH_PW:
24252         case OPC_PRECRQ_RS_QH_PW:
24253         case OPC_PRECRQU_S_OB_QH:
24254             gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
24255             break;
24256         case OPC_CMPU_EQ_OB:
24257         case OPC_CMPU_LT_OB:
24258         case OPC_CMPU_LE_OB:
24259         case OPC_CMP_EQ_QH:
24260         case OPC_CMP_LT_QH:
24261         case OPC_CMP_LE_QH:
24262         case OPC_CMP_EQ_PW:
24263         case OPC_CMP_LT_PW:
24264         case OPC_CMP_LE_PW:
24265             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 0);
24266             break;
24267         case OPC_CMPGDU_EQ_OB:
24268         case OPC_CMPGDU_LT_OB:
24269         case OPC_CMPGDU_LE_OB:
24270         case OPC_CMPGU_EQ_OB:
24271         case OPC_CMPGU_LT_OB:
24272         case OPC_CMPGU_LE_OB:
24273         case OPC_PACKRL_PW:
24274         case OPC_PICK_OB:
24275         case OPC_PICK_PW:
24276         case OPC_PICK_QH:
24277             gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 1);
24278             break;
24279         default:            /* Invalid */
24280             MIPS_INVAL("MASK CMPU_EQ.OB");
24281             gen_reserved_instruction(ctx);
24282             break;
24283         }
24284         break;
24285     case OPC_DAPPEND_DSP:
24286         gen_mipsdsp_append(env, ctx, op1, rt, rs, rd);
24287         break;
24288     case OPC_DEXTR_W_DSP:
24289         op2 = MASK_DEXTR_W(ctx->opcode);
24290         switch (op2) {
24291         case OPC_DEXTP:
24292         case OPC_DEXTPDP:
24293         case OPC_DEXTPDPV:
24294         case OPC_DEXTPV:
24295         case OPC_DEXTR_L:
24296         case OPC_DEXTR_R_L:
24297         case OPC_DEXTR_RS_L:
24298         case OPC_DEXTR_W:
24299         case OPC_DEXTR_R_W:
24300         case OPC_DEXTR_RS_W:
24301         case OPC_DEXTR_S_H:
24302         case OPC_DEXTRV_L:
24303         case OPC_DEXTRV_R_L:
24304         case OPC_DEXTRV_RS_L:
24305         case OPC_DEXTRV_S_H:
24306         case OPC_DEXTRV_W:
24307         case OPC_DEXTRV_R_W:
24308         case OPC_DEXTRV_RS_W:
24309             gen_mipsdsp_accinsn(ctx, op1, op2, rt, rs, rd, 1);
24310             break;
24311         case OPC_DMTHLIP:
24312         case OPC_DSHILO:
24313         case OPC_DSHILOV:
24314             gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 0);
24315             break;
24316         default:            /* Invalid */
24317             MIPS_INVAL("MASK EXTR.W");
24318             gen_reserved_instruction(ctx);
24319             break;
24320         }
24321         break;
24322     case OPC_DPAQ_W_QH_DSP:
24323         op2 = MASK_DPAQ_W_QH(ctx->opcode);
24324         switch (op2) {
24325         case OPC_DPAU_H_OBL:
24326         case OPC_DPAU_H_OBR:
24327         case OPC_DPSU_H_OBL:
24328         case OPC_DPSU_H_OBR:
24329         case OPC_DPA_W_QH:
24330         case OPC_DPAQ_S_W_QH:
24331         case OPC_DPS_W_QH:
24332         case OPC_DPSQ_S_W_QH:
24333         case OPC_MULSAQ_S_W_QH:
24334         case OPC_DPAQ_SA_L_PW:
24335         case OPC_DPSQ_SA_L_PW:
24336         case OPC_MULSAQ_S_L_PW:
24337             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
24338             break;
24339         case OPC_MAQ_S_W_QHLL:
24340         case OPC_MAQ_S_W_QHLR:
24341         case OPC_MAQ_S_W_QHRL:
24342         case OPC_MAQ_S_W_QHRR:
24343         case OPC_MAQ_SA_W_QHLL:
24344         case OPC_MAQ_SA_W_QHLR:
24345         case OPC_MAQ_SA_W_QHRL:
24346         case OPC_MAQ_SA_W_QHRR:
24347         case OPC_MAQ_S_L_PWL:
24348         case OPC_MAQ_S_L_PWR:
24349         case OPC_DMADD:
24350         case OPC_DMADDU:
24351         case OPC_DMSUB:
24352         case OPC_DMSUBU:
24353             gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
24354             break;
24355         default:            /* Invalid */
24356             MIPS_INVAL("MASK DPAQ.W.QH");
24357             gen_reserved_instruction(ctx);
24358             break;
24359         }
24360         break;
24361     case OPC_DINSV_DSP:
24362         op2 = MASK_INSV(ctx->opcode);
24363         switch (op2) {
24364         case OPC_DINSV:
24365         {
24366             TCGv t0, t1;
24367 
24368             check_dsp(ctx);
24369 
24370             if (rt == 0) {
24371                 break;
24372             }
24373 
24374             t0 = tcg_temp_new();
24375             t1 = tcg_temp_new();
24376 
24377             gen_load_gpr(t0, rt);
24378             gen_load_gpr(t1, rs);
24379 
24380             gen_helper_dinsv(cpu_gpr[rt], cpu_env, t1, t0);
24381 
24382             tcg_temp_free(t0);
24383             tcg_temp_free(t1);
24384             break;
24385         }
24386         default:            /* Invalid */
24387             MIPS_INVAL("MASK DINSV");
24388             gen_reserved_instruction(ctx);
24389             break;
24390         }
24391         break;
24392     case OPC_SHLL_OB_DSP:
24393         gen_mipsdsp_shift(ctx, op1, rd, rs, rt);
24394         break;
24395 #endif
24396     default:            /* Invalid */
24397         MIPS_INVAL("special3_legacy");
24398         gen_reserved_instruction(ctx);
24399         break;
24400     }
24401 }
24402 
24403 
24404 #if defined(TARGET_MIPS64)
24405 
24406 static void decode_mmi(CPUMIPSState *env, DisasContext *ctx)
24407 {
24408     uint32_t opc = MASK_MMI(ctx->opcode);
24409     int rs = extract32(ctx->opcode, 21, 5);
24410     int rt = extract32(ctx->opcode, 16, 5);
24411     int rd = extract32(ctx->opcode, 11, 5);
24412 
24413     switch (opc) {
24414     case MMI_OPC_MULT1:
24415     case MMI_OPC_MULTU1:
24416     case MMI_OPC_MADD:
24417     case MMI_OPC_MADDU:
24418     case MMI_OPC_MADD1:
24419     case MMI_OPC_MADDU1:
24420         gen_mul_txx9(ctx, opc, rd, rs, rt);
24421         break;
24422     case MMI_OPC_DIV1:
24423     case MMI_OPC_DIVU1:
24424         gen_div1_tx79(ctx, opc, rs, rt);
24425         break;
24426     default:
24427         MIPS_INVAL("TX79 MMI class");
24428         gen_reserved_instruction(ctx);
24429         break;
24430     }
24431 }
24432 
24433 static void gen_mmi_lq(CPUMIPSState *env, DisasContext *ctx)
24434 {
24435     gen_reserved_instruction(ctx);    /* TODO: MMI_OPC_LQ */
24436 }
24437 
24438 static void gen_mmi_sq(DisasContext *ctx, int base, int rt, int offset)
24439 {
24440     gen_reserved_instruction(ctx);    /* TODO: MMI_OPC_SQ */
24441 }
24442 
24443 /*
24444  * The TX79-specific instruction Store Quadword
24445  *
24446  * +--------+-------+-------+------------------------+
24447  * | 011111 |  base |   rt  |           offset       | SQ
24448  * +--------+-------+-------+------------------------+
24449  *      6       5       5                 16
24450  *
24451  * has the same opcode as the Read Hardware Register instruction
24452  *
24453  * +--------+-------+-------+-------+-------+--------+
24454  * | 011111 | 00000 |   rt  |   rd  | 00000 | 111011 | RDHWR
24455  * +--------+-------+-------+-------+-------+--------+
24456  *      6       5       5       5       5        6
24457  *
24458  * that is required, trapped and emulated by the Linux kernel. However, all
24459  * RDHWR encodings yield address error exceptions on the TX79 since the SQ
24460  * offset is odd. Therefore all valid SQ instructions can execute normally.
24461  * In user mode, QEMU must verify the upper and lower 11 bits to distinguish
24462  * between SQ and RDHWR, as the Linux kernel does.
24463  */
24464 static void decode_mmi_sq(CPUMIPSState *env, DisasContext *ctx)
24465 {
24466     int base = extract32(ctx->opcode, 21, 5);
24467     int rt = extract32(ctx->opcode, 16, 5);
24468     int offset = extract32(ctx->opcode, 0, 16);
24469 
24470 #ifdef CONFIG_USER_ONLY
24471     uint32_t op1 = MASK_SPECIAL3(ctx->opcode);
24472     uint32_t op2 = extract32(ctx->opcode, 6, 5);
24473 
24474     if (base == 0 && op2 == 0 && op1 == OPC_RDHWR) {
24475         int rd = extract32(ctx->opcode, 11, 5);
24476 
24477         gen_rdhwr(ctx, rt, rd, 0);
24478         return;
24479     }
24480 #endif
24481 
24482     gen_mmi_sq(ctx, base, rt, offset);
24483 }
24484 
24485 #endif
24486 
24487 static void decode_opc_special3(CPUMIPSState *env, DisasContext *ctx)
24488 {
24489     int rs, rt, rd, sa;
24490     uint32_t op1, op2;
24491     int16_t imm;
24492 
24493     rs = (ctx->opcode >> 21) & 0x1f;
24494     rt = (ctx->opcode >> 16) & 0x1f;
24495     rd = (ctx->opcode >> 11) & 0x1f;
24496     sa = (ctx->opcode >> 6) & 0x1f;
24497     imm = sextract32(ctx->opcode, 7, 9);
24498 
24499     op1 = MASK_SPECIAL3(ctx->opcode);
24500 
24501     /*
24502      * EVA loads and stores overlap Loongson 2E instructions decoded by
24503      * decode_opc_special3_legacy(), so be careful to allow their decoding when
24504      * EVA is absent.
24505      */
24506     if (ctx->eva) {
24507         switch (op1) {
24508         case OPC_LWLE:
24509         case OPC_LWRE:
24510         case OPC_LBUE:
24511         case OPC_LHUE:
24512         case OPC_LBE:
24513         case OPC_LHE:
24514         case OPC_LLE:
24515         case OPC_LWE:
24516             check_cp0_enabled(ctx);
24517             gen_ld(ctx, op1, rt, rs, imm);
24518             return;
24519         case OPC_SWLE:
24520         case OPC_SWRE:
24521         case OPC_SBE:
24522         case OPC_SHE:
24523         case OPC_SWE:
24524             check_cp0_enabled(ctx);
24525             gen_st(ctx, op1, rt, rs, imm);
24526             return;
24527         case OPC_SCE:
24528             check_cp0_enabled(ctx);
24529             gen_st_cond(ctx, rt, rs, imm, MO_TESL, true);
24530             return;
24531         case OPC_CACHEE:
24532             check_eva(ctx);
24533             check_cp0_enabled(ctx);
24534             if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
24535                 gen_cache_operation(ctx, rt, rs, imm);
24536             }
24537             return;
24538         case OPC_PREFE:
24539             check_cp0_enabled(ctx);
24540             /* Treat as NOP. */
24541             return;
24542         }
24543     }
24544 
24545     switch (op1) {
24546     case OPC_EXT:
24547     case OPC_INS:
24548         check_insn(ctx, ISA_MIPS_R2);
24549         gen_bitops(ctx, op1, rt, rs, sa, rd);
24550         break;
24551     case OPC_BSHFL:
24552         op2 = MASK_BSHFL(ctx->opcode);
24553         switch (op2) {
24554         case OPC_ALIGN:
24555         case OPC_ALIGN_1:
24556         case OPC_ALIGN_2:
24557         case OPC_ALIGN_3:
24558         case OPC_BITSWAP:
24559             check_insn(ctx, ISA_MIPS_R6);
24560             decode_opc_special3_r6(env, ctx);
24561             break;
24562         default:
24563             check_insn(ctx, ISA_MIPS_R2);
24564             gen_bshfl(ctx, op2, rt, rd);
24565             break;
24566         }
24567         break;
24568 #if defined(TARGET_MIPS64)
24569     case OPC_DEXTM:
24570     case OPC_DEXTU:
24571     case OPC_DEXT:
24572     case OPC_DINSM:
24573     case OPC_DINSU:
24574     case OPC_DINS:
24575         check_insn(ctx, ISA_MIPS_R2);
24576         check_mips_64(ctx);
24577         gen_bitops(ctx, op1, rt, rs, sa, rd);
24578         break;
24579     case OPC_DBSHFL:
24580         op2 = MASK_DBSHFL(ctx->opcode);
24581         switch (op2) {
24582         case OPC_DALIGN:
24583         case OPC_DALIGN_1:
24584         case OPC_DALIGN_2:
24585         case OPC_DALIGN_3:
24586         case OPC_DALIGN_4:
24587         case OPC_DALIGN_5:
24588         case OPC_DALIGN_6:
24589         case OPC_DALIGN_7:
24590         case OPC_DBITSWAP:
24591             check_insn(ctx, ISA_MIPS_R6);
24592             decode_opc_special3_r6(env, ctx);
24593             break;
24594         default:
24595             check_insn(ctx, ISA_MIPS_R2);
24596             check_mips_64(ctx);
24597             op2 = MASK_DBSHFL(ctx->opcode);
24598             gen_bshfl(ctx, op2, rt, rd);
24599             break;
24600         }
24601         break;
24602 #endif
24603     case OPC_RDHWR:
24604         gen_rdhwr(ctx, rt, rd, extract32(ctx->opcode, 6, 3));
24605         break;
24606     case OPC_FORK:
24607         check_mt(ctx);
24608         {
24609             TCGv t0 = tcg_temp_new();
24610             TCGv t1 = tcg_temp_new();
24611 
24612             gen_load_gpr(t0, rt);
24613             gen_load_gpr(t1, rs);
24614             gen_helper_fork(t0, t1);
24615             tcg_temp_free(t0);
24616             tcg_temp_free(t1);
24617         }
24618         break;
24619     case OPC_YIELD:
24620         check_mt(ctx);
24621         {
24622             TCGv t0 = tcg_temp_new();
24623 
24624             gen_load_gpr(t0, rs);
24625             gen_helper_yield(t0, cpu_env, t0);
24626             gen_store_gpr(t0, rd);
24627             tcg_temp_free(t0);
24628         }
24629         break;
24630     default:
24631         if (ctx->insn_flags & ISA_MIPS_R6) {
24632             decode_opc_special3_r6(env, ctx);
24633         } else {
24634             decode_opc_special3_legacy(env, ctx);
24635         }
24636     }
24637 }
24638 
24639 static bool decode_opc_legacy(CPUMIPSState *env, DisasContext *ctx)
24640 {
24641     int32_t offset;
24642     int rs, rt, rd, sa;
24643     uint32_t op, op1;
24644     int16_t imm;
24645 
24646     op = MASK_OP_MAJOR(ctx->opcode);
24647     rs = (ctx->opcode >> 21) & 0x1f;
24648     rt = (ctx->opcode >> 16) & 0x1f;
24649     rd = (ctx->opcode >> 11) & 0x1f;
24650     sa = (ctx->opcode >> 6) & 0x1f;
24651     imm = (int16_t)ctx->opcode;
24652     switch (op) {
24653     case OPC_SPECIAL:
24654         decode_opc_special(env, ctx);
24655         break;
24656     case OPC_SPECIAL2:
24657 #if defined(TARGET_MIPS64)
24658         if ((ctx->insn_flags & INSN_R5900) && (ctx->insn_flags & ASE_MMI)) {
24659             decode_mmi(env, ctx);
24660             break;
24661         }
24662 #endif
24663         if (TARGET_LONG_BITS == 32 && (ctx->insn_flags & ASE_MXU)) {
24664             if (MASK_SPECIAL2(ctx->opcode) == OPC_MUL) {
24665                 gen_arith(ctx, OPC_MUL, rd, rs, rt);
24666             } else {
24667                 decode_ase_mxu(ctx, ctx->opcode);
24668             }
24669             break;
24670         }
24671         decode_opc_special2_legacy(env, ctx);
24672         break;
24673     case OPC_SPECIAL3:
24674 #if defined(TARGET_MIPS64)
24675         if (ctx->insn_flags & INSN_R5900) {
24676             decode_mmi_sq(env, ctx);    /* MMI_OPC_SQ */
24677         } else {
24678             decode_opc_special3(env, ctx);
24679         }
24680 #else
24681         decode_opc_special3(env, ctx);
24682 #endif
24683         break;
24684     case OPC_REGIMM:
24685         op1 = MASK_REGIMM(ctx->opcode);
24686         switch (op1) {
24687         case OPC_BLTZL: /* REGIMM branches */
24688         case OPC_BGEZL:
24689         case OPC_BLTZALL:
24690         case OPC_BGEZALL:
24691             check_insn(ctx, ISA_MIPS2);
24692             check_insn_opc_removed(ctx, ISA_MIPS_R6);
24693             /* Fallthrough */
24694         case OPC_BLTZ:
24695         case OPC_BGEZ:
24696             gen_compute_branch(ctx, op1, 4, rs, -1, imm << 2, 4);
24697             break;
24698         case OPC_BLTZAL:
24699         case OPC_BGEZAL:
24700             if (ctx->insn_flags & ISA_MIPS_R6) {
24701                 if (rs == 0) {
24702                     /* OPC_NAL, OPC_BAL */
24703                     gen_compute_branch(ctx, op1, 4, 0, -1, imm << 2, 4);
24704                 } else {
24705                     gen_reserved_instruction(ctx);
24706                 }
24707             } else {
24708                 gen_compute_branch(ctx, op1, 4, rs, -1, imm << 2, 4);
24709             }
24710             break;
24711         case OPC_TGEI: /* REGIMM traps */
24712         case OPC_TGEIU:
24713         case OPC_TLTI:
24714         case OPC_TLTIU:
24715         case OPC_TEQI:
24716 
24717         case OPC_TNEI:
24718             check_insn(ctx, ISA_MIPS2);
24719             check_insn_opc_removed(ctx, ISA_MIPS_R6);
24720             gen_trap(ctx, op1, rs, -1, imm);
24721             break;
24722         case OPC_SIGRIE:
24723             check_insn(ctx, ISA_MIPS_R6);
24724             gen_reserved_instruction(ctx);
24725             break;
24726         case OPC_SYNCI:
24727             check_insn(ctx, ISA_MIPS_R2);
24728             /*
24729              * Break the TB to be able to sync copied instructions
24730              * immediately.
24731              */
24732             ctx->base.is_jmp = DISAS_STOP;
24733             break;
24734         case OPC_BPOSGE32:    /* MIPS DSP branch */
24735 #if defined(TARGET_MIPS64)
24736         case OPC_BPOSGE64:
24737 #endif
24738             check_dsp(ctx);
24739             gen_compute_branch(ctx, op1, 4, -1, -2, (int32_t)imm << 2, 4);
24740             break;
24741 #if defined(TARGET_MIPS64)
24742         case OPC_DAHI:
24743             check_insn(ctx, ISA_MIPS_R6);
24744             check_mips_64(ctx);
24745             if (rs != 0) {
24746                 tcg_gen_addi_tl(cpu_gpr[rs], cpu_gpr[rs], (int64_t)imm << 32);
24747             }
24748             break;
24749         case OPC_DATI:
24750             check_insn(ctx, ISA_MIPS_R6);
24751             check_mips_64(ctx);
24752             if (rs != 0) {
24753                 tcg_gen_addi_tl(cpu_gpr[rs], cpu_gpr[rs], (int64_t)imm << 48);
24754             }
24755             break;
24756 #endif
24757         default:            /* Invalid */
24758             MIPS_INVAL("regimm");
24759             gen_reserved_instruction(ctx);
24760             break;
24761         }
24762         break;
24763     case OPC_CP0:
24764         check_cp0_enabled(ctx);
24765         op1 = MASK_CP0(ctx->opcode);
24766         switch (op1) {
24767         case OPC_MFC0:
24768         case OPC_MTC0:
24769         case OPC_MFTR:
24770         case OPC_MTTR:
24771         case OPC_MFHC0:
24772         case OPC_MTHC0:
24773 #if defined(TARGET_MIPS64)
24774         case OPC_DMFC0:
24775         case OPC_DMTC0:
24776 #endif
24777 #ifndef CONFIG_USER_ONLY
24778             gen_cp0(env, ctx, op1, rt, rd);
24779 #endif /* !CONFIG_USER_ONLY */
24780             break;
24781         case OPC_C0:
24782         case OPC_C0_1:
24783         case OPC_C0_2:
24784         case OPC_C0_3:
24785         case OPC_C0_4:
24786         case OPC_C0_5:
24787         case OPC_C0_6:
24788         case OPC_C0_7:
24789         case OPC_C0_8:
24790         case OPC_C0_9:
24791         case OPC_C0_A:
24792         case OPC_C0_B:
24793         case OPC_C0_C:
24794         case OPC_C0_D:
24795         case OPC_C0_E:
24796         case OPC_C0_F:
24797 #ifndef CONFIG_USER_ONLY
24798             gen_cp0(env, ctx, MASK_C0(ctx->opcode), rt, rd);
24799 #endif /* !CONFIG_USER_ONLY */
24800             break;
24801         case OPC_MFMC0:
24802 #ifndef CONFIG_USER_ONLY
24803             {
24804                 uint32_t op2;
24805                 TCGv t0 = tcg_temp_new();
24806 
24807                 op2 = MASK_MFMC0(ctx->opcode);
24808                 switch (op2) {
24809                 case OPC_DMT:
24810                     check_cp0_mt(ctx);
24811                     gen_helper_dmt(t0);
24812                     gen_store_gpr(t0, rt);
24813                     break;
24814                 case OPC_EMT:
24815                     check_cp0_mt(ctx);
24816                     gen_helper_emt(t0);
24817                     gen_store_gpr(t0, rt);
24818                     break;
24819                 case OPC_DVPE:
24820                     check_cp0_mt(ctx);
24821                     gen_helper_dvpe(t0, cpu_env);
24822                     gen_store_gpr(t0, rt);
24823                     break;
24824                 case OPC_EVPE:
24825                     check_cp0_mt(ctx);
24826                     gen_helper_evpe(t0, cpu_env);
24827                     gen_store_gpr(t0, rt);
24828                     break;
24829                 case OPC_DVP:
24830                     check_insn(ctx, ISA_MIPS_R6);
24831                     if (ctx->vp) {
24832                         gen_helper_dvp(t0, cpu_env);
24833                         gen_store_gpr(t0, rt);
24834                     }
24835                     break;
24836                 case OPC_EVP:
24837                     check_insn(ctx, ISA_MIPS_R6);
24838                     if (ctx->vp) {
24839                         gen_helper_evp(t0, cpu_env);
24840                         gen_store_gpr(t0, rt);
24841                     }
24842                     break;
24843                 case OPC_DI:
24844                     check_insn(ctx, ISA_MIPS_R2);
24845                     save_cpu_state(ctx, 1);
24846                     gen_helper_di(t0, cpu_env);
24847                     gen_store_gpr(t0, rt);
24848                     /*
24849                      * Stop translation as we may have switched
24850                      * the execution mode.
24851                      */
24852                     ctx->base.is_jmp = DISAS_STOP;
24853                     break;
24854                 case OPC_EI:
24855                     check_insn(ctx, ISA_MIPS_R2);
24856                     save_cpu_state(ctx, 1);
24857                     gen_helper_ei(t0, cpu_env);
24858                     gen_store_gpr(t0, rt);
24859                     /*
24860                      * DISAS_STOP isn't sufficient, we need to ensure we break
24861                      * out of translated code to check for pending interrupts.
24862                      */
24863                     gen_save_pc(ctx->base.pc_next + 4);
24864                     ctx->base.is_jmp = DISAS_EXIT;
24865                     break;
24866                 default:            /* Invalid */
24867                     MIPS_INVAL("mfmc0");
24868                     gen_reserved_instruction(ctx);
24869                     break;
24870                 }
24871                 tcg_temp_free(t0);
24872             }
24873 #endif /* !CONFIG_USER_ONLY */
24874             break;
24875         case OPC_RDPGPR:
24876             check_insn(ctx, ISA_MIPS_R2);
24877             gen_load_srsgpr(rt, rd);
24878             break;
24879         case OPC_WRPGPR:
24880             check_insn(ctx, ISA_MIPS_R2);
24881             gen_store_srsgpr(rt, rd);
24882             break;
24883         default:
24884             MIPS_INVAL("cp0");
24885             gen_reserved_instruction(ctx);
24886             break;
24887         }
24888         break;
24889     case OPC_BOVC: /* OPC_BEQZALC, OPC_BEQC, OPC_ADDI */
24890         if (ctx->insn_flags & ISA_MIPS_R6) {
24891             /* OPC_BOVC, OPC_BEQZALC, OPC_BEQC */
24892             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
24893         } else {
24894             /* OPC_ADDI */
24895             /* Arithmetic with immediate opcode */
24896             gen_arith_imm(ctx, op, rt, rs, imm);
24897         }
24898         break;
24899     case OPC_ADDIU:
24900          gen_arith_imm(ctx, op, rt, rs, imm);
24901          break;
24902     case OPC_SLTI: /* Set on less than with immediate opcode */
24903     case OPC_SLTIU:
24904          gen_slt_imm(ctx, op, rt, rs, imm);
24905          break;
24906     case OPC_ANDI: /* Arithmetic with immediate opcode */
24907     case OPC_LUI: /* OPC_AUI */
24908     case OPC_ORI:
24909     case OPC_XORI:
24910          gen_logic_imm(ctx, op, rt, rs, imm);
24911          break;
24912     case OPC_J: /* Jump */
24913     case OPC_JAL:
24914          offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
24915          gen_compute_branch(ctx, op, 4, rs, rt, offset, 4);
24916          break;
24917     /* Branch */
24918     case OPC_BLEZC: /* OPC_BGEZC, OPC_BGEC, OPC_BLEZL */
24919         if (ctx->insn_flags & ISA_MIPS_R6) {
24920             if (rt == 0) {
24921                 gen_reserved_instruction(ctx);
24922                 break;
24923             }
24924             /* OPC_BLEZC, OPC_BGEZC, OPC_BGEC */
24925             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
24926         } else {
24927             /* OPC_BLEZL */
24928             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
24929         }
24930         break;
24931     case OPC_BGTZC: /* OPC_BLTZC, OPC_BLTC, OPC_BGTZL */
24932         if (ctx->insn_flags & ISA_MIPS_R6) {
24933             if (rt == 0) {
24934                 gen_reserved_instruction(ctx);
24935                 break;
24936             }
24937             /* OPC_BGTZC, OPC_BLTZC, OPC_BLTC */
24938             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
24939         } else {
24940             /* OPC_BGTZL */
24941             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
24942         }
24943         break;
24944     case OPC_BLEZALC: /* OPC_BGEZALC, OPC_BGEUC, OPC_BLEZ */
24945         if (rt == 0) {
24946             /* OPC_BLEZ */
24947             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
24948         } else {
24949             check_insn(ctx, ISA_MIPS_R6);
24950             /* OPC_BLEZALC, OPC_BGEZALC, OPC_BGEUC */
24951             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
24952         }
24953         break;
24954     case OPC_BGTZALC: /* OPC_BLTZALC, OPC_BLTUC, OPC_BGTZ */
24955         if (rt == 0) {
24956             /* OPC_BGTZ */
24957             gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
24958         } else {
24959             check_insn(ctx, ISA_MIPS_R6);
24960             /* OPC_BGTZALC, OPC_BLTZALC, OPC_BLTUC */
24961             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
24962         }
24963         break;
24964     case OPC_BEQL:
24965     case OPC_BNEL:
24966         check_insn(ctx, ISA_MIPS2);
24967          check_insn_opc_removed(ctx, ISA_MIPS_R6);
24968         /* Fallthrough */
24969     case OPC_BEQ:
24970     case OPC_BNE:
24971          gen_compute_branch(ctx, op, 4, rs, rt, imm << 2, 4);
24972          break;
24973     case OPC_LL: /* Load and stores */
24974         check_insn(ctx, ISA_MIPS2);
24975         if (ctx->insn_flags & INSN_R5900) {
24976             check_insn_opc_user_only(ctx, INSN_R5900);
24977         }
24978         /* Fallthrough */
24979     case OPC_LWL:
24980     case OPC_LWR:
24981     case OPC_LB:
24982     case OPC_LH:
24983     case OPC_LW:
24984     case OPC_LWPC:
24985     case OPC_LBU:
24986     case OPC_LHU:
24987          gen_ld(ctx, op, rt, rs, imm);
24988          break;
24989     case OPC_SWL:
24990     case OPC_SWR:
24991     case OPC_SB:
24992     case OPC_SH:
24993     case OPC_SW:
24994          gen_st(ctx, op, rt, rs, imm);
24995          break;
24996     case OPC_SC:
24997         check_insn(ctx, ISA_MIPS2);
24998         if (ctx->insn_flags & INSN_R5900) {
24999             check_insn_opc_user_only(ctx, INSN_R5900);
25000         }
25001         gen_st_cond(ctx, rt, rs, imm, MO_TESL, false);
25002         break;
25003     case OPC_CACHE:
25004         check_cp0_enabled(ctx);
25005         check_insn(ctx, ISA_MIPS3 | ISA_MIPS_R1);
25006         if (ctx->hflags & MIPS_HFLAG_ITC_CACHE) {
25007             gen_cache_operation(ctx, rt, rs, imm);
25008         }
25009         /* Treat as NOP. */
25010         break;
25011     case OPC_PREF:
25012         if (ctx->insn_flags & INSN_R5900) {
25013             /* Treat as NOP. */
25014         } else {
25015             check_insn(ctx, ISA_MIPS4 | ISA_MIPS_R1);
25016             /* Treat as NOP. */
25017         }
25018         break;
25019 
25020     /* Floating point (COP1). */
25021     case OPC_LWC1:
25022     case OPC_LDC1:
25023     case OPC_SWC1:
25024     case OPC_SDC1:
25025         gen_cop1_ldst(ctx, op, rt, rs, imm);
25026         break;
25027 
25028     case OPC_CP1:
25029         op1 = MASK_CP1(ctx->opcode);
25030 
25031         switch (op1) {
25032         case OPC_MFHC1:
25033         case OPC_MTHC1:
25034             check_cp1_enabled(ctx);
25035             check_insn(ctx, ISA_MIPS_R2);
25036             /* fall through */
25037         case OPC_MFC1:
25038         case OPC_CFC1:
25039         case OPC_MTC1:
25040         case OPC_CTC1:
25041             check_cp1_enabled(ctx);
25042             gen_cp1(ctx, op1, rt, rd);
25043             break;
25044 #if defined(TARGET_MIPS64)
25045         case OPC_DMFC1:
25046         case OPC_DMTC1:
25047             check_cp1_enabled(ctx);
25048             check_insn(ctx, ISA_MIPS3);
25049             check_mips_64(ctx);
25050             gen_cp1(ctx, op1, rt, rd);
25051             break;
25052 #endif
25053         case OPC_BC1EQZ: /* OPC_BC1ANY2 */
25054             check_cp1_enabled(ctx);
25055             if (ctx->insn_flags & ISA_MIPS_R6) {
25056                 /* OPC_BC1EQZ */
25057                 gen_compute_branch1_r6(ctx, MASK_CP1(ctx->opcode),
25058                                        rt, imm << 2, 4);
25059             } else {
25060                 /* OPC_BC1ANY2 */
25061                 check_cop1x(ctx);
25062                 check_insn(ctx, ASE_MIPS3D);
25063                 gen_compute_branch1(ctx, MASK_BC1(ctx->opcode),
25064                                     (rt >> 2) & 0x7, imm << 2);
25065             }
25066             break;
25067         case OPC_BC1NEZ:
25068             check_cp1_enabled(ctx);
25069             check_insn(ctx, ISA_MIPS_R6);
25070             gen_compute_branch1_r6(ctx, MASK_CP1(ctx->opcode),
25071                                    rt, imm << 2, 4);
25072             break;
25073         case OPC_BC1ANY4:
25074             check_cp1_enabled(ctx);
25075             check_insn_opc_removed(ctx, ISA_MIPS_R6);
25076             check_cop1x(ctx);
25077             check_insn(ctx, ASE_MIPS3D);
25078             /* fall through */
25079         case OPC_BC1:
25080             check_cp1_enabled(ctx);
25081             check_insn_opc_removed(ctx, ISA_MIPS_R6);
25082             gen_compute_branch1(ctx, MASK_BC1(ctx->opcode),
25083                                 (rt >> 2) & 0x7, imm << 2);
25084             break;
25085         case OPC_PS_FMT:
25086             check_ps(ctx);
25087             /* fall through */
25088         case OPC_S_FMT:
25089         case OPC_D_FMT:
25090             check_cp1_enabled(ctx);
25091             gen_farith(ctx, ctx->opcode & FOP(0x3f, 0x1f), rt, rd, sa,
25092                        (imm >> 8) & 0x7);
25093             break;
25094         case OPC_W_FMT:
25095         case OPC_L_FMT:
25096         {
25097             int r6_op = ctx->opcode & FOP(0x3f, 0x1f);
25098             check_cp1_enabled(ctx);
25099             if (ctx->insn_flags & ISA_MIPS_R6) {
25100                 switch (r6_op) {
25101                 case R6_OPC_CMP_AF_S:
25102                 case R6_OPC_CMP_UN_S:
25103                 case R6_OPC_CMP_EQ_S:
25104                 case R6_OPC_CMP_UEQ_S:
25105                 case R6_OPC_CMP_LT_S:
25106                 case R6_OPC_CMP_ULT_S:
25107                 case R6_OPC_CMP_LE_S:
25108                 case R6_OPC_CMP_ULE_S:
25109                 case R6_OPC_CMP_SAF_S:
25110                 case R6_OPC_CMP_SUN_S:
25111                 case R6_OPC_CMP_SEQ_S:
25112                 case R6_OPC_CMP_SEUQ_S:
25113                 case R6_OPC_CMP_SLT_S:
25114                 case R6_OPC_CMP_SULT_S:
25115                 case R6_OPC_CMP_SLE_S:
25116                 case R6_OPC_CMP_SULE_S:
25117                 case R6_OPC_CMP_OR_S:
25118                 case R6_OPC_CMP_UNE_S:
25119                 case R6_OPC_CMP_NE_S:
25120                 case R6_OPC_CMP_SOR_S:
25121                 case R6_OPC_CMP_SUNE_S:
25122                 case R6_OPC_CMP_SNE_S:
25123                     gen_r6_cmp_s(ctx, ctx->opcode & 0x1f, rt, rd, sa);
25124                     break;
25125                 case R6_OPC_CMP_AF_D:
25126                 case R6_OPC_CMP_UN_D:
25127                 case R6_OPC_CMP_EQ_D:
25128                 case R6_OPC_CMP_UEQ_D:
25129                 case R6_OPC_CMP_LT_D:
25130                 case R6_OPC_CMP_ULT_D:
25131                 case R6_OPC_CMP_LE_D:
25132                 case R6_OPC_CMP_ULE_D:
25133                 case R6_OPC_CMP_SAF_D:
25134                 case R6_OPC_CMP_SUN_D:
25135                 case R6_OPC_CMP_SEQ_D:
25136                 case R6_OPC_CMP_SEUQ_D:
25137                 case R6_OPC_CMP_SLT_D:
25138                 case R6_OPC_CMP_SULT_D:
25139                 case R6_OPC_CMP_SLE_D:
25140                 case R6_OPC_CMP_SULE_D:
25141                 case R6_OPC_CMP_OR_D:
25142                 case R6_OPC_CMP_UNE_D:
25143                 case R6_OPC_CMP_NE_D:
25144                 case R6_OPC_CMP_SOR_D:
25145                 case R6_OPC_CMP_SUNE_D:
25146                 case R6_OPC_CMP_SNE_D:
25147                     gen_r6_cmp_d(ctx, ctx->opcode & 0x1f, rt, rd, sa);
25148                     break;
25149                 default:
25150                     gen_farith(ctx, ctx->opcode & FOP(0x3f, 0x1f),
25151                                rt, rd, sa, (imm >> 8) & 0x7);
25152 
25153                     break;
25154                 }
25155             } else {
25156                 gen_farith(ctx, ctx->opcode & FOP(0x3f, 0x1f), rt, rd, sa,
25157                            (imm >> 8) & 0x7);
25158             }
25159             break;
25160         }
25161         default:
25162             MIPS_INVAL("cp1");
25163             gen_reserved_instruction(ctx);
25164             break;
25165         }
25166         break;
25167 
25168     /* Compact branches [R6] and COP2 [non-R6] */
25169     case OPC_BC: /* OPC_LWC2 */
25170     case OPC_BALC: /* OPC_SWC2 */
25171         if (ctx->insn_flags & ISA_MIPS_R6) {
25172             /* OPC_BC, OPC_BALC */
25173             gen_compute_compact_branch(ctx, op, 0, 0,
25174                                        sextract32(ctx->opcode << 2, 0, 28));
25175         } else if (ctx->insn_flags & ASE_LEXT) {
25176             gen_loongson_lswc2(ctx, rt, rs, rd);
25177         } else {
25178             /* OPC_LWC2, OPC_SWC2 */
25179             /* COP2: Not implemented. */
25180             generate_exception_err(ctx, EXCP_CpU, 2);
25181         }
25182         break;
25183     case OPC_BEQZC: /* OPC_JIC, OPC_LDC2 */
25184     case OPC_BNEZC: /* OPC_JIALC, OPC_SDC2 */
25185         if (ctx->insn_flags & ISA_MIPS_R6) {
25186             if (rs != 0) {
25187                 /* OPC_BEQZC, OPC_BNEZC */
25188                 gen_compute_compact_branch(ctx, op, rs, 0,
25189                                            sextract32(ctx->opcode << 2, 0, 23));
25190             } else {
25191                 /* OPC_JIC, OPC_JIALC */
25192                 gen_compute_compact_branch(ctx, op, 0, rt, imm);
25193             }
25194         } else if (ctx->insn_flags & ASE_LEXT) {
25195             gen_loongson_lsdc2(ctx, rt, rs, rd);
25196         } else {
25197             /* OPC_LWC2, OPC_SWC2 */
25198             /* COP2: Not implemented. */
25199             generate_exception_err(ctx, EXCP_CpU, 2);
25200         }
25201         break;
25202     case OPC_CP2:
25203         check_insn(ctx, ASE_LMMI);
25204         /* Note that these instructions use different fields.  */
25205         gen_loongson_multimedia(ctx, sa, rd, rt);
25206         break;
25207 
25208     case OPC_CP3:
25209         if (ctx->CP0_Config1 & (1 << CP0C1_FP)) {
25210             check_cp1_enabled(ctx);
25211             op1 = MASK_CP3(ctx->opcode);
25212             switch (op1) {
25213             case OPC_LUXC1:
25214             case OPC_SUXC1:
25215                 check_insn(ctx, ISA_MIPS5 | ISA_MIPS_R2);
25216                 /* Fallthrough */
25217             case OPC_LWXC1:
25218             case OPC_LDXC1:
25219             case OPC_SWXC1:
25220             case OPC_SDXC1:
25221                 check_insn(ctx, ISA_MIPS4 | ISA_MIPS_R2);
25222                 gen_flt3_ldst(ctx, op1, sa, rd, rs, rt);
25223                 break;
25224             case OPC_PREFX:
25225                 check_insn(ctx, ISA_MIPS4 | ISA_MIPS_R2);
25226                 /* Treat as NOP. */
25227                 break;
25228             case OPC_ALNV_PS:
25229                 check_insn(ctx, ISA_MIPS5 | ISA_MIPS_R2);
25230                 /* Fallthrough */
25231             case OPC_MADD_S:
25232             case OPC_MADD_D:
25233             case OPC_MADD_PS:
25234             case OPC_MSUB_S:
25235             case OPC_MSUB_D:
25236             case OPC_MSUB_PS:
25237             case OPC_NMADD_S:
25238             case OPC_NMADD_D:
25239             case OPC_NMADD_PS:
25240             case OPC_NMSUB_S:
25241             case OPC_NMSUB_D:
25242             case OPC_NMSUB_PS:
25243                 check_insn(ctx, ISA_MIPS4 | ISA_MIPS_R2);
25244                 gen_flt3_arith(ctx, op1, sa, rs, rd, rt);
25245                 break;
25246             default:
25247                 MIPS_INVAL("cp3");
25248                 gen_reserved_instruction(ctx);
25249                 break;
25250             }
25251         } else {
25252             generate_exception_err(ctx, EXCP_CpU, 1);
25253         }
25254         break;
25255 
25256 #if defined(TARGET_MIPS64)
25257     /* MIPS64 opcodes */
25258     case OPC_LLD:
25259         if (ctx->insn_flags & INSN_R5900) {
25260             check_insn_opc_user_only(ctx, INSN_R5900);
25261         }
25262         /* fall through */
25263     case OPC_LDL:
25264     case OPC_LDR:
25265     case OPC_LWU:
25266     case OPC_LD:
25267         check_insn(ctx, ISA_MIPS3);
25268         check_mips_64(ctx);
25269         gen_ld(ctx, op, rt, rs, imm);
25270         break;
25271     case OPC_SDL:
25272     case OPC_SDR:
25273     case OPC_SD:
25274         check_insn(ctx, ISA_MIPS3);
25275         check_mips_64(ctx);
25276         gen_st(ctx, op, rt, rs, imm);
25277         break;
25278     case OPC_SCD:
25279         check_insn(ctx, ISA_MIPS3);
25280         if (ctx->insn_flags & INSN_R5900) {
25281             check_insn_opc_user_only(ctx, INSN_R5900);
25282         }
25283         check_mips_64(ctx);
25284         gen_st_cond(ctx, rt, rs, imm, MO_TEQ, false);
25285         break;
25286     case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC, OPC_DADDI */
25287         if (ctx->insn_flags & ISA_MIPS_R6) {
25288             /* OPC_BNVC, OPC_BNEZALC, OPC_BNEC */
25289             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
25290         } else {
25291             /* OPC_DADDI */
25292             check_insn(ctx, ISA_MIPS3);
25293             check_mips_64(ctx);
25294             gen_arith_imm(ctx, op, rt, rs, imm);
25295         }
25296         break;
25297     case OPC_DADDIU:
25298         check_insn(ctx, ISA_MIPS3);
25299         check_mips_64(ctx);
25300         gen_arith_imm(ctx, op, rt, rs, imm);
25301         break;
25302 #else
25303     case OPC_BNVC: /* OPC_BNEZALC, OPC_BNEC */
25304         if (ctx->insn_flags & ISA_MIPS_R6) {
25305             gen_compute_compact_branch(ctx, op, rs, rt, imm << 2);
25306         } else {
25307             MIPS_INVAL("major opcode");
25308             gen_reserved_instruction(ctx);
25309         }
25310         break;
25311 #endif
25312     case OPC_DAUI: /* OPC_JALX */
25313         if (ctx->insn_flags & ISA_MIPS_R6) {
25314 #if defined(TARGET_MIPS64)
25315             /* OPC_DAUI */
25316             check_mips_64(ctx);
25317             if (rs == 0) {
25318                 generate_exception(ctx, EXCP_RI);
25319             } else if (rt != 0) {
25320                 TCGv t0 = tcg_temp_new();
25321                 gen_load_gpr(t0, rs);
25322                 tcg_gen_addi_tl(cpu_gpr[rt], t0, imm << 16);
25323                 tcg_temp_free(t0);
25324             }
25325 #else
25326             gen_reserved_instruction(ctx);
25327             MIPS_INVAL("major opcode");
25328 #endif
25329         } else {
25330             /* OPC_JALX */
25331             check_insn(ctx, ASE_MIPS16 | ASE_MICROMIPS);
25332             offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
25333             gen_compute_branch(ctx, op, 4, rs, rt, offset, 4);
25334         }
25335         break;
25336     case OPC_MDMX: /* MMI_OPC_LQ */
25337         if (ctx->insn_flags & INSN_R5900) {
25338 #if defined(TARGET_MIPS64)
25339             gen_mmi_lq(env, ctx);
25340 #endif
25341         } else {
25342             /* MDMX: Not implemented. */
25343         }
25344         break;
25345     case OPC_PCREL:
25346         check_insn(ctx, ISA_MIPS_R6);
25347         gen_pcrel(ctx, ctx->opcode, ctx->base.pc_next, rs);
25348         break;
25349     default:            /* Invalid */
25350         MIPS_INVAL("major opcode");
25351         return false;
25352     }
25353     return true;
25354 }
25355 
25356 static void decode_opc(CPUMIPSState *env, DisasContext *ctx)
25357 {
25358     /* make sure instructions are on a word boundary */
25359     if (ctx->base.pc_next & 0x3) {
25360         env->CP0_BadVAddr = ctx->base.pc_next;
25361         generate_exception_err(ctx, EXCP_AdEL, EXCP_INST_NOTAVAIL);
25362         return;
25363     }
25364 
25365     /* Handle blikely not taken case */
25366     if ((ctx->hflags & MIPS_HFLAG_BMASK_BASE) == MIPS_HFLAG_BL) {
25367         TCGLabel *l1 = gen_new_label();
25368 
25369         tcg_gen_brcondi_tl(TCG_COND_NE, bcond, 0, l1);
25370         tcg_gen_movi_i32(hflags, ctx->hflags & ~MIPS_HFLAG_BMASK);
25371         gen_goto_tb(ctx, 1, ctx->base.pc_next + 4);
25372         gen_set_label(l1);
25373     }
25374 
25375     /* Transition to the auto-generated decoder.  */
25376 
25377     /* ISA extensions */
25378     if (ase_msa_available(env) && decode_ase_msa(ctx, ctx->opcode)) {
25379         return;
25380     }
25381 
25382     /* ISA (from latest to oldest) */
25383     if (cpu_supports_isa(env, ISA_MIPS_R6) && decode_isa_rel6(ctx, ctx->opcode)) {
25384         return;
25385     }
25386     if (cpu_supports_isa(env, INSN_R5900) && decode_ext_txx9(ctx, ctx->opcode)) {
25387         return;
25388     }
25389 
25390     if (decode_opc_legacy(env, ctx)) {
25391         return;
25392     }
25393 
25394     gen_reserved_instruction(ctx);
25395 }
25396 
25397 static void mips_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
25398 {
25399     DisasContext *ctx = container_of(dcbase, DisasContext, base);
25400     CPUMIPSState *env = cs->env_ptr;
25401 
25402     ctx->page_start = ctx->base.pc_first & TARGET_PAGE_MASK;
25403     ctx->saved_pc = -1;
25404     ctx->insn_flags = env->insn_flags;
25405     ctx->CP0_Config1 = env->CP0_Config1;
25406     ctx->CP0_Config2 = env->CP0_Config2;
25407     ctx->CP0_Config3 = env->CP0_Config3;
25408     ctx->CP0_Config5 = env->CP0_Config5;
25409     ctx->btarget = 0;
25410     ctx->kscrexist = (env->CP0_Config4 >> CP0C4_KScrExist) & 0xff;
25411     ctx->rxi = (env->CP0_Config3 >> CP0C3_RXI) & 1;
25412     ctx->ie = (env->CP0_Config4 >> CP0C4_IE) & 3;
25413     ctx->bi = (env->CP0_Config3 >> CP0C3_BI) & 1;
25414     ctx->bp = (env->CP0_Config3 >> CP0C3_BP) & 1;
25415     ctx->PAMask = env->PAMask;
25416     ctx->mvh = (env->CP0_Config5 >> CP0C5_MVH) & 1;
25417     ctx->eva = (env->CP0_Config5 >> CP0C5_EVA) & 1;
25418     ctx->sc = (env->CP0_Config3 >> CP0C3_SC) & 1;
25419     ctx->CP0_LLAddr_shift = env->CP0_LLAddr_shift;
25420     ctx->cmgcr = (env->CP0_Config3 >> CP0C3_CMGCR) & 1;
25421     /* Restore delay slot state from the tb context.  */
25422     ctx->hflags = (uint32_t)ctx->base.tb->flags; /* FIXME: maybe use 64 bits? */
25423     ctx->ulri = (env->CP0_Config3 >> CP0C3_ULRI) & 1;
25424     ctx->ps = ((env->active_fpu.fcr0 >> FCR0_PS) & 1) ||
25425              (env->insn_flags & (INSN_LOONGSON2E | INSN_LOONGSON2F));
25426     ctx->vp = (env->CP0_Config5 >> CP0C5_VP) & 1;
25427     ctx->mrp = (env->CP0_Config5 >> CP0C5_MRP) & 1;
25428     ctx->nan2008 = (env->active_fpu.fcr31 >> FCR31_NAN2008) & 1;
25429     ctx->abs2008 = (env->active_fpu.fcr31 >> FCR31_ABS2008) & 1;
25430     ctx->mi = (env->CP0_Config5 >> CP0C5_MI) & 1;
25431     ctx->gi = (env->CP0_Config5 >> CP0C5_GI) & 3;
25432     restore_cpu_state(env, ctx);
25433 #ifdef CONFIG_USER_ONLY
25434         ctx->mem_idx = MIPS_HFLAG_UM;
25435 #else
25436         ctx->mem_idx = hflags_mmu_index(ctx->hflags);
25437 #endif
25438     ctx->default_tcg_memop_mask = (ctx->insn_flags & (ISA_MIPS_R6 |
25439                                   INSN_LOONGSON3A)) ? MO_UNALN : MO_ALIGN;
25440 
25441     LOG_DISAS("\ntb %p idx %d hflags %04x\n", ctx->base.tb, ctx->mem_idx,
25442               ctx->hflags);
25443 }
25444 
25445 static void mips_tr_tb_start(DisasContextBase *dcbase, CPUState *cs)
25446 {
25447 }
25448 
25449 static void mips_tr_insn_start(DisasContextBase *dcbase, CPUState *cs)
25450 {
25451     DisasContext *ctx = container_of(dcbase, DisasContext, base);
25452 
25453     tcg_gen_insn_start(ctx->base.pc_next, ctx->hflags & MIPS_HFLAG_BMASK,
25454                        ctx->btarget);
25455 }
25456 
25457 static bool mips_tr_breakpoint_check(DisasContextBase *dcbase, CPUState *cs,
25458                                      const CPUBreakpoint *bp)
25459 {
25460     DisasContext *ctx = container_of(dcbase, DisasContext, base);
25461 
25462     save_cpu_state(ctx, 1);
25463     ctx->base.is_jmp = DISAS_NORETURN;
25464     gen_helper_raise_exception_debug(cpu_env);
25465     /*
25466      * The address covered by the breakpoint must be included in
25467      * [tb->pc, tb->pc + tb->size) in order to for it to be
25468      * properly cleared -- thus we increment the PC here so that
25469      * the logic setting tb->size below does the right thing.
25470      */
25471     ctx->base.pc_next += 4;
25472     return true;
25473 }
25474 
25475 static void mips_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs)
25476 {
25477     CPUMIPSState *env = cs->env_ptr;
25478     DisasContext *ctx = container_of(dcbase, DisasContext, base);
25479     int insn_bytes;
25480     int is_slot;
25481 
25482     is_slot = ctx->hflags & MIPS_HFLAG_BMASK;
25483     if (ctx->insn_flags & ISA_NANOMIPS32) {
25484         ctx->opcode = translator_lduw(env, ctx->base.pc_next);
25485         insn_bytes = decode_nanomips_opc(env, ctx);
25486     } else if (!(ctx->hflags & MIPS_HFLAG_M16)) {
25487         ctx->opcode = translator_ldl(env, ctx->base.pc_next);
25488         insn_bytes = 4;
25489         decode_opc(env, ctx);
25490     } else if (ctx->insn_flags & ASE_MICROMIPS) {
25491         ctx->opcode = translator_lduw(env, ctx->base.pc_next);
25492         insn_bytes = decode_micromips_opc(env, ctx);
25493     } else if (ctx->insn_flags & ASE_MIPS16) {
25494         ctx->opcode = translator_lduw(env, ctx->base.pc_next);
25495         insn_bytes = decode_mips16_opc(env, ctx);
25496     } else {
25497         gen_reserved_instruction(ctx);
25498         g_assert(ctx->base.is_jmp == DISAS_NORETURN);
25499         return;
25500     }
25501 
25502     if (ctx->hflags & MIPS_HFLAG_BMASK) {
25503         if (!(ctx->hflags & (MIPS_HFLAG_BDS16 | MIPS_HFLAG_BDS32 |
25504                              MIPS_HFLAG_FBNSLOT))) {
25505             /*
25506              * Force to generate branch as there is neither delay nor
25507              * forbidden slot.
25508              */
25509             is_slot = 1;
25510         }
25511         if ((ctx->hflags & MIPS_HFLAG_M16) &&
25512             (ctx->hflags & MIPS_HFLAG_FBNSLOT)) {
25513             /*
25514              * Force to generate branch as microMIPS R6 doesn't restrict
25515              * branches in the forbidden slot.
25516              */
25517             is_slot = 1;
25518         }
25519     }
25520     if (is_slot) {
25521         gen_branch(ctx, insn_bytes);
25522     }
25523     ctx->base.pc_next += insn_bytes;
25524 
25525     if (ctx->base.is_jmp != DISAS_NEXT) {
25526         return;
25527     }
25528     /*
25529      * Execute a branch and its delay slot as a single instruction.
25530      * This is what GDB expects and is consistent with what the
25531      * hardware does (e.g. if a delay slot instruction faults, the
25532      * reported PC is the PC of the branch).
25533      */
25534     if (ctx->base.singlestep_enabled &&
25535         (ctx->hflags & MIPS_HFLAG_BMASK) == 0) {
25536         ctx->base.is_jmp = DISAS_TOO_MANY;
25537     }
25538     if (ctx->base.pc_next - ctx->page_start >= TARGET_PAGE_SIZE) {
25539         ctx->base.is_jmp = DISAS_TOO_MANY;
25540     }
25541 }
25542 
25543 static void mips_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
25544 {
25545     DisasContext *ctx = container_of(dcbase, DisasContext, base);
25546 
25547     if (ctx->base.singlestep_enabled && ctx->base.is_jmp != DISAS_NORETURN) {
25548         save_cpu_state(ctx, ctx->base.is_jmp != DISAS_EXIT);
25549         gen_helper_raise_exception_debug(cpu_env);
25550     } else {
25551         switch (ctx->base.is_jmp) {
25552         case DISAS_STOP:
25553             gen_save_pc(ctx->base.pc_next);
25554             tcg_gen_lookup_and_goto_ptr();
25555             break;
25556         case DISAS_NEXT:
25557         case DISAS_TOO_MANY:
25558             save_cpu_state(ctx, 0);
25559             gen_goto_tb(ctx, 0, ctx->base.pc_next);
25560             break;
25561         case DISAS_EXIT:
25562             tcg_gen_exit_tb(NULL, 0);
25563             break;
25564         case DISAS_NORETURN:
25565             break;
25566         default:
25567             g_assert_not_reached();
25568         }
25569     }
25570 }
25571 
25572 static void mips_tr_disas_log(const DisasContextBase *dcbase, CPUState *cs)
25573 {
25574     qemu_log("IN: %s\n", lookup_symbol(dcbase->pc_first));
25575     log_target_disas(cs, dcbase->pc_first, dcbase->tb->size);
25576 }
25577 
25578 static const TranslatorOps mips_tr_ops = {
25579     .init_disas_context = mips_tr_init_disas_context,
25580     .tb_start           = mips_tr_tb_start,
25581     .insn_start         = mips_tr_insn_start,
25582     .breakpoint_check   = mips_tr_breakpoint_check,
25583     .translate_insn     = mips_tr_translate_insn,
25584     .tb_stop            = mips_tr_tb_stop,
25585     .disas_log          = mips_tr_disas_log,
25586 };
25587 
25588 void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int max_insns)
25589 {
25590     DisasContext ctx;
25591 
25592     translator_loop(&mips_tr_ops, &ctx.base, cs, tb, max_insns);
25593 }
25594 
25595 void mips_tcg_init(void)
25596 {
25597     int i;
25598 
25599     cpu_gpr[0] = NULL;
25600     for (i = 1; i < 32; i++)
25601         cpu_gpr[i] = tcg_global_mem_new(cpu_env,
25602                                         offsetof(CPUMIPSState,
25603                                                  active_tc.gpr[i]),
25604                                         regnames[i]);
25605 #if defined(TARGET_MIPS64)
25606     cpu_gpr_hi[0] = NULL;
25607 
25608     for (unsigned i = 1; i < 32; i++) {
25609         g_autofree char *rname = g_strdup_printf("%s[hi]", regnames[i]);
25610 
25611         cpu_gpr_hi[i] = tcg_global_mem_new_i64(cpu_env,
25612                                                offsetof(CPUMIPSState,
25613                                                         active_tc.gpr_hi[i]),
25614                                                rname);
25615     }
25616 #endif /* !TARGET_MIPS64 */
25617     for (i = 0; i < 32; i++) {
25618         int off = offsetof(CPUMIPSState, active_fpu.fpr[i].wr.d[0]);
25619 
25620         fpu_f64[i] = tcg_global_mem_new_i64(cpu_env, off, fregnames[i]);
25621     }
25622     msa_translate_init();
25623     cpu_PC = tcg_global_mem_new(cpu_env,
25624                                 offsetof(CPUMIPSState, active_tc.PC), "PC");
25625     for (i = 0; i < MIPS_DSP_ACC; i++) {
25626         cpu_HI[i] = tcg_global_mem_new(cpu_env,
25627                                        offsetof(CPUMIPSState, active_tc.HI[i]),
25628                                        regnames_HI[i]);
25629         cpu_LO[i] = tcg_global_mem_new(cpu_env,
25630                                        offsetof(CPUMIPSState, active_tc.LO[i]),
25631                                        regnames_LO[i]);
25632     }
25633     cpu_dspctrl = tcg_global_mem_new(cpu_env,
25634                                      offsetof(CPUMIPSState,
25635                                               active_tc.DSPControl),
25636                                      "DSPControl");
25637     bcond = tcg_global_mem_new(cpu_env,
25638                                offsetof(CPUMIPSState, bcond), "bcond");
25639     btarget = tcg_global_mem_new(cpu_env,
25640                                  offsetof(CPUMIPSState, btarget), "btarget");
25641     hflags = tcg_global_mem_new_i32(cpu_env,
25642                                     offsetof(CPUMIPSState, hflags), "hflags");
25643 
25644     fpu_fcr0 = tcg_global_mem_new_i32(cpu_env,
25645                                       offsetof(CPUMIPSState, active_fpu.fcr0),
25646                                       "fcr0");
25647     fpu_fcr31 = tcg_global_mem_new_i32(cpu_env,
25648                                        offsetof(CPUMIPSState, active_fpu.fcr31),
25649                                        "fcr31");
25650     cpu_lladdr = tcg_global_mem_new(cpu_env, offsetof(CPUMIPSState, lladdr),
25651                                     "lladdr");
25652     cpu_llval = tcg_global_mem_new(cpu_env, offsetof(CPUMIPSState, llval),
25653                                    "llval");
25654 
25655     if (TARGET_LONG_BITS == 32) {
25656         mxu_translate_init();
25657     }
25658 }
25659 
25660 void restore_state_to_opc(CPUMIPSState *env, TranslationBlock *tb,
25661                           target_ulong *data)
25662 {
25663     env->active_tc.PC = data[0];
25664     env->hflags &= ~MIPS_HFLAG_BMASK;
25665     env->hflags |= data[1];
25666     switch (env->hflags & MIPS_HFLAG_BMASK_BASE) {
25667     case MIPS_HFLAG_BR:
25668         break;
25669     case MIPS_HFLAG_BC:
25670     case MIPS_HFLAG_BL:
25671     case MIPS_HFLAG_B:
25672         env->btarget = data[2];
25673         break;
25674     }
25675 }
25676