Statistics
| Branch: | Revision:

root / target-mips / translate.c @ cbeb0857

History | View | Annotate | Download (141.2 kB)

1 6af0bf9c bellard
/*
2 6af0bf9c bellard
 *  MIPS32 emulation for qemu: main translation routines.
3 6af0bf9c bellard
 * 
4 6af0bf9c bellard
 *  Copyright (c) 2004-2005 Jocelyn Mayer
5 6ea83fed bellard
 *  Copyright (c) 2006 Marius Groeger (FPU operations)
6 bb8a53ad ths
 *  Copyright (c) 2006 Thiemo Seufer (MIPS32R2 support)
7 6af0bf9c bellard
 *
8 6af0bf9c bellard
 * This library is free software; you can redistribute it and/or
9 6af0bf9c bellard
 * modify it under the terms of the GNU Lesser General Public
10 6af0bf9c bellard
 * License as published by the Free Software Foundation; either
11 6af0bf9c bellard
 * version 2 of the License, or (at your option) any later version.
12 6af0bf9c bellard
 *
13 6af0bf9c bellard
 * This library is distributed in the hope that it will be useful,
14 6af0bf9c bellard
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 6af0bf9c bellard
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 6af0bf9c bellard
 * Lesser General Public License for more details.
17 6af0bf9c bellard
 *
18 6af0bf9c bellard
 * You should have received a copy of the GNU Lesser General Public
19 6af0bf9c bellard
 * License along with this library; if not, write to the Free Software
20 6af0bf9c bellard
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21 6af0bf9c bellard
 */
22 6af0bf9c bellard
23 6af0bf9c bellard
#include <stdarg.h>
24 6af0bf9c bellard
#include <stdlib.h>
25 6af0bf9c bellard
#include <stdio.h>
26 6af0bf9c bellard
#include <string.h>
27 6af0bf9c bellard
#include <inttypes.h>
28 6af0bf9c bellard
29 6af0bf9c bellard
#include "cpu.h"
30 6af0bf9c bellard
#include "exec-all.h"
31 6af0bf9c bellard
#include "disas.h"
32 6af0bf9c bellard
33 eeef26cd bellard
//#define MIPS_DEBUG_DISAS
34 c570fd16 ths
//#define MIPS_DEBUG_SIGN_EXTENSIONS
35 6af0bf9c bellard
//#define MIPS_SINGLE_STEP
36 6af0bf9c bellard
37 c53be334 bellard
#ifdef USE_DIRECT_JUMP
38 c53be334 bellard
#define TBPARAM(x)
39 c53be334 bellard
#else
40 c53be334 bellard
#define TBPARAM(x) (long)(x)
41 c53be334 bellard
#endif
42 c53be334 bellard
43 6af0bf9c bellard
enum {
44 6af0bf9c bellard
#define DEF(s, n, copy_size) INDEX_op_ ## s,
45 6af0bf9c bellard
#include "opc.h"
46 6af0bf9c bellard
#undef DEF
47 6af0bf9c bellard
    NB_OPS,
48 6af0bf9c bellard
};
49 6af0bf9c bellard
50 6af0bf9c bellard
static uint16_t *gen_opc_ptr;
51 6af0bf9c bellard
static uint32_t *gen_opparam_ptr;
52 6af0bf9c bellard
53 6af0bf9c bellard
#include "gen-op.h"
54 6af0bf9c bellard
55 7a387fff ths
/* MIPS major opcodes */
56 7a387fff ths
#define MASK_OP_MAJOR(op)  (op & (0x3F << 26))
57 e37e863f bellard
58 e37e863f bellard
enum {
59 e37e863f bellard
    /* indirect opcode tables */
60 7a387fff ths
    OPC_SPECIAL  = (0x00 << 26),
61 7a387fff ths
    OPC_REGIMM   = (0x01 << 26),
62 7a387fff ths
    OPC_CP0      = (0x10 << 26),
63 7a387fff ths
    OPC_CP1      = (0x11 << 26),
64 7a387fff ths
    OPC_CP2      = (0x12 << 26),
65 7a387fff ths
    OPC_CP3      = (0x13 << 26),
66 7a387fff ths
    OPC_SPECIAL2 = (0x1C << 26),
67 7a387fff ths
    OPC_SPECIAL3 = (0x1F << 26),
68 e37e863f bellard
    /* arithmetic with immediate */
69 7a387fff ths
    OPC_ADDI     = (0x08 << 26),
70 7a387fff ths
    OPC_ADDIU    = (0x09 << 26),
71 7a387fff ths
    OPC_SLTI     = (0x0A << 26),
72 7a387fff ths
    OPC_SLTIU    = (0x0B << 26),
73 7a387fff ths
    OPC_ANDI     = (0x0C << 26),
74 7a387fff ths
    OPC_ORI      = (0x0D << 26),
75 7a387fff ths
    OPC_XORI     = (0x0E << 26),
76 7a387fff ths
    OPC_LUI      = (0x0F << 26),
77 7a387fff ths
    OPC_DADDI    = (0x18 << 26),
78 7a387fff ths
    OPC_DADDIU   = (0x19 << 26),
79 e37e863f bellard
    /* Jump and branches */
80 7a387fff ths
    OPC_J        = (0x02 << 26),
81 7a387fff ths
    OPC_JAL      = (0x03 << 26),
82 7a387fff ths
    OPC_BEQ      = (0x04 << 26),  /* Unconditional if rs = rt = 0 (B) */
83 7a387fff ths
    OPC_BEQL     = (0x14 << 26),
84 7a387fff ths
    OPC_BNE      = (0x05 << 26),
85 7a387fff ths
    OPC_BNEL     = (0x15 << 26),
86 7a387fff ths
    OPC_BLEZ     = (0x06 << 26),
87 7a387fff ths
    OPC_BLEZL    = (0x16 << 26),
88 7a387fff ths
    OPC_BGTZ     = (0x07 << 26),
89 7a387fff ths
    OPC_BGTZL    = (0x17 << 26),
90 7a387fff ths
    OPC_JALX     = (0x1D << 26),  /* MIPS 16 only */
91 e37e863f bellard
    /* Load and stores */
92 7a387fff ths
    OPC_LDL      = (0x1A << 26),
93 7a387fff ths
    OPC_LDR      = (0x1B << 26),
94 7a387fff ths
    OPC_LB       = (0x20 << 26),
95 7a387fff ths
    OPC_LH       = (0x21 << 26),
96 7a387fff ths
    OPC_LWL      = (0x22 << 26),
97 7a387fff ths
    OPC_LW       = (0x23 << 26),
98 7a387fff ths
    OPC_LBU      = (0x24 << 26),
99 7a387fff ths
    OPC_LHU      = (0x25 << 26),
100 7a387fff ths
    OPC_LWR      = (0x26 << 26),
101 7a387fff ths
    OPC_LWU      = (0x27 << 26),
102 7a387fff ths
    OPC_SB       = (0x28 << 26),
103 7a387fff ths
    OPC_SH       = (0x29 << 26),
104 7a387fff ths
    OPC_SWL      = (0x2A << 26),
105 7a387fff ths
    OPC_SW       = (0x2B << 26),
106 7a387fff ths
    OPC_SDL      = (0x2C << 26),
107 7a387fff ths
    OPC_SDR      = (0x2D << 26),
108 7a387fff ths
    OPC_SWR      = (0x2E << 26),
109 7a387fff ths
    OPC_LL       = (0x30 << 26),
110 7a387fff ths
    OPC_LLD      = (0x34 << 26),
111 7a387fff ths
    OPC_LD       = (0x37 << 26),
112 7a387fff ths
    OPC_SC       = (0x38 << 26),
113 7a387fff ths
    OPC_SCD      = (0x3C << 26),
114 7a387fff ths
    OPC_SD       = (0x3F << 26),
115 e37e863f bellard
    /* Floating point load/store */
116 7a387fff ths
    OPC_LWC1     = (0x31 << 26),
117 7a387fff ths
    OPC_LWC2     = (0x32 << 26),
118 7a387fff ths
    OPC_LDC1     = (0x35 << 26),
119 7a387fff ths
    OPC_LDC2     = (0x36 << 26),
120 7a387fff ths
    OPC_SWC1     = (0x39 << 26),
121 7a387fff ths
    OPC_SWC2     = (0x3A << 26),
122 7a387fff ths
    OPC_SDC1     = (0x3D << 26),
123 7a387fff ths
    OPC_SDC2     = (0x3E << 26),
124 7a387fff ths
    /* MDMX ASE specific */
125 7a387fff ths
    OPC_MDMX     = (0x1E << 26),
126 e37e863f bellard
    /* Cache and prefetch */
127 7a387fff ths
    OPC_CACHE    = (0x2F << 26),
128 7a387fff ths
    OPC_PREF     = (0x33 << 26),
129 7a387fff ths
    /* Reserved major opcode */
130 7a387fff ths
    OPC_MAJOR3B_RESERVED = (0x3B << 26),
131 e37e863f bellard
};
132 e37e863f bellard
133 e37e863f bellard
/* MIPS special opcodes */
134 7a387fff ths
#define MASK_SPECIAL(op)   MASK_OP_MAJOR(op) | (op & 0x3F)
135 7a387fff ths
136 e37e863f bellard
enum {
137 e37e863f bellard
    /* Shifts */
138 7a387fff ths
    OPC_SLL      = 0x00 | OPC_SPECIAL,
139 e37e863f bellard
    /* NOP is SLL r0, r0, 0   */
140 e37e863f bellard
    /* SSNOP is SLL r0, r0, 1 */
141 7a387fff ths
    /* EHB is SLL r0, r0, 3 */
142 7a387fff ths
    OPC_SRL      = 0x02 | OPC_SPECIAL, /* also ROTR */
143 7a387fff ths
    OPC_SRA      = 0x03 | OPC_SPECIAL,
144 7a387fff ths
    OPC_SLLV     = 0x04 | OPC_SPECIAL,
145 7a387fff ths
    OPC_SRLV     = 0x06 | OPC_SPECIAL,
146 7a387fff ths
    OPC_SRAV     = 0x07 | OPC_SPECIAL,
147 7a387fff ths
    OPC_DSLLV    = 0x14 | OPC_SPECIAL,
148 7a387fff ths
    OPC_DSRLV    = 0x16 | OPC_SPECIAL, /* also DROTRV */
149 7a387fff ths
    OPC_DSRAV    = 0x17 | OPC_SPECIAL,
150 7a387fff ths
    OPC_DSLL     = 0x38 | OPC_SPECIAL,
151 7a387fff ths
    OPC_DSRL     = 0x3A | OPC_SPECIAL, /* also DROTR */
152 7a387fff ths
    OPC_DSRA     = 0x3B | OPC_SPECIAL,
153 7a387fff ths
    OPC_DSLL32   = 0x3C | OPC_SPECIAL,
154 7a387fff ths
    OPC_DSRL32   = 0x3E | OPC_SPECIAL, /* also DROTR32 */
155 7a387fff ths
    OPC_DSRA32   = 0x3F | OPC_SPECIAL,
156 e37e863f bellard
    /* Multiplication / division */
157 7a387fff ths
    OPC_MULT     = 0x18 | OPC_SPECIAL,
158 7a387fff ths
    OPC_MULTU    = 0x19 | OPC_SPECIAL,
159 7a387fff ths
    OPC_DIV      = 0x1A | OPC_SPECIAL,
160 7a387fff ths
    OPC_DIVU     = 0x1B | OPC_SPECIAL,
161 7a387fff ths
    OPC_DMULT    = 0x1C | OPC_SPECIAL,
162 7a387fff ths
    OPC_DMULTU   = 0x1D | OPC_SPECIAL,
163 7a387fff ths
    OPC_DDIV     = 0x1E | OPC_SPECIAL,
164 7a387fff ths
    OPC_DDIVU    = 0x1F | OPC_SPECIAL,
165 e37e863f bellard
    /* 2 registers arithmetic / logic */
166 7a387fff ths
    OPC_ADD      = 0x20 | OPC_SPECIAL,
167 7a387fff ths
    OPC_ADDU     = 0x21 | OPC_SPECIAL,
168 7a387fff ths
    OPC_SUB      = 0x22 | OPC_SPECIAL,
169 7a387fff ths
    OPC_SUBU     = 0x23 | OPC_SPECIAL,
170 7a387fff ths
    OPC_AND      = 0x24 | OPC_SPECIAL,
171 7a387fff ths
    OPC_OR       = 0x25 | OPC_SPECIAL,
172 7a387fff ths
    OPC_XOR      = 0x26 | OPC_SPECIAL,
173 7a387fff ths
    OPC_NOR      = 0x27 | OPC_SPECIAL,
174 7a387fff ths
    OPC_SLT      = 0x2A | OPC_SPECIAL,
175 7a387fff ths
    OPC_SLTU     = 0x2B | OPC_SPECIAL,
176 7a387fff ths
    OPC_DADD     = 0x2C | OPC_SPECIAL,
177 7a387fff ths
    OPC_DADDU    = 0x2D | OPC_SPECIAL,
178 7a387fff ths
    OPC_DSUB     = 0x2E | OPC_SPECIAL,
179 7a387fff ths
    OPC_DSUBU    = 0x2F | OPC_SPECIAL,
180 e37e863f bellard
    /* Jumps */
181 7a387fff ths
    OPC_JR       = 0x08 | OPC_SPECIAL, /* Also JR.HB */
182 7a387fff ths
    OPC_JALR     = 0x09 | OPC_SPECIAL, /* Also JALR.HB */
183 e37e863f bellard
    /* Traps */
184 7a387fff ths
    OPC_TGE      = 0x30 | OPC_SPECIAL,
185 7a387fff ths
    OPC_TGEU     = 0x31 | OPC_SPECIAL,
186 7a387fff ths
    OPC_TLT      = 0x32 | OPC_SPECIAL,
187 7a387fff ths
    OPC_TLTU     = 0x33 | OPC_SPECIAL,
188 7a387fff ths
    OPC_TEQ      = 0x34 | OPC_SPECIAL,
189 7a387fff ths
    OPC_TNE      = 0x36 | OPC_SPECIAL,
190 e37e863f bellard
    /* HI / LO registers load & stores */
191 7a387fff ths
    OPC_MFHI     = 0x10 | OPC_SPECIAL,
192 7a387fff ths
    OPC_MTHI     = 0x11 | OPC_SPECIAL,
193 7a387fff ths
    OPC_MFLO     = 0x12 | OPC_SPECIAL,
194 7a387fff ths
    OPC_MTLO     = 0x13 | OPC_SPECIAL,
195 e37e863f bellard
    /* Conditional moves */
196 7a387fff ths
    OPC_MOVZ     = 0x0A | OPC_SPECIAL,
197 7a387fff ths
    OPC_MOVN     = 0x0B | OPC_SPECIAL,
198 e37e863f bellard
199 7a387fff ths
    OPC_MOVCI    = 0x01 | OPC_SPECIAL,
200 e37e863f bellard
201 e37e863f bellard
    /* Special */
202 7a387fff ths
    OPC_PMON     = 0x05 | OPC_SPECIAL, /* inofficial */
203 7a387fff ths
    OPC_SYSCALL  = 0x0C | OPC_SPECIAL,
204 7a387fff ths
    OPC_BREAK    = 0x0D | OPC_SPECIAL,
205 7a387fff ths
    OPC_SPIM     = 0x0E | OPC_SPECIAL, /* inofficial */
206 7a387fff ths
    OPC_SYNC     = 0x0F | OPC_SPECIAL,
207 7a387fff ths
208 7a387fff ths
    OPC_SPECIAL15_RESERVED = 0x15 | OPC_SPECIAL,
209 7a387fff ths
    OPC_SPECIAL28_RESERVED = 0x28 | OPC_SPECIAL,
210 7a387fff ths
    OPC_SPECIAL29_RESERVED = 0x29 | OPC_SPECIAL,
211 7a387fff ths
    OPC_SPECIAL35_RESERVED = 0x35 | OPC_SPECIAL,
212 7a387fff ths
    OPC_SPECIAL37_RESERVED = 0x37 | OPC_SPECIAL,
213 7a387fff ths
    OPC_SPECIAL39_RESERVED = 0x39 | OPC_SPECIAL,
214 7a387fff ths
    OPC_SPECIAL3D_RESERVED = 0x3D | OPC_SPECIAL,
215 7a387fff ths
};
216 7a387fff ths
217 7a387fff ths
/* REGIMM (rt field) opcodes */
218 7a387fff ths
#define MASK_REGIMM(op)    MASK_OP_MAJOR(op) | (op & (0x1F << 16))
219 7a387fff ths
220 7a387fff ths
enum {
221 7a387fff ths
    OPC_BLTZ     = (0x00 << 16) | OPC_REGIMM,
222 7a387fff ths
    OPC_BLTZL    = (0x02 << 16) | OPC_REGIMM,
223 7a387fff ths
    OPC_BGEZ     = (0x01 << 16) | OPC_REGIMM,
224 7a387fff ths
    OPC_BGEZL    = (0x03 << 16) | OPC_REGIMM,
225 7a387fff ths
    OPC_BLTZAL   = (0x10 << 16) | OPC_REGIMM,
226 7a387fff ths
    OPC_BLTZALL  = (0x12 << 16) | OPC_REGIMM,
227 7a387fff ths
    OPC_BGEZAL   = (0x11 << 16) | OPC_REGIMM,
228 7a387fff ths
    OPC_BGEZALL  = (0x13 << 16) | OPC_REGIMM,
229 7a387fff ths
    OPC_TGEI     = (0x08 << 16) | OPC_REGIMM,
230 7a387fff ths
    OPC_TGEIU    = (0x09 << 16) | OPC_REGIMM,
231 7a387fff ths
    OPC_TLTI     = (0x0A << 16) | OPC_REGIMM,
232 7a387fff ths
    OPC_TLTIU    = (0x0B << 16) | OPC_REGIMM,
233 7a387fff ths
    OPC_TEQI     = (0x0C << 16) | OPC_REGIMM,
234 7a387fff ths
    OPC_TNEI     = (0x0E << 16) | OPC_REGIMM,
235 7a387fff ths
    OPC_SYNCI    = (0x1F << 16) | OPC_REGIMM,
236 e37e863f bellard
};
237 e37e863f bellard
238 7a387fff ths
/* Special2 opcodes */
239 7a387fff ths
#define MASK_SPECIAL2(op)  MASK_OP_MAJOR(op) | (op & 0x3F)
240 7a387fff ths
241 e37e863f bellard
enum {
242 7a387fff ths
    /* Multiply & xxx operations */
243 7a387fff ths
    OPC_MADD     = 0x00 | OPC_SPECIAL2,
244 7a387fff ths
    OPC_MADDU    = 0x01 | OPC_SPECIAL2,
245 7a387fff ths
    OPC_MUL      = 0x02 | OPC_SPECIAL2,
246 7a387fff ths
    OPC_MSUB     = 0x04 | OPC_SPECIAL2,
247 7a387fff ths
    OPC_MSUBU    = 0x05 | OPC_SPECIAL2,
248 e37e863f bellard
    /* Misc */
249 7a387fff ths
    OPC_CLZ      = 0x20 | OPC_SPECIAL2,
250 7a387fff ths
    OPC_CLO      = 0x21 | OPC_SPECIAL2,
251 7a387fff ths
    OPC_DCLZ     = 0x24 | OPC_SPECIAL2,
252 7a387fff ths
    OPC_DCLO     = 0x25 | OPC_SPECIAL2,
253 e37e863f bellard
    /* Special */
254 7a387fff ths
    OPC_SDBBP    = 0x3F | OPC_SPECIAL2,
255 7a387fff ths
};
256 7a387fff ths
257 7a387fff ths
/* Special3 opcodes */
258 7a387fff ths
#define MASK_SPECIAL3(op)  MASK_OP_MAJOR(op) | (op & 0x3F)
259 7a387fff ths
260 7a387fff ths
enum {
261 7a387fff ths
    OPC_EXT      = 0x00 | OPC_SPECIAL3,
262 7a387fff ths
    OPC_DEXTM    = 0x01 | OPC_SPECIAL3,
263 7a387fff ths
    OPC_DEXTU    = 0x02 | OPC_SPECIAL3,
264 7a387fff ths
    OPC_DEXT     = 0x03 | OPC_SPECIAL3,
265 7a387fff ths
    OPC_INS      = 0x04 | OPC_SPECIAL3,
266 7a387fff ths
    OPC_DINSM    = 0x05 | OPC_SPECIAL3,
267 7a387fff ths
    OPC_DINSU    = 0x06 | OPC_SPECIAL3,
268 7a387fff ths
    OPC_DINS     = 0x07 | OPC_SPECIAL3,
269 7a387fff ths
    OPC_BSHFL    = 0x20 | OPC_SPECIAL3,
270 7a387fff ths
    OPC_DBSHFL   = 0x24 | OPC_SPECIAL3,
271 7a387fff ths
    OPC_RDHWR    = 0x3B | OPC_SPECIAL3,
272 e37e863f bellard
};
273 e37e863f bellard
274 7a387fff ths
/* BSHFL opcodes */
275 7a387fff ths
#define MASK_BSHFL(op)     MASK_SPECIAL3(op) | (op & (0x1F << 6))
276 7a387fff ths
277 e37e863f bellard
enum {
278 7a387fff ths
    OPC_WSBH     = (0x02 << 6) | OPC_BSHFL,
279 7a387fff ths
    OPC_SEB      = (0x10 << 6) | OPC_BSHFL,
280 7a387fff ths
    OPC_SEH      = (0x18 << 6) | OPC_BSHFL,
281 e37e863f bellard
};
282 e37e863f bellard
283 7a387fff ths
/* DBSHFL opcodes */
284 7a387fff ths
#define MASK_DBSHFL(op)    MASK_SPECIAL3(op) | (op & (0x1F << 6))
285 7a387fff ths
286 e37e863f bellard
enum {
287 7a387fff ths
    OPC_DSBH     = (0x02 << 6) | OPC_DBSHFL,
288 7a387fff ths
    OPC_DSHD     = (0x05 << 6) | OPC_DBSHFL,
289 e37e863f bellard
};
290 e37e863f bellard
291 7a387fff ths
/* Coprocessor 0 (rs field) */
292 7a387fff ths
#define MASK_CP0(op)       MASK_OP_MAJOR(op) | (op & (0x1F << 21))
293 7a387fff ths
294 6ea83fed bellard
enum {
295 7a387fff ths
    OPC_MFC0     = (0x00 << 21) | OPC_CP0,
296 7a387fff ths
    OPC_DMFC0    = (0x01 << 21) | OPC_CP0,
297 7a387fff ths
    OPC_MTC0     = (0x04 << 21) | OPC_CP0,
298 7a387fff ths
    OPC_DMTC0    = (0x05 << 21) | OPC_CP0,
299 7a387fff ths
    OPC_RDPGPR   = (0x0A << 21) | OPC_CP0,
300 7a387fff ths
    OPC_MFMC0    = (0x0B << 21) | OPC_CP0,
301 7a387fff ths
    OPC_WRPGPR   = (0x0E << 21) | OPC_CP0,
302 7a387fff ths
    OPC_C0       = (0x10 << 21) | OPC_CP0,
303 7a387fff ths
    OPC_C0_FIRST = (0x10 << 21) | OPC_CP0,
304 7a387fff ths
    OPC_C0_LAST  = (0x1F << 21) | OPC_CP0,
305 6ea83fed bellard
};
306 7a387fff ths
307 7a387fff ths
/* MFMC0 opcodes */
308 7a387fff ths
#define MASK_MFMC0(op)     MASK_CP0(op) | (op & ((0x0C << 11) | (1 << 5)))
309 7a387fff ths
310 7a387fff ths
enum {
311 7a387fff ths
    OPC_DI       = (0 << 5) | (0x0C << 11) | OPC_MFMC0,
312 7a387fff ths
    OPC_EI       = (1 << 5) | (0x0C << 11) | OPC_MFMC0,
313 7a387fff ths
};
314 7a387fff ths
315 7a387fff ths
/* Coprocessor 0 (with rs == C0) */
316 7a387fff ths
#define MASK_C0(op)        MASK_CP0(op) | (op & 0x3F)
317 7a387fff ths
318 7a387fff ths
enum {
319 7a387fff ths
    OPC_TLBR     = 0x01 | OPC_C0,
320 7a387fff ths
    OPC_TLBWI    = 0x02 | OPC_C0,
321 7a387fff ths
    OPC_TLBWR    = 0x06 | OPC_C0,
322 7a387fff ths
    OPC_TLBP     = 0x08 | OPC_C0,
323 7a387fff ths
    OPC_RFE      = 0x10 | OPC_C0,
324 7a387fff ths
    OPC_ERET     = 0x18 | OPC_C0,
325 7a387fff ths
    OPC_DERET    = 0x1F | OPC_C0,
326 7a387fff ths
    OPC_WAIT     = 0x20 | OPC_C0,
327 7a387fff ths
};
328 7a387fff ths
329 7a387fff ths
/* Coprocessor 1 (rs field) */
330 7a387fff ths
#define MASK_CP1(op)       MASK_OP_MAJOR(op) | (op & (0x1F << 21))
331 7a387fff ths
332 7a387fff ths
enum {
333 7a387fff ths
    OPC_MFC1     = (0x00 << 21) | OPC_CP1,
334 7a387fff ths
    OPC_DMFC1    = (0x01 << 21) | OPC_CP1,
335 7a387fff ths
    OPC_CFC1     = (0x02 << 21) | OPC_CP1,
336 7a387fff ths
    OPC_MFHCI    = (0x03 << 21) | OPC_CP1,
337 7a387fff ths
    OPC_MTC1     = (0x04 << 21) | OPC_CP1,
338 7a387fff ths
    OPC_DMTC1    = (0x05 << 21) | OPC_CP1,
339 7a387fff ths
    OPC_CTC1     = (0x06 << 21) | OPC_CP1,
340 7a387fff ths
    OPC_MTHCI    = (0x07 << 21) | OPC_CP1,
341 7a387fff ths
    OPC_BC1      = (0x08 << 21) | OPC_CP1, /* bc */
342 7a387fff ths
    OPC_S_FMT    = (0x10 << 21) | OPC_CP1, /* 16: fmt=single fp */
343 7a387fff ths
    OPC_D_FMT    = (0x11 << 21) | OPC_CP1, /* 17: fmt=double fp */
344 7a387fff ths
    OPC_E_FMT    = (0x12 << 21) | OPC_CP1, /* 18: fmt=extended fp */
345 7a387fff ths
    OPC_Q_FMT    = (0x13 << 21) | OPC_CP1, /* 19: fmt=quad fp */
346 7a387fff ths
    OPC_W_FMT    = (0x14 << 21) | OPC_CP1, /* 20: fmt=32bit fixed */
347 7a387fff ths
    OPC_L_FMT    = (0x15 << 21) | OPC_CP1, /* 21: fmt=64bit fixed */
348 7a387fff ths
};
349 7a387fff ths
350 7a387fff ths
enum {
351 7a387fff ths
    OPC_BC1F     = (0x00 << 16) | OPC_BC1,
352 7a387fff ths
    OPC_BC1T     = (0x01 << 16) | OPC_BC1,
353 7a387fff ths
    OPC_BC1FL    = (0x02 << 16) | OPC_BC1,
354 7a387fff ths
    OPC_BC1TL    = (0x03 << 16) | OPC_BC1,
355 7a387fff ths
};
356 7a387fff ths
357 e1449664 ths
#define MASK_CP1_BCOND(op)      MASK_CP1(op) | (op & (0x3 << 16))
358 e1449664 ths
#define MASK_CP1_FUNC(op)       MASK_CP1(op) | (op & 0x3F)
359 7a387fff ths
360 7a387fff ths
#define MASK_CP2(op)       MASK_OP_MAJOR(op) | (op & (0x1F << 21))
361 7a387fff ths
#define MASK_CP3(op)       MASK_OP_MAJOR(op) | (op & (0x1F << 21))
362 6ea83fed bellard
363 6af0bf9c bellard
const unsigned char *regnames[] =
364 6af0bf9c bellard
    { "r0", "at", "v0", "v1", "a0", "a1", "a2", "a3",
365 6af0bf9c bellard
      "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
366 6af0bf9c bellard
      "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
367 6af0bf9c bellard
      "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra", };
368 6af0bf9c bellard
369 6af0bf9c bellard
/* Warning: no function for r0 register (hard wired to zero) */
370 6af0bf9c bellard
#define GEN32(func, NAME) \
371 6af0bf9c bellard
static GenOpFunc *NAME ## _table [32] = {                                     \
372 6af0bf9c bellard
NULL,       NAME ## 1, NAME ## 2, NAME ## 3,                                  \
373 6af0bf9c bellard
NAME ## 4,  NAME ## 5, NAME ## 6, NAME ## 7,                                  \
374 6af0bf9c bellard
NAME ## 8,  NAME ## 9, NAME ## 10, NAME ## 11,                                \
375 6af0bf9c bellard
NAME ## 12, NAME ## 13, NAME ## 14, NAME ## 15,                               \
376 6af0bf9c bellard
NAME ## 16, NAME ## 17, NAME ## 18, NAME ## 19,                               \
377 6af0bf9c bellard
NAME ## 20, NAME ## 21, NAME ## 22, NAME ## 23,                               \
378 6af0bf9c bellard
NAME ## 24, NAME ## 25, NAME ## 26, NAME ## 27,                               \
379 6af0bf9c bellard
NAME ## 28, NAME ## 29, NAME ## 30, NAME ## 31,                               \
380 6af0bf9c bellard
};                                                                            \
381 6af0bf9c bellard
static inline void func(int n)                                                \
382 6af0bf9c bellard
{                                                                             \
383 6af0bf9c bellard
    NAME ## _table[n]();                                                      \
384 6af0bf9c bellard
}
385 6af0bf9c bellard
386 6af0bf9c bellard
/* General purpose registers moves */
387 6af0bf9c bellard
GEN32(gen_op_load_gpr_T0, gen_op_load_gpr_T0_gpr);
388 6af0bf9c bellard
GEN32(gen_op_load_gpr_T1, gen_op_load_gpr_T1_gpr);
389 6af0bf9c bellard
GEN32(gen_op_load_gpr_T2, gen_op_load_gpr_T2_gpr);
390 6af0bf9c bellard
391 6af0bf9c bellard
GEN32(gen_op_store_T0_gpr, gen_op_store_T0_gpr_gpr);
392 6af0bf9c bellard
GEN32(gen_op_store_T1_gpr, gen_op_store_T1_gpr_gpr);
393 6af0bf9c bellard
394 7a387fff ths
static const char *fregnames[] =
395 6ea83fed bellard
    { "f0",  "f1",  "f2",  "f3",  "f4",  "f5",  "f6",  "f7",
396 6ea83fed bellard
      "f8",  "f9",  "f10", "f11", "f12", "f13", "f14", "f15",
397 6ea83fed bellard
      "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
398 6ea83fed bellard
      "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", };
399 6ea83fed bellard
400 6ea83fed bellard
# define SFGEN32(func, NAME) \
401 6ea83fed bellard
static GenOpFunc *NAME ## _table [32] = {                                     \
402 6ea83fed bellard
NAME ## 0,  NAME ## 1,  NAME ## 2,  NAME ## 3,                                \
403 6ea83fed bellard
NAME ## 4,  NAME ## 5,  NAME ## 6,  NAME ## 7,                                \
404 6ea83fed bellard
NAME ## 8,  NAME ## 9,  NAME ## 10, NAME ## 11,                               \
405 6ea83fed bellard
NAME ## 12, NAME ## 13, NAME ## 14, NAME ## 15,                               \
406 6ea83fed bellard
NAME ## 16, NAME ## 17, NAME ## 18, NAME ## 19,                               \
407 6ea83fed bellard
NAME ## 20, NAME ## 21, NAME ## 22, NAME ## 23,                               \
408 6ea83fed bellard
NAME ## 24, NAME ## 25, NAME ## 26, NAME ## 27,                               \
409 6ea83fed bellard
NAME ## 28, NAME ## 29, NAME ## 30, NAME ## 31,                               \
410 6ea83fed bellard
};                                                                            \
411 6ea83fed bellard
static inline void func(int n)                                                \
412 6ea83fed bellard
{                                                                             \
413 6ea83fed bellard
    NAME ## _table[n]();                                                      \
414 6ea83fed bellard
}
415 6ea83fed bellard
416 6ea83fed bellard
# define DFGEN32(func, NAME) \
417 6ea83fed bellard
static GenOpFunc *NAME ## _table [32] = {                                     \
418 6ea83fed bellard
NAME ## 0,  0, NAME ## 2,  0,                                                 \
419 6ea83fed bellard
NAME ## 4,  0, NAME ## 6,  0,                                                 \
420 6ea83fed bellard
NAME ## 8,  0, NAME ## 10, 0,                                                 \
421 6ea83fed bellard
NAME ## 12, 0, NAME ## 14, 0,                                                 \
422 6ea83fed bellard
NAME ## 16, 0, NAME ## 18, 0,                                                 \
423 6ea83fed bellard
NAME ## 20, 0, NAME ## 22, 0,                                                 \
424 6ea83fed bellard
NAME ## 24, 0, NAME ## 26, 0,                                                 \
425 6ea83fed bellard
NAME ## 28, 0, NAME ## 30, 0,                                                 \
426 6ea83fed bellard
};                                                                            \
427 6ea83fed bellard
static inline void func(int n)                                                \
428 6ea83fed bellard
{                                                                             \
429 6ea83fed bellard
    NAME ## _table[n]();                                                      \
430 6ea83fed bellard
}
431 6ea83fed bellard
432 6ea83fed bellard
SFGEN32(gen_op_load_fpr_WT0,  gen_op_load_fpr_WT0_fpr);
433 6ea83fed bellard
SFGEN32(gen_op_store_fpr_WT0, gen_op_store_fpr_WT0_fpr);
434 6ea83fed bellard
435 6ea83fed bellard
SFGEN32(gen_op_load_fpr_WT1,  gen_op_load_fpr_WT1_fpr);
436 6ea83fed bellard
SFGEN32(gen_op_store_fpr_WT1, gen_op_store_fpr_WT1_fpr);
437 6ea83fed bellard
438 6ea83fed bellard
SFGEN32(gen_op_load_fpr_WT2,  gen_op_load_fpr_WT2_fpr);
439 6ea83fed bellard
SFGEN32(gen_op_store_fpr_WT2, gen_op_store_fpr_WT2_fpr);
440 6ea83fed bellard
441 6ea83fed bellard
DFGEN32(gen_op_load_fpr_DT0,  gen_op_load_fpr_DT0_fpr);
442 6ea83fed bellard
DFGEN32(gen_op_store_fpr_DT0, gen_op_store_fpr_DT0_fpr);
443 6ea83fed bellard
444 6ea83fed bellard
DFGEN32(gen_op_load_fpr_DT1,  gen_op_load_fpr_DT1_fpr);
445 6ea83fed bellard
DFGEN32(gen_op_store_fpr_DT1, gen_op_store_fpr_DT1_fpr);
446 6ea83fed bellard
447 6ea83fed bellard
DFGEN32(gen_op_load_fpr_DT2,  gen_op_load_fpr_DT2_fpr);
448 6ea83fed bellard
DFGEN32(gen_op_store_fpr_DT2, gen_op_store_fpr_DT2_fpr);
449 6ea83fed bellard
450 6ea83fed bellard
#define FOP_CONDS(fmt) \
451 6ea83fed bellard
static GenOpFunc * cond_ ## fmt ## _table[16] = {                       \
452 6ea83fed bellard
    gen_op_cmp_ ## fmt ## _f,                                           \
453 6ea83fed bellard
    gen_op_cmp_ ## fmt ## _un,                                          \
454 6ea83fed bellard
    gen_op_cmp_ ## fmt ## _eq,                                          \
455 6ea83fed bellard
    gen_op_cmp_ ## fmt ## _ueq,                                         \
456 6ea83fed bellard
    gen_op_cmp_ ## fmt ## _olt,                                         \
457 6ea83fed bellard
    gen_op_cmp_ ## fmt ## _ult,                                         \
458 6ea83fed bellard
    gen_op_cmp_ ## fmt ## _ole,                                         \
459 6ea83fed bellard
    gen_op_cmp_ ## fmt ## _ule,                                         \
460 6ea83fed bellard
    gen_op_cmp_ ## fmt ## _sf,                                          \
461 6ea83fed bellard
    gen_op_cmp_ ## fmt ## _ngle,                                        \
462 6ea83fed bellard
    gen_op_cmp_ ## fmt ## _seq,                                         \
463 6ea83fed bellard
    gen_op_cmp_ ## fmt ## _ngl,                                         \
464 6ea83fed bellard
    gen_op_cmp_ ## fmt ## _lt,                                          \
465 6ea83fed bellard
    gen_op_cmp_ ## fmt ## _nge,                                         \
466 6ea83fed bellard
    gen_op_cmp_ ## fmt ## _le,                                          \
467 6ea83fed bellard
    gen_op_cmp_ ## fmt ## _ngt,                                         \
468 6ea83fed bellard
};                                                                      \
469 6ea83fed bellard
static inline void gen_cmp_ ## fmt(int n)                               \
470 6ea83fed bellard
{                                                                       \
471 6ea83fed bellard
    cond_ ## fmt ## _table[n]();                                        \
472 6ea83fed bellard
}
473 6ea83fed bellard
474 6ea83fed bellard
FOP_CONDS(d)
475 6ea83fed bellard
FOP_CONDS(s)
476 6ea83fed bellard
477 6af0bf9c bellard
typedef struct DisasContext {
478 6af0bf9c bellard
    struct TranslationBlock *tb;
479 6af0bf9c bellard
    target_ulong pc, saved_pc;
480 6af0bf9c bellard
    uint32_t opcode;
481 6af0bf9c bellard
    /* Routine used to access memory */
482 6af0bf9c bellard
    int mem_idx;
483 6af0bf9c bellard
    uint32_t hflags, saved_hflags;
484 6af0bf9c bellard
    uint32_t CP0_Status;
485 6af0bf9c bellard
    int bstate;
486 6af0bf9c bellard
    target_ulong btarget;
487 6af0bf9c bellard
} DisasContext;
488 6af0bf9c bellard
489 6af0bf9c bellard
enum {
490 6af0bf9c bellard
    BS_NONE     = 0, /* We go out of the TB without reaching a branch or an
491 6af0bf9c bellard
                      * exception condition
492 6af0bf9c bellard
                      */
493 6af0bf9c bellard
    BS_STOP     = 1, /* We want to stop translation for any reason */
494 6af0bf9c bellard
    BS_BRANCH   = 2, /* We reached a branch condition     */
495 6af0bf9c bellard
    BS_EXCP     = 3, /* We reached an exception condition */
496 6af0bf9c bellard
};
497 6af0bf9c bellard
498 6af0bf9c bellard
#if defined MIPS_DEBUG_DISAS
499 6af0bf9c bellard
#define MIPS_DEBUG(fmt, args...)                                              \
500 6af0bf9c bellard
do {                                                                          \
501 6af0bf9c bellard
    if (loglevel & CPU_LOG_TB_IN_ASM) {                                       \
502 3594c774 ths
        fprintf(logfile, TARGET_FMT_lx ": %08x " fmt "\n",                    \
503 6af0bf9c bellard
                ctx->pc, ctx->opcode , ##args);                               \
504 6af0bf9c bellard
    }                                                                         \
505 6af0bf9c bellard
} while (0)
506 6af0bf9c bellard
#else
507 6af0bf9c bellard
#define MIPS_DEBUG(fmt, args...) do { } while(0)
508 6af0bf9c bellard
#endif
509 6af0bf9c bellard
510 6af0bf9c bellard
#define MIPS_INVAL(op)                                                        \
511 6af0bf9c bellard
do {                                                                          \
512 6af0bf9c bellard
    MIPS_DEBUG("Invalid %s %03x %03x %03x", op, ctx->opcode >> 26,            \
513 6af0bf9c bellard
               ctx->opcode & 0x3F, ((ctx->opcode >> 16) & 0x1F));             \
514 6af0bf9c bellard
} while (0)
515 6af0bf9c bellard
516 6af0bf9c bellard
#define GEN_LOAD_REG_TN(Tn, Rn)                                               \
517 6af0bf9c bellard
do {                                                                          \
518 6af0bf9c bellard
    if (Rn == 0) {                                                            \
519 6af0bf9c bellard
        glue(gen_op_reset_, Tn)();                                            \
520 6af0bf9c bellard
    } else {                                                                  \
521 6af0bf9c bellard
        glue(gen_op_load_gpr_, Tn)(Rn);                                       \
522 6af0bf9c bellard
    }                                                                         \
523 6af0bf9c bellard
} while (0)
524 6af0bf9c bellard
525 6af0bf9c bellard
#define GEN_LOAD_IMM_TN(Tn, Imm)                                              \
526 6af0bf9c bellard
do {                                                                          \
527 6af0bf9c bellard
    if (Imm == 0) {                                                           \
528 6af0bf9c bellard
        glue(gen_op_reset_, Tn)();                                            \
529 6af0bf9c bellard
    } else {                                                                  \
530 6af0bf9c bellard
        glue(gen_op_set_, Tn)(Imm);                                           \
531 6af0bf9c bellard
    }                                                                         \
532 6af0bf9c bellard
} while (0)
533 6af0bf9c bellard
534 6af0bf9c bellard
#define GEN_STORE_TN_REG(Rn, Tn)                                              \
535 6af0bf9c bellard
do {                                                                          \
536 6af0bf9c bellard
    if (Rn != 0) {                                                            \
537 6af0bf9c bellard
        glue(glue(gen_op_store_, Tn),_gpr)(Rn);                               \
538 6af0bf9c bellard
    }                                                                         \
539 6af0bf9c bellard
} while (0)
540 6af0bf9c bellard
541 7a387fff ths
#define GEN_LOAD_FREG_FTN(FTn, Fn)                                            \
542 6ea83fed bellard
do {                                                                          \
543 6ea83fed bellard
    glue(gen_op_load_fpr_, FTn)(Fn);                                          \
544 6ea83fed bellard
} while (0)
545 6ea83fed bellard
546 6ea83fed bellard
#define GEN_STORE_FTN_FREG(Fn, FTn)                                           \
547 6ea83fed bellard
do {                                                                          \
548 6ea83fed bellard
    glue(gen_op_store_fpr_, FTn)(Fn);                                         \
549 6ea83fed bellard
} while (0)
550 6ea83fed bellard
551 6af0bf9c bellard
static inline void save_cpu_state (DisasContext *ctx, int do_save_pc)
552 6af0bf9c bellard
{
553 6af0bf9c bellard
#if defined MIPS_DEBUG_DISAS
554 6af0bf9c bellard
    if (loglevel & CPU_LOG_TB_IN_ASM) {
555 6af0bf9c bellard
            fprintf(logfile, "hflags %08x saved %08x\n",
556 6af0bf9c bellard
                    ctx->hflags, ctx->saved_hflags);
557 6af0bf9c bellard
    }
558 6af0bf9c bellard
#endif
559 6af0bf9c bellard
    if (do_save_pc && ctx->pc != ctx->saved_pc) {
560 6af0bf9c bellard
        gen_op_save_pc(ctx->pc);
561 6af0bf9c bellard
        ctx->saved_pc = ctx->pc;
562 6af0bf9c bellard
    }
563 6af0bf9c bellard
    if (ctx->hflags != ctx->saved_hflags) {
564 6af0bf9c bellard
        gen_op_save_state(ctx->hflags);
565 6af0bf9c bellard
        ctx->saved_hflags = ctx->hflags;
566 6af0bf9c bellard
        if (ctx->hflags & MIPS_HFLAG_BR) {
567 6af0bf9c bellard
            gen_op_save_breg_target();
568 6af0bf9c bellard
        } else if (ctx->hflags & MIPS_HFLAG_B) {
569 6af0bf9c bellard
            gen_op_save_btarget(ctx->btarget);
570 6af0bf9c bellard
        } else if (ctx->hflags & MIPS_HFLAG_BMASK) {
571 6af0bf9c bellard
            gen_op_save_bcond();
572 6af0bf9c bellard
            gen_op_save_btarget(ctx->btarget);
573 6af0bf9c bellard
        }
574 6af0bf9c bellard
    }
575 6af0bf9c bellard
}
576 6af0bf9c bellard
577 4ad40f36 bellard
static inline void generate_exception_err (DisasContext *ctx, int excp, int err)
578 6af0bf9c bellard
{
579 6af0bf9c bellard
#if defined MIPS_DEBUG_DISAS
580 6af0bf9c bellard
    if (loglevel & CPU_LOG_TB_IN_ASM)
581 6af0bf9c bellard
            fprintf(logfile, "%s: raise exception %d\n", __func__, excp);
582 6af0bf9c bellard
#endif
583 6af0bf9c bellard
    save_cpu_state(ctx, 1);
584 4ad40f36 bellard
    if (err == 0)
585 4ad40f36 bellard
        gen_op_raise_exception(excp);
586 4ad40f36 bellard
    else
587 4ad40f36 bellard
        gen_op_raise_exception_err(excp, err);
588 6af0bf9c bellard
    ctx->bstate = BS_EXCP;
589 6af0bf9c bellard
}
590 6af0bf9c bellard
591 4ad40f36 bellard
static inline void generate_exception (DisasContext *ctx, int excp)
592 4ad40f36 bellard
{
593 4ad40f36 bellard
    generate_exception_err (ctx, excp, 0);
594 4ad40f36 bellard
}
595 4ad40f36 bellard
596 6af0bf9c bellard
#if defined(CONFIG_USER_ONLY)
597 6af0bf9c bellard
#define op_ldst(name)        gen_op_##name##_raw()
598 6af0bf9c bellard
#define OP_LD_TABLE(width)
599 6af0bf9c bellard
#define OP_ST_TABLE(width)
600 6af0bf9c bellard
#else
601 6af0bf9c bellard
#define op_ldst(name)        (*gen_op_##name[ctx->mem_idx])()
602 6af0bf9c bellard
#define OP_LD_TABLE(width)                                                    \
603 6af0bf9c bellard
static GenOpFunc *gen_op_l##width[] = {                                       \
604 6af0bf9c bellard
    &gen_op_l##width##_user,                                                  \
605 6af0bf9c bellard
    &gen_op_l##width##_kernel,                                                \
606 6af0bf9c bellard
}
607 6af0bf9c bellard
#define OP_ST_TABLE(width)                                                    \
608 6af0bf9c bellard
static GenOpFunc *gen_op_s##width[] = {                                       \
609 6af0bf9c bellard
    &gen_op_s##width##_user,                                                  \
610 6af0bf9c bellard
    &gen_op_s##width##_kernel,                                                \
611 6af0bf9c bellard
}
612 6af0bf9c bellard
#endif
613 6af0bf9c bellard
614 60aa19ab ths
#ifdef TARGET_MIPS64
615 6af0bf9c bellard
OP_LD_TABLE(d);
616 6af0bf9c bellard
OP_LD_TABLE(dl);
617 6af0bf9c bellard
OP_LD_TABLE(dr);
618 6af0bf9c bellard
OP_ST_TABLE(d);
619 6af0bf9c bellard
OP_ST_TABLE(dl);
620 6af0bf9c bellard
OP_ST_TABLE(dr);
621 c570fd16 ths
OP_LD_TABLE(ld);
622 c570fd16 ths
OP_ST_TABLE(cd);
623 6af0bf9c bellard
#endif
624 6af0bf9c bellard
OP_LD_TABLE(w);
625 d796321b bellard
OP_LD_TABLE(wu);
626 6af0bf9c bellard
OP_LD_TABLE(wl);
627 6af0bf9c bellard
OP_LD_TABLE(wr);
628 6af0bf9c bellard
OP_ST_TABLE(w);
629 6af0bf9c bellard
OP_ST_TABLE(wl);
630 6af0bf9c bellard
OP_ST_TABLE(wr);
631 6af0bf9c bellard
OP_LD_TABLE(h);
632 6af0bf9c bellard
OP_LD_TABLE(hu);
633 6af0bf9c bellard
OP_ST_TABLE(h);
634 6af0bf9c bellard
OP_LD_TABLE(b);
635 6af0bf9c bellard
OP_LD_TABLE(bu);
636 6af0bf9c bellard
OP_ST_TABLE(b);
637 6af0bf9c bellard
OP_LD_TABLE(l);
638 6af0bf9c bellard
OP_ST_TABLE(c);
639 6ea83fed bellard
OP_LD_TABLE(wc1);
640 6ea83fed bellard
OP_ST_TABLE(wc1);
641 6ea83fed bellard
OP_LD_TABLE(dc1);
642 6ea83fed bellard
OP_ST_TABLE(dc1);
643 6af0bf9c bellard
644 6af0bf9c bellard
/* Load and store */
645 7a387fff ths
static void gen_ldst (DisasContext *ctx, uint32_t opc, int rt,
646 6af0bf9c bellard
                      int base, int16_t offset)
647 6af0bf9c bellard
{
648 7a387fff ths
    const char *opn = "unk";
649 6af0bf9c bellard
650 6af0bf9c bellard
    if (base == 0) {
651 6af0bf9c bellard
        GEN_LOAD_IMM_TN(T0, offset);
652 6af0bf9c bellard
    } else if (offset == 0) {
653 6af0bf9c bellard
        gen_op_load_gpr_T0(base);
654 6af0bf9c bellard
    } else {
655 6af0bf9c bellard
        gen_op_load_gpr_T0(base);
656 6af0bf9c bellard
        gen_op_set_T1(offset);
657 6af0bf9c bellard
        gen_op_add();
658 6af0bf9c bellard
    }
659 6af0bf9c bellard
    /* Don't do NOP if destination is zero: we must perform the actual
660 6af0bf9c bellard
     * memory access
661 6af0bf9c bellard
     */
662 6af0bf9c bellard
    switch (opc) {
663 60aa19ab ths
#ifdef TARGET_MIPS64
664 6af0bf9c bellard
    case OPC_LD:
665 6af0bf9c bellard
        op_ldst(ld);
666 6af0bf9c bellard
        GEN_STORE_TN_REG(rt, T0);
667 6af0bf9c bellard
        opn = "ld";
668 6af0bf9c bellard
        break;
669 7a387fff ths
    case OPC_LLD:
670 7a387fff ths
        op_ldst(lld);
671 7a387fff ths
        GEN_STORE_TN_REG(rt, T0);
672 7a387fff ths
        opn = "lld";
673 7a387fff ths
        break;
674 6af0bf9c bellard
    case OPC_SD:
675 6af0bf9c bellard
        GEN_LOAD_REG_TN(T1, rt);
676 6af0bf9c bellard
        op_ldst(sd);
677 6af0bf9c bellard
        opn = "sd";
678 6af0bf9c bellard
        break;
679 7a387fff ths
    case OPC_SCD:
680 7a387fff ths
        GEN_LOAD_REG_TN(T1, rt);
681 7a387fff ths
        op_ldst(scd);
682 7a387fff ths
        opn = "scd";
683 7a387fff ths
        break;
684 6af0bf9c bellard
    case OPC_LDL:
685 6af0bf9c bellard
        op_ldst(ldl);
686 6af0bf9c bellard
        GEN_STORE_TN_REG(rt, T0);
687 6af0bf9c bellard
        opn = "ldl";
688 6af0bf9c bellard
        break;
689 6af0bf9c bellard
    case OPC_SDL:
690 6af0bf9c bellard
        GEN_LOAD_REG_TN(T1, rt);
691 6af0bf9c bellard
        op_ldst(sdl);
692 6af0bf9c bellard
        opn = "sdl";
693 6af0bf9c bellard
        break;
694 6af0bf9c bellard
    case OPC_LDR:
695 6af0bf9c bellard
        op_ldst(ldr);
696 6af0bf9c bellard
        GEN_STORE_TN_REG(rt, T0);
697 6af0bf9c bellard
        opn = "ldr";
698 6af0bf9c bellard
        break;
699 6af0bf9c bellard
    case OPC_SDR:
700 6af0bf9c bellard
        GEN_LOAD_REG_TN(T1, rt);
701 6af0bf9c bellard
        op_ldst(sdr);
702 6af0bf9c bellard
        opn = "sdr";
703 6af0bf9c bellard
        break;
704 6af0bf9c bellard
#endif
705 6af0bf9c bellard
    case OPC_LW:
706 6af0bf9c bellard
        op_ldst(lw);
707 6af0bf9c bellard
        GEN_STORE_TN_REG(rt, T0);
708 6af0bf9c bellard
        opn = "lw";
709 6af0bf9c bellard
        break;
710 d796321b bellard
    case OPC_LWU:
711 d796321b bellard
        op_ldst(lwu);
712 d796321b bellard
        GEN_STORE_TN_REG(rt, T0);
713 d796321b bellard
        opn = "lwu";
714 d796321b bellard
        break;
715 6af0bf9c bellard
    case OPC_SW:
716 6af0bf9c bellard
        GEN_LOAD_REG_TN(T1, rt);
717 6af0bf9c bellard
        op_ldst(sw);
718 6af0bf9c bellard
        opn = "sw";
719 6af0bf9c bellard
        break;
720 6af0bf9c bellard
    case OPC_LH:
721 6af0bf9c bellard
        op_ldst(lh);
722 6af0bf9c bellard
        GEN_STORE_TN_REG(rt, T0);
723 6af0bf9c bellard
        opn = "lh";
724 6af0bf9c bellard
        break;
725 6af0bf9c bellard
    case OPC_SH:
726 6af0bf9c bellard
        GEN_LOAD_REG_TN(T1, rt);
727 6af0bf9c bellard
        op_ldst(sh);
728 6af0bf9c bellard
        opn = "sh";
729 6af0bf9c bellard
        break;
730 6af0bf9c bellard
    case OPC_LHU:
731 6af0bf9c bellard
        op_ldst(lhu);
732 6af0bf9c bellard
        GEN_STORE_TN_REG(rt, T0);
733 6af0bf9c bellard
        opn = "lhu";
734 6af0bf9c bellard
        break;
735 6af0bf9c bellard
    case OPC_LB:
736 6af0bf9c bellard
        op_ldst(lb);
737 6af0bf9c bellard
        GEN_STORE_TN_REG(rt, T0);
738 6af0bf9c bellard
        opn = "lb";
739 6af0bf9c bellard
        break;
740 6af0bf9c bellard
    case OPC_SB:
741 6af0bf9c bellard
        GEN_LOAD_REG_TN(T1, rt);
742 6af0bf9c bellard
        op_ldst(sb);
743 6af0bf9c bellard
        opn = "sb";
744 6af0bf9c bellard
        break;
745 6af0bf9c bellard
    case OPC_LBU:
746 6af0bf9c bellard
        op_ldst(lbu);
747 6af0bf9c bellard
        GEN_STORE_TN_REG(rt, T0);
748 6af0bf9c bellard
        opn = "lbu";
749 6af0bf9c bellard
        break;
750 6af0bf9c bellard
    case OPC_LWL:
751 9d1d106a bellard
        GEN_LOAD_REG_TN(T1, rt);
752 6af0bf9c bellard
        op_ldst(lwl);
753 6af0bf9c bellard
        GEN_STORE_TN_REG(rt, T0);
754 6af0bf9c bellard
        opn = "lwl";
755 6af0bf9c bellard
        break;
756 6af0bf9c bellard
    case OPC_SWL:
757 6af0bf9c bellard
        GEN_LOAD_REG_TN(T1, rt);
758 6af0bf9c bellard
        op_ldst(swl);
759 6af0bf9c bellard
        opn = "swr";
760 6af0bf9c bellard
        break;
761 6af0bf9c bellard
    case OPC_LWR:
762 9d1d106a bellard
        GEN_LOAD_REG_TN(T1, rt);
763 6af0bf9c bellard
        op_ldst(lwr);
764 6af0bf9c bellard
        GEN_STORE_TN_REG(rt, T0);
765 6af0bf9c bellard
        opn = "lwr";
766 6af0bf9c bellard
        break;
767 6af0bf9c bellard
    case OPC_SWR:
768 6af0bf9c bellard
        GEN_LOAD_REG_TN(T1, rt);
769 6af0bf9c bellard
        op_ldst(swr);
770 6af0bf9c bellard
        opn = "swr";
771 6af0bf9c bellard
        break;
772 6af0bf9c bellard
    case OPC_LL:
773 6af0bf9c bellard
        op_ldst(ll);
774 6af0bf9c bellard
        GEN_STORE_TN_REG(rt, T0);
775 6af0bf9c bellard
        opn = "ll";
776 6af0bf9c bellard
        break;
777 6af0bf9c bellard
    case OPC_SC:
778 6af0bf9c bellard
        GEN_LOAD_REG_TN(T1, rt);
779 6af0bf9c bellard
        op_ldst(sc);
780 6af0bf9c bellard
        GEN_STORE_TN_REG(rt, T0);
781 6af0bf9c bellard
        opn = "sc";
782 6af0bf9c bellard
        break;
783 6af0bf9c bellard
    default:
784 6af0bf9c bellard
        MIPS_INVAL("load/store");
785 6af0bf9c bellard
        generate_exception(ctx, EXCP_RI);
786 6af0bf9c bellard
        return;
787 6af0bf9c bellard
    }
788 6af0bf9c bellard
    MIPS_DEBUG("%s %s, %d(%s)", opn, regnames[rt], offset, regnames[base]);
789 6af0bf9c bellard
}
790 6af0bf9c bellard
791 6ea83fed bellard
/* Load and store */
792 7a387fff ths
static void gen_flt_ldst (DisasContext *ctx, uint32_t opc, int ft,
793 6ea83fed bellard
                      int base, int16_t offset)
794 6ea83fed bellard
{
795 7a387fff ths
    const char *opn = "unk";
796 6ea83fed bellard
797 6ea83fed bellard
    if (base == 0) {
798 6ea83fed bellard
        GEN_LOAD_IMM_TN(T0, offset);
799 6ea83fed bellard
    } else if (offset == 0) {
800 6ea83fed bellard
        gen_op_load_gpr_T0(base);
801 6ea83fed bellard
    } else {
802 6ea83fed bellard
        gen_op_load_gpr_T0(base);
803 6ea83fed bellard
        gen_op_set_T1(offset);
804 6ea83fed bellard
        gen_op_add();
805 6ea83fed bellard
    }
806 6ea83fed bellard
    /* Don't do NOP if destination is zero: we must perform the actual
807 6ea83fed bellard
     * memory access
808 6ea83fed bellard
     */
809 6ea83fed bellard
    switch (opc) {
810 6ea83fed bellard
    case OPC_LWC1:
811 6ea83fed bellard
        op_ldst(lwc1);
812 6ea83fed bellard
        GEN_STORE_FTN_FREG(ft, WT0);
813 6ea83fed bellard
        opn = "lwc1";
814 6ea83fed bellard
        break;
815 6ea83fed bellard
    case OPC_SWC1:
816 6ea83fed bellard
        GEN_LOAD_FREG_FTN(WT0, ft);
817 6ea83fed bellard
        op_ldst(swc1);
818 6ea83fed bellard
        opn = "swc1";
819 6ea83fed bellard
        break;
820 6ea83fed bellard
    case OPC_LDC1:
821 6ea83fed bellard
        op_ldst(ldc1);
822 6ea83fed bellard
        GEN_STORE_FTN_FREG(ft, DT0);
823 6ea83fed bellard
        opn = "ldc1";
824 6ea83fed bellard
        break;
825 6ea83fed bellard
    case OPC_SDC1:
826 6ea83fed bellard
        GEN_LOAD_FREG_FTN(DT0, ft);
827 6ea83fed bellard
        op_ldst(sdc1);
828 6ea83fed bellard
        opn = "sdc1";
829 6ea83fed bellard
        break;
830 6ea83fed bellard
    default:
831 6ea83fed bellard
        MIPS_INVAL("float load/store");
832 e397ee33 ths
        generate_exception(ctx, EXCP_RI);
833 6ea83fed bellard
        return;
834 6ea83fed bellard
    }
835 6ea83fed bellard
    MIPS_DEBUG("%s %s, %d(%s)", opn, fregnames[ft], offset, regnames[base]);
836 6ea83fed bellard
}
837 6ea83fed bellard
838 6af0bf9c bellard
/* Arithmetic with immediate operand */
839 7a387fff ths
static void gen_arith_imm (DisasContext *ctx, uint32_t opc, int rt,
840 6af0bf9c bellard
                           int rs, int16_t imm)
841 6af0bf9c bellard
{
842 6af0bf9c bellard
    uint32_t uimm;
843 7a387fff ths
    const char *opn = "unk";
844 6af0bf9c bellard
845 7a387fff ths
    if (rt == 0 && opc != OPC_ADDI && opc != OPC_DADDI) {
846 6af0bf9c bellard
        /* if no destination, treat it as a NOP 
847 6af0bf9c bellard
         * For addi, we must generate the overflow exception when needed.
848 6af0bf9c bellard
         */
849 6af0bf9c bellard
        MIPS_DEBUG("NOP");
850 6af0bf9c bellard
        return;
851 6af0bf9c bellard
    }
852 5a63bcb2 ths
    uimm = (uint16_t)imm;
853 5a63bcb2 ths
    switch (opc) {
854 5a63bcb2 ths
    case OPC_ADDI:
855 5a63bcb2 ths
    case OPC_ADDIU:
856 5a63bcb2 ths
#ifdef TARGET_MIPS64
857 5a63bcb2 ths
    case OPC_DADDI:
858 5a63bcb2 ths
    case OPC_DADDIU:
859 5a63bcb2 ths
#endif
860 5a63bcb2 ths
    case OPC_SLTI:
861 5a63bcb2 ths
    case OPC_SLTIU:
862 7a387fff ths
        uimm = (int32_t)imm; /* Sign extend to 32 bits */
863 5a63bcb2 ths
        /* Fall through. */
864 5a63bcb2 ths
    case OPC_ANDI:
865 5a63bcb2 ths
    case OPC_ORI:
866 5a63bcb2 ths
    case OPC_XORI:
867 6af0bf9c bellard
        GEN_LOAD_REG_TN(T0, rs);
868 6af0bf9c bellard
        GEN_LOAD_IMM_TN(T1, uimm);
869 5a63bcb2 ths
        break;
870 5a63bcb2 ths
    case OPC_LUI:
871 5a63bcb2 ths
        uimm <<= 16;
872 6af0bf9c bellard
        GEN_LOAD_IMM_TN(T0, uimm);
873 5a63bcb2 ths
        break;
874 5a63bcb2 ths
    case OPC_SLL:
875 5a63bcb2 ths
    case OPC_SRA:
876 5a63bcb2 ths
    case OPC_SRL:
877 5a63bcb2 ths
#ifdef TARGET_MIPS64
878 5a63bcb2 ths
    case OPC_DSLL:
879 5a63bcb2 ths
    case OPC_DSRA:
880 5a63bcb2 ths
    case OPC_DSRL:
881 5a63bcb2 ths
    case OPC_DSLL32:
882 5a63bcb2 ths
    case OPC_DSRA32:
883 5a63bcb2 ths
    case OPC_DSRL32:
884 5a63bcb2 ths
#endif
885 5a63bcb2 ths
        uimm &= 0x1f;
886 5a63bcb2 ths
        GEN_LOAD_REG_TN(T0, rs);
887 5a63bcb2 ths
        GEN_LOAD_IMM_TN(T1, uimm);
888 5a63bcb2 ths
        break;
889 6af0bf9c bellard
    }
890 6af0bf9c bellard
    switch (opc) {
891 6af0bf9c bellard
    case OPC_ADDI:
892 6af0bf9c bellard
        save_cpu_state(ctx, 1);
893 6af0bf9c bellard
        gen_op_addo();
894 6af0bf9c bellard
        opn = "addi";
895 6af0bf9c bellard
        break;
896 6af0bf9c bellard
    case OPC_ADDIU:
897 6af0bf9c bellard
        gen_op_add();
898 6af0bf9c bellard
        opn = "addiu";
899 6af0bf9c bellard
        break;
900 60aa19ab ths
#ifdef TARGET_MIPS64
901 7a387fff ths
    case OPC_DADDI:
902 7a387fff ths
        save_cpu_state(ctx, 1);
903 7a387fff ths
        gen_op_daddo();
904 7a387fff ths
        opn = "daddi";
905 7a387fff ths
        break;
906 7a387fff ths
    case OPC_DADDIU:
907 7a387fff ths
        gen_op_dadd();
908 7a387fff ths
        opn = "daddiu";
909 7a387fff ths
        break;
910 7a387fff ths
#endif
911 6af0bf9c bellard
    case OPC_SLTI:
912 6af0bf9c bellard
        gen_op_lt();
913 6af0bf9c bellard
        opn = "slti";
914 6af0bf9c bellard
        break;
915 6af0bf9c bellard
    case OPC_SLTIU:
916 6af0bf9c bellard
        gen_op_ltu();
917 6af0bf9c bellard
        opn = "sltiu";
918 6af0bf9c bellard
        break;
919 6af0bf9c bellard
    case OPC_ANDI:
920 6af0bf9c bellard
        gen_op_and();
921 6af0bf9c bellard
        opn = "andi";
922 6af0bf9c bellard
        break;
923 6af0bf9c bellard
    case OPC_ORI:
924 6af0bf9c bellard
        gen_op_or();
925 6af0bf9c bellard
        opn = "ori";
926 6af0bf9c bellard
        break;
927 6af0bf9c bellard
    case OPC_XORI:
928 6af0bf9c bellard
        gen_op_xor();
929 6af0bf9c bellard
        opn = "xori";
930 6af0bf9c bellard
        break;
931 6af0bf9c bellard
    case OPC_LUI:
932 6af0bf9c bellard
        opn = "lui";
933 6af0bf9c bellard
        break;
934 6af0bf9c bellard
    case OPC_SLL:
935 6af0bf9c bellard
        gen_op_sll();
936 6af0bf9c bellard
        opn = "sll";
937 6af0bf9c bellard
        break;
938 6af0bf9c bellard
    case OPC_SRA:
939 6af0bf9c bellard
        gen_op_sra();
940 6af0bf9c bellard
        opn = "sra";
941 6af0bf9c bellard
        break;
942 6af0bf9c bellard
    case OPC_SRL:
943 5a63bcb2 ths
        switch ((ctx->opcode >> 21) & 0x1f) {
944 5a63bcb2 ths
        case 0:
945 7a387fff ths
            gen_op_srl();
946 7a387fff ths
            opn = "srl";
947 5a63bcb2 ths
            break;
948 5a63bcb2 ths
        case 1:
949 5a63bcb2 ths
            gen_op_rotr();
950 5a63bcb2 ths
            opn = "rotr";
951 5a63bcb2 ths
            break;
952 5a63bcb2 ths
        default:
953 5a63bcb2 ths
            MIPS_INVAL("invalid srl flag");
954 5a63bcb2 ths
            generate_exception(ctx, EXCP_RI);
955 5a63bcb2 ths
            break;
956 5a63bcb2 ths
        }
957 7a387fff ths
        break;
958 60aa19ab ths
#ifdef TARGET_MIPS64
959 7a387fff ths
    case OPC_DSLL:
960 7a387fff ths
        gen_op_dsll();
961 7a387fff ths
        opn = "dsll";
962 7a387fff ths
        break;
963 7a387fff ths
    case OPC_DSRA:
964 7a387fff ths
        gen_op_dsra();
965 7a387fff ths
        opn = "dsra";
966 7a387fff ths
        break;
967 7a387fff ths
    case OPC_DSRL:
968 5a63bcb2 ths
        switch ((ctx->opcode >> 21) & 0x1f) {
969 5a63bcb2 ths
        case 0:
970 7a387fff ths
            gen_op_dsrl();
971 7a387fff ths
            opn = "dsrl";
972 5a63bcb2 ths
            break;
973 5a63bcb2 ths
        case 1:
974 5a63bcb2 ths
            gen_op_drotr();
975 5a63bcb2 ths
            opn = "drotr";
976 5a63bcb2 ths
            break;
977 5a63bcb2 ths
        default:
978 5a63bcb2 ths
            MIPS_INVAL("invalid dsrl flag");
979 5a63bcb2 ths
            generate_exception(ctx, EXCP_RI);
980 5a63bcb2 ths
            break;
981 5a63bcb2 ths
        }
982 7a387fff ths
        break;
983 7a387fff ths
    case OPC_DSLL32:
984 7a387fff ths
        gen_op_dsll32();
985 7a387fff ths
        opn = "dsll32";
986 7a387fff ths
        break;
987 7a387fff ths
    case OPC_DSRA32:
988 7a387fff ths
        gen_op_dsra32();
989 7a387fff ths
        opn = "dsra32";
990 7a387fff ths
        break;
991 7a387fff ths
    case OPC_DSRL32:
992 5a63bcb2 ths
        switch ((ctx->opcode >> 21) & 0x1f) {
993 5a63bcb2 ths
        case 0:
994 7a387fff ths
            gen_op_dsrl32();
995 7a387fff ths
            opn = "dsrl32";
996 5a63bcb2 ths
            break;
997 5a63bcb2 ths
        case 1:
998 5a63bcb2 ths
            gen_op_drotr32();
999 5a63bcb2 ths
            opn = "drotr32";
1000 5a63bcb2 ths
            break;
1001 5a63bcb2 ths
        default:
1002 5a63bcb2 ths
            MIPS_INVAL("invalid dsrl32 flag");
1003 5a63bcb2 ths
            generate_exception(ctx, EXCP_RI);
1004 5a63bcb2 ths
            break;
1005 5a63bcb2 ths
        }
1006 6af0bf9c bellard
        break;
1007 7a387fff ths
#endif
1008 6af0bf9c bellard
    default:
1009 6af0bf9c bellard
        MIPS_INVAL("imm arith");
1010 6af0bf9c bellard
        generate_exception(ctx, EXCP_RI);
1011 6af0bf9c bellard
        return;
1012 6af0bf9c bellard
    }
1013 6af0bf9c bellard
    GEN_STORE_TN_REG(rt, T0);
1014 6af0bf9c bellard
    MIPS_DEBUG("%s %s, %s, %x", opn, regnames[rt], regnames[rs], uimm);
1015 6af0bf9c bellard
}
1016 6af0bf9c bellard
1017 6af0bf9c bellard
/* Arithmetic */
1018 7a387fff ths
static void gen_arith (DisasContext *ctx, uint32_t opc,
1019 6af0bf9c bellard
                       int rd, int rs, int rt)
1020 6af0bf9c bellard
{
1021 7a387fff ths
    const char *opn = "unk";
1022 6af0bf9c bellard
1023 7a387fff ths
    if (rd == 0 && opc != OPC_ADD && opc != OPC_SUB
1024 7a387fff ths
       && opc != OPC_DADD && opc != OPC_DSUB) {
1025 6af0bf9c bellard
        /* if no destination, treat it as a NOP 
1026 6af0bf9c bellard
         * For add & sub, we must generate the overflow exception when needed.
1027 6af0bf9c bellard
         */
1028 6af0bf9c bellard
        MIPS_DEBUG("NOP");
1029 6af0bf9c bellard
        return;
1030 6af0bf9c bellard
    }
1031 6af0bf9c bellard
    GEN_LOAD_REG_TN(T0, rs);
1032 6af0bf9c bellard
    GEN_LOAD_REG_TN(T1, rt);
1033 6af0bf9c bellard
    switch (opc) {
1034 6af0bf9c bellard
    case OPC_ADD:
1035 6af0bf9c bellard
        save_cpu_state(ctx, 1);
1036 6af0bf9c bellard
        gen_op_addo();
1037 6af0bf9c bellard
        opn = "add";
1038 6af0bf9c bellard
        break;
1039 6af0bf9c bellard
    case OPC_ADDU:
1040 6af0bf9c bellard
        gen_op_add();
1041 6af0bf9c bellard
        opn = "addu";
1042 6af0bf9c bellard
        break;
1043 6af0bf9c bellard
    case OPC_SUB:
1044 6af0bf9c bellard
        save_cpu_state(ctx, 1);
1045 6af0bf9c bellard
        gen_op_subo();
1046 6af0bf9c bellard
        opn = "sub";
1047 6af0bf9c bellard
        break;
1048 6af0bf9c bellard
    case OPC_SUBU:
1049 6af0bf9c bellard
        gen_op_sub();
1050 6af0bf9c bellard
        opn = "subu";
1051 6af0bf9c bellard
        break;
1052 60aa19ab ths
#ifdef TARGET_MIPS64
1053 7a387fff ths
    case OPC_DADD:
1054 7a387fff ths
        save_cpu_state(ctx, 1);
1055 7a387fff ths
        gen_op_daddo();
1056 7a387fff ths
        opn = "dadd";
1057 7a387fff ths
        break;
1058 7a387fff ths
    case OPC_DADDU:
1059 7a387fff ths
        gen_op_dadd();
1060 7a387fff ths
        opn = "daddu";
1061 7a387fff ths
        break;
1062 7a387fff ths
    case OPC_DSUB:
1063 7a387fff ths
        save_cpu_state(ctx, 1);
1064 7a387fff ths
        gen_op_dsubo();
1065 7a387fff ths
        opn = "dsub";
1066 7a387fff ths
        break;
1067 7a387fff ths
    case OPC_DSUBU:
1068 7a387fff ths
        gen_op_dsub();
1069 7a387fff ths
        opn = "dsubu";
1070 7a387fff ths
        break;
1071 7a387fff ths
#endif
1072 6af0bf9c bellard
    case OPC_SLT:
1073 6af0bf9c bellard
        gen_op_lt();
1074 6af0bf9c bellard
        opn = "slt";
1075 6af0bf9c bellard
        break;
1076 6af0bf9c bellard
    case OPC_SLTU:
1077 6af0bf9c bellard
        gen_op_ltu();
1078 6af0bf9c bellard
        opn = "sltu";
1079 6af0bf9c bellard
        break;
1080 6af0bf9c bellard
    case OPC_AND:
1081 6af0bf9c bellard
        gen_op_and();
1082 6af0bf9c bellard
        opn = "and";
1083 6af0bf9c bellard
        break;
1084 6af0bf9c bellard
    case OPC_NOR:
1085 6af0bf9c bellard
        gen_op_nor();
1086 6af0bf9c bellard
        opn = "nor";
1087 6af0bf9c bellard
        break;
1088 6af0bf9c bellard
    case OPC_OR:
1089 6af0bf9c bellard
        gen_op_or();
1090 6af0bf9c bellard
        opn = "or";
1091 6af0bf9c bellard
        break;
1092 6af0bf9c bellard
    case OPC_XOR:
1093 6af0bf9c bellard
        gen_op_xor();
1094 6af0bf9c bellard
        opn = "xor";
1095 6af0bf9c bellard
        break;
1096 6af0bf9c bellard
    case OPC_MUL:
1097 6af0bf9c bellard
        gen_op_mul();
1098 6af0bf9c bellard
        opn = "mul";
1099 6af0bf9c bellard
        break;
1100 6af0bf9c bellard
    case OPC_MOVN:
1101 6af0bf9c bellard
        gen_op_movn(rd);
1102 6af0bf9c bellard
        opn = "movn";
1103 6af0bf9c bellard
        goto print;
1104 6af0bf9c bellard
    case OPC_MOVZ:
1105 6af0bf9c bellard
        gen_op_movz(rd);
1106 6af0bf9c bellard
        opn = "movz";
1107 6af0bf9c bellard
        goto print;
1108 6af0bf9c bellard
    case OPC_SLLV:
1109 6af0bf9c bellard
        gen_op_sllv();
1110 6af0bf9c bellard
        opn = "sllv";
1111 6af0bf9c bellard
        break;
1112 6af0bf9c bellard
    case OPC_SRAV:
1113 6af0bf9c bellard
        gen_op_srav();
1114 6af0bf9c bellard
        opn = "srav";
1115 6af0bf9c bellard
        break;
1116 6af0bf9c bellard
    case OPC_SRLV:
1117 5a63bcb2 ths
        switch ((ctx->opcode >> 6) & 0x1f) {
1118 5a63bcb2 ths
        case 0:
1119 7a387fff ths
            gen_op_srlv();
1120 7a387fff ths
            opn = "srlv";
1121 5a63bcb2 ths
            break;
1122 5a63bcb2 ths
        case 1:
1123 5a63bcb2 ths
            gen_op_rotrv();
1124 5a63bcb2 ths
            opn = "rotrv";
1125 5a63bcb2 ths
            break;
1126 5a63bcb2 ths
        default:
1127 5a63bcb2 ths
            MIPS_INVAL("invalid srlv flag");
1128 5a63bcb2 ths
            generate_exception(ctx, EXCP_RI);
1129 5a63bcb2 ths
            break;
1130 5a63bcb2 ths
        }
1131 7a387fff ths
        break;
1132 60aa19ab ths
#ifdef TARGET_MIPS64
1133 7a387fff ths
    case OPC_DSLLV:
1134 7a387fff ths
        gen_op_dsllv();
1135 7a387fff ths
        opn = "dsllv";
1136 7a387fff ths
        break;
1137 7a387fff ths
    case OPC_DSRAV:
1138 7a387fff ths
        gen_op_dsrav();
1139 7a387fff ths
        opn = "dsrav";
1140 7a387fff ths
        break;
1141 7a387fff ths
    case OPC_DSRLV:
1142 5a63bcb2 ths
        switch ((ctx->opcode >> 6) & 0x1f) {
1143 5a63bcb2 ths
        case 0:
1144 7a387fff ths
            gen_op_dsrlv();
1145 7a387fff ths
            opn = "dsrlv";
1146 5a63bcb2 ths
            break;
1147 5a63bcb2 ths
        case 1:
1148 5a63bcb2 ths
            gen_op_drotrv();
1149 5a63bcb2 ths
            opn = "drotrv";
1150 5a63bcb2 ths
            break;
1151 5a63bcb2 ths
        default:
1152 5a63bcb2 ths
            MIPS_INVAL("invalid dsrlv flag");
1153 5a63bcb2 ths
            generate_exception(ctx, EXCP_RI);
1154 5a63bcb2 ths
            break;
1155 5a63bcb2 ths
        }
1156 6af0bf9c bellard
        break;
1157 7a387fff ths
#endif
1158 6af0bf9c bellard
    default:
1159 6af0bf9c bellard
        MIPS_INVAL("arith");
1160 6af0bf9c bellard
        generate_exception(ctx, EXCP_RI);
1161 6af0bf9c bellard
        return;
1162 6af0bf9c bellard
    }
1163 6af0bf9c bellard
    GEN_STORE_TN_REG(rd, T0);
1164 6af0bf9c bellard
 print:
1165 6af0bf9c bellard
    MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
1166 6af0bf9c bellard
}
1167 6af0bf9c bellard
1168 6af0bf9c bellard
/* Arithmetic on HI/LO registers */
1169 7a387fff ths
static void gen_HILO (DisasContext *ctx, uint32_t opc, int reg)
1170 6af0bf9c bellard
{
1171 7a387fff ths
    const char *opn = "unk";
1172 6af0bf9c bellard
1173 6af0bf9c bellard
    if (reg == 0 && (opc == OPC_MFHI || opc == OPC_MFLO)) {
1174 6af0bf9c bellard
        /* Treat as a NOP */
1175 6af0bf9c bellard
        MIPS_DEBUG("NOP");
1176 6af0bf9c bellard
        return;
1177 6af0bf9c bellard
    }
1178 6af0bf9c bellard
    switch (opc) {
1179 6af0bf9c bellard
    case OPC_MFHI:
1180 6af0bf9c bellard
        gen_op_load_HI();
1181 6af0bf9c bellard
        GEN_STORE_TN_REG(reg, T0);
1182 6af0bf9c bellard
        opn = "mfhi";
1183 6af0bf9c bellard
        break;
1184 6af0bf9c bellard
    case OPC_MFLO:
1185 6af0bf9c bellard
        gen_op_load_LO();
1186 6af0bf9c bellard
        GEN_STORE_TN_REG(reg, T0);
1187 6af0bf9c bellard
        opn = "mflo";
1188 6af0bf9c bellard
        break;
1189 6af0bf9c bellard
    case OPC_MTHI:
1190 6af0bf9c bellard
        GEN_LOAD_REG_TN(T0, reg);
1191 6af0bf9c bellard
        gen_op_store_HI();
1192 6af0bf9c bellard
        opn = "mthi";
1193 6af0bf9c bellard
        break;
1194 6af0bf9c bellard
    case OPC_MTLO:
1195 6af0bf9c bellard
        GEN_LOAD_REG_TN(T0, reg);
1196 6af0bf9c bellard
        gen_op_store_LO();
1197 6af0bf9c bellard
        opn = "mtlo";
1198 6af0bf9c bellard
        break;
1199 6af0bf9c bellard
    default:
1200 6af0bf9c bellard
        MIPS_INVAL("HILO");
1201 6af0bf9c bellard
        generate_exception(ctx, EXCP_RI);
1202 6af0bf9c bellard
        return;
1203 6af0bf9c bellard
    }
1204 6af0bf9c bellard
    MIPS_DEBUG("%s %s", opn, regnames[reg]);
1205 6af0bf9c bellard
}
1206 6af0bf9c bellard
1207 7a387fff ths
static void gen_muldiv (DisasContext *ctx, uint32_t opc,
1208 6af0bf9c bellard
                        int rs, int rt)
1209 6af0bf9c bellard
{
1210 7a387fff ths
    const char *opn = "unk";
1211 6af0bf9c bellard
1212 6af0bf9c bellard
    GEN_LOAD_REG_TN(T0, rs);
1213 6af0bf9c bellard
    GEN_LOAD_REG_TN(T1, rt);
1214 6af0bf9c bellard
    switch (opc) {
1215 6af0bf9c bellard
    case OPC_DIV:
1216 6af0bf9c bellard
        gen_op_div();
1217 6af0bf9c bellard
        opn = "div";
1218 6af0bf9c bellard
        break;
1219 6af0bf9c bellard
    case OPC_DIVU:
1220 6af0bf9c bellard
        gen_op_divu();
1221 6af0bf9c bellard
        opn = "divu";
1222 6af0bf9c bellard
        break;
1223 6af0bf9c bellard
    case OPC_MULT:
1224 6af0bf9c bellard
        gen_op_mult();
1225 6af0bf9c bellard
        opn = "mult";
1226 6af0bf9c bellard
        break;
1227 6af0bf9c bellard
    case OPC_MULTU:
1228 6af0bf9c bellard
        gen_op_multu();
1229 6af0bf9c bellard
        opn = "multu";
1230 6af0bf9c bellard
        break;
1231 60aa19ab ths
#ifdef TARGET_MIPS64
1232 7a387fff ths
    case OPC_DDIV:
1233 7a387fff ths
        gen_op_ddiv();
1234 7a387fff ths
        opn = "ddiv";
1235 7a387fff ths
        break;
1236 7a387fff ths
    case OPC_DDIVU:
1237 7a387fff ths
        gen_op_ddivu();
1238 7a387fff ths
        opn = "ddivu";
1239 7a387fff ths
        break;
1240 7a387fff ths
    case OPC_DMULT:
1241 7a387fff ths
        gen_op_dmult();
1242 7a387fff ths
        opn = "dmult";
1243 7a387fff ths
        break;
1244 7a387fff ths
    case OPC_DMULTU:
1245 7a387fff ths
        gen_op_dmultu();
1246 7a387fff ths
        opn = "dmultu";
1247 7a387fff ths
        break;
1248 7a387fff ths
#endif
1249 6af0bf9c bellard
    case OPC_MADD:
1250 6af0bf9c bellard
        gen_op_madd();
1251 6af0bf9c bellard
        opn = "madd";
1252 6af0bf9c bellard
        break;
1253 6af0bf9c bellard
    case OPC_MADDU:
1254 6af0bf9c bellard
        gen_op_maddu();
1255 6af0bf9c bellard
        opn = "maddu";
1256 6af0bf9c bellard
        break;
1257 6af0bf9c bellard
    case OPC_MSUB:
1258 6af0bf9c bellard
        gen_op_msub();
1259 6af0bf9c bellard
        opn = "msub";
1260 6af0bf9c bellard
        break;
1261 6af0bf9c bellard
    case OPC_MSUBU:
1262 6af0bf9c bellard
        gen_op_msubu();
1263 6af0bf9c bellard
        opn = "msubu";
1264 6af0bf9c bellard
        break;
1265 6af0bf9c bellard
    default:
1266 6af0bf9c bellard
        MIPS_INVAL("mul/div");
1267 6af0bf9c bellard
        generate_exception(ctx, EXCP_RI);
1268 6af0bf9c bellard
        return;
1269 6af0bf9c bellard
    }
1270 6af0bf9c bellard
    MIPS_DEBUG("%s %s %s", opn, regnames[rs], regnames[rt]);
1271 6af0bf9c bellard
}
1272 6af0bf9c bellard
1273 7a387fff ths
static void gen_cl (DisasContext *ctx, uint32_t opc,
1274 6af0bf9c bellard
                    int rd, int rs)
1275 6af0bf9c bellard
{
1276 7a387fff ths
    const char *opn = "unk";
1277 6af0bf9c bellard
    if (rd == 0) {
1278 6af0bf9c bellard
        /* Treat as a NOP */
1279 6af0bf9c bellard
        MIPS_DEBUG("NOP");
1280 6af0bf9c bellard
        return;
1281 6af0bf9c bellard
    }
1282 6af0bf9c bellard
    GEN_LOAD_REG_TN(T0, rs);
1283 6af0bf9c bellard
    switch (opc) {
1284 6af0bf9c bellard
    case OPC_CLO:
1285 6af0bf9c bellard
        gen_op_clo();
1286 6af0bf9c bellard
        opn = "clo";
1287 6af0bf9c bellard
        break;
1288 6af0bf9c bellard
    case OPC_CLZ:
1289 6af0bf9c bellard
        gen_op_clz();
1290 6af0bf9c bellard
        opn = "clz";
1291 6af0bf9c bellard
        break;
1292 60aa19ab ths
#ifdef TARGET_MIPS64
1293 7a387fff ths
    case OPC_DCLO:
1294 7a387fff ths
        gen_op_dclo();
1295 7a387fff ths
        opn = "dclo";
1296 7a387fff ths
        break;
1297 7a387fff ths
    case OPC_DCLZ:
1298 7a387fff ths
        gen_op_dclz();
1299 7a387fff ths
        opn = "dclz";
1300 7a387fff ths
        break;
1301 7a387fff ths
#endif
1302 6af0bf9c bellard
    default:
1303 6af0bf9c bellard
        MIPS_INVAL("CLx");
1304 6af0bf9c bellard
        generate_exception(ctx, EXCP_RI);
1305 6af0bf9c bellard
        return;
1306 6af0bf9c bellard
    }
1307 6af0bf9c bellard
    gen_op_store_T0_gpr(rd);
1308 6af0bf9c bellard
    MIPS_DEBUG("%s %s, %s", opn, regnames[rd], regnames[rs]);
1309 6af0bf9c bellard
}
1310 6af0bf9c bellard
1311 6af0bf9c bellard
/* Traps */
1312 7a387fff ths
static void gen_trap (DisasContext *ctx, uint32_t opc,
1313 6af0bf9c bellard
                      int rs, int rt, int16_t imm)
1314 6af0bf9c bellard
{
1315 6af0bf9c bellard
    int cond;
1316 6af0bf9c bellard
1317 6af0bf9c bellard
    cond = 0;
1318 6af0bf9c bellard
    /* Load needed operands */
1319 6af0bf9c bellard
    switch (opc) {
1320 6af0bf9c bellard
    case OPC_TEQ:
1321 6af0bf9c bellard
    case OPC_TGE:
1322 6af0bf9c bellard
    case OPC_TGEU:
1323 6af0bf9c bellard
    case OPC_TLT:
1324 6af0bf9c bellard
    case OPC_TLTU:
1325 6af0bf9c bellard
    case OPC_TNE:
1326 6af0bf9c bellard
        /* Compare two registers */
1327 6af0bf9c bellard
        if (rs != rt) {
1328 6af0bf9c bellard
            GEN_LOAD_REG_TN(T0, rs);
1329 6af0bf9c bellard
            GEN_LOAD_REG_TN(T1, rt);
1330 6af0bf9c bellard
            cond = 1;
1331 6af0bf9c bellard
        }
1332 179e32bb ths
        break;
1333 6af0bf9c bellard
    case OPC_TEQI:
1334 6af0bf9c bellard
    case OPC_TGEI:
1335 6af0bf9c bellard
    case OPC_TGEIU:
1336 6af0bf9c bellard
    case OPC_TLTI:
1337 6af0bf9c bellard
    case OPC_TLTIU:
1338 6af0bf9c bellard
    case OPC_TNEI:
1339 6af0bf9c bellard
        /* Compare register to immediate */
1340 6af0bf9c bellard
        if (rs != 0 || imm != 0) {
1341 6af0bf9c bellard
            GEN_LOAD_REG_TN(T0, rs);
1342 6af0bf9c bellard
            GEN_LOAD_IMM_TN(T1, (int32_t)imm);
1343 6af0bf9c bellard
            cond = 1;
1344 6af0bf9c bellard
        }
1345 6af0bf9c bellard
        break;
1346 6af0bf9c bellard
    }
1347 6af0bf9c bellard
    if (cond == 0) {
1348 6af0bf9c bellard
        switch (opc) {
1349 6af0bf9c bellard
        case OPC_TEQ:   /* rs == rs */
1350 6af0bf9c bellard
        case OPC_TEQI:  /* r0 == 0  */
1351 6af0bf9c bellard
        case OPC_TGE:   /* rs >= rs */
1352 6af0bf9c bellard
        case OPC_TGEI:  /* r0 >= 0  */
1353 6af0bf9c bellard
        case OPC_TGEU:  /* rs >= rs unsigned */
1354 6af0bf9c bellard
        case OPC_TGEIU: /* r0 >= 0  unsigned */
1355 6af0bf9c bellard
            /* Always trap */
1356 6af0bf9c bellard
            gen_op_set_T0(1);
1357 6af0bf9c bellard
            break;
1358 6af0bf9c bellard
        case OPC_TLT:   /* rs < rs           */
1359 6af0bf9c bellard
        case OPC_TLTI:  /* r0 < 0            */
1360 6af0bf9c bellard
        case OPC_TLTU:  /* rs < rs unsigned  */
1361 6af0bf9c bellard
        case OPC_TLTIU: /* r0 < 0  unsigned  */
1362 6af0bf9c bellard
        case OPC_TNE:   /* rs != rs          */
1363 6af0bf9c bellard
        case OPC_TNEI:  /* r0 != 0           */
1364 6af0bf9c bellard
            /* Never trap: treat as NOP */
1365 6af0bf9c bellard
            return;
1366 6af0bf9c bellard
        default:
1367 6af0bf9c bellard
            MIPS_INVAL("TRAP");
1368 6af0bf9c bellard
            generate_exception(ctx, EXCP_RI);
1369 6af0bf9c bellard
            return;
1370 6af0bf9c bellard
        }
1371 6af0bf9c bellard
    } else {
1372 6af0bf9c bellard
        switch (opc) {
1373 6af0bf9c bellard
        case OPC_TEQ:
1374 6af0bf9c bellard
        case OPC_TEQI:
1375 6af0bf9c bellard
            gen_op_eq();
1376 6af0bf9c bellard
            break;
1377 6af0bf9c bellard
        case OPC_TGE:
1378 6af0bf9c bellard
        case OPC_TGEI:
1379 6af0bf9c bellard
            gen_op_ge();
1380 6af0bf9c bellard
            break;
1381 6af0bf9c bellard
        case OPC_TGEU:
1382 6af0bf9c bellard
        case OPC_TGEIU:
1383 6af0bf9c bellard
            gen_op_geu();
1384 6af0bf9c bellard
            break;
1385 6af0bf9c bellard
        case OPC_TLT:
1386 6af0bf9c bellard
        case OPC_TLTI:
1387 6af0bf9c bellard
            gen_op_lt();
1388 6af0bf9c bellard
            break;
1389 6af0bf9c bellard
        case OPC_TLTU:
1390 6af0bf9c bellard
        case OPC_TLTIU:
1391 6af0bf9c bellard
            gen_op_ltu();
1392 6af0bf9c bellard
            break;
1393 6af0bf9c bellard
        case OPC_TNE:
1394 6af0bf9c bellard
        case OPC_TNEI:
1395 6af0bf9c bellard
            gen_op_ne();
1396 6af0bf9c bellard
            break;
1397 6af0bf9c bellard
        default:
1398 6af0bf9c bellard
            MIPS_INVAL("TRAP");
1399 6af0bf9c bellard
            generate_exception(ctx, EXCP_RI);
1400 6af0bf9c bellard
            return;
1401 6af0bf9c bellard
        }
1402 6af0bf9c bellard
    }
1403 6af0bf9c bellard
    save_cpu_state(ctx, 1);
1404 6af0bf9c bellard
    gen_op_trap();
1405 6af0bf9c bellard
    ctx->bstate = BS_STOP;
1406 6af0bf9c bellard
}
1407 6af0bf9c bellard
1408 6e256c93 bellard
static inline void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
1409 c53be334 bellard
{
1410 6e256c93 bellard
    TranslationBlock *tb;
1411 6e256c93 bellard
    tb = ctx->tb;
1412 6e256c93 bellard
    if ((tb->pc & TARGET_PAGE_MASK) == (dest & TARGET_PAGE_MASK)) {
1413 6e256c93 bellard
        if (n == 0)
1414 6e256c93 bellard
            gen_op_goto_tb0(TBPARAM(tb));
1415 6e256c93 bellard
        else
1416 6e256c93 bellard
            gen_op_goto_tb1(TBPARAM(tb));
1417 6e256c93 bellard
        gen_op_save_pc(dest);
1418 6e256c93 bellard
        gen_op_set_T0((long)tb + n);
1419 6e256c93 bellard
        gen_op_exit_tb();
1420 6e256c93 bellard
    } else {
1421 6e256c93 bellard
        gen_op_save_pc(dest);
1422 6e256c93 bellard
        gen_op_set_T0(0);
1423 6e256c93 bellard
        gen_op_exit_tb();
1424 6e256c93 bellard
    }
1425 c53be334 bellard
}
1426 c53be334 bellard
1427 6af0bf9c bellard
/* Branches (before delay slot) */
1428 7a387fff ths
static void gen_compute_branch (DisasContext *ctx, uint32_t opc,
1429 6af0bf9c bellard
                                int rs, int rt, int32_t offset)
1430 6af0bf9c bellard
{
1431 3ad4bb2d ths
    target_ulong btarget = -1;
1432 3ad4bb2d ths
    int blink = 0;
1433 3ad4bb2d ths
    int bcond = 0;
1434 3ad4bb2d ths
1435 3ad4bb2d ths
    if (ctx->hflags & MIPS_HFLAG_BMASK) {
1436 3ad4bb2d ths
        if (loglevel & CPU_LOG_TB_IN_ASM) {
1437 3ad4bb2d ths
            fprintf(logfile,
1438 38121543 ths
                    "undefined branch in delay slot at PC " TARGET_FMT_lx "\n",
1439 38121543 ths
                    ctx->pc);
1440 3ad4bb2d ths
        }
1441 3ad4bb2d ths
        MIPS_INVAL("branch/jump in bdelay slot");
1442 3ad4bb2d ths
        generate_exception(ctx, EXCP_RI);
1443 3ad4bb2d ths
        return;
1444 3ad4bb2d ths
    }
1445 6af0bf9c bellard
1446 6af0bf9c bellard
    /* Load needed operands */
1447 6af0bf9c bellard
    switch (opc) {
1448 6af0bf9c bellard
    case OPC_BEQ:
1449 6af0bf9c bellard
    case OPC_BEQL:
1450 6af0bf9c bellard
    case OPC_BNE:
1451 6af0bf9c bellard
    case OPC_BNEL:
1452 6af0bf9c bellard
        /* Compare two registers */
1453 6af0bf9c bellard
        if (rs != rt) {
1454 6af0bf9c bellard
            GEN_LOAD_REG_TN(T0, rs);
1455 6af0bf9c bellard
            GEN_LOAD_REG_TN(T1, rt);
1456 6af0bf9c bellard
            bcond = 1;
1457 6af0bf9c bellard
        }
1458 6af0bf9c bellard
        btarget = ctx->pc + 4 + offset;
1459 6af0bf9c bellard
        break;
1460 6af0bf9c bellard
    case OPC_BGEZ:
1461 6af0bf9c bellard
    case OPC_BGEZAL:
1462 6af0bf9c bellard
    case OPC_BGEZALL:
1463 6af0bf9c bellard
    case OPC_BGEZL:
1464 6af0bf9c bellard
    case OPC_BGTZ:
1465 6af0bf9c bellard
    case OPC_BGTZL:
1466 6af0bf9c bellard
    case OPC_BLEZ:
1467 6af0bf9c bellard
    case OPC_BLEZL:
1468 6af0bf9c bellard
    case OPC_BLTZ:
1469 6af0bf9c bellard
    case OPC_BLTZAL:
1470 6af0bf9c bellard
    case OPC_BLTZALL:
1471 6af0bf9c bellard
    case OPC_BLTZL:
1472 6af0bf9c bellard
        /* Compare to zero */
1473 6af0bf9c bellard
        if (rs != 0) {
1474 6af0bf9c bellard
            gen_op_load_gpr_T0(rs);
1475 6af0bf9c bellard
            bcond = 1;
1476 6af0bf9c bellard
        }
1477 6af0bf9c bellard
        btarget = ctx->pc + 4 + offset;
1478 6af0bf9c bellard
        break;
1479 6af0bf9c bellard
    case OPC_J:
1480 6af0bf9c bellard
    case OPC_JAL:
1481 6af0bf9c bellard
        /* Jump to immediate */
1482 5dc4b744 ths
        btarget = ((ctx->pc + 4) & (int32_t)0xF0000000) | offset;
1483 6af0bf9c bellard
        break;
1484 6af0bf9c bellard
    case OPC_JR:
1485 6af0bf9c bellard
    case OPC_JALR:
1486 6af0bf9c bellard
        /* Jump to register */
1487 7a387fff ths
        if (offset != 0 && offset != 16) {
1488 7a387fff ths
            /* Hint = 0 is JR/JALR, hint 16 is JR.HB/JALR.HB, the
1489 cbeb0857 ths
               others are reserved. */
1490 6af0bf9c bellard
            generate_exception(ctx, EXCP_RI);
1491 6af0bf9c bellard
            return;
1492 6af0bf9c bellard
        }
1493 6af0bf9c bellard
        GEN_LOAD_REG_TN(T2, rs);
1494 6af0bf9c bellard
        break;
1495 6af0bf9c bellard
    default:
1496 6af0bf9c bellard
        MIPS_INVAL("branch/jump");
1497 6af0bf9c bellard
        generate_exception(ctx, EXCP_RI);
1498 6af0bf9c bellard
        return;
1499 6af0bf9c bellard
    }
1500 6af0bf9c bellard
    if (bcond == 0) {
1501 6af0bf9c bellard
        /* No condition to be computed */
1502 6af0bf9c bellard
        switch (opc) {
1503 6af0bf9c bellard
        case OPC_BEQ:     /* rx == rx        */
1504 6af0bf9c bellard
        case OPC_BEQL:    /* rx == rx likely */
1505 6af0bf9c bellard
        case OPC_BGEZ:    /* 0 >= 0          */
1506 6af0bf9c bellard
        case OPC_BGEZL:   /* 0 >= 0 likely   */
1507 6af0bf9c bellard
        case OPC_BLEZ:    /* 0 <= 0          */
1508 6af0bf9c bellard
        case OPC_BLEZL:   /* 0 <= 0 likely   */
1509 6af0bf9c bellard
            /* Always take */
1510 4ad40f36 bellard
            ctx->hflags |= MIPS_HFLAG_B;
1511 6af0bf9c bellard
            MIPS_DEBUG("balways");
1512 6af0bf9c bellard
            break;
1513 6af0bf9c bellard
        case OPC_BGEZAL:  /* 0 >= 0          */
1514 6af0bf9c bellard
        case OPC_BGEZALL: /* 0 >= 0 likely   */
1515 6af0bf9c bellard
            /* Always take and link */
1516 6af0bf9c bellard
            blink = 31;
1517 4ad40f36 bellard
            ctx->hflags |= MIPS_HFLAG_B;
1518 6af0bf9c bellard
            MIPS_DEBUG("balways and link");
1519 6af0bf9c bellard
            break;
1520 6af0bf9c bellard
        case OPC_BNE:     /* rx != rx        */
1521 6af0bf9c bellard
        case OPC_BGTZ:    /* 0 > 0           */
1522 6af0bf9c bellard
        case OPC_BLTZ:    /* 0 < 0           */
1523 6af0bf9c bellard
            /* Treated as NOP */
1524 6af0bf9c bellard
            MIPS_DEBUG("bnever (NOP)");
1525 6af0bf9c bellard
            return;
1526 eeef26cd bellard
        case OPC_BLTZAL:  /* 0 < 0           */
1527 eeef26cd bellard
            gen_op_set_T0(ctx->pc + 8);
1528 eeef26cd bellard
            gen_op_store_T0_gpr(31);
1529 eeef26cd bellard
            return;
1530 eeef26cd bellard
        case OPC_BLTZALL: /* 0 < 0 likely */
1531 eeef26cd bellard
            gen_op_set_T0(ctx->pc + 8);
1532 eeef26cd bellard
            gen_op_store_T0_gpr(31);
1533 e04bcc69 ths
            gen_goto_tb(ctx, 0, ctx->pc + 8);
1534 eeef26cd bellard
            return;
1535 6af0bf9c bellard
        case OPC_BNEL:    /* rx != rx likely */
1536 6af0bf9c bellard
        case OPC_BGTZL:   /* 0 > 0 likely */
1537 6af0bf9c bellard
        case OPC_BLTZL:   /* 0 < 0 likely */
1538 6af0bf9c bellard
            /* Skip the instruction in the delay slot */
1539 6af0bf9c bellard
            MIPS_DEBUG("bnever and skip");
1540 e04bcc69 ths
            gen_goto_tb(ctx, 0, ctx->pc + 8);
1541 6af0bf9c bellard
            return;
1542 6af0bf9c bellard
        case OPC_J:
1543 4ad40f36 bellard
            ctx->hflags |= MIPS_HFLAG_B;
1544 6af0bf9c bellard
            MIPS_DEBUG("j %08x", btarget);
1545 6af0bf9c bellard
            break;
1546 6af0bf9c bellard
        case OPC_JAL:
1547 6af0bf9c bellard
            blink = 31;
1548 4ad40f36 bellard
            ctx->hflags |= MIPS_HFLAG_B;
1549 6af0bf9c bellard
            MIPS_DEBUG("jal %08x", btarget);
1550 6af0bf9c bellard
            break;
1551 6af0bf9c bellard
        case OPC_JR:
1552 4ad40f36 bellard
            ctx->hflags |= MIPS_HFLAG_BR;
1553 6af0bf9c bellard
            MIPS_DEBUG("jr %s", regnames[rs]);
1554 6af0bf9c bellard
            break;
1555 6af0bf9c bellard
        case OPC_JALR:
1556 6af0bf9c bellard
            blink = rt;
1557 4ad40f36 bellard
            ctx->hflags |= MIPS_HFLAG_BR;
1558 6af0bf9c bellard
            MIPS_DEBUG("jalr %s, %s", regnames[rt], regnames[rs]);
1559 6af0bf9c bellard
            break;
1560 6af0bf9c bellard
        default:
1561 6af0bf9c bellard
            MIPS_INVAL("branch/jump");
1562 6af0bf9c bellard
            generate_exception(ctx, EXCP_RI);
1563 6af0bf9c bellard
            return;
1564 6af0bf9c bellard
        }
1565 6af0bf9c bellard
    } else {
1566 6af0bf9c bellard
        switch (opc) {
1567 6af0bf9c bellard
        case OPC_BEQ:
1568 6af0bf9c bellard
            gen_op_eq();
1569 6af0bf9c bellard
            MIPS_DEBUG("beq %s, %s, %08x",
1570 6af0bf9c bellard
                       regnames[rs], regnames[rt], btarget);
1571 6af0bf9c bellard
            goto not_likely;
1572 6af0bf9c bellard
        case OPC_BEQL:
1573 6af0bf9c bellard
            gen_op_eq();
1574 6af0bf9c bellard
            MIPS_DEBUG("beql %s, %s, %08x",
1575 6af0bf9c bellard
                       regnames[rs], regnames[rt], btarget);
1576 6af0bf9c bellard
            goto likely;
1577 6af0bf9c bellard
        case OPC_BNE:
1578 6af0bf9c bellard
            gen_op_ne();
1579 6af0bf9c bellard
            MIPS_DEBUG("bne %s, %s, %08x",
1580 6af0bf9c bellard
                       regnames[rs], regnames[rt], btarget);
1581 6af0bf9c bellard
            goto not_likely;
1582 6af0bf9c bellard
        case OPC_BNEL:
1583 6af0bf9c bellard
            gen_op_ne();
1584 6af0bf9c bellard
            MIPS_DEBUG("bnel %s, %s, %08x",
1585 6af0bf9c bellard
                       regnames[rs], regnames[rt], btarget);
1586 6af0bf9c bellard
            goto likely;
1587 6af0bf9c bellard
        case OPC_BGEZ:
1588 6af0bf9c bellard
            gen_op_gez();
1589 6af0bf9c bellard
            MIPS_DEBUG("bgez %s, %08x", regnames[rs], btarget);
1590 6af0bf9c bellard
            goto not_likely;
1591 6af0bf9c bellard
        case OPC_BGEZL:
1592 6af0bf9c bellard
            gen_op_gez();
1593 6af0bf9c bellard
            MIPS_DEBUG("bgezl %s, %08x", regnames[rs], btarget);
1594 6af0bf9c bellard
            goto likely;
1595 6af0bf9c bellard
        case OPC_BGEZAL:
1596 6af0bf9c bellard
            gen_op_gez();
1597 6af0bf9c bellard
            MIPS_DEBUG("bgezal %s, %08x", regnames[rs], btarget);
1598 6af0bf9c bellard
            blink = 31;
1599 6af0bf9c bellard
            goto not_likely;
1600 6af0bf9c bellard
        case OPC_BGEZALL:
1601 6af0bf9c bellard
            gen_op_gez();
1602 6af0bf9c bellard
            blink = 31;
1603 6af0bf9c bellard
            MIPS_DEBUG("bgezall %s, %08x", regnames[rs], btarget);
1604 6af0bf9c bellard
            goto likely;
1605 6af0bf9c bellard
        case OPC_BGTZ:
1606 6af0bf9c bellard
            gen_op_gtz();
1607 6af0bf9c bellard
            MIPS_DEBUG("bgtz %s, %08x", regnames[rs], btarget);
1608 6af0bf9c bellard
            goto not_likely;
1609 6af0bf9c bellard
        case OPC_BGTZL:
1610 6af0bf9c bellard
            gen_op_gtz();
1611 6af0bf9c bellard
            MIPS_DEBUG("bgtzl %s, %08x", regnames[rs], btarget);
1612 6af0bf9c bellard
            goto likely;
1613 6af0bf9c bellard
        case OPC_BLEZ:
1614 6af0bf9c bellard
            gen_op_lez();
1615 6af0bf9c bellard
            MIPS_DEBUG("blez %s, %08x", regnames[rs], btarget);
1616 6af0bf9c bellard
            goto not_likely;
1617 6af0bf9c bellard
        case OPC_BLEZL:
1618 6af0bf9c bellard
            gen_op_lez();
1619 6af0bf9c bellard
            MIPS_DEBUG("blezl %s, %08x", regnames[rs], btarget);
1620 6af0bf9c bellard
            goto likely;
1621 6af0bf9c bellard
        case OPC_BLTZ:
1622 6af0bf9c bellard
            gen_op_ltz();
1623 6af0bf9c bellard
            MIPS_DEBUG("bltz %s, %08x", regnames[rs], btarget);
1624 6af0bf9c bellard
            goto not_likely;
1625 6af0bf9c bellard
        case OPC_BLTZL:
1626 6af0bf9c bellard
            gen_op_ltz();
1627 6af0bf9c bellard
            MIPS_DEBUG("bltzl %s, %08x", regnames[rs], btarget);
1628 6af0bf9c bellard
            goto likely;
1629 6af0bf9c bellard
        case OPC_BLTZAL:
1630 6af0bf9c bellard
            gen_op_ltz();
1631 6af0bf9c bellard
            blink = 31;
1632 6af0bf9c bellard
            MIPS_DEBUG("bltzal %s, %08x", regnames[rs], btarget);
1633 6af0bf9c bellard
        not_likely:
1634 4ad40f36 bellard
            ctx->hflags |= MIPS_HFLAG_BC;
1635 6af0bf9c bellard
            break;
1636 6af0bf9c bellard
        case OPC_BLTZALL:
1637 6af0bf9c bellard
            gen_op_ltz();
1638 6af0bf9c bellard
            blink = 31;
1639 6af0bf9c bellard
            MIPS_DEBUG("bltzall %s, %08x", regnames[rs], btarget);
1640 6af0bf9c bellard
        likely:
1641 4ad40f36 bellard
            ctx->hflags |= MIPS_HFLAG_BL;
1642 6af0bf9c bellard
            break;
1643 c53f4a62 ths
        default:
1644 c53f4a62 ths
            MIPS_INVAL("conditional branch/jump");
1645 c53f4a62 ths
            generate_exception(ctx, EXCP_RI);
1646 c53f4a62 ths
            return;
1647 6af0bf9c bellard
        }
1648 6af0bf9c bellard
        gen_op_set_bcond();
1649 6af0bf9c bellard
    }
1650 6af0bf9c bellard
    MIPS_DEBUG("enter ds: link %d cond %02x target %08x",
1651 6af0bf9c bellard
               blink, ctx->hflags, btarget);
1652 6af0bf9c bellard
    ctx->btarget = btarget;
1653 6af0bf9c bellard
    if (blink > 0) {
1654 6af0bf9c bellard
        gen_op_set_T0(ctx->pc + 8);
1655 6af0bf9c bellard
        gen_op_store_T0_gpr(blink);
1656 6af0bf9c bellard
    }
1657 6af0bf9c bellard
}
1658 6af0bf9c bellard
1659 7a387fff ths
/* special3 bitfield operations */
1660 7a387fff ths
static void gen_bitops (DisasContext *ctx, uint32_t opc, int rt,
1661 7a387fff ths
                       int rs, int lsb, int msb)
1662 7a387fff ths
{
1663 7a387fff ths
    GEN_LOAD_REG_TN(T1, rs);
1664 7a387fff ths
    switch (opc) {
1665 7a387fff ths
    case OPC_EXT:
1666 7a387fff ths
        if (lsb + msb > 31)
1667 7a387fff ths
            goto fail;
1668 7a387fff ths
        gen_op_ext(lsb, msb + 1);
1669 7a387fff ths
        break;
1670 7a387fff ths
    case OPC_DEXTM:
1671 7a387fff ths
        if (lsb + msb > 63)
1672 7a387fff ths
            goto fail;
1673 7a387fff ths
        gen_op_ext(lsb, msb + 1 + 32);
1674 7a387fff ths
        break;
1675 7a387fff ths
    case OPC_DEXTU:
1676 7a387fff ths
        if (lsb + msb > 63)
1677 7a387fff ths
            goto fail;
1678 7a387fff ths
        gen_op_ext(lsb + 32, msb + 1);
1679 7a387fff ths
        break;
1680 7a387fff ths
    case OPC_DEXT:
1681 7a387fff ths
        gen_op_ext(lsb, msb + 1);
1682 7a387fff ths
        break;
1683 7a387fff ths
    case OPC_INS:
1684 7a387fff ths
        if (lsb > msb)
1685 7a387fff ths
            goto fail;
1686 7a387fff ths
        GEN_LOAD_REG_TN(T2, rt);
1687 7a387fff ths
        gen_op_ins(lsb, msb - lsb + 1);
1688 7a387fff ths
        break;
1689 7a387fff ths
    case OPC_DINSM:
1690 7a387fff ths
        if (lsb > msb)
1691 7a387fff ths
            goto fail;
1692 7a387fff ths
        GEN_LOAD_REG_TN(T2, rt);
1693 7a387fff ths
        gen_op_ins(lsb, msb - lsb + 1 + 32);
1694 7a387fff ths
        break;
1695 7a387fff ths
    case OPC_DINSU:
1696 7a387fff ths
        if (lsb > msb)
1697 7a387fff ths
            goto fail;
1698 7a387fff ths
        GEN_LOAD_REG_TN(T2, rt);
1699 7a387fff ths
        gen_op_ins(lsb + 32, msb - lsb + 1);
1700 7a387fff ths
        break;
1701 7a387fff ths
    case OPC_DINS:
1702 7a387fff ths
        if (lsb > msb)
1703 7a387fff ths
            goto fail;
1704 7a387fff ths
        GEN_LOAD_REG_TN(T2, rt);
1705 7a387fff ths
        gen_op_ins(lsb, msb - lsb + 1);
1706 7a387fff ths
        break;
1707 7a387fff ths
    default:
1708 7a387fff ths
fail:
1709 7a387fff ths
        MIPS_INVAL("bitops");
1710 7a387fff ths
        generate_exception(ctx, EXCP_RI);
1711 7a387fff ths
        return;
1712 7a387fff ths
    }
1713 7a387fff ths
    GEN_STORE_TN_REG(rt, T0);
1714 7a387fff ths
}
1715 7a387fff ths
1716 6af0bf9c bellard
/* CP0 (MMU and control) */
1717 873eb012 ths
static void gen_mfc0 (DisasContext *ctx, int reg, int sel)
1718 873eb012 ths
{
1719 7a387fff ths
    const char *rn = "invalid";
1720 873eb012 ths
1721 873eb012 ths
    switch (reg) {
1722 873eb012 ths
    case 0:
1723 7a387fff ths
        switch (sel) {
1724 7a387fff ths
        case 0:
1725 7a387fff ths
           gen_op_mfc0_index();
1726 7a387fff ths
            rn = "Index";
1727 7a387fff ths
            break;
1728 7a387fff ths
        case 1:
1729 7a387fff ths
//         gen_op_mfc0_mvpcontrol(); /* MT ASE */
1730 7a387fff ths
            rn = "MVPControl";
1731 7a387fff ths
//         break;
1732 7a387fff ths
        case 2:
1733 7a387fff ths
//         gen_op_mfc0_mvpconf0(); /* MT ASE */
1734 7a387fff ths
            rn = "MVPConf0";
1735 7a387fff ths
//         break;
1736 7a387fff ths
        case 3:
1737 7a387fff ths
//         gen_op_mfc0_mvpconf1(); /* MT ASE */
1738 7a387fff ths
            rn = "MVPConf1";
1739 7a387fff ths
//         break;
1740 7a387fff ths
        default:
1741 7a387fff ths
            goto die;
1742 7a387fff ths
        }
1743 873eb012 ths
        break;
1744 873eb012 ths
    case 1:
1745 7a387fff ths
        switch (sel) {
1746 7a387fff ths
        case 0:
1747 7a387fff ths
            gen_op_mfc0_random();
1748 7a387fff ths
            rn = "Random";
1749 7a387fff ths
           break;
1750 7a387fff ths
        case 1:
1751 7a387fff ths
//         gen_op_mfc0_vpecontrol(); /* MT ASE */
1752 7a387fff ths
            rn = "VPEControl";
1753 7a387fff ths
//         break;
1754 7a387fff ths
        case 2:
1755 7a387fff ths
//         gen_op_mfc0_vpeconf0(); /* MT ASE */
1756 7a387fff ths
            rn = "VPEConf0";
1757 7a387fff ths
//         break;
1758 7a387fff ths
        case 3:
1759 7a387fff ths
//         gen_op_mfc0_vpeconf1(); /* MT ASE */
1760 7a387fff ths
            rn = "VPEConf1";
1761 7a387fff ths
//         break;
1762 7a387fff ths
        case 4:
1763 7a387fff ths
//         gen_op_mfc0_YQMask(); /* MT ASE */
1764 7a387fff ths
            rn = "YQMask";
1765 7a387fff ths
//         break;
1766 7a387fff ths
        case 5:
1767 7a387fff ths
//         gen_op_mfc0_vpeschedule(); /* MT ASE */
1768 7a387fff ths
            rn = "VPESchedule";
1769 7a387fff ths
//         break;
1770 7a387fff ths
        case 6:
1771 7a387fff ths
//         gen_op_mfc0_vpeschefback(); /* MT ASE */
1772 7a387fff ths
            rn = "VPEScheFBack";
1773 7a387fff ths
//         break;
1774 7a387fff ths
        case 7:
1775 7a387fff ths
//         gen_op_mfc0_vpeopt(); /* MT ASE */
1776 7a387fff ths
            rn = "VPEOpt";
1777 7a387fff ths
//         break;
1778 7a387fff ths
        default:
1779 7a387fff ths
            goto die;
1780 7a387fff ths
        }
1781 873eb012 ths
        break;
1782 873eb012 ths
    case 2:
1783 7a387fff ths
        switch (sel) {
1784 7a387fff ths
        case 0:
1785 7a387fff ths
           gen_op_mfc0_entrylo0();
1786 7a387fff ths
           rn = "EntryLo0";
1787 7a387fff ths
           break;
1788 7a387fff ths
        case 1:
1789 7a387fff ths
//         gen_op_mfc0_tcstatus(); /* MT ASE */
1790 7a387fff ths
           rn = "TCStatus";
1791 7a387fff ths
//         break;
1792 7a387fff ths
        case 2:
1793 7a387fff ths
//         gen_op_mfc0_tcbind(); /* MT ASE */
1794 7a387fff ths
           rn = "TCBind";
1795 7a387fff ths
//         break;
1796 7a387fff ths
        case 3:
1797 7a387fff ths
//         gen_op_mfc0_tcrestart(); /* MT ASE */
1798 7a387fff ths
           rn = "TCRestart";
1799 7a387fff ths
//         break;
1800 7a387fff ths
        case 4:
1801 7a387fff ths
//         gen_op_mfc0_tchalt(); /* MT ASE */
1802 7a387fff ths
           rn = "TCHalt";
1803 7a387fff ths
//         break;
1804 7a387fff ths
        case 5:
1805 7a387fff ths
//         gen_op_mfc0_tccontext(); /* MT ASE */
1806 7a387fff ths
           rn = "TCContext";
1807 7a387fff ths
//         break;
1808 7a387fff ths
        case 6:
1809 7a387fff ths
//         gen_op_mfc0_tcschedule(); /* MT ASE */
1810 7a387fff ths
           rn = "TCSchedule";
1811 7a387fff ths
//         break;
1812 7a387fff ths
        case 7:
1813 7a387fff ths
//         gen_op_mfc0_tcschefback(); /* MT ASE */
1814 7a387fff ths
           rn = "TCScheFBack";
1815 7a387fff ths
//         break;
1816 7a387fff ths
        default:
1817 7a387fff ths
            goto die;
1818 7a387fff ths
        }
1819 873eb012 ths
        break;
1820 873eb012 ths
    case 3:
1821 7a387fff ths
        switch (sel) {
1822 7a387fff ths
        case 0:
1823 7a387fff ths
           gen_op_mfc0_entrylo1();
1824 7a387fff ths
           rn = "EntryLo1";
1825 7a387fff ths
           break;
1826 7a387fff ths
        default:
1827 7a387fff ths
            goto die;
1828 1579a72e ths
        }
1829 873eb012 ths
        break;
1830 873eb012 ths
    case 4:
1831 7a387fff ths
        switch (sel) {
1832 7a387fff ths
        case 0:
1833 7a387fff ths
           gen_op_mfc0_context();
1834 7a387fff ths
           rn = "Context";
1835 7a387fff ths
           break;
1836 7a387fff ths
        case 1:
1837 7a387fff ths
//         gen_op_mfc0_contextconfig(); /* SmartMIPS ASE */
1838 7a387fff ths
           rn = "ContextConfig";
1839 7a387fff ths
//         break;
1840 7a387fff ths
        default:
1841 7a387fff ths
            goto die;
1842 1579a72e ths
        }
1843 873eb012 ths
        break;
1844 873eb012 ths
    case 5:
1845 7a387fff ths
        switch (sel) {
1846 7a387fff ths
        case 0:
1847 7a387fff ths
           gen_op_mfc0_pagemask();
1848 7a387fff ths
           rn = "PageMask";
1849 7a387fff ths
           break;
1850 7a387fff ths
        case 1:
1851 7a387fff ths
           gen_op_mfc0_pagegrain();
1852 7a387fff ths
           rn = "PageGrain";
1853 7a387fff ths
           break;
1854 7a387fff ths
        default:
1855 7a387fff ths
            goto die;
1856 1579a72e ths
        }
1857 873eb012 ths
        break;
1858 873eb012 ths
    case 6:
1859 7a387fff ths
        switch (sel) {
1860 7a387fff ths
        case 0:
1861 7a387fff ths
           gen_op_mfc0_wired();
1862 7a387fff ths
           rn = "Wired";
1863 7a387fff ths
           break;
1864 7a387fff ths
        case 1:
1865 7a387fff ths
//         gen_op_mfc0_srsconf0(); /* shadow registers */
1866 7a387fff ths
           rn = "SRSConf0";
1867 7a387fff ths
//         break;
1868 7a387fff ths
        case 2:
1869 7a387fff ths
//         gen_op_mfc0_srsconf1(); /* shadow registers */
1870 7a387fff ths
           rn = "SRSConf1";
1871 7a387fff ths
//         break;
1872 7a387fff ths
        case 3:
1873 7a387fff ths
//         gen_op_mfc0_srsconf2(); /* shadow registers */
1874 7a387fff ths
           rn = "SRSConf2";
1875 7a387fff ths
//         break;
1876 7a387fff ths
        case 4:
1877 7a387fff ths
//         gen_op_mfc0_srsconf3(); /* shadow registers */
1878 7a387fff ths
           rn = "SRSConf3";
1879 7a387fff ths
//         break;
1880 7a387fff ths
        case 5:
1881 7a387fff ths
//         gen_op_mfc0_srsconf4(); /* shadow registers */
1882 7a387fff ths
           rn = "SRSConf4";
1883 7a387fff ths
//         break;
1884 7a387fff ths
        default:
1885 7a387fff ths
            goto die;
1886 1579a72e ths
        }
1887 873eb012 ths
        break;
1888 8c0fdd85 ths
    case 7:
1889 7a387fff ths
        switch (sel) {
1890 7a387fff ths
        case 0:
1891 7a387fff ths
           gen_op_mfc0_hwrena();
1892 7a387fff ths
           rn = "HWREna";
1893 7a387fff ths
           break;
1894 7a387fff ths
        default:
1895 7a387fff ths
            goto die;
1896 1579a72e ths
        }
1897 8c0fdd85 ths
        break;
1898 873eb012 ths
    case 8:
1899 7a387fff ths
        switch (sel) {
1900 7a387fff ths
        case 0:
1901 7a387fff ths
           gen_op_mfc0_badvaddr();
1902 7a387fff ths
           rn = "BadVaddr";
1903 7a387fff ths
           break;
1904 7a387fff ths
        default:
1905 7a387fff ths
            goto die;
1906 7a387fff ths
       }
1907 873eb012 ths
        break;
1908 873eb012 ths
    case 9:
1909 7a387fff ths
        switch (sel) {
1910 7a387fff ths
        case 0:
1911 7a387fff ths
           gen_op_mfc0_count();
1912 7a387fff ths
           rn = "Count";
1913 7a387fff ths
           break;
1914 7a387fff ths
       /* 6,7 are implementation dependent */
1915 7a387fff ths
        default:
1916 7a387fff ths
            goto die;
1917 7a387fff ths
       }
1918 873eb012 ths
        break;
1919 873eb012 ths
    case 10:
1920 7a387fff ths
        switch (sel) {
1921 7a387fff ths
        case 0:
1922 7a387fff ths
           gen_op_mfc0_entryhi();
1923 7a387fff ths
           rn = "EntryHi";
1924 7a387fff ths
           break;
1925 7a387fff ths
        default:
1926 7a387fff ths
            goto die;
1927 1579a72e ths
        }
1928 873eb012 ths
        break;
1929 873eb012 ths
    case 11:
1930 7a387fff ths
        switch (sel) {
1931 7a387fff ths
        case 0:
1932 7a387fff ths
           gen_op_mfc0_compare();
1933 7a387fff ths
           rn = "Compare";
1934 7a387fff ths
           break;
1935 7a387fff ths
       /* 6,7 are implementation dependent */
1936 7a387fff ths
        default:
1937 7a387fff ths
            goto die;
1938 7a387fff ths
       }
1939 873eb012 ths
        break;
1940 873eb012 ths
    case 12:
1941 7a387fff ths
        switch (sel) {
1942 7a387fff ths
        case 0:
1943 7a387fff ths
           gen_op_mfc0_status();
1944 7a387fff ths
           rn = "Status";
1945 7a387fff ths
           break;
1946 7a387fff ths
        case 1:
1947 7a387fff ths
           gen_op_mfc0_intctl();
1948 7a387fff ths
           rn = "IntCtl";
1949 7a387fff ths
           break;
1950 7a387fff ths
        case 2:
1951 7a387fff ths
           gen_op_mfc0_srsctl();
1952 7a387fff ths
           rn = "SRSCtl";
1953 7a387fff ths
           break;
1954 7a387fff ths
        case 3:
1955 7a387fff ths
//         gen_op_mfc0_srsmap(); /* shadow registers */
1956 7a387fff ths
           rn = "SRSMap";
1957 7a387fff ths
//         break;
1958 7a387fff ths
        default:
1959 7a387fff ths
            goto die;
1960 7a387fff ths
       }
1961 873eb012 ths
        break;
1962 873eb012 ths
    case 13:
1963 7a387fff ths
        switch (sel) {
1964 7a387fff ths
        case 0:
1965 7a387fff ths
           gen_op_mfc0_cause();
1966 7a387fff ths
           rn = "Cause";
1967 7a387fff ths
           break;
1968 7a387fff ths
        default:
1969 7a387fff ths
            goto die;
1970 7a387fff ths
       }
1971 873eb012 ths
        break;
1972 873eb012 ths
    case 14:
1973 7a387fff ths
        switch (sel) {
1974 7a387fff ths
        case 0:
1975 7a387fff ths
           gen_op_mfc0_epc();
1976 7a387fff ths
           rn = "EPC";
1977 7a387fff ths
           break;
1978 7a387fff ths
        default:
1979 7a387fff ths
            goto die;
1980 1579a72e ths
        }
1981 873eb012 ths
        break;
1982 873eb012 ths
    case 15:
1983 7a387fff ths
        switch (sel) {
1984 7a387fff ths
        case 0:
1985 7a387fff ths
           gen_op_mfc0_prid();
1986 7a387fff ths
           rn = "PRid";
1987 7a387fff ths
           break;
1988 7a387fff ths
        case 1:
1989 7a387fff ths
           gen_op_mfc0_ebase();
1990 7a387fff ths
           rn = "EBase";
1991 7a387fff ths
           break;
1992 7a387fff ths
        default:
1993 7a387fff ths
            goto die;
1994 7a387fff ths
       }
1995 873eb012 ths
        break;
1996 873eb012 ths
    case 16:
1997 873eb012 ths
        switch (sel) {
1998 873eb012 ths
        case 0:
1999 e397ee33 ths
            gen_op_mfc0_config0();
2000 873eb012 ths
            rn = "Config";
2001 873eb012 ths
            break;
2002 873eb012 ths
        case 1:
2003 e397ee33 ths
            gen_op_mfc0_config1();
2004 873eb012 ths
            rn = "Config1";
2005 873eb012 ths
            break;
2006 7a387fff ths
        case 2:
2007 e397ee33 ths
            gen_op_mfc0_config2();
2008 7a387fff ths
            rn = "Config2";
2009 7a387fff ths
            break;
2010 7a387fff ths
        case 3:
2011 e397ee33 ths
            gen_op_mfc0_config3();
2012 7a387fff ths
            rn = "Config3";
2013 7a387fff ths
            break;
2014 e397ee33 ths
        /* 4,5 are reserved */
2015 e397ee33 ths
        /* 6,7 are implementation dependent */
2016 e397ee33 ths
        case 6:
2017 e397ee33 ths
            gen_op_mfc0_config6();
2018 e397ee33 ths
            rn = "Config6";
2019 e397ee33 ths
            break;
2020 e397ee33 ths
        case 7:
2021 e397ee33 ths
            gen_op_mfc0_config7();
2022 e397ee33 ths
            rn = "Config7";
2023 e397ee33 ths
            break;
2024 873eb012 ths
        default:
2025 873eb012 ths
            goto die;
2026 873eb012 ths
        }
2027 873eb012 ths
        break;
2028 873eb012 ths
    case 17:
2029 7a387fff ths
        switch (sel) {
2030 7a387fff ths
        case 0:
2031 7a387fff ths
           gen_op_mfc0_lladdr();
2032 7a387fff ths
           rn = "LLAddr";
2033 7a387fff ths
           break;
2034 7a387fff ths
        default:
2035 7a387fff ths
            goto die;
2036 7a387fff ths
        }
2037 873eb012 ths
        break;
2038 873eb012 ths
    case 18:
2039 7a387fff ths
        switch (sel) {
2040 7a387fff ths
        case 0:
2041 7a387fff ths
           gen_op_mfc0_watchlo0();
2042 7a387fff ths
           rn = "WatchLo";
2043 7a387fff ths
           break;
2044 7a387fff ths
        case 1:
2045 7a387fff ths
//         gen_op_mfc0_watchlo1();
2046 7a387fff ths
           rn = "WatchLo1";
2047 7a387fff ths
//         break;
2048 7a387fff ths
        case 2:
2049 7a387fff ths
//         gen_op_mfc0_watchlo2();
2050 7a387fff ths
           rn = "WatchLo2";
2051 7a387fff ths
//         break;
2052 7a387fff ths
        case 3:
2053 7a387fff ths
//         gen_op_mfc0_watchlo3();
2054 7a387fff ths
           rn = "WatchLo3";
2055 7a387fff ths
//         break;
2056 7a387fff ths
        case 4:
2057 7a387fff ths
//         gen_op_mfc0_watchlo4();
2058 7a387fff ths
           rn = "WatchLo4";
2059 7a387fff ths
//         break;
2060 7a387fff ths
        case 5:
2061 7a387fff ths
//         gen_op_mfc0_watchlo5();
2062 7a387fff ths
           rn = "WatchLo5";
2063 7a387fff ths
//         break;
2064 7a387fff ths
        case 6:
2065 7a387fff ths
//         gen_op_mfc0_watchlo6();
2066 7a387fff ths
           rn = "WatchLo6";
2067 7a387fff ths
//         break;
2068 7a387fff ths
        case 7:
2069 7a387fff ths
//         gen_op_mfc0_watchlo7();
2070 7a387fff ths
           rn = "WatchLo7";
2071 7a387fff ths
//         break;
2072 7a387fff ths
        default:
2073 7a387fff ths
            goto die;
2074 7a387fff ths
        }
2075 873eb012 ths
        break;
2076 873eb012 ths
    case 19:
2077 7a387fff ths
        switch (sel) {
2078 7a387fff ths
        case 0:
2079 7a387fff ths
           gen_op_mfc0_watchhi0();
2080 7a387fff ths
           rn = "WatchHi";
2081 7a387fff ths
           break;
2082 7a387fff ths
        case 1:
2083 7a387fff ths
//         gen_op_mfc0_watchhi1();
2084 7a387fff ths
           rn = "WatchHi1";
2085 7a387fff ths
//         break;
2086 7a387fff ths
        case 2:
2087 7a387fff ths
//         gen_op_mfc0_watchhi2();
2088 7a387fff ths
           rn = "WatchHi2";
2089 7a387fff ths
//         break;
2090 7a387fff ths
        case 3:
2091 7a387fff ths
//         gen_op_mfc0_watchhi3();
2092 7a387fff ths
           rn = "WatchHi3";
2093 7a387fff ths
//         break;
2094 7a387fff ths
        case 4:
2095 7a387fff ths
//         gen_op_mfc0_watchhi4();
2096 7a387fff ths
           rn = "WatchHi4";
2097 7a387fff ths
//         break;
2098 7a387fff ths
        case 5:
2099 7a387fff ths
//         gen_op_mfc0_watchhi5();
2100 7a387fff ths
           rn = "WatchHi5";
2101 7a387fff ths
//         break;
2102 7a387fff ths
        case 6:
2103 7a387fff ths
//         gen_op_mfc0_watchhi6();
2104 7a387fff ths
           rn = "WatchHi6";
2105 7a387fff ths
//         break;
2106 7a387fff ths
        case 7:
2107 7a387fff ths
//         gen_op_mfc0_watchhi7();
2108 7a387fff ths
           rn = "WatchHi7";
2109 7a387fff ths
//         break;
2110 7a387fff ths
        default:
2111 7a387fff ths
            goto die;
2112 7a387fff ths
        }
2113 873eb012 ths
        break;
2114 8c0fdd85 ths
    case 20:
2115 7a387fff ths
        switch (sel) {
2116 7a387fff ths
        case 0:
2117 7a387fff ths
           /* 64 bit MMU only */
2118 7a387fff ths
           gen_op_mfc0_xcontext();
2119 7a387fff ths
           rn = "XContext";
2120 7a387fff ths
           break;
2121 7a387fff ths
        default:
2122 7a387fff ths
            goto die;
2123 7a387fff ths
        }
2124 8c0fdd85 ths
        break;
2125 8c0fdd85 ths
    case 21:
2126 7a387fff ths
       /* Officially reserved, but sel 0 is used for R1x000 framemask */
2127 7a387fff ths
        switch (sel) {
2128 7a387fff ths
        case 0:
2129 7a387fff ths
           gen_op_mfc0_framemask();
2130 7a387fff ths
           rn = "Framemask";
2131 7a387fff ths
           break;
2132 7a387fff ths
        default:
2133 7a387fff ths
            goto die;
2134 7a387fff ths
        }
2135 8c0fdd85 ths
        break;
2136 8c0fdd85 ths
    case 22:
2137 7a387fff ths
       /* ignored */
2138 7a387fff ths
       rn = "'Diagnostic"; /* implementation dependent */
2139 7a387fff ths
       break;
2140 873eb012 ths
    case 23:
2141 7a387fff ths
        switch (sel) {
2142 7a387fff ths
        case 0:
2143 7a387fff ths
           gen_op_mfc0_debug(); /* EJTAG support */
2144 7a387fff ths
           rn = "Debug";
2145 7a387fff ths
           break;
2146 7a387fff ths
        case 1:
2147 7a387fff ths
//         gen_op_mfc0_tracecontrol(); /* PDtrace support */
2148 7a387fff ths
           rn = "TraceControl";
2149 7a387fff ths
//         break;
2150 7a387fff ths
        case 2:
2151 7a387fff ths
//         gen_op_mfc0_tracecontrol2(); /* PDtrace support */
2152 7a387fff ths
           rn = "TraceControl2";
2153 7a387fff ths
//         break;
2154 7a387fff ths
        case 3:
2155 7a387fff ths
//         gen_op_mfc0_usertracedata(); /* PDtrace support */
2156 7a387fff ths
           rn = "UserTraceData";
2157 7a387fff ths
//         break;
2158 7a387fff ths
        case 4:
2159 7a387fff ths
//         gen_op_mfc0_debug(); /* PDtrace support */
2160 7a387fff ths
           rn = "TraceBPC";
2161 7a387fff ths
//         break;
2162 7a387fff ths
        default:
2163 7a387fff ths
            goto die;
2164 7a387fff ths
        }
2165 873eb012 ths
        break;
2166 873eb012 ths
    case 24:
2167 7a387fff ths
        switch (sel) {
2168 7a387fff ths
        case 0:
2169 7a387fff ths
           gen_op_mfc0_depc(); /* EJTAG support */
2170 7a387fff ths
           rn = "DEPC";
2171 7a387fff ths
           break;
2172 7a387fff ths
        default:
2173 7a387fff ths
            goto die;
2174 7a387fff ths
        }
2175 873eb012 ths
        break;
2176 8c0fdd85 ths
    case 25:
2177 7a387fff ths
        switch (sel) {
2178 7a387fff ths
        case 0:
2179 7a387fff ths
           gen_op_mfc0_performance0();
2180 7a387fff ths
           rn = "Performance0";
2181 7a387fff ths
            break;
2182 7a387fff ths
        case 1:
2183 7a387fff ths
//         gen_op_mfc0_performance1();
2184 7a387fff ths
           rn = "Performance1";
2185 7a387fff ths
//         break;
2186 7a387fff ths
        case 2:
2187 7a387fff ths
//         gen_op_mfc0_performance2();
2188 7a387fff ths
           rn = "Performance2";
2189 7a387fff ths
//         break;
2190 7a387fff ths
        case 3:
2191 7a387fff ths
//         gen_op_mfc0_performance3();
2192 7a387fff ths
           rn = "Performance3";
2193 7a387fff ths
//         break;
2194 7a387fff ths
        case 4:
2195 7a387fff ths
//         gen_op_mfc0_performance4();
2196 7a387fff ths
           rn = "Performance4";
2197 7a387fff ths
//         break;
2198 7a387fff ths
        case 5:
2199 7a387fff ths
//         gen_op_mfc0_performance5();
2200 7a387fff ths
           rn = "Performance5";
2201 7a387fff ths
//         break;
2202 7a387fff ths
        case 6:
2203 7a387fff ths
//         gen_op_mfc0_performance6();
2204 7a387fff ths
           rn = "Performance6";
2205 7a387fff ths
//         break;
2206 7a387fff ths
        case 7:
2207 7a387fff ths
//         gen_op_mfc0_performance7();
2208 7a387fff ths
           rn = "Performance7";
2209 7a387fff ths
//         break;
2210 7a387fff ths
        default:
2211 7a387fff ths
            goto die;
2212 7a387fff ths
        }
2213 8c0fdd85 ths
        break;
2214 8c0fdd85 ths
    case 26:
2215 7a387fff ths
       rn = "ECC";
2216 7a387fff ths
       break;
2217 8c0fdd85 ths
    case 27:
2218 7a387fff ths
        switch (sel) {
2219 7a387fff ths
        /* ignored */
2220 7a387fff ths
        case 0 ... 3:
2221 7a387fff ths
           rn = "CacheErr";
2222 7a387fff ths
           break;
2223 7a387fff ths
        default:
2224 7a387fff ths
            goto die;
2225 7a387fff ths
        }
2226 8c0fdd85 ths
        break;
2227 873eb012 ths
    case 28:
2228 873eb012 ths
        switch (sel) {
2229 873eb012 ths
        case 0:
2230 7a387fff ths
        case 2:
2231 7a387fff ths
        case 4:
2232 7a387fff ths
        case 6:
2233 873eb012 ths
            gen_op_mfc0_taglo();
2234 873eb012 ths
            rn = "TagLo";
2235 873eb012 ths
            break;
2236 873eb012 ths
        case 1:
2237 7a387fff ths
        case 3:
2238 7a387fff ths
        case 5:
2239 7a387fff ths
        case 7:
2240 873eb012 ths
            gen_op_mfc0_datalo();
2241 873eb012 ths
            rn = "DataLo";
2242 873eb012 ths
            break;
2243 873eb012 ths
        default:
2244 873eb012 ths
            goto die;
2245 873eb012 ths
        }
2246 873eb012 ths
        break;
2247 8c0fdd85 ths
    case 29:
2248 7a387fff ths
        switch (sel) {
2249 7a387fff ths
        case 0:
2250 7a387fff ths
        case 2:
2251 7a387fff ths
        case 4:
2252 7a387fff ths
        case 6:
2253 7a387fff ths
            gen_op_mfc0_taghi();
2254 7a387fff ths
            rn = "TagHi";
2255 7a387fff ths
            break;
2256 7a387fff ths
        case 1:
2257 7a387fff ths
        case 3:
2258 7a387fff ths
        case 5:
2259 7a387fff ths
        case 7:
2260 7a387fff ths
            gen_op_mfc0_datahi();
2261 7a387fff ths
            rn = "DataHi";
2262 7a387fff ths
            break;
2263 7a387fff ths
        default:
2264 7a387fff ths
            goto die;
2265 7a387fff ths
        }
2266 8c0fdd85 ths
        break;
2267 873eb012 ths
    case 30:
2268 7a387fff ths
        switch (sel) {
2269 7a387fff ths
        case 0:
2270 7a387fff ths
           gen_op_mfc0_errorepc();
2271 7a387fff ths
           rn = "ErrorEPC";
2272 7a387fff ths
           break;
2273 7a387fff ths
        default:
2274 7a387fff ths
            goto die;
2275 7a387fff ths
        }
2276 873eb012 ths
        break;
2277 873eb012 ths
    case 31:
2278 7a387fff ths
        switch (sel) {
2279 7a387fff ths
        case 0:
2280 7a387fff ths
           gen_op_mfc0_desave(); /* EJTAG support */
2281 7a387fff ths
           rn = "DESAVE";
2282 7a387fff ths
           break;
2283 7a387fff ths
        default:
2284 7a387fff ths
            goto die;
2285 7a387fff ths
        }
2286 873eb012 ths
        break;
2287 873eb012 ths
    default:
2288 873eb012 ths
       goto die;
2289 873eb012 ths
    }
2290 873eb012 ths
#if defined MIPS_DEBUG_DISAS
2291 873eb012 ths
    if (loglevel & CPU_LOG_TB_IN_ASM) {
2292 7a387fff ths
        fprintf(logfile, "mfc0 %s (reg %d sel %d)\n",
2293 7a387fff ths
                rn, reg, sel);
2294 873eb012 ths
    }
2295 873eb012 ths
#endif
2296 873eb012 ths
    return;
2297 873eb012 ths
2298 873eb012 ths
die:
2299 873eb012 ths
#if defined MIPS_DEBUG_DISAS
2300 873eb012 ths
    if (loglevel & CPU_LOG_TB_IN_ASM) {
2301 7a387fff ths
        fprintf(logfile, "mfc0 %s (reg %d sel %d)\n",
2302 7a387fff ths
                rn, reg, sel);
2303 873eb012 ths
    }
2304 873eb012 ths
#endif
2305 873eb012 ths
    generate_exception(ctx, EXCP_RI);
2306 873eb012 ths
}
2307 873eb012 ths
2308 8c0fdd85 ths
static void gen_mtc0 (DisasContext *ctx, int reg, int sel)
2309 8c0fdd85 ths
{
2310 7a387fff ths
    const char *rn = "invalid";
2311 7a387fff ths
2312 8c0fdd85 ths
    switch (reg) {
2313 8c0fdd85 ths
    case 0:
2314 7a387fff ths
        switch (sel) {
2315 7a387fff ths
        case 0:
2316 7a387fff ths
           gen_op_mtc0_index();
2317 7a387fff ths
            rn = "Index";
2318 7a387fff ths
            break;
2319 7a387fff ths
        case 1:
2320 7a387fff ths
//         gen_op_mtc0_mvpcontrol(); /* MT ASE */
2321 7a387fff ths
            rn = "MVPControl";
2322 7a387fff ths
//         break;
2323 7a387fff ths
        case 2:
2324 7a387fff ths
//         gen_op_mtc0_mvpconf0(); /* MT ASE */
2325 7a387fff ths
            rn = "MVPConf0";
2326 7a387fff ths
//         break;
2327 7a387fff ths
        case 3:
2328 7a387fff ths
//         gen_op_mtc0_mvpconf1(); /* MT ASE */
2329 7a387fff ths
            rn = "MVPConf1";
2330 7a387fff ths
//         break;
2331 7a387fff ths
        default:
2332 7a387fff ths
            goto die;
2333 7a387fff ths
        }
2334 8c0fdd85 ths
        break;
2335 8c0fdd85 ths
    case 1:
2336 7a387fff ths
        switch (sel) {
2337 7a387fff ths
        case 0:
2338 7a387fff ths
           /* ignored */
2339 7a387fff ths
            rn = "Random";
2340 7a387fff ths
           break;
2341 7a387fff ths
        case 1:
2342 7a387fff ths
//         gen_op_mtc0_vpecontrol(); /* MT ASE */
2343 7a387fff ths
            rn = "VPEControl";
2344 7a387fff ths
//         break;
2345 7a387fff ths
        case 2:
2346 7a387fff ths
//         gen_op_mtc0_vpeconf0(); /* MT ASE */
2347 7a387fff ths
            rn = "VPEConf0";
2348 7a387fff ths
//         break;
2349 7a387fff ths
        case 3:
2350 7a387fff ths
//         gen_op_mtc0_vpeconf1(); /* MT ASE */
2351 7a387fff ths
            rn = "VPEConf1";
2352 7a387fff ths
//         break;
2353 7a387fff ths
        case 4:
2354 7a387fff ths
//         gen_op_mtc0_YQMask(); /* MT ASE */
2355 7a387fff ths
            rn = "YQMask";
2356 7a387fff ths
//         break;
2357 7a387fff ths
        case 5:
2358 7a387fff ths
//         gen_op_mtc0_vpeschedule(); /* MT ASE */
2359 7a387fff ths
            rn = "VPESchedule";
2360 7a387fff ths
//         break;
2361 7a387fff ths
        case 6:
2362 7a387fff ths
//         gen_op_mtc0_vpeschefback(); /* MT ASE */
2363 7a387fff ths
            rn = "VPEScheFBack";
2364 7a387fff ths
//         break;
2365 7a387fff ths
        case 7:
2366 7a387fff ths
//         gen_op_mtc0_vpeopt(); /* MT ASE */
2367 7a387fff ths
            rn = "VPEOpt";
2368 7a387fff ths
//         break;
2369 7a387fff ths
        default:
2370 7a387fff ths
            goto die;
2371 7a387fff ths
        }
2372 8c0fdd85 ths
        break;
2373 8c0fdd85 ths
    case 2:
2374 7a387fff ths
        switch (sel) {
2375 7a387fff ths
        case 0:
2376 7a387fff ths
           gen_op_mtc0_entrylo0();
2377 7a387fff ths
           rn = "EntryLo0";
2378 7a387fff ths
           break;
2379 7a387fff ths
        case 1:
2380 7a387fff ths
//         gen_op_mtc0_tcstatus(); /* MT ASE */
2381 7a387fff ths
           rn = "TCStatus";
2382 7a387fff ths
//         break;
2383 7a387fff ths
        case 2:
2384 7a387fff ths
//         gen_op_mtc0_tcbind(); /* MT ASE */
2385 7a387fff ths
           rn = "TCBind";
2386 7a387fff ths
//         break;
2387 7a387fff ths
        case 3:
2388 7a387fff ths
//         gen_op_mtc0_tcrestart(); /* MT ASE */
2389 7a387fff ths
           rn = "TCRestart";
2390 7a387fff ths
//         break;
2391 7a387fff ths
        case 4:
2392 7a387fff ths
//         gen_op_mtc0_tchalt(); /* MT ASE */
2393 7a387fff ths
           rn = "TCHalt";
2394 7a387fff ths
//         break;
2395 7a387fff ths
        case 5:
2396 7a387fff ths
//         gen_op_mtc0_tccontext(); /* MT ASE */
2397 7a387fff ths
           rn = "TCContext";
2398 7a387fff ths
//         break;
2399 7a387fff ths
        case 6:
2400 7a387fff ths
//         gen_op_mtc0_tcschedule(); /* MT ASE */
2401 7a387fff ths
           rn = "TCSchedule";
2402 7a387fff ths
//         break;
2403 7a387fff ths
        case 7:
2404 7a387fff ths
//         gen_op_mtc0_tcschefback(); /* MT ASE */
2405 7a387fff ths
           rn = "TCScheFBack";
2406 7a387fff ths
//         break;
2407 7a387fff ths
        default:
2408 7a387fff ths
            goto die;
2409 7a387fff ths
        }
2410 8c0fdd85 ths
        break;
2411 8c0fdd85 ths
    case 3:
2412 7a387fff ths
        switch (sel) {
2413 7a387fff ths
        case 0:
2414 7a387fff ths
           gen_op_mtc0_entrylo1();
2415 7a387fff ths
           rn = "EntryLo1";
2416 7a387fff ths
           break;
2417 7a387fff ths
        default:
2418 7a387fff ths
            goto die;
2419 876d4b07 ths
        }
2420 8c0fdd85 ths
        break;
2421 8c0fdd85 ths
    case 4:
2422 7a387fff ths
        switch (sel) {
2423 7a387fff ths
        case 0:
2424 7a387fff ths
           gen_op_mtc0_context();
2425 7a387fff ths
           rn = "Context";
2426 7a387fff ths
           break;
2427 7a387fff ths
        case 1:
2428 7a387fff ths
//         gen_op_mtc0_contextconfig(); /* SmartMIPS ASE */
2429 7a387fff ths
           rn = "ContextConfig";
2430 7a387fff ths
//         break;
2431 7a387fff ths
        default:
2432 7a387fff ths
            goto die;
2433 876d4b07 ths
        }
2434 8c0fdd85 ths
        break;
2435 8c0fdd85 ths
    case 5:
2436 7a387fff ths
        switch (sel) {
2437 7a387fff ths
        case 0:
2438 7a387fff ths
           gen_op_mtc0_pagemask();
2439 7a387fff ths
           rn = "PageMask";
2440 7a387fff ths
           break;
2441 7a387fff ths
        case 1:
2442 7a387fff ths
           gen_op_mtc0_pagegrain();
2443 7a387fff ths
           rn = "PageGrain";
2444 7a387fff ths
           break;
2445 7a387fff ths
        default:
2446 7a387fff ths
            goto die;
2447 876d4b07 ths
        }
2448 8c0fdd85 ths
        break;
2449 8c0fdd85 ths
    case 6:
2450 7a387fff ths
        switch (sel) {
2451 7a387fff ths
        case 0:
2452 7a387fff ths
           gen_op_mtc0_wired();
2453 7a387fff ths
           rn = "Wired";
2454 7a387fff ths
           break;
2455 7a387fff ths
        case 1:
2456 7a387fff ths
//         gen_op_mtc0_srsconf0(); /* shadow registers */
2457 7a387fff ths
           rn = "SRSConf0";
2458 7a387fff ths
//         break;
2459 7a387fff ths
        case 2:
2460 7a387fff ths
//         gen_op_mtc0_srsconf1(); /* shadow registers */
2461 7a387fff ths
           rn = "SRSConf1";
2462 7a387fff ths
//         break;
2463 7a387fff ths
        case 3:
2464 7a387fff ths
//         gen_op_mtc0_srsconf2(); /* shadow registers */
2465 7a387fff ths
           rn = "SRSConf2";
2466 7a387fff ths
//         break;
2467 7a387fff ths
        case 4:
2468 7a387fff ths
//         gen_op_mtc0_srsconf3(); /* shadow registers */
2469 7a387fff ths
           rn = "SRSConf3";
2470 7a387fff ths
//         break;
2471 7a387fff ths
        case 5:
2472 7a387fff ths
//         gen_op_mtc0_srsconf4(); /* shadow registers */
2473 7a387fff ths
           rn = "SRSConf4";
2474 7a387fff ths
//         break;
2475 7a387fff ths
        default:
2476 7a387fff ths
            goto die;
2477 876d4b07 ths
        }
2478 8c0fdd85 ths
        break;
2479 8c0fdd85 ths
    case 7:
2480 7a387fff ths
        switch (sel) {
2481 7a387fff ths
        case 0:
2482 7a387fff ths
           gen_op_mtc0_hwrena();
2483 7a387fff ths
           rn = "HWREna";
2484 7a387fff ths
           break;
2485 7a387fff ths
        default:
2486 7a387fff ths
            goto die;
2487 876d4b07 ths
        }
2488 8c0fdd85 ths
        break;
2489 8c0fdd85 ths
    case 8:
2490 7a387fff ths
        /* ignored */
2491 8c0fdd85 ths
        rn = "BadVaddr";
2492 8c0fdd85 ths
        break;
2493 8c0fdd85 ths
    case 9:
2494 7a387fff ths
        switch (sel) {
2495 7a387fff ths
        case 0:
2496 7a387fff ths
           gen_op_mtc0_count();
2497 7a387fff ths
           rn = "Count";
2498 7a387fff ths
           break;
2499 876d4b07 ths
        /* 6,7 are implementation dependent */
2500 7a387fff ths
        default:
2501 7a387fff ths
            goto die;
2502 876d4b07 ths
        }
2503 876d4b07 ths
        /* Stop translation as we may have switched the execution mode */
2504 876d4b07 ths
        ctx->bstate = BS_STOP;
2505 8c0fdd85 ths
        break;
2506 8c0fdd85 ths
    case 10:
2507 7a387fff ths
        switch (sel) {
2508 7a387fff ths
        case 0:
2509 7a387fff ths
           gen_op_mtc0_entryhi();
2510 7a387fff ths
           rn = "EntryHi";
2511 7a387fff ths
           break;
2512 7a387fff ths
        default:
2513 7a387fff ths
            goto die;
2514 876d4b07 ths
        }
2515 8c0fdd85 ths
        break;
2516 8c0fdd85 ths
    case 11:
2517 7a387fff ths
        switch (sel) {
2518 7a387fff ths
        case 0:
2519 7a387fff ths
           gen_op_mtc0_compare();
2520 7a387fff ths
           rn = "Compare";
2521 7a387fff ths
           break;
2522 7a387fff ths
       /* 6,7 are implementation dependent */
2523 7a387fff ths
        default:
2524 7a387fff ths
            goto die;
2525 876d4b07 ths
        }
2526 876d4b07 ths
        /* Stop translation as we may have switched the execution mode */
2527 876d4b07 ths
        ctx->bstate = BS_STOP;
2528 8c0fdd85 ths
        break;
2529 8c0fdd85 ths
    case 12:
2530 7a387fff ths
        switch (sel) {
2531 7a387fff ths
        case 0:
2532 7a387fff ths
           gen_op_mtc0_status();
2533 7a387fff ths
           rn = "Status";
2534 7a387fff ths
           break;
2535 7a387fff ths
        case 1:
2536 7a387fff ths
           gen_op_mtc0_intctl();
2537 7a387fff ths
           rn = "IntCtl";
2538 7a387fff ths
           break;
2539 7a387fff ths
        case 2:
2540 7a387fff ths
           gen_op_mtc0_srsctl();
2541 7a387fff ths
           rn = "SRSCtl";
2542 7a387fff ths
           break;
2543 7a387fff ths
        case 3:
2544 7a387fff ths
//         gen_op_mtc0_srsmap(); /* shadow registers */
2545 7a387fff ths
           rn = "SRSMap";
2546 7a387fff ths
//         break;
2547 7a387fff ths
        default:
2548 7a387fff ths
            goto die;
2549 876d4b07 ths
        }
2550 876d4b07 ths
        /* Stop translation as we may have switched the execution mode */
2551 876d4b07 ths
        ctx->bstate = BS_STOP;
2552 8c0fdd85 ths
        break;
2553 8c0fdd85 ths
    case 13:
2554 7a387fff ths
        switch (sel) {
2555 7a387fff ths
        case 0:
2556 7a387fff ths
           gen_op_mtc0_cause();
2557 7a387fff ths
           rn = "Cause";
2558 7a387fff ths
           break;
2559 7a387fff ths
        default:
2560 7a387fff ths
            goto die;
2561 876d4b07 ths
        }
2562 876d4b07 ths
        /* Stop translation as we may have switched the execution mode */
2563 876d4b07 ths
        ctx->bstate = BS_STOP;
2564 8c0fdd85 ths
        break;
2565 8c0fdd85 ths
    case 14:
2566 7a387fff ths
        switch (sel) {
2567 7a387fff ths
        case 0:
2568 7a387fff ths
           gen_op_mtc0_epc();
2569 7a387fff ths
           rn = "EPC";
2570 7a387fff ths
           break;
2571 7a387fff ths
        default:
2572 7a387fff ths
            goto die;
2573 876d4b07 ths
        }
2574 8c0fdd85 ths
        break;
2575 8c0fdd85 ths
    case 15:
2576 7a387fff ths
        switch (sel) {
2577 7a387fff ths
        case 0:
2578 7a387fff ths
           /* ignored */
2579 7a387fff ths
           rn = "PRid";
2580 7a387fff ths
           break;
2581 7a387fff ths
        case 1:
2582 7a387fff ths
           gen_op_mtc0_ebase();
2583 7a387fff ths
           rn = "EBase";
2584 7a387fff ths
           break;
2585 7a387fff ths
        default:
2586 7a387fff ths
            goto die;
2587 1579a72e ths
        }
2588 8c0fdd85 ths
        break;
2589 8c0fdd85 ths
    case 16:
2590 8c0fdd85 ths
        switch (sel) {
2591 8c0fdd85 ths
        case 0:
2592 e397ee33 ths
            gen_op_mtc0_config0();
2593 7a387fff ths
            rn = "Config";
2594 7a387fff ths
            break;
2595 7a387fff ths
        case 1:
2596 e397ee33 ths
            /* ignored, read only */
2597 7a387fff ths
            rn = "Config1";
2598 7a387fff ths
            break;
2599 7a387fff ths
        case 2:
2600 e397ee33 ths
            gen_op_mtc0_config2();
2601 7a387fff ths
            rn = "Config2";
2602 8c0fdd85 ths
            break;
2603 7a387fff ths
        case 3:
2604 e397ee33 ths
            /* ignored, read only */
2605 7a387fff ths
            rn = "Config3";
2606 7a387fff ths
            break;
2607 e397ee33 ths
        /* 4,5 are reserved */
2608 e397ee33 ths
        /* 6,7 are implementation dependent */
2609 e397ee33 ths
        case 6:
2610 e397ee33 ths
            /* ignored */
2611 e397ee33 ths
            rn = "Config6";
2612 e397ee33 ths
            break;
2613 e397ee33 ths
        case 7:
2614 e397ee33 ths
            /* ignored */
2615 e397ee33 ths
            rn = "Config7";
2616 e397ee33 ths
            break;
2617 8c0fdd85 ths
        default:
2618 8c0fdd85 ths
            rn = "Invalid config selector";
2619 8c0fdd85 ths
            goto die;
2620 8c0fdd85 ths
        }
2621 e397ee33 ths
        /* Stop translation as we may have switched the execution mode */
2622 e397ee33 ths
        ctx->bstate = BS_STOP;
2623 8c0fdd85 ths
        break;
2624 8c0fdd85 ths
    case 17:
2625 7a387fff ths
        switch (sel) {
2626 7a387fff ths
        case 0:
2627 7a387fff ths
           /* ignored */
2628 7a387fff ths
           rn = "LLAddr";
2629 7a387fff ths
           break;
2630 7a387fff ths
        default:
2631 7a387fff ths
            goto die;
2632 7a387fff ths
        }
2633 8c0fdd85 ths
        break;
2634 8c0fdd85 ths
    case 18:
2635 7a387fff ths
        switch (sel) {
2636 7a387fff ths
        case 0:
2637 7a387fff ths
           gen_op_mtc0_watchlo0();
2638 7a387fff ths
           rn = "WatchLo";
2639 7a387fff ths
           break;
2640 7a387fff ths
        case 1:
2641 7a387fff ths
//         gen_op_mtc0_watchlo1();
2642 7a387fff ths
           rn = "WatchLo1";
2643 7a387fff ths
//         break;
2644 7a387fff ths
        case 2:
2645 7a387fff ths
//         gen_op_mtc0_watchlo2();
2646 7a387fff ths
           rn = "WatchLo2";
2647 7a387fff ths
//         break;
2648 7a387fff ths
        case 3:
2649 7a387fff ths
//         gen_op_mtc0_watchlo3();
2650 7a387fff ths
           rn = "WatchLo3";
2651 7a387fff ths
//         break;
2652 7a387fff ths
        case 4:
2653 7a387fff ths
//         gen_op_mtc0_watchlo4();
2654 7a387fff ths
           rn = "WatchLo4";
2655 7a387fff ths
//         break;
2656 7a387fff ths
        case 5:
2657 7a387fff ths
//         gen_op_mtc0_watchlo5();
2658 7a387fff ths
           rn = "WatchLo5";
2659 7a387fff ths
//         break;
2660 7a387fff ths
        case 6:
2661 7a387fff ths
//         gen_op_mtc0_watchlo6();
2662 7a387fff ths
           rn = "WatchLo6";
2663 7a387fff ths
//         break;
2664 7a387fff ths
        case 7:
2665 7a387fff ths
//         gen_op_mtc0_watchlo7();
2666 7a387fff ths
           rn = "WatchLo7";
2667 7a387fff ths
//         break;
2668 7a387fff ths
        default:
2669 7a387fff ths
            goto die;
2670 7a387fff ths
        }
2671 8c0fdd85 ths
        break;
2672 8c0fdd85 ths
    case 19:
2673 7a387fff ths
        switch (sel) {
2674 7a387fff ths
        case 0:
2675 7a387fff ths
           gen_op_mtc0_watchhi0();
2676 7a387fff ths
           rn = "WatchHi";
2677 7a387fff ths
           break;
2678 7a387fff ths
        case 1:
2679 7a387fff ths
//         gen_op_mtc0_watchhi1();
2680 7a387fff ths
           rn = "WatchHi1";
2681 7a387fff ths
//         break;
2682 7a387fff ths
        case 2:
2683 7a387fff ths
//         gen_op_mtc0_watchhi2();
2684 7a387fff ths
           rn = "WatchHi2";
2685 7a387fff ths
//         break;
2686 7a387fff ths
        case 3:
2687 7a387fff ths
//         gen_op_mtc0_watchhi3();
2688 7a387fff ths
           rn = "WatchHi3";
2689 7a387fff ths
//         break;
2690 7a387fff ths
        case 4:
2691 7a387fff ths
//         gen_op_mtc0_watchhi4();
2692 7a387fff ths
           rn = "WatchHi4";
2693 7a387fff ths
//         break;
2694 7a387fff ths
        case 5:
2695 7a387fff ths
//         gen_op_mtc0_watchhi5();
2696 7a387fff ths
           rn = "WatchHi5";
2697 7a387fff ths
//         break;
2698 7a387fff ths
        case 6:
2699 7a387fff ths
//         gen_op_mtc0_watchhi6();
2700 7a387fff ths
           rn = "WatchHi6";
2701 7a387fff ths
//         break;
2702 7a387fff ths
        case 7:
2703 7a387fff ths
//         gen_op_mtc0_watchhi7();
2704 7a387fff ths
           rn = "WatchHi7";
2705 7a387fff ths
//         break;
2706 7a387fff ths
        default:
2707 7a387fff ths
            goto die;
2708 7a387fff ths
        }
2709 8c0fdd85 ths
        break;
2710 8c0fdd85 ths
    case 20:
2711 7a387fff ths
        switch (sel) {
2712 7a387fff ths
        case 0:
2713 7a387fff ths
           /* 64 bit MMU only */
2714 7a387fff ths
           gen_op_mtc0_xcontext();
2715 7a387fff ths
           rn = "XContext";
2716 7a387fff ths
           break;
2717 7a387fff ths
        default:
2718 7a387fff ths
            goto die;
2719 7a387fff ths
        }
2720 8c0fdd85 ths
        break;
2721 8c0fdd85 ths
    case 21:
2722 7a387fff ths
       /* Officially reserved, but sel 0 is used for R1x000 framemask */
2723 7a387fff ths
        switch (sel) {
2724 7a387fff ths
        case 0:
2725 7a387fff ths
           gen_op_mtc0_framemask();
2726 7a387fff ths
           rn = "Framemask";
2727 7a387fff ths
           break;
2728 7a387fff ths
        default:
2729 7a387fff ths
            goto die;
2730 7a387fff ths
        }
2731 7a387fff ths
        break;
2732 8c0fdd85 ths
    case 22:
2733 7a387fff ths
        /* ignored */
2734 7a387fff ths
        rn = "Diagnostic"; /* implementation dependent */
2735 8c0fdd85 ths
       break;
2736 8c0fdd85 ths
    case 23:
2737 7a387fff ths
        switch (sel) {
2738 7a387fff ths
        case 0:
2739 7a387fff ths
           gen_op_mtc0_debug(); /* EJTAG support */
2740 7a387fff ths
           rn = "Debug";
2741 7a387fff ths
           break;
2742 7a387fff ths
        case 1:
2743 7a387fff ths
//         gen_op_mtc0_tracecontrol(); /* PDtrace support */
2744 7a387fff ths
           rn = "TraceControl";
2745 7a387fff ths
//         break;
2746 7a387fff ths
        case 2:
2747 7a387fff ths
//         gen_op_mtc0_tracecontrol2(); /* PDtrace support */
2748 7a387fff ths
           rn = "TraceControl2";
2749 7a387fff ths
//         break;
2750 7a387fff ths
        case 3:
2751 7a387fff ths
//         gen_op_mtc0_usertracedata(); /* PDtrace support */
2752 7a387fff ths
           rn = "UserTraceData";
2753 7a387fff ths
//         break;
2754 7a387fff ths
        case 4:
2755 7a387fff ths
//         gen_op_mtc0_debug(); /* PDtrace support */
2756 7a387fff ths
           rn = "TraceBPC";
2757 7a387fff ths
//         break;
2758 7a387fff ths
        default:
2759 7a387fff ths
            goto die;
2760 7a387fff ths
        }
2761 7a387fff ths
       /* Stop translation as we may have switched the execution mode */
2762 7a387fff ths
       ctx->bstate = BS_STOP;
2763 8c0fdd85 ths
        break;
2764 8c0fdd85 ths
    case 24:
2765 7a387fff ths
        switch (sel) {
2766 7a387fff ths
        case 0:
2767 7a387fff ths
           gen_op_mtc0_depc(); /* EJTAG support */
2768 7a387fff ths
           rn = "DEPC";
2769 7a387fff ths
           break;
2770 7a387fff ths
        default:
2771 7a387fff ths
            goto die;
2772 7a387fff ths
        }
2773 8c0fdd85 ths
        break;
2774 8c0fdd85 ths
    case 25:
2775 7a387fff ths
        switch (sel) {
2776 7a387fff ths
        case 0:
2777 7a387fff ths
           gen_op_mtc0_performance0();
2778 7a387fff ths
           rn = "Performance0";
2779 7a387fff ths
           break;
2780 7a387fff ths
        case 1:
2781 7a387fff ths
//         gen_op_mtc0_performance1();
2782 7a387fff ths
           rn = "Performance1";
2783 7a387fff ths
//         break;
2784 7a387fff ths
        case 2:
2785 7a387fff ths
//         gen_op_mtc0_performance2();
2786 7a387fff ths
           rn = "Performance2";
2787 7a387fff ths
//         break;
2788 7a387fff ths
        case 3:
2789 7a387fff ths
//         gen_op_mtc0_performance3();
2790 7a387fff ths
           rn = "Performance3";
2791 7a387fff ths
//         break;
2792 7a387fff ths
        case 4:
2793 7a387fff ths
//         gen_op_mtc0_performance4();
2794 7a387fff ths
           rn = "Performance4";
2795 7a387fff ths
//         break;
2796 7a387fff ths
        case 5:
2797 7a387fff ths
//         gen_op_mtc0_performance5();
2798 7a387fff ths
           rn = "Performance5";
2799 7a387fff ths
//         break;
2800 7a387fff ths
        case 6:
2801 7a387fff ths
//         gen_op_mtc0_performance6();
2802 7a387fff ths
           rn = "Performance6";
2803 7a387fff ths
//         break;
2804 7a387fff ths
        case 7:
2805 7a387fff ths
//         gen_op_mtc0_performance7();
2806 7a387fff ths
           rn = "Performance7";
2807 7a387fff ths
//         break;
2808 7a387fff ths
        default:
2809 7a387fff ths
            goto die;
2810 7a387fff ths
        }
2811 8c0fdd85 ths
       break;
2812 8c0fdd85 ths
    case 26:
2813 7a387fff ths
       /* ignored */
2814 8c0fdd85 ths
        rn = "ECC";
2815 8c0fdd85 ths
       break;
2816 8c0fdd85 ths
    case 27:
2817 7a387fff ths
        switch (sel) {
2818 7a387fff ths
        case 0 ... 3:
2819 7a387fff ths
           /* ignored */
2820 7a387fff ths
           rn = "CacheErr";
2821 7a387fff ths
           break;
2822 7a387fff ths
        default:
2823 7a387fff ths
            goto die;
2824 7a387fff ths
        }
2825 8c0fdd85 ths
       break;
2826 8c0fdd85 ths
    case 28:
2827 8c0fdd85 ths
        switch (sel) {
2828 8c0fdd85 ths
        case 0:
2829 7a387fff ths
        case 2:
2830 7a387fff ths
        case 4:
2831 7a387fff ths
        case 6:
2832 8c0fdd85 ths
            gen_op_mtc0_taglo();
2833 8c0fdd85 ths
            rn = "TagLo";
2834 8c0fdd85 ths
            break;
2835 7a387fff ths
        case 1:
2836 7a387fff ths
        case 3:
2837 7a387fff ths
        case 5:
2838 7a387fff ths
        case 7:
2839 7a387fff ths
           gen_op_mtc0_datalo();
2840 7a387fff ths
            rn = "DataLo";
2841 7a387fff ths
            break;
2842 8c0fdd85 ths
        default:
2843 8c0fdd85 ths
            goto die;
2844 8c0fdd85 ths
        }
2845 8c0fdd85 ths
        break;
2846 8c0fdd85 ths
    case 29:
2847 7a387fff ths
        switch (sel) {
2848 7a387fff ths
        case 0:
2849 7a387fff ths
        case 2:
2850 7a387fff ths
        case 4:
2851 7a387fff ths
        case 6:
2852 7a387fff ths
            gen_op_mtc0_taghi();
2853 7a387fff ths
            rn = "TagHi";
2854 7a387fff ths
            break;
2855 7a387fff ths
        case 1:
2856 7a387fff ths
        case 3:
2857 7a387fff ths
        case 5:
2858 7a387fff ths
        case 7:
2859 7a387fff ths
           gen_op_mtc0_datahi();
2860 7a387fff ths
            rn = "DataHi";
2861 7a387fff ths
            break;
2862 7a387fff ths
        default:
2863 7a387fff ths
            rn = "invalid sel";
2864 7a387fff ths
            goto die;
2865 7a387fff ths
        }
2866 8c0fdd85 ths
       break;
2867 8c0fdd85 ths
    case 30:
2868 7a387fff ths
        switch (sel) {
2869 7a387fff ths
        case 0:
2870 7a387fff ths
           gen_op_mtc0_errorepc();
2871 7a387fff ths
           rn = "ErrorEPC";
2872 7a387fff ths
           break;
2873 7a387fff ths
        default:
2874 7a387fff ths
            goto die;
2875 7a387fff ths
        }
2876 8c0fdd85 ths
        break;
2877 8c0fdd85 ths
    case 31:
2878 7a387fff ths
        switch (sel) {
2879 7a387fff ths
        case 0:
2880 7a387fff ths
           gen_op_mtc0_desave(); /* EJTAG support */
2881 7a387fff ths
           rn = "DESAVE";
2882 7a387fff ths
           break;
2883 7a387fff ths
        default:
2884 7a387fff ths
            goto die;
2885 7a387fff ths
        }
2886 7a387fff ths
       /* Stop translation as we may have switched the execution mode */
2887 7a387fff ths
       ctx->bstate = BS_STOP;
2888 8c0fdd85 ths
        break;
2889 8c0fdd85 ths
    default:
2890 8c0fdd85 ths
       goto die;
2891 8c0fdd85 ths
    }
2892 8c0fdd85 ths
#if defined MIPS_DEBUG_DISAS
2893 8c0fdd85 ths
    if (loglevel & CPU_LOG_TB_IN_ASM) {
2894 7a387fff ths
        fprintf(logfile, "mtc0 %s (reg %d sel %d)\n",
2895 7a387fff ths
                rn, reg, sel);
2896 8c0fdd85 ths
    }
2897 8c0fdd85 ths
#endif
2898 8c0fdd85 ths
    return;
2899 8c0fdd85 ths
2900 8c0fdd85 ths
die:
2901 8c0fdd85 ths
#if defined MIPS_DEBUG_DISAS
2902 8c0fdd85 ths
    if (loglevel & CPU_LOG_TB_IN_ASM) {
2903 7a387fff ths
        fprintf(logfile, "mtc0 %s (reg %d sel %d)\n",
2904 7a387fff ths
                rn, reg, sel);
2905 8c0fdd85 ths
    }
2906 8c0fdd85 ths
#endif
2907 8c0fdd85 ths
    generate_exception(ctx, EXCP_RI);
2908 8c0fdd85 ths
}
2909 8c0fdd85 ths
2910 9c2149c8 ths
static void gen_dmfc0 (DisasContext *ctx, int reg, int sel)
2911 9c2149c8 ths
{
2912 9c2149c8 ths
    const char *rn = "invalid";
2913 9c2149c8 ths
2914 9c2149c8 ths
    switch (reg) {
2915 9c2149c8 ths
    case 0:
2916 9c2149c8 ths
        switch (sel) {
2917 9c2149c8 ths
        case 0:
2918 9c2149c8 ths
           gen_op_mfc0_index();
2919 9c2149c8 ths
            rn = "Index";
2920 9c2149c8 ths
            break;
2921 9c2149c8 ths
        case 1:
2922 9c2149c8 ths
//         gen_op_dmfc0_mvpcontrol(); /* MT ASE */
2923 9c2149c8 ths
            rn = "MVPControl";
2924 9c2149c8 ths
//         break;
2925 9c2149c8 ths
        case 2:
2926 9c2149c8 ths
//         gen_op_dmfc0_mvpconf0(); /* MT ASE */
2927 9c2149c8 ths
            rn = "MVPConf0";
2928 9c2149c8 ths
//         break;
2929 9c2149c8 ths
        case 3:
2930 9c2149c8 ths
//         gen_op_dmfc0_mvpconf1(); /* MT ASE */
2931 9c2149c8 ths
            rn = "MVPConf1";
2932 9c2149c8 ths
//         break;
2933 9c2149c8 ths
        default:
2934 9c2149c8 ths
            goto die;
2935 9c2149c8 ths
        }
2936 9c2149c8 ths
        break;
2937 9c2149c8 ths
    case 1:
2938 9c2149c8 ths
        switch (sel) {
2939 9c2149c8 ths
        case 0:
2940 9c2149c8 ths
            gen_op_mfc0_random();
2941 9c2149c8 ths
            rn = "Random";
2942 9c2149c8 ths
           break;
2943 9c2149c8 ths
        case 1:
2944 9c2149c8 ths
//         gen_op_dmfc0_vpecontrol(); /* MT ASE */
2945 9c2149c8 ths
            rn = "VPEControl";
2946 9c2149c8 ths
//         break;
2947 9c2149c8 ths
        case 2:
2948 9c2149c8 ths
//         gen_op_dmfc0_vpeconf0(); /* MT ASE */
2949 9c2149c8 ths
            rn = "VPEConf0";
2950 9c2149c8 ths
//         break;
2951 9c2149c8 ths
        case 3:
2952 9c2149c8 ths
//         gen_op_dmfc0_vpeconf1(); /* MT ASE */
2953 9c2149c8 ths
            rn = "VPEConf1";
2954 9c2149c8 ths
//         break;
2955 9c2149c8 ths
        case 4:
2956 9c2149c8 ths
//         gen_op_dmfc0_YQMask(); /* MT ASE */
2957 9c2149c8 ths
            rn = "YQMask";
2958 9c2149c8 ths
//         break;
2959 9c2149c8 ths
        case 5:
2960 9c2149c8 ths
//         gen_op_dmfc0_vpeschedule(); /* MT ASE */
2961 9c2149c8 ths
            rn = "VPESchedule";
2962 9c2149c8 ths
//         break;
2963 9c2149c8 ths
        case 6:
2964 9c2149c8 ths
//         gen_op_dmfc0_vpeschefback(); /* MT ASE */
2965 9c2149c8 ths
            rn = "VPEScheFBack";
2966 9c2149c8 ths
//         break;
2967 9c2149c8 ths
        case 7:
2968 9c2149c8 ths
//         gen_op_dmfc0_vpeopt(); /* MT ASE */
2969 9c2149c8 ths
            rn = "VPEOpt";
2970 9c2149c8 ths
//         break;
2971 9c2149c8 ths
        default:
2972 9c2149c8 ths
            goto die;
2973 9c2149c8 ths
        }
2974 9c2149c8 ths
        break;
2975 9c2149c8 ths
    case 2:
2976 9c2149c8 ths
        switch (sel) {
2977 9c2149c8 ths
        case 0:
2978 9c2149c8 ths
           gen_op_dmfc0_entrylo0();
2979 9c2149c8 ths
           rn = "EntryLo0";
2980 9c2149c8 ths
           break;
2981 9c2149c8 ths
        case 1:
2982 9c2149c8 ths
//         gen_op_dmfc0_tcstatus(); /* MT ASE */
2983 9c2149c8 ths
           rn = "TCStatus";
2984 9c2149c8 ths
//         break;
2985 9c2149c8 ths
        case 2:
2986 9c2149c8 ths
//         gen_op_dmfc0_tcbind(); /* MT ASE */
2987 9c2149c8 ths
           rn = "TCBind";
2988 9c2149c8 ths
//         break;
2989 9c2149c8 ths
        case 3:
2990 9c2149c8 ths
//         gen_op_dmfc0_tcrestart(); /* MT ASE */
2991 9c2149c8 ths
           rn = "TCRestart";
2992 9c2149c8 ths
//         break;
2993 9c2149c8 ths
        case 4:
2994 9c2149c8 ths
//         gen_op_dmfc0_tchalt(); /* MT ASE */
2995 9c2149c8 ths
           rn = "TCHalt";
2996 9c2149c8 ths
//         break;
2997 9c2149c8 ths
        case 5:
2998 9c2149c8 ths
//         gen_op_dmfc0_tccontext(); /* MT ASE */
2999 9c2149c8 ths
           rn = "TCContext";
3000 9c2149c8 ths
//         break;
3001 9c2149c8 ths
        case 6:
3002 9c2149c8 ths
//         gen_op_dmfc0_tcschedule(); /* MT ASE */
3003 9c2149c8 ths
           rn = "TCSchedule";
3004 9c2149c8 ths
//         break;
3005 9c2149c8 ths
        case 7:
3006 9c2149c8 ths
//         gen_op_dmfc0_tcschefback(); /* MT ASE */
3007 9c2149c8 ths
           rn = "TCScheFBack";
3008 9c2149c8 ths
//         break;
3009 9c2149c8 ths
        default:
3010 9c2149c8 ths
            goto die;
3011 9c2149c8 ths
        }
3012 9c2149c8 ths
        break;
3013 9c2149c8 ths
    case 3:
3014 9c2149c8 ths
        switch (sel) {
3015 9c2149c8 ths
        case 0:
3016 9c2149c8 ths
           gen_op_dmfc0_entrylo1();
3017 9c2149c8 ths
           rn = "EntryLo1";
3018 9c2149c8 ths
           break;
3019 9c2149c8 ths
        default:
3020 9c2149c8 ths
            goto die;
3021 1579a72e ths
        }
3022 9c2149c8 ths
        break;
3023 9c2149c8 ths
    case 4:
3024 9c2149c8 ths
        switch (sel) {
3025 9c2149c8 ths
        case 0:
3026 9c2149c8 ths
           gen_op_dmfc0_context();
3027 9c2149c8 ths
           rn = "Context";
3028 9c2149c8 ths
           break;
3029 9c2149c8 ths
        case 1:
3030 9c2149c8 ths
//         gen_op_dmfc0_contextconfig(); /* SmartMIPS ASE */
3031 9c2149c8 ths
           rn = "ContextConfig";
3032 9c2149c8 ths
//         break;
3033 9c2149c8 ths
        default:
3034 9c2149c8 ths
            goto die;
3035 876d4b07 ths
        }
3036 9c2149c8 ths
        break;
3037 9c2149c8 ths
    case 5:
3038 9c2149c8 ths
        switch (sel) {
3039 9c2149c8 ths
        case 0:
3040 9c2149c8 ths
           gen_op_mfc0_pagemask();
3041 9c2149c8 ths
           rn = "PageMask";
3042 9c2149c8 ths
           break;
3043 9c2149c8 ths
        case 1:
3044 9c2149c8 ths
           gen_op_mfc0_pagegrain();
3045 9c2149c8 ths
           rn = "PageGrain";
3046 9c2149c8 ths
           break;
3047 9c2149c8 ths
        default:
3048 9c2149c8 ths
            goto die;
3049 876d4b07 ths
        }
3050 9c2149c8 ths
        break;
3051 9c2149c8 ths
    case 6:
3052 9c2149c8 ths
        switch (sel) {
3053 9c2149c8 ths
        case 0:
3054 9c2149c8 ths
           gen_op_mfc0_wired();
3055 9c2149c8 ths
           rn = "Wired";
3056 9c2149c8 ths
           break;
3057 9c2149c8 ths
        case 1:
3058 9c2149c8 ths
//         gen_op_dmfc0_srsconf0(); /* shadow registers */
3059 9c2149c8 ths
           rn = "SRSConf0";
3060 9c2149c8 ths
//         break;
3061 9c2149c8 ths
        case 2:
3062 9c2149c8 ths
//         gen_op_dmfc0_srsconf1(); /* shadow registers */
3063 9c2149c8 ths
           rn = "SRSConf1";
3064 9c2149c8 ths
//         break;
3065 9c2149c8 ths
        case 3:
3066 9c2149c8 ths
//         gen_op_dmfc0_srsconf2(); /* shadow registers */
3067 9c2149c8 ths
           rn = "SRSConf2";
3068 9c2149c8 ths
//         break;
3069 9c2149c8 ths
        case 4:
3070 9c2149c8 ths
//         gen_op_dmfc0_srsconf3(); /* shadow registers */
3071 9c2149c8 ths
           rn = "SRSConf3";
3072 9c2149c8 ths
//         break;
3073 9c2149c8 ths
        case 5:
3074 9c2149c8 ths
//         gen_op_dmfc0_srsconf4(); /* shadow registers */
3075 9c2149c8 ths
           rn = "SRSConf4";
3076 9c2149c8 ths
//         break;
3077 9c2149c8 ths
        default:
3078 9c2149c8 ths
            goto die;
3079 876d4b07 ths
        }
3080 9c2149c8 ths
        break;
3081 9c2149c8 ths
    case 7:
3082 9c2149c8 ths
        switch (sel) {
3083 9c2149c8 ths
        case 0:
3084 9c2149c8 ths
           gen_op_mfc0_hwrena();
3085 9c2149c8 ths
           rn = "HWREna";
3086 9c2149c8 ths
           break;
3087 9c2149c8 ths
        default:
3088 9c2149c8 ths
            goto die;
3089 876d4b07 ths
        }
3090 9c2149c8 ths
        break;
3091 9c2149c8 ths
    case 8:
3092 9c2149c8 ths
        switch (sel) {
3093 9c2149c8 ths
        case 0:
3094 9c2149c8 ths
           gen_op_dmfc0_badvaddr();
3095 9c2149c8 ths
           rn = "BadVaddr";
3096 9c2149c8 ths
           break;
3097 9c2149c8 ths
        default:
3098 9c2149c8 ths
            goto die;
3099 876d4b07 ths
        }
3100 9c2149c8 ths
        break;
3101 9c2149c8 ths
    case 9:
3102 9c2149c8 ths
        switch (sel) {
3103 9c2149c8 ths
        case 0:
3104 9c2149c8 ths
           gen_op_mfc0_count();
3105 9c2149c8 ths
           rn = "Count";
3106 9c2149c8 ths
           break;
3107 9c2149c8 ths
       /* 6,7 are implementation dependent */
3108 9c2149c8 ths
        default:
3109 9c2149c8 ths
            goto die;
3110 876d4b07 ths
        }
3111 9c2149c8 ths
        break;
3112 9c2149c8 ths
    case 10:
3113 9c2149c8 ths
        switch (sel) {
3114 9c2149c8 ths
        case 0:
3115 9c2149c8 ths
           gen_op_dmfc0_entryhi();
3116 9c2149c8 ths
           rn = "EntryHi";
3117 9c2149c8 ths
           break;
3118 9c2149c8 ths
        default:
3119 9c2149c8 ths
            goto die;
3120 876d4b07 ths
        }
3121 9c2149c8 ths
        break;
3122 9c2149c8 ths
    case 11:
3123 9c2149c8 ths
        switch (sel) {
3124 9c2149c8 ths
        case 0:
3125 9c2149c8 ths
           gen_op_mfc0_compare();
3126 9c2149c8 ths
           rn = "Compare";
3127 9c2149c8 ths
           break;
3128 876d4b07 ths
        /* 6,7 are implementation dependent */
3129 9c2149c8 ths
        default:
3130 9c2149c8 ths
            goto die;
3131 876d4b07 ths
        }
3132 9c2149c8 ths
        break;
3133 9c2149c8 ths
    case 12:
3134 9c2149c8 ths
        switch (sel) {
3135 9c2149c8 ths
        case 0:
3136 9c2149c8 ths
           gen_op_mfc0_status();
3137 9c2149c8 ths
           rn = "Status";
3138 9c2149c8 ths
           break;
3139 9c2149c8 ths
        case 1:
3140 9c2149c8 ths
           gen_op_mfc0_intctl();
3141 9c2149c8 ths
           rn = "IntCtl";
3142 9c2149c8 ths
           break;
3143 9c2149c8 ths
        case 2:
3144 9c2149c8 ths
           gen_op_mfc0_srsctl();
3145 9c2149c8 ths
           rn = "SRSCtl";
3146 9c2149c8 ths
           break;
3147 9c2149c8 ths
        case 3:
3148 9c2149c8 ths
           gen_op_mfc0_srsmap(); /* shadow registers */
3149 9c2149c8 ths
           rn = "SRSMap";
3150 9c2149c8 ths
           break;
3151 9c2149c8 ths
        default:
3152 9c2149c8 ths
            goto die;
3153 876d4b07 ths
        }
3154 9c2149c8 ths
        break;
3155 9c2149c8 ths
    case 13:
3156 9c2149c8 ths
        switch (sel) {
3157 9c2149c8 ths
        case 0:
3158 9c2149c8 ths
           gen_op_mfc0_cause();
3159 9c2149c8 ths
           rn = "Cause";
3160 9c2149c8 ths
           break;
3161 9c2149c8 ths
        default:
3162 9c2149c8 ths
            goto die;
3163 876d4b07 ths
        }
3164 9c2149c8 ths
        break;
3165 9c2149c8 ths
    case 14:
3166 9c2149c8 ths
        switch (sel) {
3167 9c2149c8 ths
        case 0:
3168 9c2149c8 ths
           gen_op_dmfc0_epc();
3169 9c2149c8 ths
           rn = "EPC";
3170 9c2149c8 ths
           break;
3171 9c2149c8 ths
        default:
3172 9c2149c8 ths
            goto die;
3173 876d4b07 ths
        }
3174 9c2149c8 ths
        break;
3175 9c2149c8 ths
    case 15:
3176 9c2149c8 ths
        switch (sel) {
3177 9c2149c8 ths
        case 0:
3178 9c2149c8 ths
           gen_op_mfc0_prid();
3179 9c2149c8 ths
           rn = "PRid";
3180 9c2149c8 ths
           break;
3181 9c2149c8 ths
        case 1:
3182 b29a0341 ths
           gen_op_mfc0_ebase();
3183 9c2149c8 ths
           rn = "EBase";
3184 9c2149c8 ths
           break;
3185 9c2149c8 ths
        default:
3186 9c2149c8 ths
            goto die;
3187 876d4b07 ths
        }
3188 9c2149c8 ths
        break;
3189 9c2149c8 ths
    case 16:
3190 9c2149c8 ths
        switch (sel) {
3191 9c2149c8 ths
        case 0:
3192 9c2149c8 ths
           gen_op_mfc0_config0();
3193 9c2149c8 ths
            rn = "Config";
3194 9c2149c8 ths
            break;
3195 9c2149c8 ths
        case 1:
3196 9c2149c8 ths
           gen_op_mfc0_config1();
3197 9c2149c8 ths
            rn = "Config1";
3198 9c2149c8 ths
            break;
3199 9c2149c8 ths
        case 2:
3200 9c2149c8 ths
           gen_op_mfc0_config2();
3201 9c2149c8 ths
            rn = "Config2";
3202 9c2149c8 ths
            break;
3203 9c2149c8 ths
        case 3:
3204 9c2149c8 ths
           gen_op_mfc0_config3();
3205 9c2149c8 ths
            rn = "Config3";
3206 9c2149c8 ths
            break;
3207 9c2149c8 ths
       /* 6,7 are implementation dependent */
3208 9c2149c8 ths
        default:
3209 9c2149c8 ths
            goto die;
3210 9c2149c8 ths
        }
3211 9c2149c8 ths
        break;
3212 9c2149c8 ths
    case 17:
3213 9c2149c8 ths
        switch (sel) {
3214 9c2149c8 ths
        case 0:
3215 9c2149c8 ths
           gen_op_dmfc0_lladdr();
3216 9c2149c8 ths
           rn = "LLAddr";
3217 9c2149c8 ths
           break;
3218 9c2149c8 ths
        default:
3219 9c2149c8 ths
            goto die;
3220 9c2149c8 ths
        }
3221 9c2149c8 ths
        break;
3222 9c2149c8 ths
    case 18:
3223 9c2149c8 ths
        switch (sel) {
3224 9c2149c8 ths
        case 0:
3225 9c2149c8 ths
           gen_op_dmfc0_watchlo0();
3226 9c2149c8 ths
           rn = "WatchLo";
3227 9c2149c8 ths
           break;
3228 9c2149c8 ths
        case 1:
3229 9c2149c8 ths
//         gen_op_dmfc0_watchlo1();
3230 9c2149c8 ths
           rn = "WatchLo1";
3231 9c2149c8 ths
//         break;
3232 9c2149c8 ths
        case 2:
3233 9c2149c8 ths
//         gen_op_dmfc0_watchlo2();
3234 9c2149c8 ths
           rn = "WatchLo2";
3235 9c2149c8 ths
//         break;
3236 9c2149c8 ths
        case 3:
3237 9c2149c8 ths
//         gen_op_dmfc0_watchlo3();
3238 9c2149c8 ths
           rn = "WatchLo3";
3239 9c2149c8 ths
//         break;
3240 9c2149c8 ths
        case 4:
3241 9c2149c8 ths
//         gen_op_dmfc0_watchlo4();
3242 9c2149c8 ths
           rn = "WatchLo4";
3243 9c2149c8 ths
//         break;
3244 9c2149c8 ths
        case 5:
3245 9c2149c8 ths
//         gen_op_dmfc0_watchlo5();
3246 9c2149c8 ths
           rn = "WatchLo5";
3247 9c2149c8 ths
//         break;
3248 9c2149c8 ths
        case 6:
3249 9c2149c8 ths
//         gen_op_dmfc0_watchlo6();
3250 9c2149c8 ths
           rn = "WatchLo6";
3251 9c2149c8 ths
//         break;
3252 9c2149c8 ths
        case 7:
3253 9c2149c8 ths
//         gen_op_dmfc0_watchlo7();
3254 9c2149c8 ths
           rn = "WatchLo7";
3255 9c2149c8 ths
//         break;
3256 9c2149c8 ths
        default:
3257 9c2149c8 ths
            goto die;
3258 9c2149c8 ths
        }
3259 9c2149c8 ths
        break;
3260 9c2149c8 ths
    case 19:
3261 9c2149c8 ths
        switch (sel) {
3262 9c2149c8 ths
        case 0:
3263 9c2149c8 ths
           gen_op_mfc0_watchhi0();
3264 9c2149c8 ths
           rn = "WatchHi";
3265 9c2149c8 ths
           break;
3266 9c2149c8 ths
        case 1:
3267 9c2149c8 ths
//         gen_op_mfc0_watchhi1();
3268 9c2149c8 ths
           rn = "WatchHi1";
3269 9c2149c8 ths
//         break;
3270 9c2149c8 ths
        case 2:
3271 9c2149c8 ths
//         gen_op_mfc0_watchhi2();
3272 9c2149c8 ths
           rn = "WatchHi2";
3273 9c2149c8 ths
//         break;
3274 9c2149c8 ths
        case 3:
3275 9c2149c8 ths
//         gen_op_mfc0_watchhi3();
3276 9c2149c8 ths
           rn = "WatchHi3";
3277 9c2149c8 ths
//         break;
3278 9c2149c8 ths
        case 4:
3279 9c2149c8 ths
//         gen_op_mfc0_watchhi4();
3280 9c2149c8 ths
           rn = "WatchHi4";
3281 9c2149c8 ths
//         break;
3282 9c2149c8 ths
        case 5:
3283 9c2149c8 ths
//         gen_op_mfc0_watchhi5();
3284 9c2149c8 ths
           rn = "WatchHi5";
3285 9c2149c8 ths
//         break;
3286 9c2149c8 ths
        case 6:
3287 9c2149c8 ths
//         gen_op_mfc0_watchhi6();
3288 9c2149c8 ths
           rn = "WatchHi6";
3289 9c2149c8 ths
//         break;
3290 9c2149c8 ths
        case 7:
3291 9c2149c8 ths
//         gen_op_mfc0_watchhi7();
3292 9c2149c8 ths
           rn = "WatchHi7";
3293 9c2149c8 ths
//         break;
3294 9c2149c8 ths
        default:
3295 9c2149c8 ths
            goto die;
3296 9c2149c8 ths
        }
3297 9c2149c8 ths
        break;
3298 9c2149c8 ths
    case 20:
3299 9c2149c8 ths
        switch (sel) {
3300 9c2149c8 ths
        case 0:
3301 9c2149c8 ths
           /* 64 bit MMU only */
3302 9c2149c8 ths
           gen_op_dmfc0_xcontext();
3303 9c2149c8 ths
           rn = "XContext";
3304 9c2149c8 ths
           break;
3305 9c2149c8 ths
        default:
3306 9c2149c8 ths
            goto die;
3307 9c2149c8 ths
        }
3308 9c2149c8 ths
        break;
3309 9c2149c8 ths
    case 21:
3310 9c2149c8 ths
       /* Officially reserved, but sel 0 is used for R1x000 framemask */
3311 9c2149c8 ths
        switch (sel) {
3312 9c2149c8 ths
        case 0:
3313 9c2149c8 ths
           gen_op_mfc0_framemask();
3314 9c2149c8 ths
           rn = "Framemask";
3315 9c2149c8 ths
           break;
3316 9c2149c8 ths
        default:
3317 9c2149c8 ths
            goto die;
3318 9c2149c8 ths
        }
3319 9c2149c8 ths
        break;
3320 9c2149c8 ths
    case 22:
3321 9c2149c8 ths
       /* ignored */
3322 9c2149c8 ths
       rn = "'Diagnostic"; /* implementation dependent */
3323 9c2149c8 ths
       break;
3324 9c2149c8 ths
    case 23:
3325 9c2149c8 ths
        switch (sel) {
3326 9c2149c8 ths
        case 0:
3327 9c2149c8 ths
           gen_op_mfc0_debug(); /* EJTAG support */
3328 9c2149c8 ths
           rn = "Debug";
3329 9c2149c8 ths
           break;
3330 9c2149c8 ths
        case 1:
3331 9c2149c8 ths
//         gen_op_dmfc0_tracecontrol(); /* PDtrace support */
3332 9c2149c8 ths
           rn = "TraceControl";
3333 9c2149c8 ths
//         break;
3334 9c2149c8 ths
        case 2:
3335 9c2149c8 ths
//         gen_op_dmfc0_tracecontrol2(); /* PDtrace support */
3336 9c2149c8 ths
           rn = "TraceControl2";
3337 9c2149c8 ths
//         break;
3338 9c2149c8 ths
        case 3:
3339 9c2149c8 ths
//         gen_op_dmfc0_usertracedata(); /* PDtrace support */
3340 9c2149c8 ths
           rn = "UserTraceData";
3341 9c2149c8 ths
//         break;
3342 9c2149c8 ths
        case 4:
3343 9c2149c8 ths
//         gen_op_dmfc0_debug(); /* PDtrace support */
3344 9c2149c8 ths
           rn = "TraceBPC";
3345 9c2149c8 ths
//         break;
3346 9c2149c8 ths
        default:
3347 9c2149c8 ths
            goto die;
3348 9c2149c8 ths
        }
3349 9c2149c8 ths
        break;
3350 9c2149c8 ths
    case 24:
3351 9c2149c8 ths
        switch (sel) {
3352 9c2149c8 ths
        case 0:
3353 9c2149c8 ths
           gen_op_dmfc0_depc(); /* EJTAG support */
3354 9c2149c8 ths
           rn = "DEPC";
3355 9c2149c8 ths
           break;
3356 9c2149c8 ths
        default:
3357 9c2149c8 ths
            goto die;
3358 9c2149c8 ths
        }
3359 9c2149c8 ths
        break;
3360 9c2149c8 ths
    case 25:
3361 9c2149c8 ths
        switch (sel) {
3362 9c2149c8 ths
        case 0:
3363 9c2149c8 ths
           gen_op_mfc0_performance0();
3364 9c2149c8 ths
           rn = "Performance0";
3365 9c2149c8 ths
            break;
3366 9c2149c8 ths
        case 1:
3367 9c2149c8 ths
//         gen_op_dmfc0_performance1();
3368 9c2149c8 ths
           rn = "Performance1";
3369 9c2149c8 ths
//         break;
3370 9c2149c8 ths
        case 2:
3371 9c2149c8 ths
//         gen_op_dmfc0_performance2();
3372 9c2149c8 ths
           rn = "Performance2";
3373 9c2149c8 ths
//         break;
3374 9c2149c8 ths
        case 3:
3375 9c2149c8 ths
//         gen_op_dmfc0_performance3();
3376 9c2149c8 ths
           rn = "Performance3";
3377 9c2149c8 ths
//         break;
3378 9c2149c8 ths
        case 4:
3379 9c2149c8 ths
//         gen_op_dmfc0_performance4();
3380 9c2149c8 ths
           rn = "Performance4";
3381 9c2149c8 ths
//         break;
3382 9c2149c8 ths
        case 5:
3383 9c2149c8 ths
//         gen_op_dmfc0_performance5();
3384 9c2149c8 ths
           rn = "Performance5";
3385 9c2149c8 ths
//         break;
3386 9c2149c8 ths
        case 6:
3387 9c2149c8 ths
//         gen_op_dmfc0_performance6();
3388 9c2149c8 ths
           rn = "Performance6";
3389 9c2149c8 ths
//         break;
3390 9c2149c8 ths
        case 7:
3391 9c2149c8 ths
//         gen_op_dmfc0_performance7();
3392 9c2149c8 ths
           rn = "Performance7";
3393 9c2149c8 ths
//         break;
3394 9c2149c8 ths
        default:
3395 9c2149c8 ths
            goto die;
3396 9c2149c8 ths
        }
3397 9c2149c8 ths
        break;
3398 9c2149c8 ths
    case 26:
3399 9c2149c8 ths
       rn = "ECC";
3400 9c2149c8 ths
       break;
3401 9c2149c8 ths
    case 27:
3402 9c2149c8 ths
        switch (sel) {
3403 9c2149c8 ths
        /* ignored */
3404 9c2149c8 ths
        case 0 ... 3:
3405 9c2149c8 ths
           rn = "CacheErr";
3406 9c2149c8 ths
           break;
3407 9c2149c8 ths
        default:
3408 9c2149c8 ths
            goto die;
3409 9c2149c8 ths
        }
3410 9c2149c8 ths
        break;
3411 9c2149c8 ths
    case 28:
3412 9c2149c8 ths
        switch (sel) {
3413 9c2149c8 ths
        case 0:
3414 9c2149c8 ths
        case 2:
3415 9c2149c8 ths
        case 4:
3416 9c2149c8 ths
        case 6:
3417 9c2149c8 ths
            gen_op_mfc0_taglo();
3418 9c2149c8 ths
            rn = "TagLo";
3419 9c2149c8 ths
            break;
3420 9c2149c8 ths
        case 1:
3421 9c2149c8 ths
        case 3:
3422 9c2149c8 ths
        case 5:
3423 9c2149c8 ths
        case 7:
3424 9c2149c8 ths
            gen_op_mfc0_datalo();
3425 9c2149c8 ths
            rn = "DataLo";
3426 9c2149c8 ths
            break;
3427 9c2149c8 ths
        default:
3428 9c2149c8 ths
            goto die;
3429 9c2149c8 ths
        }
3430 9c2149c8 ths
        break;
3431 9c2149c8 ths
    case 29:
3432 9c2149c8 ths
        switch (sel) {
3433 9c2149c8 ths
        case 0:
3434 9c2149c8 ths
        case 2:
3435 9c2149c8 ths
        case 4:
3436 9c2149c8 ths
        case 6:
3437 9c2149c8 ths
            gen_op_mfc0_taghi();
3438 9c2149c8 ths
            rn = "TagHi";
3439 9c2149c8 ths
            break;
3440 9c2149c8 ths
        case 1:
3441 9c2149c8 ths
        case 3:
3442 9c2149c8 ths
        case 5:
3443 9c2149c8 ths
        case 7:
3444 9c2149c8 ths
            gen_op_mfc0_datahi();
3445 9c2149c8 ths
            rn = "DataHi";
3446 9c2149c8 ths
            break;
3447 9c2149c8 ths
        default:
3448 9c2149c8 ths
            goto die;
3449 9c2149c8 ths
        }
3450 9c2149c8 ths
        break;
3451 9c2149c8 ths
    case 30:
3452 9c2149c8 ths
        switch (sel) {
3453 9c2149c8 ths
        case 0:
3454 9c2149c8 ths
           gen_op_dmfc0_errorepc();
3455 9c2149c8 ths
           rn = "ErrorEPC";
3456 9c2149c8 ths
           break;
3457 9c2149c8 ths
        default:
3458 9c2149c8 ths
            goto die;
3459 9c2149c8 ths
        }
3460 9c2149c8 ths
        break;
3461 9c2149c8 ths
    case 31:
3462 9c2149c8 ths
        switch (sel) {
3463 9c2149c8 ths
        case 0:
3464 9c2149c8 ths
           gen_op_mfc0_desave(); /* EJTAG support */
3465 9c2149c8 ths
           rn = "DESAVE";
3466 9c2149c8 ths
           break;
3467 9c2149c8 ths
        default:
3468 9c2149c8 ths
            goto die;
3469 9c2149c8 ths
        }
3470 9c2149c8 ths
        break;
3471 9c2149c8 ths
    default:
3472 876d4b07 ths
        goto die;
3473 9c2149c8 ths
    }
3474 9c2149c8 ths
#if defined MIPS_DEBUG_DISAS
3475 9c2149c8 ths
    if (loglevel & CPU_LOG_TB_IN_ASM) {
3476 9c2149c8 ths
        fprintf(logfile, "dmfc0 %s (reg %d sel %d)\n",
3477 9c2149c8 ths
                rn, reg, sel);
3478 9c2149c8 ths
    }
3479 9c2149c8 ths
#endif
3480 9c2149c8 ths
    return;
3481 9c2149c8 ths
3482 9c2149c8 ths
die:
3483 9c2149c8 ths
#if defined MIPS_DEBUG_DISAS
3484 9c2149c8 ths
    if (loglevel & CPU_LOG_TB_IN_ASM) {
3485 9c2149c8 ths
        fprintf(logfile, "dmfc0 %s (reg %d sel %d)\n",
3486 9c2149c8 ths
                rn, reg, sel);
3487 9c2149c8 ths
    }
3488 9c2149c8 ths
#endif
3489 9c2149c8 ths
    generate_exception(ctx, EXCP_RI);
3490 9c2149c8 ths
}
3491 9c2149c8 ths
3492 9c2149c8 ths
static void gen_dmtc0 (DisasContext *ctx, int reg, int sel)
3493 9c2149c8 ths
{
3494 9c2149c8 ths
    const char *rn = "invalid";
3495 9c2149c8 ths
3496 9c2149c8 ths
    switch (reg) {
3497 9c2149c8 ths
    case 0:
3498 9c2149c8 ths
        switch (sel) {
3499 9c2149c8 ths
        case 0:
3500 9c2149c8 ths
            gen_op_mtc0_index();
3501 9c2149c8 ths
            rn = "Index";
3502 9c2149c8 ths
            break;
3503 9c2149c8 ths
        case 1:
3504 9c2149c8 ths
//         gen_op_dmtc0_mvpcontrol(); /* MT ASE */
3505 9c2149c8 ths
            rn = "MVPControl";
3506 9c2149c8 ths
//         break;
3507 9c2149c8 ths
        case 2:
3508 9c2149c8 ths
//         gen_op_dmtc0_mvpconf0(); /* MT ASE */
3509 9c2149c8 ths
            rn = "MVPConf0";
3510 9c2149c8 ths
//         break;
3511 9c2149c8 ths
        case 3:
3512 9c2149c8 ths
//         gen_op_dmtc0_mvpconf1(); /* MT ASE */
3513 9c2149c8 ths
            rn = "MVPConf1";
3514 9c2149c8 ths
//         break;
3515 9c2149c8 ths
        default:
3516 9c2149c8 ths
            goto die;
3517 9c2149c8 ths
        }
3518 9c2149c8 ths
        break;
3519 9c2149c8 ths
    case 1:
3520 9c2149c8 ths
        switch (sel) {
3521 9c2149c8 ths
        case 0:
3522 9c2149c8 ths
           /* ignored */
3523 9c2149c8 ths
            rn = "Random";
3524 9c2149c8 ths
           break;
3525 9c2149c8 ths
        case 1:
3526 9c2149c8 ths
//         gen_op_dmtc0_vpecontrol(); /* MT ASE */
3527 9c2149c8 ths
            rn = "VPEControl";
3528 9c2149c8 ths
//         break;
3529 9c2149c8 ths
        case 2:
3530 9c2149c8 ths
//         gen_op_dmtc0_vpeconf0(); /* MT ASE */
3531 9c2149c8 ths
            rn = "VPEConf0";
3532 9c2149c8 ths
//         break;
3533 9c2149c8 ths
        case 3:
3534 9c2149c8 ths
//         gen_op_dmtc0_vpeconf1(); /* MT ASE */
3535 9c2149c8 ths
            rn = "VPEConf1";
3536 9c2149c8 ths
//         break;
3537 9c2149c8 ths
        case 4:
3538 9c2149c8 ths
//         gen_op_dmtc0_YQMask(); /* MT ASE */
3539 9c2149c8 ths
            rn = "YQMask";
3540 9c2149c8 ths
//         break;
3541 9c2149c8 ths
        case 5:
3542 9c2149c8 ths
//         gen_op_dmtc0_vpeschedule(); /* MT ASE */
3543 9c2149c8 ths
            rn = "VPESchedule";
3544 9c2149c8 ths
//         break;
3545 9c2149c8 ths
        case 6:
3546 9c2149c8 ths
//         gen_op_dmtc0_vpeschefback(); /* MT ASE */
3547 9c2149c8 ths
            rn = "VPEScheFBack";
3548 9c2149c8 ths
//         break;
3549 9c2149c8 ths
        case 7:
3550 9c2149c8 ths
//         gen_op_dmtc0_vpeopt(); /* MT ASE */
3551 9c2149c8 ths
            rn = "VPEOpt";
3552 9c2149c8 ths
//         break;
3553 9c2149c8 ths
        default:
3554 9c2149c8 ths
            goto die;
3555 9c2149c8 ths
        }
3556 9c2149c8 ths
        break;
3557 9c2149c8 ths
    case 2:
3558 9c2149c8 ths
        switch (sel) {
3559 9c2149c8 ths
        case 0:
3560 9c2149c8 ths
           gen_op_dmtc0_entrylo0();
3561 9c2149c8 ths
           rn = "EntryLo0";
3562 9c2149c8 ths
           break;
3563 9c2149c8 ths
        case 1:
3564 9c2149c8 ths
//         gen_op_dmtc0_tcstatus(); /* MT ASE */
3565 9c2149c8 ths
           rn = "TCStatus";
3566 9c2149c8 ths
//         break;
3567 9c2149c8 ths
        case 2:
3568 9c2149c8 ths
//         gen_op_dmtc0_tcbind(); /* MT ASE */
3569 9c2149c8 ths
           rn = "TCBind";
3570 9c2149c8 ths
//         break;
3571 9c2149c8 ths
        case 3:
3572 9c2149c8 ths
//         gen_op_dmtc0_tcrestart(); /* MT ASE */
3573 9c2149c8 ths
           rn = "TCRestart";
3574 9c2149c8 ths
//         break;
3575 9c2149c8 ths
        case 4:
3576 9c2149c8 ths
//         gen_op_dmtc0_tchalt(); /* MT ASE */
3577 9c2149c8 ths
           rn = "TCHalt";
3578 9c2149c8 ths
//         break;
3579 9c2149c8 ths
        case 5:
3580 9c2149c8 ths
//         gen_op_dmtc0_tccontext(); /* MT ASE */
3581 9c2149c8 ths
           rn = "TCContext";
3582 9c2149c8 ths
//         break;
3583 9c2149c8 ths
        case 6:
3584 9c2149c8 ths
//         gen_op_dmtc0_tcschedule(); /* MT ASE */
3585 9c2149c8 ths
           rn = "TCSchedule";
3586 9c2149c8 ths
//         break;
3587 9c2149c8 ths
        case 7:
3588 9c2149c8 ths
//         gen_op_dmtc0_tcschefback(); /* MT ASE */
3589 9c2149c8 ths
           rn = "TCScheFBack";
3590 9c2149c8 ths
//         break;
3591 9c2149c8 ths
        default:
3592 9c2149c8 ths
            goto die;
3593 9c2149c8 ths
        }
3594 9c2149c8 ths
        break;
3595 9c2149c8 ths
    case 3:
3596 9c2149c8 ths
        switch (sel) {
3597 9c2149c8 ths
        case 0:
3598 9c2149c8 ths
           gen_op_dmtc0_entrylo1();
3599 9c2149c8 ths
           rn = "EntryLo1";
3600 9c2149c8 ths
           break;
3601 9c2149c8 ths
        default:
3602 9c2149c8 ths
            goto die;
3603 876d4b07 ths
        }
3604 9c2149c8 ths
        break;
3605 9c2149c8 ths
    case 4:
3606 9c2149c8 ths
        switch (sel) {
3607 9c2149c8 ths
        case 0:
3608 9c2149c8 ths
           gen_op_dmtc0_context();
3609 9c2149c8 ths
           rn = "Context";
3610 9c2149c8 ths
           break;
3611 9c2149c8 ths
        case 1:
3612 9c2149c8 ths
//         gen_op_dmtc0_contextconfig(); /* SmartMIPS ASE */
3613 9c2149c8 ths
           rn = "ContextConfig";
3614 9c2149c8 ths
//         break;
3615 9c2149c8 ths
        default:
3616 9c2149c8 ths
            goto die;
3617 876d4b07 ths
        }
3618 9c2149c8 ths
        break;
3619 9c2149c8 ths
    case 5:
3620 9c2149c8 ths
        switch (sel) {
3621 9c2149c8 ths
        case 0:
3622 9c2149c8 ths
           gen_op_mtc0_pagemask();
3623 9c2149c8 ths
           rn = "PageMask";
3624 9c2149c8 ths
           break;
3625 9c2149c8 ths
        case 1:
3626 9c2149c8 ths
           gen_op_mtc0_pagegrain();
3627 9c2149c8 ths
           rn = "PageGrain";
3628 9c2149c8 ths
           break;
3629 9c2149c8 ths
        default:
3630 9c2149c8 ths
            goto die;
3631 876d4b07 ths
        }
3632 9c2149c8 ths
        break;
3633 9c2149c8 ths
    case 6:
3634 9c2149c8 ths
        switch (sel) {
3635 9c2149c8 ths
        case 0:
3636 9c2149c8 ths
           gen_op_mtc0_wired();
3637 9c2149c8 ths
           rn = "Wired";
3638 9c2149c8 ths
           break;
3639 9c2149c8 ths
        case 1:
3640 9c2149c8 ths
//         gen_op_dmtc0_srsconf0(); /* shadow registers */
3641 9c2149c8 ths
           rn = "SRSConf0";
3642 9c2149c8 ths
//         break;
3643 9c2149c8 ths
        case 2:
3644 9c2149c8 ths
//         gen_op_dmtc0_srsconf1(); /* shadow registers */
3645 9c2149c8 ths
           rn = "SRSConf1";
3646 9c2149c8 ths
//         break;
3647 9c2149c8 ths
        case 3:
3648 9c2149c8 ths
//         gen_op_dmtc0_srsconf2(); /* shadow registers */
3649 9c2149c8 ths
           rn = "SRSConf2";
3650 9c2149c8 ths
//         break;
3651 9c2149c8 ths
        case 4:
3652 9c2149c8 ths
//         gen_op_dmtc0_srsconf3(); /* shadow registers */
3653 9c2149c8 ths
           rn = "SRSConf3";
3654 9c2149c8 ths
//         break;
3655 9c2149c8 ths
        case 5:
3656 9c2149c8 ths
//         gen_op_dmtc0_srsconf4(); /* shadow registers */
3657 9c2149c8 ths
           rn = "SRSConf4";
3658 9c2149c8 ths
//         break;
3659 9c2149c8 ths
        default:
3660 9c2149c8 ths
            goto die;
3661 876d4b07 ths
        }
3662 9c2149c8 ths
        break;
3663 9c2149c8 ths
    case 7:
3664 9c2149c8 ths
        switch (sel) {
3665 9c2149c8 ths
        case 0:
3666 9c2149c8 ths
           gen_op_mtc0_hwrena();
3667 9c2149c8 ths
           rn = "HWREna";
3668 9c2149c8 ths
           break;
3669 9c2149c8 ths
        default:
3670 9c2149c8 ths
            goto die;
3671 876d4b07 ths
        }
3672 9c2149c8 ths
        break;
3673 9c2149c8 ths
    case 8:
3674 9c2149c8 ths
        /* ignored */
3675 9c2149c8 ths
        rn = "BadVaddr";
3676 9c2149c8 ths
        break;
3677 9c2149c8 ths
    case 9:
3678 9c2149c8 ths
        switch (sel) {
3679 9c2149c8 ths
        case 0:
3680 9c2149c8 ths
           gen_op_mtc0_count();
3681 9c2149c8 ths
           rn = "Count";
3682 9c2149c8 ths
           break;
3683 876d4b07 ths
        /* 6,7 are implementation dependent */
3684 9c2149c8 ths
        default:
3685 9c2149c8 ths
            goto die;
3686 876d4b07 ths
        }
3687 876d4b07 ths
        /* Stop translation as we may have switched the execution mode */
3688 876d4b07 ths
        ctx->bstate = BS_STOP;
3689 9c2149c8 ths
        break;
3690 9c2149c8 ths
    case 10:
3691 9c2149c8 ths
        switch (sel) {
3692 9c2149c8 ths
        case 0:
3693 9c2149c8 ths
           gen_op_mtc0_entryhi();
3694 9c2149c8 ths
           rn = "EntryHi";
3695 9c2149c8 ths
           break;
3696 9c2149c8 ths
        default:
3697 9c2149c8 ths
            goto die;
3698 876d4b07 ths
        }
3699 9c2149c8 ths
        break;
3700 9c2149c8 ths
    case 11:
3701 9c2149c8 ths
        switch (sel) {
3702 9c2149c8 ths
        case 0:
3703 9c2149c8 ths
           gen_op_mtc0_compare();
3704 9c2149c8 ths
           rn = "Compare";
3705 9c2149c8 ths
           break;
3706 876d4b07 ths
        /* 6,7 are implementation dependent */
3707 9c2149c8 ths
        default:
3708 9c2149c8 ths
            goto die;
3709 876d4b07 ths
        }
3710 876d4b07 ths
        /* Stop translation as we may have switched the execution mode */
3711 876d4b07 ths
        ctx->bstate = BS_STOP;
3712 9c2149c8 ths
        break;
3713 9c2149c8 ths
    case 12:
3714 9c2149c8 ths
        switch (sel) {
3715 9c2149c8 ths
        case 0:
3716 9c2149c8 ths
           gen_op_mtc0_status();
3717 9c2149c8 ths
           rn = "Status";
3718 9c2149c8 ths
           break;
3719 9c2149c8 ths
        case 1:
3720 9c2149c8 ths
           gen_op_mtc0_intctl();
3721 9c2149c8 ths
           rn = "IntCtl";
3722 9c2149c8 ths
           break;
3723 9c2149c8 ths
        case 2:
3724 9c2149c8 ths
           gen_op_mtc0_srsctl();
3725 9c2149c8 ths
           rn = "SRSCtl";
3726 9c2149c8 ths
           break;
3727 9c2149c8 ths
        case 3:
3728 9c2149c8 ths
         gen_op_mtc0_srsmap(); /* shadow registers */
3729 9c2149c8 ths
           rn = "SRSMap";
3730 9c2149c8 ths
         break;
3731 876d4b07 ths
         default:
3732 9c2149c8 ths
            goto die;
3733 876d4b07 ths
        }
3734 876d4b07 ths
        /* Stop translation as we may have switched the execution mode */
3735 876d4b07 ths
        ctx->bstate = BS_STOP;
3736 9c2149c8 ths
        break;
3737 9c2149c8 ths
    case 13:
3738 9c2149c8 ths
        switch (sel) {
3739 9c2149c8 ths
        case 0:
3740 9c2149c8 ths
           gen_op_mtc0_cause();
3741 9c2149c8 ths
           rn = "Cause";
3742 9c2149c8 ths
           break;
3743 9c2149c8 ths
        default:
3744 9c2149c8 ths
            goto die;
3745 876d4b07 ths
        }
3746 876d4b07 ths
        /* Stop translation as we may have switched the execution mode */
3747 876d4b07 ths
        ctx->bstate = BS_STOP;
3748 9c2149c8 ths
        break;
3749 9c2149c8 ths
    case 14:
3750 9c2149c8 ths
        switch (sel) {
3751 9c2149c8 ths
        case 0:
3752 9c2149c8 ths
           gen_op_dmtc0_epc();
3753 9c2149c8 ths
           rn = "EPC";
3754 9c2149c8 ths
           break;
3755 9c2149c8 ths
        default:
3756 9c2149c8 ths
            goto die;
3757 876d4b07 ths
        }
3758 9c2149c8 ths
        break;
3759 9c2149c8 ths
    case 15:
3760 9c2149c8 ths
        switch (sel) {
3761 9c2149c8 ths
        case 0:
3762 9c2149c8 ths
           /* ignored */
3763 9c2149c8 ths
           rn = "PRid";
3764 9c2149c8 ths
           break;
3765 9c2149c8 ths
        case 1:
3766 b29a0341 ths
           gen_op_mtc0_ebase();
3767 9c2149c8 ths
           rn = "EBase";
3768 9c2149c8 ths
           break;
3769 9c2149c8 ths
        default:
3770 9c2149c8 ths
            goto die;
3771 876d4b07 ths
        }
3772 9c2149c8 ths
        break;
3773 9c2149c8 ths
    case 16:
3774 9c2149c8 ths
        switch (sel) {
3775 9c2149c8 ths
        case 0:
3776 9c2149c8 ths
            gen_op_mtc0_config0();
3777 9c2149c8 ths
            rn = "Config";
3778 9c2149c8 ths
            break;
3779 9c2149c8 ths
        case 1:
3780 9c2149c8 ths
           /* ignored */
3781 9c2149c8 ths
            rn = "Config1";
3782 9c2149c8 ths
            break;
3783 9c2149c8 ths
        case 2:
3784 9c2149c8 ths
            gen_op_mtc0_config2();
3785 9c2149c8 ths
            rn = "Config2";
3786 9c2149c8 ths
            break;
3787 9c2149c8 ths
        case 3:
3788 9c2149c8 ths
           /* ignored */
3789 9c2149c8 ths
            rn = "Config3";
3790 9c2149c8 ths
            break;
3791 9c2149c8 ths
        /* 6,7 are implementation dependent */
3792 9c2149c8 ths
        default:
3793 9c2149c8 ths
            rn = "Invalid config selector";
3794 9c2149c8 ths
            goto die;
3795 9c2149c8 ths
        }
3796 9c2149c8 ths
        /* Stop translation as we may have switched the execution mode */
3797 9c2149c8 ths
        ctx->bstate = BS_STOP;
3798 9c2149c8 ths
        break;
3799 9c2149c8 ths
    case 17:
3800 9c2149c8 ths
        switch (sel) {
3801 9c2149c8 ths
        case 0:
3802 9c2149c8 ths
           /* ignored */
3803 9c2149c8 ths
           rn = "LLAddr";
3804 9c2149c8 ths
           break;
3805 9c2149c8 ths
        default:
3806 9c2149c8 ths
            goto die;
3807 9c2149c8 ths
        }
3808 9c2149c8 ths
        break;
3809 9c2149c8 ths
    case 18:
3810 9c2149c8 ths
        switch (sel) {
3811 9c2149c8 ths
        case 0:
3812 9c2149c8 ths
           gen_op_dmtc0_watchlo0();
3813 9c2149c8 ths
           rn = "WatchLo";
3814 9c2149c8 ths
           break;
3815 9c2149c8 ths
        case 1:
3816 9c2149c8 ths
//         gen_op_dmtc0_watchlo1();
3817 9c2149c8 ths
           rn = "WatchLo1";
3818 9c2149c8 ths
//         break;
3819 9c2149c8 ths
        case 2:
3820 9c2149c8 ths
//         gen_op_dmtc0_watchlo2();
3821 9c2149c8 ths
           rn = "WatchLo2";
3822 9c2149c8 ths
//         break;
3823 9c2149c8 ths
        case 3:
3824 9c2149c8 ths
//         gen_op_dmtc0_watchlo3();
3825 9c2149c8 ths
           rn = "WatchLo3";
3826 9c2149c8 ths
//         break;
3827 9c2149c8 ths
        case 4:
3828 9c2149c8 ths
//         gen_op_dmtc0_watchlo4();
3829 9c2149c8 ths
           rn = "WatchLo4";
3830 9c2149c8 ths
//         break;
3831 9c2149c8 ths
        case 5:
3832 9c2149c8 ths
//         gen_op_dmtc0_watchlo5();
3833 9c2149c8 ths
           rn = "WatchLo5";
3834 9c2149c8 ths
//         break;
3835 9c2149c8 ths
        case 6:
3836 9c2149c8 ths
//         gen_op_dmtc0_watchlo6();
3837 9c2149c8 ths
           rn = "WatchLo6";
3838 9c2149c8 ths
//         break;
3839 9c2149c8 ths
        case 7:
3840 9c2149c8 ths
//         gen_op_dmtc0_watchlo7();
3841 9c2149c8 ths
           rn = "WatchLo7";
3842 9c2149c8 ths
//         break;
3843 9c2149c8 ths
        default:
3844 9c2149c8 ths
            goto die;
3845 9c2149c8 ths
        }
3846 9c2149c8 ths
        break;
3847 9c2149c8 ths
    case 19:
3848 9c2149c8 ths
        switch (sel) {
3849 9c2149c8 ths
        case 0:
3850 9c2149c8 ths
           gen_op_mtc0_watchhi0();
3851 9c2149c8 ths
           rn = "WatchHi";
3852 9c2149c8 ths
           break;
3853 9c2149c8 ths
        case 1:
3854 9c2149c8 ths
//         gen_op_dmtc0_watchhi1();
3855 9c2149c8 ths
           rn = "WatchHi1";
3856 9c2149c8 ths
//         break;
3857 9c2149c8 ths
        case 2:
3858 9c2149c8 ths
//         gen_op_dmtc0_watchhi2();
3859 9c2149c8 ths
           rn = "WatchHi2";
3860 9c2149c8 ths
//         break;
3861 9c2149c8 ths
        case 3:
3862 9c2149c8 ths
//         gen_op_dmtc0_watchhi3();
3863 9c2149c8 ths
           rn = "WatchHi3";
3864 9c2149c8 ths
//         break;
3865 9c2149c8 ths
        case 4:
3866 9c2149c8 ths
//         gen_op_dmtc0_watchhi4();
3867 9c2149c8 ths
           rn = "WatchHi4";
3868 9c2149c8 ths
//         break;
3869 9c2149c8 ths
        case 5:
3870 9c2149c8 ths
//         gen_op_dmtc0_watchhi5();
3871 9c2149c8 ths
           rn = "WatchHi5";
3872 9c2149c8 ths
//         break;
3873 9c2149c8 ths
        case 6:
3874 9c2149c8 ths
//         gen_op_dmtc0_watchhi6();
3875 9c2149c8 ths
           rn = "WatchHi6";
3876 9c2149c8 ths
//         break;
3877 9c2149c8 ths
        case 7:
3878 9c2149c8 ths
//         gen_op_dmtc0_watchhi7();
3879 9c2149c8 ths
           rn = "WatchHi7";
3880 9c2149c8 ths
//         break;
3881 9c2149c8 ths
        default:
3882 9c2149c8 ths
            goto die;
3883 9c2149c8 ths
        }
3884 9c2149c8 ths
        break;
3885 9c2149c8 ths
    case 20:
3886 9c2149c8 ths
        switch (sel) {
3887 9c2149c8 ths
        case 0:
3888 9c2149c8 ths
           /* 64 bit MMU only */
3889 9c2149c8 ths
           gen_op_dmtc0_xcontext();
3890 9c2149c8 ths
           rn = "XContext";
3891 9c2149c8 ths
           break;
3892 9c2149c8 ths
        default:
3893 9c2149c8 ths
            goto die;
3894 9c2149c8 ths
        }
3895 9c2149c8 ths
        break;
3896 9c2149c8 ths
    case 21:
3897 9c2149c8 ths
       /* Officially reserved, but sel 0 is used for R1x000 framemask */
3898 9c2149c8 ths
        switch (sel) {
3899 9c2149c8 ths
        case 0:
3900 9c2149c8 ths
           gen_op_mtc0_framemask();
3901 9c2149c8 ths
           rn = "Framemask";
3902 9c2149c8 ths
           break;
3903 9c2149c8 ths
        default:
3904 9c2149c8 ths
            goto die;
3905 9c2149c8 ths
        }
3906 9c2149c8 ths
        break;
3907 9c2149c8 ths
    case 22:
3908 9c2149c8 ths
        /* ignored */
3909 9c2149c8 ths
        rn = "Diagnostic"; /* implementation dependent */
3910 876d4b07 ths
        break;
3911 9c2149c8 ths
    case 23:
3912 9c2149c8 ths
        switch (sel) {
3913 9c2149c8 ths
        case 0:
3914 9c2149c8 ths
           gen_op_mtc0_debug(); /* EJTAG support */
3915 9c2149c8 ths
           rn = "Debug";
3916 9c2149c8 ths
           break;
3917 9c2149c8 ths
        case 1:
3918 9c2149c8 ths
//         gen_op_dmtc0_tracecontrol(); /* PDtrace support */
3919 9c2149c8 ths
           rn = "TraceControl";
3920 9c2149c8 ths
//         break;
3921 9c2149c8 ths
        case 2:
3922 9c2149c8 ths
//         gen_op_dmtc0_tracecontrol2(); /* PDtrace support */
3923 9c2149c8 ths
           rn = "TraceControl2";
3924 9c2149c8 ths
//         break;
3925 9c2149c8 ths
        case 3:
3926 9c2149c8 ths
//         gen_op_dmtc0_usertracedata(); /* PDtrace support */
3927 9c2149c8 ths
           rn = "UserTraceData";
3928 9c2149c8 ths
//         break;
3929 9c2149c8 ths
        case 4:
3930 9c2149c8 ths
//         gen_op_dmtc0_debug(); /* PDtrace support */
3931 9c2149c8 ths
           rn = "TraceBPC";
3932 9c2149c8 ths
//         break;
3933 9c2149c8 ths
        default:
3934 9c2149c8 ths
            goto die;
3935 9c2149c8 ths
        }
3936 9c2149c8 ths
       /* Stop translation as we may have switched the execution mode */
3937 9c2149c8 ths
       ctx->bstate = BS_STOP;
3938 9c2149c8 ths
        break;
3939 9c2149c8 ths
    case 24:
3940 9c2149c8 ths
        switch (sel) {
3941 9c2149c8 ths
        case 0:
3942 9c2149c8 ths
           gen_op_dmtc0_depc(); /* EJTAG support */
3943 9c2149c8 ths
           rn = "DEPC";
3944 9c2149c8 ths
           break;
3945 9c2149c8 ths
        default:
3946 9c2149c8 ths
            goto die;
3947 9c2149c8 ths
        }
3948 9c2149c8 ths
        break;
3949 9c2149c8 ths
    case 25:
3950 9c2149c8 ths
        switch (sel) {
3951 9c2149c8 ths
        case 0:
3952 9c2149c8 ths
           gen_op_mtc0_performance0();
3953 9c2149c8 ths
           rn = "Performance0";
3954 9c2149c8 ths
           break;
3955 9c2149c8 ths
        case 1:
3956 9c2149c8 ths
//         gen_op_dmtc0_performance1();
3957 9c2149c8 ths
           rn = "Performance1";
3958 9c2149c8 ths
//         break;
3959 9c2149c8 ths
        case 2:
3960 9c2149c8 ths
//         gen_op_dmtc0_performance2();
3961 9c2149c8 ths
           rn = "Performance2";
3962 9c2149c8 ths
//         break;
3963 9c2149c8 ths
        case 3:
3964 9c2149c8 ths
//         gen_op_dmtc0_performance3();
3965 9c2149c8 ths
           rn = "Performance3";
3966 9c2149c8 ths
//         break;
3967 9c2149c8 ths
        case 4:
3968 9c2149c8 ths
//         gen_op_dmtc0_performance4();
3969 9c2149c8 ths
           rn = "Performance4";
3970 9c2149c8 ths
//         break;
3971 9c2149c8 ths
        case 5:
3972 9c2149c8 ths
//         gen_op_dmtc0_performance5();
3973 9c2149c8 ths
           rn = "Performance5";
3974 9c2149c8 ths
//         break;
3975 9c2149c8 ths
        case 6:
3976 9c2149c8 ths
//         gen_op_dmtc0_performance6();
3977 9c2149c8 ths
           rn = "Performance6";
3978 9c2149c8 ths
//         break;
3979 9c2149c8 ths
        case 7:
3980 9c2149c8 ths
//         gen_op_dmtc0_performance7();
3981 9c2149c8 ths
           rn = "Performance7";
3982 9c2149c8 ths
//         break;
3983 9c2149c8 ths
        default:
3984 9c2149c8 ths
            goto die;
3985 9c2149c8 ths
        }
3986 876d4b07 ths
        break;
3987 9c2149c8 ths
    case 26:
3988 876d4b07 ths
        /* ignored */
3989 9c2149c8 ths
        rn = "ECC";
3990 876d4b07 ths
        break;
3991 9c2149c8 ths
    case 27:
3992 9c2149c8 ths
        switch (sel) {
3993 9c2149c8 ths
        case 0 ... 3:
3994 9c2149c8 ths
           /* ignored */
3995 9c2149c8 ths
           rn = "CacheErr";
3996 9c2149c8 ths
           break;
3997 9c2149c8 ths
        default:
3998 9c2149c8 ths
            goto die;
3999 9c2149c8 ths
        }
4000 876d4b07 ths
        break;
4001 9c2149c8 ths
    case 28:
4002 9c2149c8 ths
        switch (sel) {
4003 9c2149c8 ths
        case 0:
4004 9c2149c8 ths
        case 2:
4005 9c2149c8 ths
        case 4:
4006 9c2149c8 ths
        case 6:
4007 9c2149c8 ths
            gen_op_mtc0_taglo();
4008 9c2149c8 ths
            rn = "TagLo";
4009 9c2149c8 ths
            break;
4010 9c2149c8 ths
        case 1:
4011 9c2149c8 ths
        case 3:
4012 9c2149c8 ths
        case 5:
4013 9c2149c8 ths
        case 7:
4014 9c2149c8 ths
           gen_op_mtc0_datalo();
4015 9c2149c8 ths
            rn = "DataLo";
4016 9c2149c8 ths
            break;
4017 9c2149c8 ths
        default:
4018 9c2149c8 ths
            goto die;
4019 9c2149c8 ths
        }
4020 9c2149c8 ths
        break;
4021 9c2149c8 ths
    case 29:
4022 9c2149c8 ths
        switch (sel) {
4023 9c2149c8 ths
        case 0:
4024 9c2149c8 ths
        case 2:
4025 9c2149c8 ths
        case 4:
4026 9c2149c8 ths
        case 6:
4027 9c2149c8 ths
            gen_op_mtc0_taghi();
4028 9c2149c8 ths
            rn = "TagHi";
4029 9c2149c8 ths
            break;
4030 9c2149c8 ths
        case 1:
4031 9c2149c8 ths
        case 3:
4032 9c2149c8 ths
        case 5:
4033 9c2149c8 ths
        case 7:
4034 9c2149c8 ths
           gen_op_mtc0_datahi();
4035 9c2149c8 ths
            rn = "DataHi";
4036 9c2149c8 ths
            break;
4037 9c2149c8 ths
        default:
4038 9c2149c8 ths
            rn = "invalid sel";
4039 9c2149c8 ths
            goto die;
4040 9c2149c8 ths
        }
4041 876d4b07 ths
        break;
4042 9c2149c8 ths
    case 30:
4043 9c2149c8 ths
        switch (sel) {
4044 9c2149c8 ths
        case 0:
4045 9c2149c8 ths
           gen_op_dmtc0_errorepc();
4046 9c2149c8 ths
           rn = "ErrorEPC";
4047 9c2149c8 ths
           break;
4048 9c2149c8 ths
        default:
4049 9c2149c8 ths
            goto die;
4050 9c2149c8 ths
        }
4051 9c2149c8 ths
        break;
4052 9c2149c8 ths
    case 31:
4053 9c2149c8 ths
        switch (sel) {
4054 9c2149c8 ths
        case 0:
4055 9c2149c8 ths
           gen_op_mtc0_desave(); /* EJTAG support */
4056 9c2149c8 ths
           rn = "DESAVE";
4057 9c2149c8 ths
           break;
4058 9c2149c8 ths
        default:
4059 9c2149c8 ths
            goto die;
4060 9c2149c8 ths
        }
4061 876d4b07 ths
        /* Stop translation as we may have switched the execution mode */
4062 876d4b07 ths
        ctx->bstate = BS_STOP;
4063 9c2149c8 ths
        break;
4064 9c2149c8 ths
    default:
4065 876d4b07 ths
        goto die;
4066 9c2149c8 ths
    }
4067 9c2149c8 ths
#if defined MIPS_DEBUG_DISAS
4068 9c2149c8 ths
    if (loglevel & CPU_LOG_TB_IN_ASM) {
4069 9c2149c8 ths
        fprintf(logfile, "dmtc0 %s (reg %d sel %d)\n",
4070 9c2149c8 ths
                rn, reg, sel);
4071 9c2149c8 ths
    }
4072 9c2149c8 ths
#endif
4073 9c2149c8 ths
    return;
4074 9c2149c8 ths
4075 9c2149c8 ths
die:
4076 9c2149c8 ths
#if defined MIPS_DEBUG_DISAS
4077 9c2149c8 ths
    if (loglevel & CPU_LOG_TB_IN_ASM) {
4078 9c2149c8 ths
        fprintf(logfile, "dmtc0 %s (reg %d sel %d)\n",
4079 9c2149c8 ths
                rn, reg, sel);
4080 9c2149c8 ths
    }
4081 9c2149c8 ths
#endif
4082 9c2149c8 ths
    generate_exception(ctx, EXCP_RI);
4083 9c2149c8 ths
}
4084 9c2149c8 ths
4085 7a387fff ths
static void gen_cp0 (DisasContext *ctx, uint32_t opc, int rt, int rd)
4086 6af0bf9c bellard
{
4087 7a387fff ths
    const char *opn = "unk";
4088 6af0bf9c bellard
4089 6af0bf9c bellard
    switch (opc) {
4090 6af0bf9c bellard
    case OPC_MFC0:
4091 6af0bf9c bellard
        if (rt == 0) {
4092 6af0bf9c bellard
            /* Treat as NOP */
4093 6af0bf9c bellard
            return;
4094 6af0bf9c bellard
        }
4095 873eb012 ths
        gen_mfc0(ctx, rd, ctx->opcode & 0x7);
4096 6af0bf9c bellard
        gen_op_store_T0_gpr(rt);
4097 6af0bf9c bellard
        opn = "mfc0";
4098 6af0bf9c bellard
        break;
4099 6af0bf9c bellard
    case OPC_MTC0:
4100 6af0bf9c bellard
        /* If we get an exception, we want to restart at next instruction */
4101 9c2149c8 ths
        /* XXX: breaks for mtc in delay slot */
4102 6af0bf9c bellard
        ctx->pc += 4;
4103 6af0bf9c bellard
        save_cpu_state(ctx, 1);
4104 6af0bf9c bellard
        ctx->pc -= 4;
4105 6af0bf9c bellard
        GEN_LOAD_REG_TN(T0, rt);
4106 8c0fdd85 ths
        gen_mtc0(ctx, rd, ctx->opcode & 0x7);
4107 6af0bf9c bellard
        opn = "mtc0";
4108 6af0bf9c bellard
        break;
4109 9c2149c8 ths
    case OPC_DMFC0:
4110 9c2149c8 ths
        if (rt == 0) {
4111 9c2149c8 ths
            /* Treat as NOP */
4112 9c2149c8 ths
            return;
4113 9c2149c8 ths
        }
4114 9c2149c8 ths
        gen_dmfc0(ctx, rd, ctx->opcode & 0x7);
4115 9c2149c8 ths
        gen_op_store_T0_gpr(rt);
4116 9c2149c8 ths
        opn = "dmfc0";
4117 9c2149c8 ths
        break;
4118 9c2149c8 ths
    case OPC_DMTC0:
4119 9c2149c8 ths
        /* If we get an exception, we want to restart at next instruction */
4120 9c2149c8 ths
        /* XXX: breaks for dmtc in delay slot */
4121 9c2149c8 ths
        ctx->pc += 4;
4122 9c2149c8 ths
        save_cpu_state(ctx, 1);
4123 9c2149c8 ths
        ctx->pc -= 4;
4124 9c2149c8 ths
        GEN_LOAD_REG_TN(T0, rt);
4125 9c2149c8 ths
        gen_dmtc0(ctx, rd, ctx->opcode & 0x7);
4126 9c2149c8 ths
        opn = "dmtc0";
4127 9c2149c8 ths
        break;
4128 6af0bf9c bellard
#if defined(MIPS_USES_R4K_TLB)
4129 6af0bf9c bellard
    case OPC_TLBWI:
4130 6af0bf9c bellard
        gen_op_tlbwi();
4131 6af0bf9c bellard
        opn = "tlbwi";
4132 6af0bf9c bellard
        break;
4133 6af0bf9c bellard
    case OPC_TLBWR:
4134 6af0bf9c bellard
        gen_op_tlbwr();
4135 6af0bf9c bellard
        opn = "tlbwr";
4136 6af0bf9c bellard
        break;
4137 6af0bf9c bellard
    case OPC_TLBP:
4138 6af0bf9c bellard
        gen_op_tlbp();
4139 6af0bf9c bellard
        opn = "tlbp";
4140 6af0bf9c bellard
        break;
4141 6af0bf9c bellard
    case OPC_TLBR:
4142 6af0bf9c bellard
        gen_op_tlbr();
4143 6af0bf9c bellard
        opn = "tlbr";
4144 6af0bf9c bellard
        break;
4145 6af0bf9c bellard
#endif
4146 6af0bf9c bellard
    case OPC_ERET:
4147 6af0bf9c bellard
        opn = "eret";
4148 6af0bf9c bellard
        save_cpu_state(ctx, 0);
4149 6af0bf9c bellard
        gen_op_eret();
4150 6af0bf9c bellard
        ctx->bstate = BS_EXCP;
4151 6af0bf9c bellard
        break;
4152 6af0bf9c bellard
    case OPC_DERET:
4153 6af0bf9c bellard
        opn = "deret";
4154 6af0bf9c bellard
        if (!(ctx->hflags & MIPS_HFLAG_DM)) {
4155 6af0bf9c bellard
            generate_exception(ctx, EXCP_RI);
4156 6af0bf9c bellard
        } else {
4157 6af0bf9c bellard
            save_cpu_state(ctx, 0);
4158 6af0bf9c bellard
            gen_op_deret();
4159 6af0bf9c bellard
            ctx->bstate = BS_EXCP;
4160 6af0bf9c bellard
        }
4161 6af0bf9c bellard
        break;
4162 4ad40f36 bellard
    case OPC_WAIT:
4163 4ad40f36 bellard
        opn = "wait";
4164 4ad40f36 bellard
        /* If we get an exception, we want to restart at next instruction */
4165 4ad40f36 bellard
        ctx->pc += 4;
4166 4ad40f36 bellard
        save_cpu_state(ctx, 1);
4167 4ad40f36 bellard
        ctx->pc -= 4;
4168 4ad40f36 bellard
        gen_op_wait();
4169 4ad40f36 bellard
        ctx->bstate = BS_EXCP;
4170 4ad40f36 bellard
        break;
4171 6af0bf9c bellard
    default:
4172 6af0bf9c bellard
        if (loglevel & CPU_LOG_TB_IN_ASM) {
4173 6af0bf9c bellard
            fprintf(logfile, "Invalid CP0 opcode: %08x %03x %03x %03x\n",
4174 6af0bf9c bellard
                    ctx->opcode, ctx->opcode >> 26, ctx->opcode & 0x3F,
4175 6af0bf9c bellard
                    ((ctx->opcode >> 16) & 0x1F));
4176 6af0bf9c bellard
        }
4177 6af0bf9c bellard
        generate_exception(ctx, EXCP_RI);
4178 6af0bf9c bellard
        return;
4179 6af0bf9c bellard
    }
4180 6af0bf9c bellard
    MIPS_DEBUG("%s %s %d", opn, regnames[rt], rd);
4181 6af0bf9c bellard
}
4182 6af0bf9c bellard
4183 6ea83fed bellard
/* CP1 Branches (before delay slot) */
4184 7a387fff ths
static void gen_compute_branch1 (DisasContext *ctx, uint32_t op,
4185 6ea83fed bellard
                                 int32_t offset)
4186 6ea83fed bellard
{
4187 6ea83fed bellard
    target_ulong btarget;
4188 6ea83fed bellard
4189 6ea83fed bellard
    btarget = ctx->pc + 4 + offset;
4190 6ea83fed bellard
4191 7a387fff ths
    switch (op) {
4192 7a387fff ths
    case OPC_BC1F:
4193 6ea83fed bellard
        gen_op_bc1f();
4194 3594c774 ths
        MIPS_DEBUG("bc1f " TARGET_FMT_lx, btarget);
4195 6ea83fed bellard
        goto not_likely;
4196 7a387fff ths
    case OPC_BC1FL:
4197 6ea83fed bellard
        gen_op_bc1f();
4198 3594c774 ths
        MIPS_DEBUG("bc1fl " TARGET_FMT_lx, btarget);
4199 6ea83fed bellard
        goto likely;
4200 7a387fff ths
    case OPC_BC1T:
4201 6ea83fed bellard
        gen_op_bc1t();
4202 3594c774 ths
        MIPS_DEBUG("bc1t " TARGET_FMT_lx, btarget);
4203 6ea83fed bellard
    not_likely:
4204 6ea83fed bellard
        ctx->hflags |= MIPS_HFLAG_BC;
4205 6ea83fed bellard
        break;
4206 7a387fff ths
    case OPC_BC1TL:
4207 6ea83fed bellard
        gen_op_bc1t();
4208 3594c774 ths
        MIPS_DEBUG("bc1tl " TARGET_FMT_lx, btarget);
4209 6ea83fed bellard
    likely:
4210 6ea83fed bellard
        ctx->hflags |= MIPS_HFLAG_BL;
4211 6ea83fed bellard
        break;
4212 6ea83fed bellard
    default:    
4213 6ea83fed bellard
        MIPS_INVAL("cp1 branch/jump");
4214 e397ee33 ths
        generate_exception (ctx, EXCP_RI);
4215 6ea83fed bellard
        return;
4216 6ea83fed bellard
    }
4217 6ea83fed bellard
    gen_op_set_bcond();
4218 6ea83fed bellard
4219 3594c774 ths
    MIPS_DEBUG("enter ds: cond %02x target " TARGET_FMT_lx,
4220 6ea83fed bellard
               ctx->hflags, btarget);
4221 6ea83fed bellard
    ctx->btarget = btarget;
4222 6ea83fed bellard
4223 6ea83fed bellard
    return;
4224 6ea83fed bellard
}
4225 6ea83fed bellard
4226 6af0bf9c bellard
/* Coprocessor 1 (FPU) */
4227 7a387fff ths
static void gen_cp1 (DisasContext *ctx, uint32_t opc, int rt, int fs)
4228 6ea83fed bellard
{
4229 7a387fff ths
    const char *opn = "unk";
4230 6ea83fed bellard
4231 6ea83fed bellard
    switch (opc) {
4232 6ea83fed bellard
    case OPC_MFC1:
4233 6ea83fed bellard
        GEN_LOAD_FREG_FTN(WT0, fs);
4234 6ea83fed bellard
        gen_op_mfc1();
4235 6ea83fed bellard
        GEN_STORE_TN_REG(rt, T0);
4236 6ea83fed bellard
        opn = "mfc1";
4237 6ea83fed bellard
        break;
4238 6ea83fed bellard
    case OPC_MTC1:
4239 6ea83fed bellard
        GEN_LOAD_REG_TN(T0, rt);
4240 6ea83fed bellard
        gen_op_mtc1();
4241 6ea83fed bellard
        GEN_STORE_FTN_FREG(fs, WT0);
4242 6ea83fed bellard
        opn = "mtc1";
4243 6ea83fed bellard
        break;
4244 6ea83fed bellard
    case OPC_CFC1:
4245 6ea83fed bellard
        if (fs != 0 && fs != 31) {
4246 6ea83fed bellard
            MIPS_INVAL("cfc1 freg");
4247 e397ee33 ths
            generate_exception (ctx, EXCP_RI);
4248 6ea83fed bellard
            return;
4249 6ea83fed bellard
        }
4250 6ea83fed bellard
        GEN_LOAD_IMM_TN(T1, fs);
4251 6ea83fed bellard
        gen_op_cfc1();
4252 6ea83fed bellard
        GEN_STORE_TN_REG(rt, T0);
4253 6ea83fed bellard
        opn = "cfc1";
4254 6ea83fed bellard
        break;
4255 6ea83fed bellard
    case OPC_CTC1:
4256 7a387fff ths
         if (fs != 0 && fs != 31) {
4257 6ea83fed bellard
            MIPS_INVAL("ctc1 freg");
4258 e397ee33 ths
            generate_exception (ctx, EXCP_RI);
4259 6ea83fed bellard
            return;
4260 6ea83fed bellard
        }
4261 6ea83fed bellard
        GEN_LOAD_IMM_TN(T1, fs);
4262 6ea83fed bellard
        GEN_LOAD_REG_TN(T0, rt);
4263 6ea83fed bellard
        gen_op_ctc1();
4264 6ea83fed bellard
        opn = "ctc1";
4265 6ea83fed bellard
        break;
4266 9c2149c8 ths
    case OPC_DMFC1:
4267 9c2149c8 ths
    case OPC_DMTC1:
4268 9c2149c8 ths
        /* Not implemented, fallthrough. */
4269 6ea83fed bellard
    default:
4270 6ea83fed bellard
        if (loglevel & CPU_LOG_TB_IN_ASM) {
4271 6ea83fed bellard
            fprintf(logfile, "Invalid CP1 opcode: %08x %03x %03x %03x\n",
4272 6ea83fed bellard
                    ctx->opcode, ctx->opcode >> 26, ctx->opcode & 0x3F,
4273 6ea83fed bellard
                    ((ctx->opcode >> 16) & 0x1F));
4274 6ea83fed bellard
        }
4275 e397ee33 ths
        generate_exception (ctx, EXCP_RI);
4276 6ea83fed bellard
        return;
4277 6ea83fed bellard
    }
4278 6ea83fed bellard
    MIPS_DEBUG("%s %s %s", opn, regnames[rt], fregnames[fs]);
4279 6ea83fed bellard
}
4280 6ea83fed bellard
4281 6ea83fed bellard
/* verify if floating point register is valid; an operation is not defined
4282 6ea83fed bellard
 * if bit 0 of any register specification is set and the FR bit in the
4283 6ea83fed bellard
 * Status register equals zero, since the register numbers specify an
4284 6ea83fed bellard
 * even-odd pair of adjacent coprocessor general registers. When the FR bit
4285 6ea83fed bellard
 * in the Status register equals one, both even and odd register numbers
4286 00a709c7 ths
 * are valid. This limitation exists only for 64 bit wide (d,l) registers.
4287 6ea83fed bellard
 * 
4288 00a709c7 ths
 * Multiple 64 bit wide registers can be checked by calling
4289 6ea83fed bellard
 * CHECK_FR(ctx, freg1 | freg2 | ... | fregN);
4290 6ea83fed bellard
 */
4291 6ea83fed bellard
#define CHECK_FR(ctx, freg) do { \
4292 6ea83fed bellard
        if (!((ctx)->CP0_Status & (1<<CP0St_FR)) && ((freg) & 1)) { \
4293 e397ee33 ths
            generate_exception (ctx, EXCP_RI); \
4294 6ea83fed bellard
            return; \
4295 6ea83fed bellard
        } \
4296 6ea83fed bellard
    } while(0)
4297 6ea83fed bellard
4298 6ea83fed bellard
#define FOP(func, fmt) (((fmt) << 21) | (func))
4299 6ea83fed bellard
4300 7a387fff ths
static void gen_farith (DisasContext *ctx, uint32_t op1, int ft, int fs, int fd)
4301 6ea83fed bellard
{
4302 7a387fff ths
    const char *opn = "unk";
4303 6ea83fed bellard
    const char *condnames[] = {
4304 6ea83fed bellard
            "c.f",
4305 6ea83fed bellard
            "c.un",
4306 6ea83fed bellard
            "c.eq",
4307 6ea83fed bellard
            "c.ueq",
4308 6ea83fed bellard
            "c.olt",
4309 6ea83fed bellard
            "c.ult",
4310 6ea83fed bellard
            "c.ole",
4311 6ea83fed bellard
            "c.ule",
4312 6ea83fed bellard
            "c.sf",
4313 6ea83fed bellard
            "c.ngle",
4314 6ea83fed bellard
            "c.seq",
4315 6ea83fed bellard
            "c.ngl",
4316 6ea83fed bellard
            "c.lt",
4317 6ea83fed bellard
            "c.nge",
4318 6ea83fed bellard
            "c.le",
4319 6ea83fed bellard
            "c.ngt",
4320 6ea83fed bellard
    };
4321 6ea83fed bellard
    int binary = 0;
4322 7a387fff ths
    uint32_t func = ctx->opcode & 0x3f;
4323 7a387fff ths
4324 6ea83fed bellard
    switch (ctx->opcode & FOP(0x3f, 0x1f)) {
4325 6ea83fed bellard
    case FOP(0, 17):
4326 6ea83fed bellard
        CHECK_FR(ctx, fs | ft | fd);
4327 6ea83fed bellard
        GEN_LOAD_FREG_FTN(DT0, fs);
4328 6ea83fed bellard
        GEN_LOAD_FREG_FTN(DT1, ft);
4329 6ea83fed bellard
        gen_op_float_add_d();
4330 6ea83fed bellard
        GEN_STORE_FTN_FREG(fd, DT2);
4331 6ea83fed bellard
        opn = "add.d";
4332 6ea83fed bellard
        binary = 1;
4333 6ea83fed bellard
        break;
4334 6ea83fed bellard
    case FOP(1, 17):
4335 6ea83fed bellard
        CHECK_FR(ctx, fs | ft | fd);
4336 6ea83fed bellard
        GEN_LOAD_FREG_FTN(DT0, fs);
4337 6ea83fed bellard
        GEN_LOAD_FREG_FTN(DT1, ft);
4338 6ea83fed bellard
        gen_op_float_sub_d();
4339 6ea83fed bellard
        GEN_STORE_FTN_FREG(fd, DT2);
4340 6ea83fed bellard
        opn = "sub.d";
4341 6ea83fed bellard
        binary = 1;
4342 6ea83fed bellard
        break;
4343 6ea83fed bellard
    case FOP(2, 17):
4344 6ea83fed bellard
        CHECK_FR(ctx, fs | ft | fd);
4345 6ea83fed bellard
        GEN_LOAD_FREG_FTN(DT0, fs);
4346 6ea83fed bellard
        GEN_LOAD_FREG_FTN(DT1, ft);
4347 6ea83fed bellard
        gen_op_float_mul_d();
4348 6ea83fed bellard
        GEN_STORE_FTN_FREG(fd, DT2);
4349 6ea83fed bellard
        opn = "mul.d";
4350 6ea83fed bellard
        binary = 1;
4351 6ea83fed bellard
        break;
4352 6ea83fed bellard
    case FOP(3, 17):
4353 6ea83fed bellard
        CHECK_FR(ctx, fs | ft | fd);
4354 6ea83fed bellard
        GEN_LOAD_FREG_FTN(DT0, fs);
4355 6ea83fed bellard
        GEN_LOAD_FREG_FTN(DT1, ft);
4356 6ea83fed bellard
        gen_op_float_div_d();
4357 6ea83fed bellard
        GEN_STORE_FTN_FREG(fd, DT2);
4358 6ea83fed bellard
        opn = "div.d";
4359 6ea83fed bellard
        binary = 1;
4360 6ea83fed bellard
        break;
4361 6ea83fed bellard
    case FOP(4, 17):
4362 6ea83fed bellard
        CHECK_FR(ctx, fs | fd);
4363 6ea83fed bellard
        GEN_LOAD_FREG_FTN(DT0, fs);
4364 6ea83fed bellard
        gen_op_float_sqrt_d();
4365 6ea83fed bellard
        GEN_STORE_FTN_FREG(fd, DT2);
4366 6ea83fed bellard
        opn = "sqrt.d";
4367 6ea83fed bellard
        break;
4368 6ea83fed bellard
    case FOP(5, 17):
4369 6ea83fed bellard
        CHECK_FR(ctx, fs | fd);
4370 6ea83fed bellard
        GEN_LOAD_FREG_FTN(DT0, fs);
4371 6ea83fed bellard
        gen_op_float_abs_d();
4372 6ea83fed bellard
        GEN_STORE_FTN_FREG(fd, DT2);
4373 6ea83fed bellard
        opn = "abs.d";
4374 6ea83fed bellard
        break;
4375 6ea83fed bellard
    case FOP(6, 17):
4376 6ea83fed bellard
        CHECK_FR(ctx, fs | fd);
4377 6ea83fed bellard
        GEN_LOAD_FREG_FTN(DT0, fs);
4378 6ea83fed bellard
        gen_op_float_mov_d();
4379 6ea83fed bellard
        GEN_STORE_FTN_FREG(fd, DT2);
4380 6ea83fed bellard
        opn = "mov.d";
4381 6ea83fed bellard
        break;
4382 6ea83fed bellard
    case FOP(7, 17):
4383 6ea83fed bellard
        CHECK_FR(ctx, fs | fd);
4384 6ea83fed bellard
        GEN_LOAD_FREG_FTN(DT0, fs);
4385 6ea83fed bellard
        gen_op_float_chs_d();
4386 6ea83fed bellard
        GEN_STORE_FTN_FREG(fd, DT2);
4387 6ea83fed bellard
        opn = "neg.d";
4388 6ea83fed bellard
        break;
4389 6ea83fed bellard
    /*  8 - round.l */
4390 6ea83fed bellard
    /*  9 - trunc.l */
4391 6ea83fed bellard
    /* 10 - ceil.l  */
4392 6ea83fed bellard
    /* 11 - floor.l */
4393 6ea83fed bellard
    case FOP(12, 17):
4394 00a709c7 ths
        CHECK_FR(ctx, fs);
4395 6ea83fed bellard
        GEN_LOAD_FREG_FTN(DT0, fs);
4396 6ea83fed bellard
        gen_op_float_roundw_d();
4397 6ea83fed bellard
        GEN_STORE_FTN_FREG(fd, WT2);
4398 6ea83fed bellard
        opn = "round.w.d";
4399 6ea83fed bellard
        break;
4400 6ea83fed bellard
    case FOP(13, 17):
4401 00a709c7 ths
        CHECK_FR(ctx, fs);
4402 6ea83fed bellard
        GEN_LOAD_FREG_FTN(DT0, fs);
4403 6ea83fed bellard
        gen_op_float_truncw_d();
4404 6ea83fed bellard
        GEN_STORE_FTN_FREG(fd, WT2);
4405 6ea83fed bellard
        opn = "trunc.w.d";
4406 6ea83fed bellard
        break;
4407 6ea83fed bellard
    case FOP(14, 17):
4408 00a709c7 ths
        CHECK_FR(ctx, fs);
4409 6ea83fed bellard
        GEN_LOAD_FREG_FTN(DT0, fs);
4410 6ea83fed bellard
        gen_op_float_ceilw_d();
4411 6ea83fed bellard
        GEN_STORE_FTN_FREG(fd, WT2);
4412 6ea83fed bellard
        opn = "ceil.w.d";
4413 6ea83fed bellard
        break;
4414 6ea83fed bellard
    case FOP(15, 17):
4415 00a709c7 ths
        CHECK_FR(ctx, fs);
4416 6ea83fed bellard
        GEN_LOAD_FREG_FTN(DT0, fs);
4417 6ea83fed bellard
        gen_op_float_floorw_d();
4418 6ea83fed bellard
        GEN_STORE_FTN_FREG(fd, WT2);
4419 7a387fff ths
        opn = "floor.w.d";
4420 6ea83fed bellard
        break;
4421 00a709c7 ths
    case FOP(33, 16):
4422 00a709c7 ths
        CHECK_FR(ctx, fd);
4423 dd016883 bellard
        GEN_LOAD_FREG_FTN(WT0, fs);
4424 dd016883 bellard
        gen_op_float_cvtd_s();
4425 dd016883 bellard
        GEN_STORE_FTN_FREG(fd, DT2);
4426 dd016883 bellard
        opn = "cvt.d.s";
4427 dd016883 bellard
        break;
4428 00a709c7 ths
    case FOP(33, 20):
4429 00a709c7 ths
        CHECK_FR(ctx, fd);
4430 6ea83fed bellard
        GEN_LOAD_FREG_FTN(WT0, fs);
4431 6ea83fed bellard
        gen_op_float_cvtd_w();
4432 6ea83fed bellard
        GEN_STORE_FTN_FREG(fd, DT2);
4433 6ea83fed bellard
        opn = "cvt.d.w";
4434 6ea83fed bellard
        break;
4435 6ea83fed bellard
    case FOP(48, 17):
4436 6ea83fed bellard
    case FOP(49, 17):
4437 6ea83fed bellard
    case FOP(50, 17):
4438 6ea83fed bellard
    case FOP(51, 17):
4439 6ea83fed bellard
    case FOP(52, 17):
4440 6ea83fed bellard
    case FOP(53, 17):
4441 6ea83fed bellard
    case FOP(54, 17):
4442 6ea83fed bellard
    case FOP(55, 17):
4443 6ea83fed bellard
    case FOP(56, 17):
4444 6ea83fed bellard
    case FOP(57, 17):
4445 6ea83fed bellard
    case FOP(58, 17):
4446 6ea83fed bellard
    case FOP(59, 17):
4447 6ea83fed bellard
    case FOP(60, 17):
4448 6ea83fed bellard
    case FOP(61, 17):
4449 6ea83fed bellard
    case FOP(62, 17):
4450 6ea83fed bellard
    case FOP(63, 17):
4451 6ea83fed bellard
        CHECK_FR(ctx, fs | ft);
4452 6ea83fed bellard
        GEN_LOAD_FREG_FTN(DT0, fs);
4453 6ea83fed bellard
        GEN_LOAD_FREG_FTN(DT1, ft);
4454 6ea83fed bellard
        gen_cmp_d(func-48);
4455 6ea83fed bellard
        opn = condnames[func-48];
4456 6ea83fed bellard
        break;
4457 6ea83fed bellard
    case FOP(0, 16):
4458 6ea83fed bellard
        GEN_LOAD_FREG_FTN(WT0, fs);
4459 6ea83fed bellard
        GEN_LOAD_FREG_FTN(WT1, ft);
4460 6ea83fed bellard
        gen_op_float_add_s();
4461 6ea83fed bellard
        GEN_STORE_FTN_FREG(fd, WT2);
4462 6ea83fed bellard
        opn = "add.s";
4463 6ea83fed bellard
        binary = 1;
4464 6ea83fed bellard
        break;
4465 6ea83fed bellard
    case FOP(1, 16):
4466 6ea83fed bellard
        GEN_LOAD_FREG_FTN(WT0, fs);
4467 6ea83fed bellard
        GEN_LOAD_FREG_FTN(WT1, ft);
4468 6ea83fed bellard
        gen_op_float_sub_s();
4469 6ea83fed bellard
        GEN_STORE_FTN_FREG(fd, WT2);
4470 6ea83fed bellard
        opn = "sub.s";
4471 6ea83fed bellard
        binary = 1;
4472 6ea83fed bellard
        break;
4473 6ea83fed bellard
    case FOP(2, 16):
4474 6ea83fed bellard
        GEN_LOAD_FREG_FTN(WT0, fs);
4475 6ea83fed bellard
        GEN_LOAD_FREG_FTN(WT1, ft);
4476 6ea83fed bellard
        gen_op_float_mul_s();
4477 6ea83fed bellard
        GEN_STORE_FTN_FREG(fd, WT2);
4478 6ea83fed bellard
        opn = "mul.s";
4479 6ea83fed bellard
        binary = 1;
4480 6ea83fed bellard
        break;
4481 6ea83fed bellard
    case FOP(3, 16):
4482 6ea83fed bellard
        GEN_LOAD_FREG_FTN(WT0, fs);
4483 6ea83fed bellard
        GEN_LOAD_FREG_FTN(WT1, ft);
4484 6ea83fed bellard
        gen_op_float_div_s();
4485 6ea83fed bellard
        GEN_STORE_FTN_FREG(fd, WT2);
4486 6ea83fed bellard
        opn = "div.s";
4487 6ea83fed bellard
        binary = 1;
4488 6ea83fed bellard
        break;
4489 6ea83fed bellard
    case FOP(4, 16):
4490 6ea83fed bellard
        GEN_LOAD_FREG_FTN(WT0, fs);
4491 6ea83fed bellard
        gen_op_float_sqrt_s();
4492 6ea83fed bellard
        GEN_STORE_FTN_FREG(fd, WT2);
4493 6ea83fed bellard
        opn = "sqrt.s";
4494 6ea83fed bellard
        break;
4495 6ea83fed bellard
    case FOP(5, 16):
4496 6ea83fed bellard
        GEN_LOAD_FREG_FTN(WT0, fs);
4497 6ea83fed bellard
        gen_op_float_abs_s();
4498 6ea83fed bellard
        GEN_STORE_FTN_FREG(fd, WT2);
4499 6ea83fed bellard
        opn = "abs.s";
4500 6ea83fed bellard
        break;
4501 6ea83fed bellard
    case FOP(6, 16):
4502 6ea83fed bellard
        GEN_LOAD_FREG_FTN(WT0, fs);
4503 6ea83fed bellard
        gen_op_float_mov_s();
4504 6ea83fed bellard
        GEN_STORE_FTN_FREG(fd, WT2);
4505 6ea83fed bellard
        opn = "mov.s";
4506 6ea83fed bellard
        break;
4507 6ea83fed bellard
    case FOP(7, 16):
4508 6ea83fed bellard
        GEN_LOAD_FREG_FTN(WT0, fs);
4509 6ea83fed bellard
        gen_op_float_chs_s();
4510 6ea83fed bellard
        GEN_STORE_FTN_FREG(fd, WT2);
4511 6ea83fed bellard
        opn = "neg.s";
4512 6ea83fed bellard
        break;
4513 6ea83fed bellard
    case FOP(12, 16):
4514 6ea83fed bellard
        GEN_LOAD_FREG_FTN(WT0, fs);
4515 6ea83fed bellard
        gen_op_float_roundw_s();
4516 6ea83fed bellard
        GEN_STORE_FTN_FREG(fd, WT2);
4517 6ea83fed bellard
        opn = "round.w.s";
4518 6ea83fed bellard
        break;
4519 6ea83fed bellard
    case FOP(13, 16):
4520 6ea83fed bellard
        GEN_LOAD_FREG_FTN(WT0, fs);
4521 6ea83fed bellard
        gen_op_float_truncw_s();
4522 6ea83fed bellard
        GEN_STORE_FTN_FREG(fd, WT2);
4523 6ea83fed bellard
        opn = "trunc.w.s";
4524 6ea83fed bellard
        break;
4525 00a709c7 ths
    case FOP(32, 17):
4526 00a709c7 ths
        CHECK_FR(ctx, fs);
4527 417f38f0 pbrook
        GEN_LOAD_FREG_FTN(DT0, fs);
4528 dd016883 bellard
        gen_op_float_cvts_d();
4529 dd016883 bellard
        GEN_STORE_FTN_FREG(fd, WT2);
4530 dd016883 bellard
        opn = "cvt.s.d";
4531 dd016883 bellard
        break;
4532 00a709c7 ths
    case FOP(32, 20):
4533 6ea83fed bellard
        GEN_LOAD_FREG_FTN(WT0, fs);
4534 6ea83fed bellard
        gen_op_float_cvts_w();
4535 6ea83fed bellard
        GEN_STORE_FTN_FREG(fd, WT2);
4536 6ea83fed bellard
        opn = "cvt.s.w";
4537 6ea83fed bellard
        break;
4538 00a709c7 ths
    case FOP(36, 16):
4539 6ea83fed bellard
        GEN_LOAD_FREG_FTN(WT0, fs);
4540 6ea83fed bellard
        gen_op_float_cvtw_s();
4541 6ea83fed bellard
        GEN_STORE_FTN_FREG(fd, WT2);
4542 6ea83fed bellard
        opn = "cvt.w.s";
4543 6ea83fed bellard
        break;
4544 00a709c7 ths
    case FOP(36, 17):
4545 00a709c7 ths
        CHECK_FR(ctx, fs);
4546 417f38f0 pbrook
        GEN_LOAD_FREG_FTN(DT0, fs);
4547 6ea83fed bellard
        gen_op_float_cvtw_d();
4548 6ea83fed bellard
        GEN_STORE_FTN_FREG(fd, WT2);
4549 6ea83fed bellard
        opn = "cvt.w.d";
4550 6ea83fed bellard
        break;
4551 6ea83fed bellard
    case FOP(48, 16):
4552 6ea83fed bellard
    case FOP(49, 16):
4553 6ea83fed bellard
    case FOP(50, 16):
4554 6ea83fed bellard
    case FOP(51, 16):
4555 6ea83fed bellard
    case FOP(52, 16):
4556 6ea83fed bellard
    case FOP(53, 16):
4557 6ea83fed bellard
    case FOP(54, 16):
4558 6ea83fed bellard
    case FOP(55, 16):
4559 6ea83fed bellard
    case FOP(56, 16):
4560 6ea83fed bellard
    case FOP(57, 16):
4561 6ea83fed bellard
    case FOP(58, 16):
4562 6ea83fed bellard
    case FOP(59, 16):
4563 6ea83fed bellard
    case FOP(60, 16):
4564 6ea83fed bellard
    case FOP(61, 16):
4565 6ea83fed bellard
    case FOP(62, 16):
4566 6ea83fed bellard
    case FOP(63, 16):
4567 6ea83fed bellard
        GEN_LOAD_FREG_FTN(WT0, fs);
4568 6ea83fed bellard
        GEN_LOAD_FREG_FTN(WT1, ft);
4569 6ea83fed bellard
        gen_cmp_s(func-48);
4570 6ea83fed bellard
        opn = condnames[func-48];
4571 6ea83fed bellard
        break;
4572 6ea83fed bellard
    default:    
4573 6ea83fed bellard
        if (loglevel & CPU_LOG_TB_IN_ASM) {
4574 7a387fff ths
            fprintf(logfile, "Invalid FP arith function: %08x %03x %03x %03x\n",
4575 6ea83fed bellard
                    ctx->opcode, ctx->opcode >> 26, ctx->opcode & 0x3F,
4576 6ea83fed bellard
                    ((ctx->opcode >> 16) & 0x1F));
4577 6ea83fed bellard
        }
4578 e397ee33 ths
        generate_exception (ctx, EXCP_RI);
4579 6ea83fed bellard
        return;
4580 6ea83fed bellard
    }
4581 6ea83fed bellard
    if (binary)
4582 6ea83fed bellard
        MIPS_DEBUG("%s %s, %s, %s", opn, fregnames[fd], fregnames[fs], fregnames[ft]);
4583 6ea83fed bellard
    else
4584 6ea83fed bellard
        MIPS_DEBUG("%s %s,%s", opn, fregnames[fd], fregnames[fs]);
4585 6ea83fed bellard
}
4586 6af0bf9c bellard
4587 7a387fff ths
static void gen_movci (DisasContext *ctx, int rd, int rs, int cc, int tf)
4588 7a387fff ths
{
4589 7a387fff ths
    uint32_t ccbit;
4590 7a387fff ths
4591 7a387fff ths
    if (cc)
4592 7a387fff ths
        ccbit = 1 << (24 + cc);
4593 7a387fff ths
    else
4594 7a387fff ths
        ccbit = 1 << 23;
4595 7a387fff ths
    if (!tf)
4596 7a387fff ths
        gen_op_movf(ccbit, rd, rs);
4597 7a387fff ths
    else
4598 7a387fff ths
       gen_op_movt(ccbit, rd, rs);
4599 7a387fff ths
}
4600 7a387fff ths
4601 7a387fff ths
/* ISA extensions (ASEs) */
4602 6af0bf9c bellard
/* MIPS16 extension to MIPS32 */
4603 6af0bf9c bellard
/* SmartMIPS extension to MIPS32 */
4604 6af0bf9c bellard
4605 60aa19ab ths
#ifdef TARGET_MIPS64
4606 6af0bf9c bellard
/* Coprocessor 3 (FPU) */
4607 6af0bf9c bellard
4608 6af0bf9c bellard
/* MDMX extension to MIPS64 */
4609 6af0bf9c bellard
/* MIPS-3D extension to MIPS64 */
4610 6af0bf9c bellard
4611 6af0bf9c bellard
#endif
4612 6af0bf9c bellard
4613 c53be334 bellard
static void gen_blikely(DisasContext *ctx)
4614 c53be334 bellard
{
4615 eeef26cd bellard
    int l1;
4616 eeef26cd bellard
    l1 = gen_new_label();
4617 eeef26cd bellard
    gen_op_jnz_T2(l1);
4618 4ad40f36 bellard
    gen_op_save_state(ctx->hflags & ~MIPS_HFLAG_BMASK);
4619 eeef26cd bellard
    gen_goto_tb(ctx, 1, ctx->pc + 4);
4620 eeef26cd bellard
    gen_set_label(l1);
4621 c53be334 bellard
}
4622 c53be334 bellard
4623 36d23958 ths
static void decode_opc (CPUState *env, DisasContext *ctx)
4624 6af0bf9c bellard
{
4625 6af0bf9c bellard
    int32_t offset;
4626 6af0bf9c bellard
    int rs, rt, rd, sa;
4627 7a387fff ths
    uint32_t op, op1, op2;
4628 6af0bf9c bellard
    int16_t imm;
4629 6af0bf9c bellard
4630 d796321b bellard
    /* make sure instructions are on a word boundary */
4631 d796321b bellard
    if (ctx->pc & 0x3) {
4632 cbeb0857 ths
        env->CP0_BadVAddr = ctx->pc;
4633 d796321b bellard
        generate_exception(ctx, EXCP_AdEL);
4634 d796321b bellard
        return;
4635 d796321b bellard
    }
4636 d796321b bellard
4637 4ad40f36 bellard
    if ((ctx->hflags & MIPS_HFLAG_BMASK) == MIPS_HFLAG_BL) {
4638 6af0bf9c bellard
        /* Handle blikely not taken case */
4639 3594c774 ths
        MIPS_DEBUG("blikely condition (" TARGET_FMT_lx ")", ctx->pc + 4);
4640 c53be334 bellard
        gen_blikely(ctx);
4641 6af0bf9c bellard
    }
4642 7a387fff ths
    op = MASK_OP_MAJOR(ctx->opcode);
4643 7a387fff ths
    rs = (ctx->opcode >> 21) & 0x1f;
4644 7a387fff ths
    rt = (ctx->opcode >> 16) & 0x1f;
4645 7a387fff ths
    rd = (ctx->opcode >> 11) & 0x1f;
4646 7a387fff ths
    sa = (ctx->opcode >> 6) & 0x1f;
4647 6af0bf9c bellard
    imm = (int16_t)ctx->opcode;
4648 6af0bf9c bellard
    switch (op) {
4649 7a387fff ths
    case OPC_SPECIAL:
4650 7a387fff ths
        op1 = MASK_SPECIAL(ctx->opcode);
4651 6af0bf9c bellard
        switch (op1) {
4652 7a387fff ths
        case OPC_SLL:          /* Arithmetic with immediate */
4653 7a387fff ths
        case OPC_SRL ... OPC_SRA:
4654 7a387fff ths
            gen_arith_imm(ctx, op1, rd, rt, sa);
4655 7a387fff ths
            break;
4656 7a387fff ths
        case OPC_SLLV:         /* Arithmetic */
4657 7a387fff ths
        case OPC_SRLV ... OPC_SRAV:
4658 7a387fff ths
        case OPC_MOVZ ... OPC_MOVN:
4659 7a387fff ths
        case OPC_ADD ... OPC_NOR:
4660 7a387fff ths
        case OPC_SLT ... OPC_SLTU:
4661 7a387fff ths
            gen_arith(ctx, op1, rd, rs, rt);
4662 7a387fff ths
            break;
4663 7a387fff ths
        case OPC_MULT ... OPC_DIVU:
4664 7a387fff ths
            gen_muldiv(ctx, op1, rs, rt);
4665 7a387fff ths
            break;
4666 7a387fff ths
        case OPC_JR ... OPC_JALR:
4667 7a387fff ths
            gen_compute_branch(ctx, op1, rs, rd, sa);
4668 6af0bf9c bellard
            return;
4669 7a387fff ths
        case OPC_TGE ... OPC_TEQ: /* Traps */
4670 7a387fff ths
        case OPC_TNE:
4671 7a387fff ths
            gen_trap(ctx, op1, rs, rt, -1);
4672 6af0bf9c bellard
            break;
4673 7a387fff ths
        case OPC_MFHI:          /* Move from HI/LO */
4674 7a387fff ths
        case OPC_MFLO:
4675 7a387fff ths
            gen_HILO(ctx, op1, rd);
4676 6af0bf9c bellard
            break;
4677 7a387fff ths
        case OPC_MTHI:
4678 7a387fff ths
        case OPC_MTLO:          /* Move to HI/LO */
4679 7a387fff ths
            gen_HILO(ctx, op1, rs);
4680 6af0bf9c bellard
            break;
4681 7a387fff ths
        case OPC_PMON:          /* Pmon entry point */
4682 7a387fff ths
            gen_op_pmon(sa);
4683 7a387fff ths
            break;
4684 7a387fff ths
        case OPC_SYSCALL:
4685 6af0bf9c bellard
            generate_exception(ctx, EXCP_SYSCALL);
4686 7a387fff ths
            ctx->bstate = BS_EXCP;
4687 6af0bf9c bellard
            break;
4688 7a387fff ths
        case OPC_BREAK:
4689 6af0bf9c bellard
            generate_exception(ctx, EXCP_BREAK);
4690 6af0bf9c bellard
            break;
4691 7a387fff ths
        case OPC_SPIM:        /* SPIM ? */
4692 7a387fff ths
           /* Implemented as RI exception for now. */
4693 7a387fff ths
            MIPS_INVAL("spim (unofficial)");
4694 7a387fff ths
            generate_exception(ctx, EXCP_RI);
4695 6af0bf9c bellard
            break;
4696 7a387fff ths
        case OPC_SYNC:
4697 7a387fff ths
            /* Treat as a noop. */
4698 6af0bf9c bellard
            break;
4699 4ad40f36 bellard
4700 7a387fff ths
        case OPC_MOVCI:
4701 36d23958 ths
            if (env->CP0_Config1 & (1 << CP0C1_FP)) {
4702 e397ee33 ths
                save_cpu_state(ctx, 1);
4703 36d23958 ths
                gen_op_cp1_enabled();
4704 36d23958 ths
                gen_movci(ctx, rd, rs, (ctx->opcode >> 18) & 0x7,
4705 36d23958 ths
                          (ctx->opcode >> 16) & 1);
4706 36d23958 ths
            } else {
4707 e397ee33 ths
                generate_exception_err(ctx, EXCP_CpU, 1);
4708 36d23958 ths
            }
4709 4ad40f36 bellard
            break;
4710 4ad40f36 bellard
4711 60aa19ab ths
#ifdef TARGET_MIPS64
4712 7a387fff ths
       /* MIPS64 specific opcodes */
4713 7a387fff ths
        case OPC_DSLL:
4714 7a387fff ths
        case OPC_DSRL ... OPC_DSRA:
4715 7a387fff ths
        case OPC_DSLL32:
4716 7a387fff ths
        case OPC_DSRL32 ... OPC_DSRA32:
4717 7a387fff ths
            gen_arith_imm(ctx, op1, rd, rt, sa);
4718 7a387fff ths
            break;
4719 7a387fff ths
        case OPC_DSLLV:
4720 7a387fff ths
        case OPC_DSRLV ... OPC_DSRAV:
4721 7a387fff ths
        case OPC_DADD ... OPC_DSUBU:
4722 7a387fff ths
            gen_arith(ctx, op1, rd, rs, rt);
4723 7a387fff ths
            break;
4724 7a387fff ths
        case OPC_DMULT ... OPC_DDIVU:
4725 7a387fff ths
            gen_muldiv(ctx, op1, rs, rt);
4726 7a387fff ths
            break;
4727 6af0bf9c bellard
#endif
4728 6af0bf9c bellard
        default:            /* Invalid */
4729 6af0bf9c bellard
            MIPS_INVAL("special");
4730 6af0bf9c bellard
            generate_exception(ctx, EXCP_RI);
4731 6af0bf9c bellard
            break;
4732 6af0bf9c bellard
        }
4733 6af0bf9c bellard
        break;
4734 7a387fff ths
    case OPC_SPECIAL2:
4735 7a387fff ths
        op1 = MASK_SPECIAL2(ctx->opcode);
4736 6af0bf9c bellard
        switch (op1) {
4737 7a387fff ths
        case OPC_MADD ... OPC_MADDU: /* Multiply and add/sub */
4738 7a387fff ths
        case OPC_MSUB ... OPC_MSUBU:
4739 7a387fff ths
            gen_muldiv(ctx, op1, rs, rt);
4740 6af0bf9c bellard
            break;
4741 7a387fff ths
        case OPC_MUL:
4742 7a387fff ths
            gen_arith(ctx, op1, rd, rs, rt);
4743 6af0bf9c bellard
            break;
4744 7a387fff ths
        case OPC_CLZ ... OPC_CLO:
4745 7a387fff ths
            gen_cl(ctx, op1, rd, rs);
4746 6af0bf9c bellard
            break;
4747 7a387fff ths
        case OPC_SDBBP:
4748 6af0bf9c bellard
            /* XXX: not clear which exception should be raised
4749 6af0bf9c bellard
             *      when in debug mode...
4750 6af0bf9c bellard
             */
4751 6af0bf9c bellard
            if (!(ctx->hflags & MIPS_HFLAG_DM)) {
4752 6af0bf9c bellard
                generate_exception(ctx, EXCP_DBp);
4753 6af0bf9c bellard
            } else {
4754 6af0bf9c bellard
                generate_exception(ctx, EXCP_DBp);
4755 6af0bf9c bellard
            }
4756 6af0bf9c bellard
            /* Treat as a noop */
4757 6af0bf9c bellard
            break;
4758 60aa19ab ths
#ifdef TARGET_MIPS64
4759 7a387fff ths
        case OPC_DCLZ ... OPC_DCLO:
4760 7a387fff ths
            gen_cl(ctx, op1, rd, rs);
4761 7a387fff ths
            break;
4762 7a387fff ths
#endif
4763 6af0bf9c bellard
        default:            /* Invalid */
4764 6af0bf9c bellard
            MIPS_INVAL("special2");
4765 6af0bf9c bellard
            generate_exception(ctx, EXCP_RI);
4766 6af0bf9c bellard
            break;
4767 6af0bf9c bellard
        }
4768 6af0bf9c bellard
        break;
4769 7a387fff ths
    case OPC_SPECIAL3:
4770 1579a72e ths
         op1 = MASK_SPECIAL3(ctx->opcode);
4771 1579a72e ths
         switch (op1) {
4772 1579a72e ths
         case OPC_EXT:
4773 1579a72e ths
         case OPC_INS:
4774 1579a72e ths
             gen_bitops(ctx, op1, rt, rs, sa, rd);
4775 1579a72e ths
             break;
4776 1579a72e ths
         case OPC_BSHFL:
4777 1579a72e ths
             op2 = MASK_BSHFL(ctx->opcode);
4778 1579a72e ths
             switch (op2) {
4779 1579a72e ths
             case OPC_WSBH:
4780 1579a72e ths
                 GEN_LOAD_REG_TN(T1, rt);
4781 1579a72e ths
                 gen_op_wsbh();
4782 1579a72e ths
                 break;
4783 1579a72e ths
             case OPC_SEB:
4784 1579a72e ths
                 GEN_LOAD_REG_TN(T1, rt);
4785 1579a72e ths
                 gen_op_seb();
4786 1579a72e ths
                 break;
4787 1579a72e ths
             case OPC_SEH:
4788 1579a72e ths
                 GEN_LOAD_REG_TN(T1, rt);
4789 1579a72e ths
                 gen_op_seh();
4790 1579a72e ths
                 break;
4791 1579a72e ths
             default:            /* Invalid */
4792 1579a72e ths
                 MIPS_INVAL("bshfl");
4793 1579a72e ths
                 generate_exception(ctx, EXCP_RI);
4794 1579a72e ths
                 break;
4795 1579a72e ths
            }
4796 1579a72e ths
            GEN_STORE_TN_REG(rd, T0);
4797 7a387fff ths
            break;
4798 1579a72e ths
        case OPC_RDHWR:
4799 1579a72e ths
            switch (rd) {
4800 1579a72e ths
            case 0:
4801 1579a72e ths
                gen_op_rdhwr_cpunum();
4802 7a387fff ths
                break;
4803 1579a72e ths
            case 1:
4804 1579a72e ths
                gen_op_rdhwr_synci_step();
4805 7a387fff ths
                break;
4806 1579a72e ths
            case 2:
4807 1579a72e ths
                gen_op_rdhwr_cc();
4808 7a387fff ths
                break;
4809 1579a72e ths
            case 3:
4810 1579a72e ths
                gen_op_rdhwr_ccres();
4811 7a387fff ths
                break;
4812 1579a72e ths
            case 29:
4813 6f5b89a0 ths
#if defined (CONFIG_USER_ONLY)
4814 1579a72e ths
                gen_op_tls_value ();
4815 1579a72e ths
#else
4816 1579a72e ths
                generate_exception(ctx, EXCP_RI);
4817 6f5b89a0 ths
#endif
4818 1579a72e ths
                break;
4819 1579a72e ths
            case 30:
4820 1579a72e ths
                /* Implementation dependent */;
4821 1579a72e ths
                gen_op_rdhwr_unimpl30();
4822 1579a72e ths
                break;
4823 1579a72e ths
            case 31:
4824 1579a72e ths
                /* Implementation dependent */;
4825 1579a72e ths
                gen_op_rdhwr_unimpl31();
4826 1579a72e ths
                break;
4827 1579a72e ths
            default:            /* Invalid */
4828 1579a72e ths
                MIPS_INVAL("rdhwr");
4829 1579a72e ths
                generate_exception(ctx, EXCP_RI);
4830 1579a72e ths
                break;
4831 1579a72e ths
            }
4832 1579a72e ths
            GEN_STORE_TN_REG(rt, T0);
4833 1579a72e ths
            break;
4834 60aa19ab ths
#ifdef TARGET_MIPS64
4835 1579a72e ths
        case OPC_DEXTM ... OPC_DEXT:
4836 1579a72e ths
        case OPC_DINSM ... OPC_DINS:
4837 1579a72e ths
            gen_bitops(ctx, op1, rt, rs, sa, rd);
4838 7a387fff ths
            break;
4839 1579a72e ths
        case OPC_DBSHFL:
4840 1579a72e ths
            op2 = MASK_DBSHFL(ctx->opcode);
4841 1579a72e ths
            switch (op2) {
4842 1579a72e ths
            case OPC_DSBH:
4843 1579a72e ths
                GEN_LOAD_REG_TN(T1, rt);
4844 1579a72e ths
                gen_op_dsbh();
4845 1579a72e ths
                break;
4846 1579a72e ths
            case OPC_DSHD:
4847 1579a72e ths
                GEN_LOAD_REG_TN(T1, rt);
4848 1579a72e ths
                gen_op_dshd();
4849 1579a72e ths
                break;
4850 7a387fff ths
            default:            /* Invalid */
4851 7a387fff ths
                MIPS_INVAL("dbshfl");
4852 7a387fff ths
                generate_exception(ctx, EXCP_RI);
4853 7a387fff ths
                break;
4854 1579a72e ths
            }
4855 1579a72e ths
            GEN_STORE_TN_REG(rd, T0);
4856 7a387fff ths
#endif
4857 7a387fff ths
        default:            /* Invalid */
4858 7a387fff ths
            MIPS_INVAL("special3");
4859 7a387fff ths
            generate_exception(ctx, EXCP_RI);
4860 7a387fff ths
            break;
4861 7a387fff ths
        }
4862 7a387fff ths
        break;
4863 7a387fff ths
    case OPC_REGIMM:
4864 7a387fff ths
        op1 = MASK_REGIMM(ctx->opcode);
4865 7a387fff ths
        switch (op1) {
4866 7a387fff ths
        case OPC_BLTZ ... OPC_BGEZL: /* REGIMM branches */
4867 7a387fff ths
        case OPC_BLTZAL ... OPC_BGEZALL:
4868 7a387fff ths
            gen_compute_branch(ctx, op1, rs, -1, imm << 2);
4869 6af0bf9c bellard
            return;
4870 7a387fff ths
        case OPC_TGEI ... OPC_TEQI: /* REGIMM traps */
4871 7a387fff ths
        case OPC_TNEI:
4872 7a387fff ths
            gen_trap(ctx, op1, rs, -1, imm);
4873 7a387fff ths
            break;
4874 7a387fff ths
        case OPC_SYNCI:
4875 24c7b0e3 ths
            /* treat as noop */
4876 6af0bf9c bellard
            break;
4877 6af0bf9c bellard
        default:            /* Invalid */
4878 6af0bf9c bellard
            MIPS_INVAL("REGIMM");
4879 6af0bf9c bellard
            generate_exception(ctx, EXCP_RI);
4880 6af0bf9c bellard
            break;
4881 6af0bf9c bellard
        }
4882 6af0bf9c bellard
        break;
4883 7a387fff ths
    case OPC_CP0:
4884 f41c52f1 ths
        save_cpu_state(ctx, 1);
4885 24c7b0e3 ths
        gen_op_cp0_enabled();
4886 7a387fff ths
        op1 = MASK_CP0(ctx->opcode);
4887 6af0bf9c bellard
        switch (op1) {
4888 7a387fff ths
        case OPC_MFC0:
4889 7a387fff ths
        case OPC_MTC0:
4890 60aa19ab ths
#ifdef TARGET_MIPS64
4891 7a387fff ths
        case OPC_DMFC0:
4892 7a387fff ths
        case OPC_DMTC0:
4893 7a387fff ths
#endif
4894 7a387fff ths
            gen_cp0(ctx, op1, rt, rd);
4895 7a387fff ths
            break;
4896 7a387fff ths
        case OPC_C0_FIRST ... OPC_C0_LAST:
4897 7a387fff ths
            gen_cp0(ctx, MASK_C0(ctx->opcode), rt, rd);
4898 7a387fff ths
            break;
4899 7a387fff ths
        case OPC_MFMC0:
4900 7a387fff ths
            op2 = MASK_MFMC0(ctx->opcode);
4901 7a387fff ths
            switch (op2) {
4902 7a387fff ths
            case OPC_DI:
4903 7a387fff ths
                gen_op_di();
4904 7a387fff ths
                /* Stop translation as we may have switched the execution mode */
4905 7a387fff ths
                ctx->bstate = BS_STOP;
4906 7a387fff ths
                break;
4907 7a387fff ths
            case OPC_EI:
4908 7a387fff ths
                gen_op_ei();
4909 7a387fff ths
                /* Stop translation as we may have switched the execution mode */
4910 7a387fff ths
                ctx->bstate = BS_STOP;
4911 7a387fff ths
                break;
4912 7a387fff ths
            default:            /* Invalid */
4913 7a387fff ths
                MIPS_INVAL("MFMC0");
4914 7a387fff ths
                generate_exception(ctx, EXCP_RI);
4915 7a387fff ths
                break;
4916 7a387fff ths
            }
4917 7a387fff ths
            GEN_STORE_TN_REG(rt, T0);
4918 6af0bf9c bellard
            break;
4919 7a387fff ths
        case OPC_RDPGPR:
4920 7a387fff ths
        case OPC_WRPGPR:
4921 38121543 ths
            if ((env->CP0_Config0 & (0x7 << CP0C0_AR)) == (1 << CP0C0_AR)) {
4922 38121543 ths
                /* Shadow registers not implemented. */
4923 38121543 ths
                GEN_LOAD_REG_TN(T0, rt);
4924 38121543 ths
                GEN_STORE_TN_REG(rd, T0);
4925 38121543 ths
            } else
4926 38121543 ths
                generate_exception(ctx, EXCP_RI);
4927 38121543 ths
            break;
4928 6af0bf9c bellard
        default:
4929 7a387fff ths
            generate_exception(ctx, EXCP_RI);
4930 6af0bf9c bellard
            break;
4931 6af0bf9c bellard
        }
4932 6af0bf9c bellard
        break;
4933 7a387fff ths
    case OPC_ADDI ... OPC_LUI: /* Arithmetic with immediate opcode */
4934 7a387fff ths
         gen_arith_imm(ctx, op, rt, rs, imm);
4935 7a387fff ths
         break;
4936 7a387fff ths
    case OPC_J ... OPC_JAL: /* Jump */
4937 7a387fff ths
         offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
4938 7a387fff ths
         gen_compute_branch(ctx, op, rs, rt, offset);
4939 7a387fff ths
         return;
4940 7a387fff ths
    case OPC_BEQ ... OPC_BGTZ: /* Branch */
4941 7a387fff ths
    case OPC_BEQL ... OPC_BGTZL:
4942 7a387fff ths
         gen_compute_branch(ctx, op, rs, rt, imm << 2);
4943 7a387fff ths
         return;
4944 7a387fff ths
    case OPC_LB ... OPC_LWR: /* Load and stores */
4945 7a387fff ths
    case OPC_SB ... OPC_SW:
4946 7a387fff ths
    case OPC_SWR:
4947 7a387fff ths
    case OPC_LL:
4948 7a387fff ths
    case OPC_SC:
4949 7a387fff ths
         gen_ldst(ctx, op, rt, rs, imm);
4950 7a387fff ths
         break;
4951 7a387fff ths
    case OPC_CACHE:
4952 7a387fff ths
         /* Treat as a noop */
4953 7a387fff ths
         break;
4954 7a387fff ths
    case OPC_PREF:
4955 6af0bf9c bellard
        /* Treat as a noop */
4956 6af0bf9c bellard
        break;
4957 4ad40f36 bellard
4958 4ad40f36 bellard
    /* Floating point.  */
4959 7a387fff ths
    case OPC_LWC1:
4960 7a387fff ths
    case OPC_LDC1:
4961 7a387fff ths
    case OPC_SWC1:
4962 7a387fff ths
    case OPC_SDC1:
4963 36d23958 ths
        if (env->CP0_Config1 & (1 << CP0C1_FP)) {
4964 36d23958 ths
            save_cpu_state(ctx, 1);
4965 36d23958 ths
            gen_op_cp1_enabled();
4966 36d23958 ths
            gen_flt_ldst(ctx, op, rt, rs, imm);
4967 36d23958 ths
        } else {
4968 36d23958 ths
            generate_exception_err(ctx, EXCP_CpU, 1);
4969 36d23958 ths
        }
4970 6ea83fed bellard
        break;
4971 6ea83fed bellard
4972 7a387fff ths
    case OPC_CP1:
4973 36d23958 ths
        if (env->CP0_Config1 & (1 << CP0C1_FP)) {
4974 36d23958 ths
            save_cpu_state(ctx, 1);
4975 36d23958 ths
            gen_op_cp1_enabled();
4976 36d23958 ths
            op1 = MASK_CP1(ctx->opcode);
4977 36d23958 ths
            switch (op1) {
4978 36d23958 ths
            case OPC_MFC1:
4979 36d23958 ths
            case OPC_CFC1:
4980 36d23958 ths
            case OPC_MTC1:
4981 36d23958 ths
            case OPC_CTC1:
4982 60aa19ab ths
#ifdef TARGET_MIPS64
4983 36d23958 ths
            case OPC_DMFC1:
4984 36d23958 ths
            case OPC_DMTC1:
4985 9c2149c8 ths
#endif
4986 36d23958 ths
                gen_cp1(ctx, op1, rt, rd);
4987 36d23958 ths
                break;
4988 36d23958 ths
            case OPC_BC1:
4989 36d23958 ths
                gen_compute_branch1(ctx, MASK_CP1_BCOND(ctx->opcode), imm << 2);
4990 36d23958 ths
                return;
4991 36d23958 ths
            case OPC_S_FMT:
4992 36d23958 ths
            case OPC_D_FMT:
4993 36d23958 ths
            case OPC_W_FMT:
4994 36d23958 ths
            case OPC_L_FMT:
4995 36d23958 ths
                gen_farith(ctx, MASK_CP1_FUNC(ctx->opcode), rt, rd, sa);
4996 36d23958 ths
                break;
4997 36d23958 ths
            default:
4998 e397ee33 ths
                generate_exception (ctx, EXCP_RI);
4999 36d23958 ths
                break;
5000 36d23958 ths
            }
5001 36d23958 ths
        } else {
5002 36d23958 ths
            generate_exception_err(ctx, EXCP_CpU, 1);
5003 6ea83fed bellard
        }
5004 4ad40f36 bellard
        break;
5005 4ad40f36 bellard
5006 4ad40f36 bellard
    /* COP2.  */
5007 7a387fff ths
    case OPC_LWC2:
5008 7a387fff ths
    case OPC_LDC2:
5009 7a387fff ths
    case OPC_SWC2:
5010 7a387fff ths
    case OPC_SDC2:
5011 7a387fff ths
    case OPC_CP2:
5012 7a387fff ths
        /* COP2: Not implemented. */
5013 4ad40f36 bellard
        generate_exception_err(ctx, EXCP_CpU, 2);
5014 4ad40f36 bellard
        break;
5015 4ad40f36 bellard
5016 7a387fff ths
    case OPC_CP3:
5017 36d23958 ths
        if (env->CP0_Config1 & (1 << CP0C1_FP)) {
5018 e397ee33 ths
            save_cpu_state(ctx, 1);
5019 36d23958 ths
            gen_op_cp1_enabled();
5020 36d23958 ths
            op1 = MASK_CP3(ctx->opcode);
5021 36d23958 ths
            switch (op1) {
5022 36d23958 ths
            /* Not implemented */
5023 36d23958 ths
            default:
5024 e397ee33 ths
                generate_exception (ctx, EXCP_RI);
5025 36d23958 ths
                break;
5026 36d23958 ths
            }
5027 36d23958 ths
        } else {
5028 e397ee33 ths
            generate_exception_err(ctx, EXCP_CpU, 1);
5029 7a387fff ths
        }
5030 4ad40f36 bellard
        break;
5031 4ad40f36 bellard
5032 60aa19ab ths
#ifdef TARGET_MIPS64
5033 7a387fff ths
    /* MIPS64 opcodes */
5034 7a387fff ths
    case OPC_LWU:
5035 7a387fff ths
    case OPC_LDL ... OPC_LDR:
5036 7a387fff ths
    case OPC_SDL ... OPC_SDR:
5037 7a387fff ths
    case OPC_LLD:
5038 7a387fff ths
    case OPC_LD:
5039 7a387fff ths
    case OPC_SCD:
5040 7a387fff ths
    case OPC_SD:
5041 7a387fff ths
        gen_ldst(ctx, op, rt, rs, imm);
5042 7a387fff ths
        break;
5043 7a387fff ths
    case OPC_DADDI ... OPC_DADDIU:
5044 7a387fff ths
        gen_arith_imm(ctx, op, rt, rs, imm);
5045 7a387fff ths
        break;
5046 6af0bf9c bellard
#endif
5047 7a387fff ths
#ifdef MIPS_HAS_MIPS16
5048 7a387fff ths
    case OPC_JALX:
5049 7a387fff ths
        /* MIPS16: Not implemented. */
5050 7a387fff ths
#endif
5051 7a387fff ths
#ifdef MIPS_HAS_MDMX
5052 7a387fff ths
    case OPC_MDMX:
5053 7a387fff ths
        /* MDMX: Not implemented. */
5054 6af0bf9c bellard
#endif
5055 6af0bf9c bellard
    default:            /* Invalid */
5056 6af0bf9c bellard
        MIPS_INVAL("");
5057 6af0bf9c bellard
        generate_exception(ctx, EXCP_RI);
5058 6af0bf9c bellard
        break;
5059 6af0bf9c bellard
    }
5060 4ad40f36 bellard
    if (ctx->hflags & MIPS_HFLAG_BMASK) {
5061 c53f4a62 ths
        int hflags = ctx->hflags & MIPS_HFLAG_BMASK;
5062 6af0bf9c bellard
        /* Branches completion */
5063 4ad40f36 bellard
        ctx->hflags &= ~MIPS_HFLAG_BMASK;
5064 6af0bf9c bellard
        ctx->bstate = BS_BRANCH;
5065 6af0bf9c bellard
        save_cpu_state(ctx, 0);
5066 6af0bf9c bellard
        switch (hflags & MIPS_HFLAG_BMASK) {
5067 6af0bf9c bellard
        case MIPS_HFLAG_B:
5068 6af0bf9c bellard
            /* unconditional branch */
5069 6af0bf9c bellard
            MIPS_DEBUG("unconditional branch");
5070 6e256c93 bellard
            gen_goto_tb(ctx, 0, ctx->btarget);
5071 6af0bf9c bellard
            break;
5072 6af0bf9c bellard
        case MIPS_HFLAG_BL:
5073 6af0bf9c bellard
            /* blikely taken case */
5074 6af0bf9c bellard
            MIPS_DEBUG("blikely branch taken");
5075 6e256c93 bellard
            gen_goto_tb(ctx, 0, ctx->btarget);
5076 6af0bf9c bellard
            break;
5077 6af0bf9c bellard
        case MIPS_HFLAG_BC:
5078 6af0bf9c bellard
            /* Conditional branch */
5079 6af0bf9c bellard
            MIPS_DEBUG("conditional branch");
5080 c53be334 bellard
            {
5081 c53be334 bellard
              int l1;
5082 c53be334 bellard
              l1 = gen_new_label();
5083 c53be334 bellard
              gen_op_jnz_T2(l1);
5084 6e256c93 bellard
              gen_goto_tb(ctx, 1, ctx->pc + 4);
5085 eeef26cd bellard
              gen_set_label(l1);
5086 eeef26cd bellard
              gen_goto_tb(ctx, 0, ctx->btarget);
5087 c53be334 bellard
            }
5088 6af0bf9c bellard
            break;
5089 6af0bf9c bellard
        case MIPS_HFLAG_BR:
5090 6af0bf9c bellard
            /* unconditional branch to register */
5091 6af0bf9c bellard
            MIPS_DEBUG("branch to register");
5092 6af0bf9c bellard
            gen_op_breg();
5093 6af0bf9c bellard
            break;
5094 6af0bf9c bellard
        default:
5095 6af0bf9c bellard
            MIPS_DEBUG("unknown branch");
5096 6af0bf9c bellard
            break;
5097 6af0bf9c bellard
        }
5098 6af0bf9c bellard
    }
5099 6af0bf9c bellard
}
5100 6af0bf9c bellard
5101 820e00f2 ths
static inline int
5102 820e00f2 ths
gen_intermediate_code_internal (CPUState *env, TranslationBlock *tb,
5103 820e00f2 ths
                                int search_pc)
5104 6af0bf9c bellard
{
5105 6af0bf9c bellard
    DisasContext ctx, *ctxp = &ctx;
5106 6af0bf9c bellard
    target_ulong pc_start;
5107 6af0bf9c bellard
    uint16_t *gen_opc_end;
5108 6af0bf9c bellard
    int j, lj = -1;
5109 6af0bf9c bellard
5110 4ad40f36 bellard
    if (search_pc && loglevel)
5111 6ea83fed bellard
        fprintf (logfile, "search pc %d\n", search_pc);
5112 4ad40f36 bellard
5113 6af0bf9c bellard
    pc_start = tb->pc;
5114 6af0bf9c bellard
    gen_opc_ptr = gen_opc_buf;
5115 6af0bf9c bellard
    gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
5116 6af0bf9c bellard
    gen_opparam_ptr = gen_opparam_buf;
5117 c53be334 bellard
    nb_gen_labels = 0;
5118 6af0bf9c bellard
    ctx.pc = pc_start;
5119 4ad40f36 bellard
    ctx.saved_pc = -1;
5120 6af0bf9c bellard
    ctx.tb = tb;
5121 6af0bf9c bellard
    ctx.bstate = BS_NONE;
5122 4ad40f36 bellard
    /* Restore delay slot state from the tb context.  */
5123 4ad40f36 bellard
    ctx.hflags = tb->flags;
5124 6af0bf9c bellard
    ctx.saved_hflags = ctx.hflags;
5125 6af0bf9c bellard
    if (ctx.hflags & MIPS_HFLAG_BR) {
5126 6af0bf9c bellard
        gen_op_restore_breg_target();
5127 6af0bf9c bellard
    } else if (ctx.hflags & MIPS_HFLAG_B) {
5128 6af0bf9c bellard
        ctx.btarget = env->btarget;
5129 6af0bf9c bellard
    } else if (ctx.hflags & MIPS_HFLAG_BMASK) {
5130 6af0bf9c bellard
        /* If we are in the delay slot of a conditional branch,
5131 6af0bf9c bellard
         * restore the branch condition from env->bcond to T2
5132 6af0bf9c bellard
         */
5133 6af0bf9c bellard
        ctx.btarget = env->btarget;
5134 6af0bf9c bellard
        gen_op_restore_bcond();
5135 6af0bf9c bellard
    }
5136 6af0bf9c bellard
#if defined(CONFIG_USER_ONLY)
5137 6af0bf9c bellard
    ctx.mem_idx = 0;
5138 6af0bf9c bellard
#else
5139 3d9fb9fe bellard
    ctx.mem_idx = !((ctx.hflags & MIPS_HFLAG_MODE) == MIPS_HFLAG_UM);
5140 6af0bf9c bellard
#endif
5141 6af0bf9c bellard
    ctx.CP0_Status = env->CP0_Status;
5142 6af0bf9c bellard
#ifdef DEBUG_DISAS
5143 6af0bf9c bellard
    if (loglevel & CPU_LOG_TB_CPU) {
5144 6af0bf9c bellard
        fprintf(logfile, "------------------------------------------------\n");
5145 4ad40f36 bellard
        /* FIXME: This may print out stale hflags from env... */
5146 6af0bf9c bellard
        cpu_dump_state(env, logfile, fprintf, 0);
5147 6af0bf9c bellard
    }
5148 6af0bf9c bellard
#endif
5149 6af0bf9c bellard
#if defined MIPS_DEBUG_DISAS
5150 6af0bf9c bellard
    if (loglevel & CPU_LOG_TB_IN_ASM)
5151 4ad40f36 bellard
        fprintf(logfile, "\ntb %p super %d cond %04x\n",
5152 4ad40f36 bellard
                tb, ctx.mem_idx, ctx.hflags);
5153 6af0bf9c bellard
#endif
5154 6af0bf9c bellard
    while (ctx.bstate == BS_NONE && gen_opc_ptr < gen_opc_end) {
5155 4ad40f36 bellard
        if (env->nb_breakpoints > 0) {
5156 4ad40f36 bellard
            for(j = 0; j < env->nb_breakpoints; j++) {
5157 4ad40f36 bellard
                if (env->breakpoints[j] == ctx.pc) {
5158 4ad40f36 bellard
                    save_cpu_state(ctxp, 1);
5159 4ad40f36 bellard
                    ctx.bstate = BS_BRANCH;
5160 4ad40f36 bellard
                    gen_op_debug();
5161 4ad40f36 bellard
                    goto done_generating;
5162 4ad40f36 bellard
                }
5163 4ad40f36 bellard
            }
5164 4ad40f36 bellard
        }
5165 4ad40f36 bellard
5166 6af0bf9c bellard
        if (search_pc) {
5167 6af0bf9c bellard
            j = gen_opc_ptr - gen_opc_buf;
5168 6af0bf9c bellard
            if (lj < j) {
5169 6af0bf9c bellard
                lj++;
5170 6af0bf9c bellard
                while (lj < j)
5171 6af0bf9c bellard
                    gen_opc_instr_start[lj++] = 0;
5172 6af0bf9c bellard
            }
5173 4ad40f36 bellard
            gen_opc_pc[lj] = ctx.pc;
5174 4ad40f36 bellard
            gen_opc_hflags[lj] = ctx.hflags & MIPS_HFLAG_BMASK;
5175 4ad40f36 bellard
            gen_opc_instr_start[lj] = 1;
5176 6af0bf9c bellard
        }
5177 6af0bf9c bellard
        ctx.opcode = ldl_code(ctx.pc);
5178 36d23958 ths
        decode_opc(env, &ctx);
5179 6af0bf9c bellard
        ctx.pc += 4;
5180 4ad40f36 bellard
5181 4ad40f36 bellard
        if (env->singlestep_enabled)
5182 4ad40f36 bellard
            break;
5183 4ad40f36 bellard
5184 6af0bf9c bellard
        if ((ctx.pc & (TARGET_PAGE_SIZE - 1)) == 0)
5185 6af0bf9c bellard
            break;
5186 4ad40f36 bellard
5187 6af0bf9c bellard
#if defined (MIPS_SINGLE_STEP)
5188 6af0bf9c bellard
        break;
5189 6af0bf9c bellard
#endif
5190 6af0bf9c bellard
    }
5191 4ad40f36 bellard
    if (env->singlestep_enabled) {
5192 4ad40f36 bellard
        save_cpu_state(ctxp, ctx.bstate == BS_NONE);
5193 4ad40f36 bellard
        gen_op_debug();
5194 4ad40f36 bellard
        goto done_generating;
5195 4ad40f36 bellard
    }
5196 4ad40f36 bellard
    else if (ctx.bstate != BS_BRANCH && ctx.bstate != BS_EXCP) {
5197 6af0bf9c bellard
        save_cpu_state(ctxp, 0);
5198 6e256c93 bellard
        gen_goto_tb(&ctx, 0, ctx.pc);
5199 6af0bf9c bellard
    }
5200 6af0bf9c bellard
    gen_op_reset_T0();
5201 6af0bf9c bellard
    /* Generate the return instruction */
5202 6af0bf9c bellard
    gen_op_exit_tb();
5203 4ad40f36 bellard
done_generating:
5204 6af0bf9c bellard
    *gen_opc_ptr = INDEX_op_end;
5205 6af0bf9c bellard
    if (search_pc) {
5206 6af0bf9c bellard
        j = gen_opc_ptr - gen_opc_buf;
5207 6af0bf9c bellard
        lj++;
5208 6af0bf9c bellard
        while (lj <= j)
5209 6af0bf9c bellard
            gen_opc_instr_start[lj++] = 0;
5210 6af0bf9c bellard
        tb->size = 0;
5211 6af0bf9c bellard
    } else {
5212 6af0bf9c bellard
        tb->size = ctx.pc - pc_start;
5213 6af0bf9c bellard
    }
5214 6af0bf9c bellard
#ifdef DEBUG_DISAS
5215 6af0bf9c bellard
#if defined MIPS_DEBUG_DISAS
5216 6af0bf9c bellard
    if (loglevel & CPU_LOG_TB_IN_ASM)
5217 6af0bf9c bellard
        fprintf(logfile, "\n");
5218 6af0bf9c bellard
#endif
5219 6af0bf9c bellard
    if (loglevel & CPU_LOG_TB_IN_ASM) {
5220 6af0bf9c bellard
        fprintf(logfile, "IN: %s\n", lookup_symbol(pc_start));
5221 6ea83fed bellard
    target_disas(logfile, pc_start, ctx.pc - pc_start, 0);
5222 6af0bf9c bellard
        fprintf(logfile, "\n");
5223 6af0bf9c bellard
    }
5224 6af0bf9c bellard
    if (loglevel & CPU_LOG_TB_OP) {
5225 6af0bf9c bellard
        fprintf(logfile, "OP:\n");
5226 6af0bf9c bellard
        dump_ops(gen_opc_buf, gen_opparam_buf);
5227 6af0bf9c bellard
        fprintf(logfile, "\n");
5228 6af0bf9c bellard
    }
5229 6af0bf9c bellard
    if (loglevel & CPU_LOG_TB_CPU) {
5230 6af0bf9c bellard
        fprintf(logfile, "---------------- %d %08x\n", ctx.bstate, ctx.hflags);
5231 6af0bf9c bellard
    }
5232 6af0bf9c bellard
#endif
5233 6af0bf9c bellard
    
5234 6af0bf9c bellard
    return 0;
5235 6af0bf9c bellard
}
5236 6af0bf9c bellard
5237 6af0bf9c bellard
int gen_intermediate_code (CPUState *env, struct TranslationBlock *tb)
5238 6af0bf9c bellard
{
5239 6af0bf9c bellard
    return gen_intermediate_code_internal(env, tb, 0);
5240 6af0bf9c bellard
}
5241 6af0bf9c bellard
5242 6af0bf9c bellard
int gen_intermediate_code_pc (CPUState *env, struct TranslationBlock *tb)
5243 6af0bf9c bellard
{
5244 6af0bf9c bellard
    return gen_intermediate_code_internal(env, tb, 1);
5245 6af0bf9c bellard
}
5246 6af0bf9c bellard
5247 6ea83fed bellard
void fpu_dump_state(CPUState *env, FILE *f, 
5248 6ea83fed bellard
                    int (*fpu_fprintf)(FILE *f, const char *fmt, ...),
5249 6ea83fed bellard
                    int flags)
5250 6ea83fed bellard
{
5251 6ea83fed bellard
    int i;
5252 6ea83fed bellard
5253 6ea83fed bellard
#   define printfpr(fp) do { \
5254 6ea83fed bellard
        fpu_fprintf(f, "w:%08x d:%08lx%08lx fd:%g fs:%g\n", \
5255 6ea83fed bellard
                (fp)->w[FP_ENDIAN_IDX], (fp)->w[0], (fp)->w[1], (fp)->fd, (fp)->fs[FP_ENDIAN_IDX]); \
5256 6ea83fed bellard
    } while(0)
5257 6ea83fed bellard
5258 6ea83fed bellard
    fpu_fprintf(f, "CP1 FCR0 0x%08x  FCR31 0x%08x  SR.FR %d\n",
5259 6ea83fed bellard
                env->fcr0, env->fcr31,
5260 7a387fff ths
                (env->CP0_Status & (1 << CP0St_FR)) != 0);
5261 6ea83fed bellard
    fpu_fprintf(f, "FT0: "); printfpr(&env->ft0);
5262 6ea83fed bellard
    fpu_fprintf(f, "FT1: "); printfpr(&env->ft1);
5263 6ea83fed bellard
    fpu_fprintf(f, "FT2: "); printfpr(&env->ft2);
5264 7a387fff ths
    for(i = 0; i < 32; i += 2) {
5265 7a387fff ths
        fpu_fprintf(f, "%s: ", fregnames[i]);
5266 6ea83fed bellard
        printfpr(FPR(env, i));
5267 6ea83fed bellard
    }
5268 6ea83fed bellard
5269 6ea83fed bellard
#undef printfpr
5270 6ea83fed bellard
}
5271 6ea83fed bellard
5272 7a387fff ths
void dump_fpu (CPUState *env)
5273 6ea83fed bellard
{
5274 6ea83fed bellard
    if (loglevel) { 
5275 3594c774 ths
       fprintf(logfile, "pc=0x" TARGET_FMT_lx " HI=0x" TARGET_FMT_lx " LO=0x" TARGET_FMT_lx " ds %04x " TARGET_FMT_lx " %d\n",
5276 6ea83fed bellard
               env->PC, env->HI, env->LO, env->hflags, env->btarget, env->bcond);
5277 6ea83fed bellard
       fpu_dump_state(env, logfile, fprintf, 0);
5278 6ea83fed bellard
    }
5279 6ea83fed bellard
}
5280 6ea83fed bellard
5281 60aa19ab ths
#if defined(TARGET_MIPS64) && defined(MIPS_DEBUG_SIGN_EXTENSIONS)
5282 c570fd16 ths
/* Debug help: The architecture requires 32bit code to maintain proper
5283 c570fd16 ths
   sign-extened values on 64bit machines.  */
5284 c570fd16 ths
5285 c570fd16 ths
#define SIGN_EXT_P(val) ((((val) & ~0x7fffffff) == 0) || (((val) & ~0x7fffffff) == ~0x7fffffff))
5286 c570fd16 ths
5287 c570fd16 ths
void cpu_mips_check_sign_extensions (CPUState *env, FILE *f,
5288 c570fd16 ths
                     int (*cpu_fprintf)(FILE *f, const char *fmt, ...),
5289 c570fd16 ths
                     int flags)
5290 c570fd16 ths
{
5291 c570fd16 ths
    int i;
5292 c570fd16 ths
5293 c570fd16 ths
    if (!SIGN_EXT_P(env->PC))
5294 3594c774 ths
        cpu_fprintf(f, "BROKEN: pc=0x" TARGET_FMT_lx "\n", env->PC);
5295 c570fd16 ths
    if (!SIGN_EXT_P(env->HI))
5296 3594c774 ths
        cpu_fprintf(f, "BROKEN: HI=0x" TARGET_FMT_lx "\n", env->HI);
5297 c570fd16 ths
    if (!SIGN_EXT_P(env->LO))
5298 3594c774 ths
        cpu_fprintf(f, "BROKEN: LO=0x" TARGET_FMT_lx "\n", env->LO);
5299 c570fd16 ths
    if (!SIGN_EXT_P(env->btarget))
5300 3594c774 ths
        cpu_fprintf(f, "BROKEN: btarget=0x" TARGET_FMT_lx "\n", env->btarget);
5301 c570fd16 ths
5302 c570fd16 ths
    for (i = 0; i < 32; i++) {
5303 c570fd16 ths
        if (!SIGN_EXT_P(env->gpr[i]))
5304 3594c774 ths
            cpu_fprintf(f, "BROKEN: %s=0x" TARGET_FMT_lx "\n", regnames[i], env->gpr[i]);
5305 c570fd16 ths
    }
5306 c570fd16 ths
5307 c570fd16 ths
    if (!SIGN_EXT_P(env->CP0_EPC))
5308 3594c774 ths
        cpu_fprintf(f, "BROKEN: EPC=0x" TARGET_FMT_lx "\n", env->CP0_EPC);
5309 c570fd16 ths
    if (!SIGN_EXT_P(env->CP0_LLAddr))
5310 3594c774 ths
        cpu_fprintf(f, "BROKEN: LLAddr=0x" TARGET_FMT_lx "\n", env->CP0_LLAddr);
5311 c570fd16 ths
}
5312 c570fd16 ths
#endif
5313 c570fd16 ths
5314 6af0bf9c bellard
void cpu_dump_state (CPUState *env, FILE *f, 
5315 6af0bf9c bellard
                     int (*cpu_fprintf)(FILE *f, const char *fmt, ...),
5316 6af0bf9c bellard
                     int flags)
5317 6af0bf9c bellard
{
5318 568b600d bellard
    uint32_t c0_status;
5319 6af0bf9c bellard
    int i;
5320 6af0bf9c bellard
    
5321 3594c774 ths
    cpu_fprintf(f, "pc=0x" TARGET_FMT_lx " HI=0x" TARGET_FMT_lx " LO=0x" TARGET_FMT_lx " ds %04x " TARGET_FMT_lx " %d\n",
5322 6af0bf9c bellard
                env->PC, env->HI, env->LO, env->hflags, env->btarget, env->bcond);
5323 6af0bf9c bellard
    for (i = 0; i < 32; i++) {
5324 6af0bf9c bellard
        if ((i & 3) == 0)
5325 6af0bf9c bellard
            cpu_fprintf(f, "GPR%02d:", i);
5326 3594c774 ths
        cpu_fprintf(f, " %s " TARGET_FMT_lx, regnames[i], env->gpr[i]);
5327 6af0bf9c bellard
        if ((i & 3) == 3)
5328 6af0bf9c bellard
            cpu_fprintf(f, "\n");
5329 6af0bf9c bellard
    }
5330 568b600d bellard
5331 568b600d bellard
    c0_status = env->CP0_Status;
5332 568b600d bellard
5333 3594c774 ths
    cpu_fprintf(f, "CP0 Status  0x%08x Cause   0x%08x EPC    0x" TARGET_FMT_lx "\n",
5334 568b600d bellard
                c0_status, env->CP0_Cause, env->CP0_EPC);
5335 3594c774 ths
    cpu_fprintf(f, "    Config0 0x%08x Config1 0x%08x LLAddr 0x" TARGET_FMT_lx "\n",
5336 6af0bf9c bellard
                env->CP0_Config0, env->CP0_Config1, env->CP0_LLAddr);
5337 7a387fff ths
    if (c0_status & (1 << CP0St_CU1))
5338 7a387fff ths
        fpu_dump_state(env, f, cpu_fprintf, flags);
5339 60aa19ab ths
#if defined(TARGET_MIPS64) && defined(MIPS_DEBUG_SIGN_EXTENSIONS)
5340 c570fd16 ths
    cpu_mips_check_sign_extensions(env, f, cpu_fprintf, flags);
5341 c570fd16 ths
#endif
5342 6af0bf9c bellard
}
5343 6af0bf9c bellard
5344 6af0bf9c bellard
CPUMIPSState *cpu_mips_init (void)
5345 6af0bf9c bellard
{
5346 6af0bf9c bellard
    CPUMIPSState *env;
5347 6af0bf9c bellard
5348 6af0bf9c bellard
    env = qemu_mallocz(sizeof(CPUMIPSState));
5349 6af0bf9c bellard
    if (!env)
5350 6af0bf9c bellard
        return NULL;
5351 173d6cfe bellard
    cpu_exec_init(env);
5352 6ae81775 ths
    cpu_reset(env);
5353 6ae81775 ths
    return env;
5354 6ae81775 ths
}
5355 6ae81775 ths
5356 6ae81775 ths
void cpu_reset (CPUMIPSState *env)
5357 6ae81775 ths
{
5358 6ae81775 ths
    memset(env, 0, offsetof(CPUMIPSState, breakpoints));
5359 6ae81775 ths
5360 6af0bf9c bellard
    tlb_flush(env, 1);
5361 6ae81775 ths
5362 6af0bf9c bellard
    /* Minimal init */
5363 ca7c2b1b ths
#if !defined(CONFIG_USER_ONLY)
5364 aa328add ths
    if (env->hflags & MIPS_HFLAG_BMASK) {
5365 aa328add ths
        /* If the exception was raised from a delay slot,
5366 aa328add ths
         * come back to the jump.  */
5367 aa328add ths
        env->CP0_ErrorEPC = env->PC - 4;
5368 aa328add ths
        env->hflags &= ~MIPS_HFLAG_BMASK;
5369 aa328add ths
    } else {
5370 aa328add ths
        env->CP0_ErrorEPC = env->PC;
5371 aa328add ths
    }
5372 24c7b0e3 ths
    env->hflags = 0;
5373 5dc4b744 ths
    env->PC = (int32_t)0xBFC00000;
5374 6af0bf9c bellard
#if defined (MIPS_USES_R4K_TLB)
5375 9c2149c8 ths
    env->CP0_Random = MIPS_TLB_NB - 1;
5376 814b9a47 ths
    env->tlb_in_use = MIPS_TLB_NB;
5377 6af0bf9c bellard
#endif
5378 6af0bf9c bellard
    env->CP0_Wired = 0;
5379 7a387fff ths
    /* SMP not implemented */
5380 b29a0341 ths
    env->CP0_EBase = 0x80000000;
5381 aa328add ths
    env->CP0_Status = (1 << CP0St_BEV) | (1 << CP0St_ERL);
5382 6af0bf9c bellard
    env->CP0_WatchLo = 0;
5383 6af0bf9c bellard
    /* Count register increments in debug mode, EJTAG version 1 */
5384 6af0bf9c bellard
    env->CP0_Debug = (1 << CP0DB_CNT) | (0x1 << CP0DB_VER);
5385 ca7c2b1b ths
#endif
5386 6af0bf9c bellard
    env->exception_index = EXCP_NONE;
5387 eeef26cd bellard
#if defined(CONFIG_USER_ONLY)
5388 eeef26cd bellard
    env->hflags |= MIPS_HFLAG_UM;
5389 ca7c2b1b ths
    env->user_mode_only = 1;
5390 eeef26cd bellard
#endif
5391 7a387fff ths
    /* XXX some guesswork here, values are CPU specific */
5392 7a387fff ths
    env->SYNCI_Step = 16;
5393 7a387fff ths
    env->CCRes = 2;
5394 6af0bf9c bellard
}
5395 33d68b5f ths
5396 33d68b5f ths
#include "translate_init.c"