Statistics
| Branch: | Revision:

root / target-mips / translate.c @ 8cfd0495

History | View | Annotate | Download (475.4 kB)

1
/*
2
 *  MIPS32 emulation for qemu: main translation routines.
3
 *
4
 *  Copyright (c) 2004-2005 Jocelyn Mayer
5
 *  Copyright (c) 2006 Marius Groeger (FPU operations)
6
 *  Copyright (c) 2006 Thiemo Seufer (MIPS32R2 support)
7
 *  Copyright (c) 2009 CodeSourcery (MIPS16 and microMIPS support)
8
 *  Copyright (c) 2012 Jia Liu & Dongxue Zhang (MIPS ASE DSP support)
9
 *
10
 * This library is free software; you can redistribute it and/or
11
 * modify it under the terms of the GNU Lesser General Public
12
 * License as published by the Free Software Foundation; either
13
 * version 2 of the License, or (at your option) any later version.
14
 *
15
 * This library is distributed in the hope that it will be useful,
16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18
 * Lesser General Public License for more details.
19
 *
20
 * You should have received a copy of the GNU Lesser General Public
21
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
22
 */
23

    
24
#include "cpu.h"
25
#include "disas/disas.h"
26
#include "tcg-op.h"
27

    
28
#include "helper.h"
29
#define GEN_HELPER 1
30
#include "helper.h"
31

    
32
#define MIPS_DEBUG_DISAS 0
33
//#define MIPS_DEBUG_SIGN_EXTENSIONS
34

    
35
/* MIPS major opcodes */
36
#define MASK_OP_MAJOR(op)  (op & (0x3F << 26))
37

    
38
enum {
39
    /* indirect opcode tables */
40
    OPC_SPECIAL  = (0x00 << 26),
41
    OPC_REGIMM   = (0x01 << 26),
42
    OPC_CP0      = (0x10 << 26),
43
    OPC_CP1      = (0x11 << 26),
44
    OPC_CP2      = (0x12 << 26),
45
    OPC_CP3      = (0x13 << 26),
46
    OPC_SPECIAL2 = (0x1C << 26),
47
    OPC_SPECIAL3 = (0x1F << 26),
48
    /* arithmetic with immediate */
49
    OPC_ADDI     = (0x08 << 26),
50
    OPC_ADDIU    = (0x09 << 26),
51
    OPC_SLTI     = (0x0A << 26),
52
    OPC_SLTIU    = (0x0B << 26),
53
    /* logic with immediate */
54
    OPC_ANDI     = (0x0C << 26),
55
    OPC_ORI      = (0x0D << 26),
56
    OPC_XORI     = (0x0E << 26),
57
    OPC_LUI      = (0x0F << 26),
58
    /* arithmetic with immediate */
59
    OPC_DADDI    = (0x18 << 26),
60
    OPC_DADDIU   = (0x19 << 26),
61
    /* Jump and branches */
62
    OPC_J        = (0x02 << 26),
63
    OPC_JAL      = (0x03 << 26),
64
    OPC_JALS     = OPC_JAL | 0x5,
65
    OPC_BEQ      = (0x04 << 26),  /* Unconditional if rs = rt = 0 (B) */
66
    OPC_BEQL     = (0x14 << 26),
67
    OPC_BNE      = (0x05 << 26),
68
    OPC_BNEL     = (0x15 << 26),
69
    OPC_BLEZ     = (0x06 << 26),
70
    OPC_BLEZL    = (0x16 << 26),
71
    OPC_BGTZ     = (0x07 << 26),
72
    OPC_BGTZL    = (0x17 << 26),
73
    OPC_JALX     = (0x1D << 26),  /* MIPS 16 only */
74
    OPC_JALXS    = OPC_JALX | 0x5,
75
    /* Load and stores */
76
    OPC_LDL      = (0x1A << 26),
77
    OPC_LDR      = (0x1B << 26),
78
    OPC_LB       = (0x20 << 26),
79
    OPC_LH       = (0x21 << 26),
80
    OPC_LWL      = (0x22 << 26),
81
    OPC_LW       = (0x23 << 26),
82
    OPC_LWPC     = OPC_LW | 0x5,
83
    OPC_LBU      = (0x24 << 26),
84
    OPC_LHU      = (0x25 << 26),
85
    OPC_LWR      = (0x26 << 26),
86
    OPC_LWU      = (0x27 << 26),
87
    OPC_SB       = (0x28 << 26),
88
    OPC_SH       = (0x29 << 26),
89
    OPC_SWL      = (0x2A << 26),
90
    OPC_SW       = (0x2B << 26),
91
    OPC_SDL      = (0x2C << 26),
92
    OPC_SDR      = (0x2D << 26),
93
    OPC_SWR      = (0x2E << 26),
94
    OPC_LL       = (0x30 << 26),
95
    OPC_LLD      = (0x34 << 26),
96
    OPC_LD       = (0x37 << 26),
97
    OPC_LDPC     = OPC_LD | 0x5,
98
    OPC_SC       = (0x38 << 26),
99
    OPC_SCD      = (0x3C << 26),
100
    OPC_SD       = (0x3F << 26),
101
    /* Floating point load/store */
102
    OPC_LWC1     = (0x31 << 26),
103
    OPC_LWC2     = (0x32 << 26),
104
    OPC_LDC1     = (0x35 << 26),
105
    OPC_LDC2     = (0x36 << 26),
106
    OPC_SWC1     = (0x39 << 26),
107
    OPC_SWC2     = (0x3A << 26),
108
    OPC_SDC1     = (0x3D << 26),
109
    OPC_SDC2     = (0x3E << 26),
110
    /* MDMX ASE specific */
111
    OPC_MDMX     = (0x1E << 26),
112
    /* Cache and prefetch */
113
    OPC_CACHE    = (0x2F << 26),
114
    OPC_PREF     = (0x33 << 26),
115
    /* Reserved major opcode */
116
    OPC_MAJOR3B_RESERVED = (0x3B << 26),
117
};
118

    
119
/* MIPS special opcodes */
120
#define MASK_SPECIAL(op)   MASK_OP_MAJOR(op) | (op & 0x3F)
121

    
122
enum {
123
    /* Shifts */
124
    OPC_SLL      = 0x00 | OPC_SPECIAL,
125
    /* NOP is SLL r0, r0, 0   */
126
    /* SSNOP is SLL r0, r0, 1 */
127
    /* EHB is SLL r0, r0, 3 */
128
    OPC_SRL      = 0x02 | OPC_SPECIAL, /* also ROTR */
129
    OPC_ROTR     = OPC_SRL | (1 << 21),
130
    OPC_SRA      = 0x03 | OPC_SPECIAL,
131
    OPC_SLLV     = 0x04 | OPC_SPECIAL,
132
    OPC_SRLV     = 0x06 | OPC_SPECIAL, /* also ROTRV */
133
    OPC_ROTRV    = OPC_SRLV | (1 << 6),
134
    OPC_SRAV     = 0x07 | OPC_SPECIAL,
135
    OPC_DSLLV    = 0x14 | OPC_SPECIAL,
136
    OPC_DSRLV    = 0x16 | OPC_SPECIAL, /* also DROTRV */
137
    OPC_DROTRV   = OPC_DSRLV | (1 << 6),
138
    OPC_DSRAV    = 0x17 | OPC_SPECIAL,
139
    OPC_DSLL     = 0x38 | OPC_SPECIAL,
140
    OPC_DSRL     = 0x3A | OPC_SPECIAL, /* also DROTR */
141
    OPC_DROTR    = OPC_DSRL | (1 << 21),
142
    OPC_DSRA     = 0x3B | OPC_SPECIAL,
143
    OPC_DSLL32   = 0x3C | OPC_SPECIAL,
144
    OPC_DSRL32   = 0x3E | OPC_SPECIAL, /* also DROTR32 */
145
    OPC_DROTR32  = OPC_DSRL32 | (1 << 21),
146
    OPC_DSRA32   = 0x3F | OPC_SPECIAL,
147
    /* Multiplication / division */
148
    OPC_MULT     = 0x18 | OPC_SPECIAL,
149
    OPC_MULTU    = 0x19 | OPC_SPECIAL,
150
    OPC_DIV      = 0x1A | OPC_SPECIAL,
151
    OPC_DIVU     = 0x1B | OPC_SPECIAL,
152
    OPC_DMULT    = 0x1C | OPC_SPECIAL,
153
    OPC_DMULTU   = 0x1D | OPC_SPECIAL,
154
    OPC_DDIV     = 0x1E | OPC_SPECIAL,
155
    OPC_DDIVU    = 0x1F | OPC_SPECIAL,
156
    /* 2 registers arithmetic / logic */
157
    OPC_ADD      = 0x20 | OPC_SPECIAL,
158
    OPC_ADDU     = 0x21 | OPC_SPECIAL,
159
    OPC_SUB      = 0x22 | OPC_SPECIAL,
160
    OPC_SUBU     = 0x23 | OPC_SPECIAL,
161
    OPC_AND      = 0x24 | OPC_SPECIAL,
162
    OPC_OR       = 0x25 | OPC_SPECIAL,
163
    OPC_XOR      = 0x26 | OPC_SPECIAL,
164
    OPC_NOR      = 0x27 | OPC_SPECIAL,
165
    OPC_SLT      = 0x2A | OPC_SPECIAL,
166
    OPC_SLTU     = 0x2B | OPC_SPECIAL,
167
    OPC_DADD     = 0x2C | OPC_SPECIAL,
168
    OPC_DADDU    = 0x2D | OPC_SPECIAL,
169
    OPC_DSUB     = 0x2E | OPC_SPECIAL,
170
    OPC_DSUBU    = 0x2F | OPC_SPECIAL,
171
    /* Jumps */
172
    OPC_JR       = 0x08 | OPC_SPECIAL, /* Also JR.HB */
173
    OPC_JALR     = 0x09 | OPC_SPECIAL, /* Also JALR.HB */
174
    OPC_JALRC    = OPC_JALR | (0x5 << 6),
175
    OPC_JALRS    = 0x10 | OPC_SPECIAL | (0x5 << 6),
176
    /* Traps */
177
    OPC_TGE      = 0x30 | OPC_SPECIAL,
178
    OPC_TGEU     = 0x31 | OPC_SPECIAL,
179
    OPC_TLT      = 0x32 | OPC_SPECIAL,
180
    OPC_TLTU     = 0x33 | OPC_SPECIAL,
181
    OPC_TEQ      = 0x34 | OPC_SPECIAL,
182
    OPC_TNE      = 0x36 | OPC_SPECIAL,
183
    /* HI / LO registers load & stores */
184
    OPC_MFHI     = 0x10 | OPC_SPECIAL,
185
    OPC_MTHI     = 0x11 | OPC_SPECIAL,
186
    OPC_MFLO     = 0x12 | OPC_SPECIAL,
187
    OPC_MTLO     = 0x13 | OPC_SPECIAL,
188
    /* Conditional moves */
189
    OPC_MOVZ     = 0x0A | OPC_SPECIAL,
190
    OPC_MOVN     = 0x0B | OPC_SPECIAL,
191

    
192
    OPC_MOVCI    = 0x01 | OPC_SPECIAL,
193

    
194
    /* Special */
195
    OPC_PMON     = 0x05 | OPC_SPECIAL, /* unofficial */
196
    OPC_SYSCALL  = 0x0C | OPC_SPECIAL,
197
    OPC_BREAK    = 0x0D | OPC_SPECIAL,
198
    OPC_SPIM     = 0x0E | OPC_SPECIAL, /* unofficial */
199
    OPC_SYNC     = 0x0F | OPC_SPECIAL,
200

    
201
    OPC_SPECIAL15_RESERVED = 0x15 | OPC_SPECIAL,
202
    OPC_SPECIAL28_RESERVED = 0x28 | OPC_SPECIAL,
203
    OPC_SPECIAL29_RESERVED = 0x29 | OPC_SPECIAL,
204
    OPC_SPECIAL35_RESERVED = 0x35 | OPC_SPECIAL,
205
    OPC_SPECIAL37_RESERVED = 0x37 | OPC_SPECIAL,
206
    OPC_SPECIAL39_RESERVED = 0x39 | OPC_SPECIAL,
207
    OPC_SPECIAL3D_RESERVED = 0x3D | OPC_SPECIAL,
208
};
209

    
210
/* Multiplication variants of the vr54xx. */
211
#define MASK_MUL_VR54XX(op)   MASK_SPECIAL(op) | (op & (0x1F << 6))
212

    
213
enum {
214
    OPC_VR54XX_MULS    = (0x03 << 6) | OPC_MULT,
215
    OPC_VR54XX_MULSU   = (0x03 << 6) | OPC_MULTU,
216
    OPC_VR54XX_MACC    = (0x05 << 6) | OPC_MULT,
217
    OPC_VR54XX_MACCU   = (0x05 << 6) | OPC_MULTU,
218
    OPC_VR54XX_MSAC    = (0x07 << 6) | OPC_MULT,
219
    OPC_VR54XX_MSACU   = (0x07 << 6) | OPC_MULTU,
220
    OPC_VR54XX_MULHI   = (0x09 << 6) | OPC_MULT,
221
    OPC_VR54XX_MULHIU  = (0x09 << 6) | OPC_MULTU,
222
    OPC_VR54XX_MULSHI  = (0x0B << 6) | OPC_MULT,
223
    OPC_VR54XX_MULSHIU = (0x0B << 6) | OPC_MULTU,
224
    OPC_VR54XX_MACCHI  = (0x0D << 6) | OPC_MULT,
225
    OPC_VR54XX_MACCHIU = (0x0D << 6) | OPC_MULTU,
226
    OPC_VR54XX_MSACHI  = (0x0F << 6) | OPC_MULT,
227
    OPC_VR54XX_MSACHIU = (0x0F << 6) | OPC_MULTU,
228
};
229

    
230
/* REGIMM (rt field) opcodes */
231
#define MASK_REGIMM(op)    MASK_OP_MAJOR(op) | (op & (0x1F << 16))
232

    
233
enum {
234
    OPC_BLTZ     = (0x00 << 16) | OPC_REGIMM,
235
    OPC_BLTZL    = (0x02 << 16) | OPC_REGIMM,
236
    OPC_BGEZ     = (0x01 << 16) | OPC_REGIMM,
237
    OPC_BGEZL    = (0x03 << 16) | OPC_REGIMM,
238
    OPC_BLTZAL   = (0x10 << 16) | OPC_REGIMM,
239
    OPC_BLTZALS  = OPC_BLTZAL | 0x5, /* microMIPS */
240
    OPC_BLTZALL  = (0x12 << 16) | OPC_REGIMM,
241
    OPC_BGEZAL   = (0x11 << 16) | OPC_REGIMM,
242
    OPC_BGEZALS  = OPC_BGEZAL | 0x5, /* microMIPS */
243
    OPC_BGEZALL  = (0x13 << 16) | OPC_REGIMM,
244
    OPC_TGEI     = (0x08 << 16) | OPC_REGIMM,
245
    OPC_TGEIU    = (0x09 << 16) | OPC_REGIMM,
246
    OPC_TLTI     = (0x0A << 16) | OPC_REGIMM,
247
    OPC_TLTIU    = (0x0B << 16) | OPC_REGIMM,
248
    OPC_TEQI     = (0x0C << 16) | OPC_REGIMM,
249
    OPC_TNEI     = (0x0E << 16) | OPC_REGIMM,
250
    OPC_SYNCI    = (0x1F << 16) | OPC_REGIMM,
251
};
252

    
253
/* Special2 opcodes */
254
#define MASK_SPECIAL2(op)  MASK_OP_MAJOR(op) | (op & 0x3F)
255

    
256
enum {
257
    /* Multiply & xxx operations */
258
    OPC_MADD     = 0x00 | OPC_SPECIAL2,
259
    OPC_MADDU    = 0x01 | OPC_SPECIAL2,
260
    OPC_MUL      = 0x02 | OPC_SPECIAL2,
261
    OPC_MSUB     = 0x04 | OPC_SPECIAL2,
262
    OPC_MSUBU    = 0x05 | OPC_SPECIAL2,
263
    /* Loongson 2F */
264
    OPC_MULT_G_2F   = 0x10 | OPC_SPECIAL2,
265
    OPC_DMULT_G_2F  = 0x11 | OPC_SPECIAL2,
266
    OPC_MULTU_G_2F  = 0x12 | OPC_SPECIAL2,
267
    OPC_DMULTU_G_2F = 0x13 | OPC_SPECIAL2,
268
    OPC_DIV_G_2F    = 0x14 | OPC_SPECIAL2,
269
    OPC_DDIV_G_2F   = 0x15 | OPC_SPECIAL2,
270
    OPC_DIVU_G_2F   = 0x16 | OPC_SPECIAL2,
271
    OPC_DDIVU_G_2F  = 0x17 | OPC_SPECIAL2,
272
    OPC_MOD_G_2F    = 0x1c | OPC_SPECIAL2,
273
    OPC_DMOD_G_2F   = 0x1d | OPC_SPECIAL2,
274
    OPC_MODU_G_2F   = 0x1e | OPC_SPECIAL2,
275
    OPC_DMODU_G_2F  = 0x1f | OPC_SPECIAL2,
276
    /* Misc */
277
    OPC_CLZ      = 0x20 | OPC_SPECIAL2,
278
    OPC_CLO      = 0x21 | OPC_SPECIAL2,
279
    OPC_DCLZ     = 0x24 | OPC_SPECIAL2,
280
    OPC_DCLO     = 0x25 | OPC_SPECIAL2,
281
    /* Special */
282
    OPC_SDBBP    = 0x3F | OPC_SPECIAL2,
283
};
284

    
285
/* Special3 opcodes */
286
#define MASK_SPECIAL3(op)  MASK_OP_MAJOR(op) | (op & 0x3F)
287

    
288
enum {
289
    OPC_EXT      = 0x00 | OPC_SPECIAL3,
290
    OPC_DEXTM    = 0x01 | OPC_SPECIAL3,
291
    OPC_DEXTU    = 0x02 | OPC_SPECIAL3,
292
    OPC_DEXT     = 0x03 | OPC_SPECIAL3,
293
    OPC_INS      = 0x04 | OPC_SPECIAL3,
294
    OPC_DINSM    = 0x05 | OPC_SPECIAL3,
295
    OPC_DINSU    = 0x06 | OPC_SPECIAL3,
296
    OPC_DINS     = 0x07 | OPC_SPECIAL3,
297
    OPC_FORK     = 0x08 | OPC_SPECIAL3,
298
    OPC_YIELD    = 0x09 | OPC_SPECIAL3,
299
    OPC_BSHFL    = 0x20 | OPC_SPECIAL3,
300
    OPC_DBSHFL   = 0x24 | OPC_SPECIAL3,
301
    OPC_RDHWR    = 0x3B | OPC_SPECIAL3,
302

    
303
    /* Loongson 2E */
304
    OPC_MULT_G_2E   = 0x18 | OPC_SPECIAL3,
305
    OPC_MULTU_G_2E  = 0x19 | OPC_SPECIAL3,
306
    OPC_DIV_G_2E    = 0x1A | OPC_SPECIAL3,
307
    OPC_DIVU_G_2E   = 0x1B | OPC_SPECIAL3,
308
    OPC_DMULT_G_2E  = 0x1C | OPC_SPECIAL3,
309
    OPC_DMULTU_G_2E = 0x1D | OPC_SPECIAL3,
310
    OPC_DDIV_G_2E   = 0x1E | OPC_SPECIAL3,
311
    OPC_DDIVU_G_2E  = 0x1F | OPC_SPECIAL3,
312
    OPC_MOD_G_2E    = 0x22 | OPC_SPECIAL3,
313
    OPC_MODU_G_2E   = 0x23 | OPC_SPECIAL3,
314
    OPC_DMOD_G_2E   = 0x26 | OPC_SPECIAL3,
315
    OPC_DMODU_G_2E  = 0x27 | OPC_SPECIAL3,
316

    
317
    /* MIPS DSP Load */
318
    OPC_LX_DSP         = 0x0A | OPC_SPECIAL3,
319
    /* MIPS DSP Arithmetic */
320
    OPC_ADDU_QB_DSP    = 0x10 | OPC_SPECIAL3,
321
    OPC_ADDU_OB_DSP    = 0x14 | OPC_SPECIAL3,
322
    OPC_ABSQ_S_PH_DSP  = 0x12 | OPC_SPECIAL3,
323
    OPC_ABSQ_S_QH_DSP  = 0x16 | OPC_SPECIAL3,
324
    /* OPC_ADDUH_QB_DSP is same as OPC_MULT_G_2E.  */
325
    /* OPC_ADDUH_QB_DSP   = 0x18 | OPC_SPECIAL3,  */
326
    OPC_CMPU_EQ_QB_DSP = 0x11 | OPC_SPECIAL3,
327
    OPC_CMPU_EQ_OB_DSP = 0x15 | OPC_SPECIAL3,
328
    /* MIPS DSP GPR-Based Shift Sub-class */
329
    OPC_SHLL_QB_DSP    = 0x13 | OPC_SPECIAL3,
330
    OPC_SHLL_OB_DSP    = 0x17 | OPC_SPECIAL3,
331
    /* MIPS DSP Multiply Sub-class insns */
332
    /* OPC_MUL_PH_DSP is same as OPC_ADDUH_QB_DSP.  */
333
    /* OPC_MUL_PH_DSP     = 0x18 | OPC_SPECIAL3,  */
334
    OPC_DPA_W_PH_DSP   = 0x30 | OPC_SPECIAL3,
335
    OPC_DPAQ_W_QH_DSP  = 0x34 | OPC_SPECIAL3,
336
    /* DSP Bit/Manipulation Sub-class */
337
    OPC_INSV_DSP       = 0x0C | OPC_SPECIAL3,
338
    OPC_DINSV_DSP      = 0x0D | OPC_SPECIAL3,
339
    /* MIPS DSP Append Sub-class */
340
    OPC_APPEND_DSP     = 0x31 | OPC_SPECIAL3,
341
    OPC_DAPPEND_DSP    = 0x35 | OPC_SPECIAL3,
342
    /* MIPS DSP Accumulator and DSPControl Access Sub-class */
343
    OPC_EXTR_W_DSP     = 0x38 | OPC_SPECIAL3,
344
    OPC_DEXTR_W_DSP    = 0x3C | OPC_SPECIAL3,
345
};
346

    
347
/* BSHFL opcodes */
348
#define MASK_BSHFL(op)     MASK_SPECIAL3(op) | (op & (0x1F << 6))
349

    
350
enum {
351
    OPC_WSBH     = (0x02 << 6) | OPC_BSHFL,
352
    OPC_SEB      = (0x10 << 6) | OPC_BSHFL,
353
    OPC_SEH      = (0x18 << 6) | OPC_BSHFL,
354
};
355

    
356
/* DBSHFL opcodes */
357
#define MASK_DBSHFL(op)    MASK_SPECIAL3(op) | (op & (0x1F << 6))
358

    
359
enum {
360
    OPC_DSBH     = (0x02 << 6) | OPC_DBSHFL,
361
    OPC_DSHD     = (0x05 << 6) | OPC_DBSHFL,
362
};
363

    
364
/* MIPS DSP REGIMM opcodes */
365
enum {
366
    OPC_BPOSGE32 = (0x1C << 16) | OPC_REGIMM,
367
    OPC_BPOSGE64 = (0x1D << 16) | OPC_REGIMM,
368
};
369

    
370
#define MASK_LX(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
371
/* MIPS DSP Load */
372
enum {
373
    OPC_LBUX = (0x06 << 6) | OPC_LX_DSP,
374
    OPC_LHX  = (0x04 << 6) | OPC_LX_DSP,
375
    OPC_LWX  = (0x00 << 6) | OPC_LX_DSP,
376
    OPC_LDX = (0x08 << 6) | OPC_LX_DSP,
377
};
378

    
379
#define MASK_ADDU_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
380
enum {
381
    /* MIPS DSP Arithmetic Sub-class */
382
    OPC_ADDQ_PH        = (0x0A << 6) | OPC_ADDU_QB_DSP,
383
    OPC_ADDQ_S_PH      = (0x0E << 6) | OPC_ADDU_QB_DSP,
384
    OPC_ADDQ_S_W       = (0x16 << 6) | OPC_ADDU_QB_DSP,
385
    OPC_ADDU_QB        = (0x00 << 6) | OPC_ADDU_QB_DSP,
386
    OPC_ADDU_S_QB      = (0x04 << 6) | OPC_ADDU_QB_DSP,
387
    OPC_ADDU_PH        = (0x08 << 6) | OPC_ADDU_QB_DSP,
388
    OPC_ADDU_S_PH      = (0x0C << 6) | OPC_ADDU_QB_DSP,
389
    OPC_SUBQ_PH        = (0x0B << 6) | OPC_ADDU_QB_DSP,
390
    OPC_SUBQ_S_PH      = (0x0F << 6) | OPC_ADDU_QB_DSP,
391
    OPC_SUBQ_S_W       = (0x17 << 6) | OPC_ADDU_QB_DSP,
392
    OPC_SUBU_QB        = (0x01 << 6) | OPC_ADDU_QB_DSP,
393
    OPC_SUBU_S_QB      = (0x05 << 6) | OPC_ADDU_QB_DSP,
394
    OPC_SUBU_PH        = (0x09 << 6) | OPC_ADDU_QB_DSP,
395
    OPC_SUBU_S_PH      = (0x0D << 6) | OPC_ADDU_QB_DSP,
396
    OPC_ADDSC          = (0x10 << 6) | OPC_ADDU_QB_DSP,
397
    OPC_ADDWC          = (0x11 << 6) | OPC_ADDU_QB_DSP,
398
    OPC_MODSUB         = (0x12 << 6) | OPC_ADDU_QB_DSP,
399
    OPC_RADDU_W_QB     = (0x14 << 6) | OPC_ADDU_QB_DSP,
400
    /* MIPS DSP Multiply Sub-class insns */
401
    OPC_MULEU_S_PH_QBL = (0x06 << 6) | OPC_ADDU_QB_DSP,
402
    OPC_MULEU_S_PH_QBR = (0x07 << 6) | OPC_ADDU_QB_DSP,
403
    OPC_MULQ_RS_PH     = (0x1F << 6) | OPC_ADDU_QB_DSP,
404
    OPC_MULEQ_S_W_PHL  = (0x1C << 6) | OPC_ADDU_QB_DSP,
405
    OPC_MULEQ_S_W_PHR  = (0x1D << 6) | OPC_ADDU_QB_DSP,
406
    OPC_MULQ_S_PH      = (0x1E << 6) | OPC_ADDU_QB_DSP,
407
};
408

    
409
#define OPC_ADDUH_QB_DSP OPC_MULT_G_2E
410
#define MASK_ADDUH_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
411
enum {
412
    /* MIPS DSP Arithmetic Sub-class */
413
    OPC_ADDUH_QB   = (0x00 << 6) | OPC_ADDUH_QB_DSP,
414
    OPC_ADDUH_R_QB = (0x02 << 6) | OPC_ADDUH_QB_DSP,
415
    OPC_ADDQH_PH   = (0x08 << 6) | OPC_ADDUH_QB_DSP,
416
    OPC_ADDQH_R_PH = (0x0A << 6) | OPC_ADDUH_QB_DSP,
417
    OPC_ADDQH_W    = (0x10 << 6) | OPC_ADDUH_QB_DSP,
418
    OPC_ADDQH_R_W  = (0x12 << 6) | OPC_ADDUH_QB_DSP,
419
    OPC_SUBUH_QB   = (0x01 << 6) | OPC_ADDUH_QB_DSP,
420
    OPC_SUBUH_R_QB = (0x03 << 6) | OPC_ADDUH_QB_DSP,
421
    OPC_SUBQH_PH   = (0x09 << 6) | OPC_ADDUH_QB_DSP,
422
    OPC_SUBQH_R_PH = (0x0B << 6) | OPC_ADDUH_QB_DSP,
423
    OPC_SUBQH_W    = (0x11 << 6) | OPC_ADDUH_QB_DSP,
424
    OPC_SUBQH_R_W  = (0x13 << 6) | OPC_ADDUH_QB_DSP,
425
    /* MIPS DSP Multiply Sub-class insns */
426
    OPC_MUL_PH     = (0x0C << 6) | OPC_ADDUH_QB_DSP,
427
    OPC_MUL_S_PH   = (0x0E << 6) | OPC_ADDUH_QB_DSP,
428
    OPC_MULQ_S_W   = (0x16 << 6) | OPC_ADDUH_QB_DSP,
429
    OPC_MULQ_RS_W  = (0x17 << 6) | OPC_ADDUH_QB_DSP,
430
};
431

    
432
#define MASK_ABSQ_S_PH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
433
enum {
434
    /* MIPS DSP Arithmetic Sub-class */
435
    OPC_ABSQ_S_QB       = (0x01 << 6) | OPC_ABSQ_S_PH_DSP,
436
    OPC_ABSQ_S_PH       = (0x09 << 6) | OPC_ABSQ_S_PH_DSP,
437
    OPC_ABSQ_S_W        = (0x11 << 6) | OPC_ABSQ_S_PH_DSP,
438
    OPC_PRECEQ_W_PHL    = (0x0C << 6) | OPC_ABSQ_S_PH_DSP,
439
    OPC_PRECEQ_W_PHR    = (0x0D << 6) | OPC_ABSQ_S_PH_DSP,
440
    OPC_PRECEQU_PH_QBL  = (0x04 << 6) | OPC_ABSQ_S_PH_DSP,
441
    OPC_PRECEQU_PH_QBR  = (0x05 << 6) | OPC_ABSQ_S_PH_DSP,
442
    OPC_PRECEQU_PH_QBLA = (0x06 << 6) | OPC_ABSQ_S_PH_DSP,
443
    OPC_PRECEQU_PH_QBRA = (0x07 << 6) | OPC_ABSQ_S_PH_DSP,
444
    OPC_PRECEU_PH_QBL   = (0x1C << 6) | OPC_ABSQ_S_PH_DSP,
445
    OPC_PRECEU_PH_QBR   = (0x1D << 6) | OPC_ABSQ_S_PH_DSP,
446
    OPC_PRECEU_PH_QBLA  = (0x1E << 6) | OPC_ABSQ_S_PH_DSP,
447
    OPC_PRECEU_PH_QBRA  = (0x1F << 6) | OPC_ABSQ_S_PH_DSP,
448
    /* DSP Bit/Manipulation Sub-class */
449
    OPC_BITREV          = (0x1B << 6) | OPC_ABSQ_S_PH_DSP,
450
    OPC_REPL_QB         = (0x02 << 6) | OPC_ABSQ_S_PH_DSP,
451
    OPC_REPLV_QB        = (0x03 << 6) | OPC_ABSQ_S_PH_DSP,
452
    OPC_REPL_PH         = (0x0A << 6) | OPC_ABSQ_S_PH_DSP,
453
    OPC_REPLV_PH        = (0x0B << 6) | OPC_ABSQ_S_PH_DSP,
454
};
455

    
456
#define MASK_CMPU_EQ_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
457
enum {
458
    /* MIPS DSP Arithmetic Sub-class */
459
    OPC_PRECR_QB_PH      = (0x0D << 6) | OPC_CMPU_EQ_QB_DSP,
460
    OPC_PRECRQ_QB_PH     = (0x0C << 6) | OPC_CMPU_EQ_QB_DSP,
461
    OPC_PRECR_SRA_PH_W   = (0x1E << 6) | OPC_CMPU_EQ_QB_DSP,
462
    OPC_PRECR_SRA_R_PH_W = (0x1F << 6) | OPC_CMPU_EQ_QB_DSP,
463
    OPC_PRECRQ_PH_W      = (0x14 << 6) | OPC_CMPU_EQ_QB_DSP,
464
    OPC_PRECRQ_RS_PH_W   = (0x15 << 6) | OPC_CMPU_EQ_QB_DSP,
465
    OPC_PRECRQU_S_QB_PH  = (0x0F << 6) | OPC_CMPU_EQ_QB_DSP,
466
    /* DSP Compare-Pick Sub-class */
467
    OPC_CMPU_EQ_QB       = (0x00 << 6) | OPC_CMPU_EQ_QB_DSP,
468
    OPC_CMPU_LT_QB       = (0x01 << 6) | OPC_CMPU_EQ_QB_DSP,
469
    OPC_CMPU_LE_QB       = (0x02 << 6) | OPC_CMPU_EQ_QB_DSP,
470
    OPC_CMPGU_EQ_QB      = (0x04 << 6) | OPC_CMPU_EQ_QB_DSP,
471
    OPC_CMPGU_LT_QB      = (0x05 << 6) | OPC_CMPU_EQ_QB_DSP,
472
    OPC_CMPGU_LE_QB      = (0x06 << 6) | OPC_CMPU_EQ_QB_DSP,
473
    OPC_CMPGDU_EQ_QB     = (0x18 << 6) | OPC_CMPU_EQ_QB_DSP,
474
    OPC_CMPGDU_LT_QB     = (0x19 << 6) | OPC_CMPU_EQ_QB_DSP,
475
    OPC_CMPGDU_LE_QB     = (0x1A << 6) | OPC_CMPU_EQ_QB_DSP,
476
    OPC_CMP_EQ_PH        = (0x08 << 6) | OPC_CMPU_EQ_QB_DSP,
477
    OPC_CMP_LT_PH        = (0x09 << 6) | OPC_CMPU_EQ_QB_DSP,
478
    OPC_CMP_LE_PH        = (0x0A << 6) | OPC_CMPU_EQ_QB_DSP,
479
    OPC_PICK_QB          = (0x03 << 6) | OPC_CMPU_EQ_QB_DSP,
480
    OPC_PICK_PH          = (0x0B << 6) | OPC_CMPU_EQ_QB_DSP,
481
    OPC_PACKRL_PH        = (0x0E << 6) | OPC_CMPU_EQ_QB_DSP,
482
};
483

    
484
#define MASK_SHLL_QB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
485
enum {
486
    /* MIPS DSP GPR-Based Shift Sub-class */
487
    OPC_SHLL_QB    = (0x00 << 6) | OPC_SHLL_QB_DSP,
488
    OPC_SHLLV_QB   = (0x02 << 6) | OPC_SHLL_QB_DSP,
489
    OPC_SHLL_PH    = (0x08 << 6) | OPC_SHLL_QB_DSP,
490
    OPC_SHLLV_PH   = (0x0A << 6) | OPC_SHLL_QB_DSP,
491
    OPC_SHLL_S_PH  = (0x0C << 6) | OPC_SHLL_QB_DSP,
492
    OPC_SHLLV_S_PH = (0x0E << 6) | OPC_SHLL_QB_DSP,
493
    OPC_SHLL_S_W   = (0x14 << 6) | OPC_SHLL_QB_DSP,
494
    OPC_SHLLV_S_W  = (0x16 << 6) | OPC_SHLL_QB_DSP,
495
    OPC_SHRL_QB    = (0x01 << 6) | OPC_SHLL_QB_DSP,
496
    OPC_SHRLV_QB   = (0x03 << 6) | OPC_SHLL_QB_DSP,
497
    OPC_SHRL_PH    = (0x19 << 6) | OPC_SHLL_QB_DSP,
498
    OPC_SHRLV_PH   = (0x1B << 6) | OPC_SHLL_QB_DSP,
499
    OPC_SHRA_QB    = (0x04 << 6) | OPC_SHLL_QB_DSP,
500
    OPC_SHRA_R_QB  = (0x05 << 6) | OPC_SHLL_QB_DSP,
501
    OPC_SHRAV_QB   = (0x06 << 6) | OPC_SHLL_QB_DSP,
502
    OPC_SHRAV_R_QB = (0x07 << 6) | OPC_SHLL_QB_DSP,
503
    OPC_SHRA_PH    = (0x09 << 6) | OPC_SHLL_QB_DSP,
504
    OPC_SHRAV_PH   = (0x0B << 6) | OPC_SHLL_QB_DSP,
505
    OPC_SHRA_R_PH  = (0x0D << 6) | OPC_SHLL_QB_DSP,
506
    OPC_SHRAV_R_PH = (0x0F << 6) | OPC_SHLL_QB_DSP,
507
    OPC_SHRA_R_W   = (0x15 << 6) | OPC_SHLL_QB_DSP,
508
    OPC_SHRAV_R_W  = (0x17 << 6) | OPC_SHLL_QB_DSP,
509
};
510

    
511
#define MASK_DPA_W_PH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
512
enum {
513
    /* MIPS DSP Multiply Sub-class insns */
514
    OPC_DPAU_H_QBL    = (0x03 << 6) | OPC_DPA_W_PH_DSP,
515
    OPC_DPAU_H_QBR    = (0x07 << 6) | OPC_DPA_W_PH_DSP,
516
    OPC_DPSU_H_QBL    = (0x0B << 6) | OPC_DPA_W_PH_DSP,
517
    OPC_DPSU_H_QBR    = (0x0F << 6) | OPC_DPA_W_PH_DSP,
518
    OPC_DPA_W_PH      = (0x00 << 6) | OPC_DPA_W_PH_DSP,
519
    OPC_DPAX_W_PH     = (0x08 << 6) | OPC_DPA_W_PH_DSP,
520
    OPC_DPAQ_S_W_PH   = (0x04 << 6) | OPC_DPA_W_PH_DSP,
521
    OPC_DPAQX_S_W_PH  = (0x18 << 6) | OPC_DPA_W_PH_DSP,
522
    OPC_DPAQX_SA_W_PH = (0x1A << 6) | OPC_DPA_W_PH_DSP,
523
    OPC_DPS_W_PH      = (0x01 << 6) | OPC_DPA_W_PH_DSP,
524
    OPC_DPSX_W_PH     = (0x09 << 6) | OPC_DPA_W_PH_DSP,
525
    OPC_DPSQ_S_W_PH   = (0x05 << 6) | OPC_DPA_W_PH_DSP,
526
    OPC_DPSQX_S_W_PH  = (0x19 << 6) | OPC_DPA_W_PH_DSP,
527
    OPC_DPSQX_SA_W_PH = (0x1B << 6) | OPC_DPA_W_PH_DSP,
528
    OPC_MULSAQ_S_W_PH = (0x06 << 6) | OPC_DPA_W_PH_DSP,
529
    OPC_DPAQ_SA_L_W   = (0x0C << 6) | OPC_DPA_W_PH_DSP,
530
    OPC_DPSQ_SA_L_W   = (0x0D << 6) | OPC_DPA_W_PH_DSP,
531
    OPC_MAQ_S_W_PHL   = (0x14 << 6) | OPC_DPA_W_PH_DSP,
532
    OPC_MAQ_S_W_PHR   = (0x16 << 6) | OPC_DPA_W_PH_DSP,
533
    OPC_MAQ_SA_W_PHL  = (0x10 << 6) | OPC_DPA_W_PH_DSP,
534
    OPC_MAQ_SA_W_PHR  = (0x12 << 6) | OPC_DPA_W_PH_DSP,
535
    OPC_MULSA_W_PH    = (0x02 << 6) | OPC_DPA_W_PH_DSP,
536
};
537

    
538
#define MASK_INSV(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
539
enum {
540
    /* DSP Bit/Manipulation Sub-class */
541
    OPC_INSV = (0x00 << 6) | OPC_INSV_DSP,
542
};
543

    
544
#define MASK_APPEND(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
545
enum {
546
    /* MIPS DSP Append Sub-class */
547
    OPC_APPEND  = (0x00 << 6) | OPC_APPEND_DSP,
548
    OPC_PREPEND = (0x01 << 6) | OPC_APPEND_DSP,
549
    OPC_BALIGN  = (0x10 << 6) | OPC_APPEND_DSP,
550
};
551

    
552
#define MASK_EXTR_W(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
553
enum {
554
    /* MIPS DSP Accumulator and DSPControl Access Sub-class */
555
    OPC_EXTR_W     = (0x00 << 6) | OPC_EXTR_W_DSP,
556
    OPC_EXTR_R_W   = (0x04 << 6) | OPC_EXTR_W_DSP,
557
    OPC_EXTR_RS_W  = (0x06 << 6) | OPC_EXTR_W_DSP,
558
    OPC_EXTR_S_H   = (0x0E << 6) | OPC_EXTR_W_DSP,
559
    OPC_EXTRV_S_H  = (0x0F << 6) | OPC_EXTR_W_DSP,
560
    OPC_EXTRV_W    = (0x01 << 6) | OPC_EXTR_W_DSP,
561
    OPC_EXTRV_R_W  = (0x05 << 6) | OPC_EXTR_W_DSP,
562
    OPC_EXTRV_RS_W = (0x07 << 6) | OPC_EXTR_W_DSP,
563
    OPC_EXTP       = (0x02 << 6) | OPC_EXTR_W_DSP,
564
    OPC_EXTPV      = (0x03 << 6) | OPC_EXTR_W_DSP,
565
    OPC_EXTPDP     = (0x0A << 6) | OPC_EXTR_W_DSP,
566
    OPC_EXTPDPV    = (0x0B << 6) | OPC_EXTR_W_DSP,
567
    OPC_SHILO      = (0x1A << 6) | OPC_EXTR_W_DSP,
568
    OPC_SHILOV     = (0x1B << 6) | OPC_EXTR_W_DSP,
569
    OPC_MTHLIP     = (0x1F << 6) | OPC_EXTR_W_DSP,
570
    OPC_WRDSP      = (0x13 << 6) | OPC_EXTR_W_DSP,
571
    OPC_RDDSP      = (0x12 << 6) | OPC_EXTR_W_DSP,
572
};
573

    
574
#define MASK_ABSQ_S_QH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
575
enum {
576
    /* MIPS DSP Arithmetic Sub-class */
577
    OPC_PRECEQ_L_PWL    = (0x14 << 6) | OPC_ABSQ_S_QH_DSP,
578
    OPC_PRECEQ_L_PWR    = (0x15 << 6) | OPC_ABSQ_S_QH_DSP,
579
    OPC_PRECEQ_PW_QHL   = (0x0C << 6) | OPC_ABSQ_S_QH_DSP,
580
    OPC_PRECEQ_PW_QHR   = (0x0D << 6) | OPC_ABSQ_S_QH_DSP,
581
    OPC_PRECEQ_PW_QHLA  = (0x0E << 6) | OPC_ABSQ_S_QH_DSP,
582
    OPC_PRECEQ_PW_QHRA  = (0x0F << 6) | OPC_ABSQ_S_QH_DSP,
583
    OPC_PRECEQU_QH_OBL  = (0x04 << 6) | OPC_ABSQ_S_QH_DSP,
584
    OPC_PRECEQU_QH_OBR  = (0x05 << 6) | OPC_ABSQ_S_QH_DSP,
585
    OPC_PRECEQU_QH_OBLA = (0x06 << 6) | OPC_ABSQ_S_QH_DSP,
586
    OPC_PRECEQU_QH_OBRA = (0x07 << 6) | OPC_ABSQ_S_QH_DSP,
587
    OPC_PRECEU_QH_OBL   = (0x1C << 6) | OPC_ABSQ_S_QH_DSP,
588
    OPC_PRECEU_QH_OBR   = (0x1D << 6) | OPC_ABSQ_S_QH_DSP,
589
    OPC_PRECEU_QH_OBLA  = (0x1E << 6) | OPC_ABSQ_S_QH_DSP,
590
    OPC_PRECEU_QH_OBRA  = (0x1F << 6) | OPC_ABSQ_S_QH_DSP,
591
    OPC_ABSQ_S_OB       = (0x01 << 6) | OPC_ABSQ_S_QH_DSP,
592
    OPC_ABSQ_S_PW       = (0x11 << 6) | OPC_ABSQ_S_QH_DSP,
593
    OPC_ABSQ_S_QH       = (0x09 << 6) | OPC_ABSQ_S_QH_DSP,
594
    /* DSP Bit/Manipulation Sub-class */
595
    OPC_REPL_OB         = (0x02 << 6) | OPC_ABSQ_S_QH_DSP,
596
    OPC_REPL_PW         = (0x12 << 6) | OPC_ABSQ_S_QH_DSP,
597
    OPC_REPL_QH         = (0x0A << 6) | OPC_ABSQ_S_QH_DSP,
598
    OPC_REPLV_OB        = (0x03 << 6) | OPC_ABSQ_S_QH_DSP,
599
    OPC_REPLV_PW        = (0x13 << 6) | OPC_ABSQ_S_QH_DSP,
600
    OPC_REPLV_QH        = (0x0B << 6) | OPC_ABSQ_S_QH_DSP,
601
};
602

    
603
#define MASK_ADDU_OB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
604
enum {
605
    /* MIPS DSP Multiply Sub-class insns */
606
    OPC_MULEQ_S_PW_QHL = (0x1C << 6) | OPC_ADDU_OB_DSP,
607
    OPC_MULEQ_S_PW_QHR = (0x1D << 6) | OPC_ADDU_OB_DSP,
608
    OPC_MULEU_S_QH_OBL = (0x06 << 6) | OPC_ADDU_OB_DSP,
609
    OPC_MULEU_S_QH_OBR = (0x07 << 6) | OPC_ADDU_OB_DSP,
610
    OPC_MULQ_RS_QH     = (0x1F << 6) | OPC_ADDU_OB_DSP,
611
    /* MIPS DSP Arithmetic Sub-class */
612
    OPC_RADDU_L_OB     = (0x14 << 6) | OPC_ADDU_OB_DSP,
613
    OPC_SUBQ_PW        = (0x13 << 6) | OPC_ADDU_OB_DSP,
614
    OPC_SUBQ_S_PW      = (0x17 << 6) | OPC_ADDU_OB_DSP,
615
    OPC_SUBQ_QH        = (0x0B << 6) | OPC_ADDU_OB_DSP,
616
    OPC_SUBQ_S_QH      = (0x0F << 6) | OPC_ADDU_OB_DSP,
617
    OPC_SUBU_OB        = (0x01 << 6) | OPC_ADDU_OB_DSP,
618
    OPC_SUBU_S_OB      = (0x05 << 6) | OPC_ADDU_OB_DSP,
619
    OPC_SUBU_QH        = (0x09 << 6) | OPC_ADDU_OB_DSP,
620
    OPC_SUBU_S_QH      = (0x0D << 6) | OPC_ADDU_OB_DSP,
621
    OPC_SUBUH_OB       = (0x19 << 6) | OPC_ADDU_OB_DSP,
622
    OPC_SUBUH_R_OB     = (0x1B << 6) | OPC_ADDU_OB_DSP,
623
    OPC_ADDQ_PW        = (0x12 << 6) | OPC_ADDU_OB_DSP,
624
    OPC_ADDQ_S_PW      = (0x16 << 6) | OPC_ADDU_OB_DSP,
625
    OPC_ADDQ_QH        = (0x0A << 6) | OPC_ADDU_OB_DSP,
626
    OPC_ADDQ_S_QH      = (0x0E << 6) | OPC_ADDU_OB_DSP,
627
    OPC_ADDU_OB        = (0x00 << 6) | OPC_ADDU_OB_DSP,
628
    OPC_ADDU_S_OB      = (0x04 << 6) | OPC_ADDU_OB_DSP,
629
    OPC_ADDU_QH        = (0x08 << 6) | OPC_ADDU_OB_DSP,
630
    OPC_ADDU_S_QH      = (0x0C << 6) | OPC_ADDU_OB_DSP,
631
    OPC_ADDUH_OB       = (0x18 << 6) | OPC_ADDU_OB_DSP,
632
    OPC_ADDUH_R_OB     = (0x1A << 6) | OPC_ADDU_OB_DSP,
633
};
634

    
635
#define MASK_CMPU_EQ_OB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
636
enum {
637
    /* DSP Compare-Pick Sub-class */
638
    OPC_CMP_EQ_PW         = (0x10 << 6) | OPC_CMPU_EQ_OB_DSP,
639
    OPC_CMP_LT_PW         = (0x11 << 6) | OPC_CMPU_EQ_OB_DSP,
640
    OPC_CMP_LE_PW         = (0x12 << 6) | OPC_CMPU_EQ_OB_DSP,
641
    OPC_CMP_EQ_QH         = (0x08 << 6) | OPC_CMPU_EQ_OB_DSP,
642
    OPC_CMP_LT_QH         = (0x09 << 6) | OPC_CMPU_EQ_OB_DSP,
643
    OPC_CMP_LE_QH         = (0x0A << 6) | OPC_CMPU_EQ_OB_DSP,
644
    OPC_CMPGDU_EQ_OB      = (0x18 << 6) | OPC_CMPU_EQ_OB_DSP,
645
    OPC_CMPGDU_LT_OB      = (0x19 << 6) | OPC_CMPU_EQ_OB_DSP,
646
    OPC_CMPGDU_LE_OB      = (0x1A << 6) | OPC_CMPU_EQ_OB_DSP,
647
    OPC_CMPGU_EQ_OB       = (0x04 << 6) | OPC_CMPU_EQ_OB_DSP,
648
    OPC_CMPGU_LT_OB       = (0x05 << 6) | OPC_CMPU_EQ_OB_DSP,
649
    OPC_CMPGU_LE_OB       = (0x06 << 6) | OPC_CMPU_EQ_OB_DSP,
650
    OPC_CMPU_EQ_OB        = (0x00 << 6) | OPC_CMPU_EQ_OB_DSP,
651
    OPC_CMPU_LT_OB        = (0x01 << 6) | OPC_CMPU_EQ_OB_DSP,
652
    OPC_CMPU_LE_OB        = (0x02 << 6) | OPC_CMPU_EQ_OB_DSP,
653
    OPC_PACKRL_PW         = (0x0E << 6) | OPC_CMPU_EQ_OB_DSP,
654
    OPC_PICK_OB           = (0x03 << 6) | OPC_CMPU_EQ_OB_DSP,
655
    OPC_PICK_PW           = (0x13 << 6) | OPC_CMPU_EQ_OB_DSP,
656
    OPC_PICK_QH           = (0x0B << 6) | OPC_CMPU_EQ_OB_DSP,
657
    /* MIPS DSP Arithmetic Sub-class */
658
    OPC_PRECR_OB_QH       = (0x0D << 6) | OPC_CMPU_EQ_OB_DSP,
659
    OPC_PRECR_SRA_QH_PW   = (0x1E << 6) | OPC_CMPU_EQ_OB_DSP,
660
    OPC_PRECR_SRA_R_QH_PW = (0x1F << 6) | OPC_CMPU_EQ_OB_DSP,
661
    OPC_PRECRQ_OB_QH      = (0x0C << 6) | OPC_CMPU_EQ_OB_DSP,
662
    OPC_PRECRQ_PW_L       = (0x1C << 6) | OPC_CMPU_EQ_OB_DSP,
663
    OPC_PRECRQ_QH_PW      = (0x14 << 6) | OPC_CMPU_EQ_OB_DSP,
664
    OPC_PRECRQ_RS_QH_PW   = (0x15 << 6) | OPC_CMPU_EQ_OB_DSP,
665
    OPC_PRECRQU_S_OB_QH   = (0x0F << 6) | OPC_CMPU_EQ_OB_DSP,
666
};
667

    
668
#define MASK_DAPPEND(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
669
enum {
670
    /* DSP Append Sub-class */
671
    OPC_DAPPEND  = (0x00 << 6) | OPC_DAPPEND_DSP,
672
    OPC_PREPENDD = (0x03 << 6) | OPC_DAPPEND_DSP,
673
    OPC_PREPENDW = (0x01 << 6) | OPC_DAPPEND_DSP,
674
    OPC_DBALIGN  = (0x10 << 6) | OPC_DAPPEND_DSP,
675
};
676

    
677
#define MASK_DEXTR_W(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
678
enum {
679
    /* MIPS DSP Accumulator and DSPControl Access Sub-class */
680
    OPC_DMTHLIP     = (0x1F << 6) | OPC_DEXTR_W_DSP,
681
    OPC_DSHILO      = (0x1A << 6) | OPC_DEXTR_W_DSP,
682
    OPC_DEXTP       = (0x02 << 6) | OPC_DEXTR_W_DSP,
683
    OPC_DEXTPDP     = (0x0A << 6) | OPC_DEXTR_W_DSP,
684
    OPC_DEXTPDPV    = (0x0B << 6) | OPC_DEXTR_W_DSP,
685
    OPC_DEXTPV      = (0x03 << 6) | OPC_DEXTR_W_DSP,
686
    OPC_DEXTR_L     = (0x10 << 6) | OPC_DEXTR_W_DSP,
687
    OPC_DEXTR_R_L   = (0x14 << 6) | OPC_DEXTR_W_DSP,
688
    OPC_DEXTR_RS_L  = (0x16 << 6) | OPC_DEXTR_W_DSP,
689
    OPC_DEXTR_W     = (0x00 << 6) | OPC_DEXTR_W_DSP,
690
    OPC_DEXTR_R_W   = (0x04 << 6) | OPC_DEXTR_W_DSP,
691
    OPC_DEXTR_RS_W  = (0x06 << 6) | OPC_DEXTR_W_DSP,
692
    OPC_DEXTR_S_H   = (0x0E << 6) | OPC_DEXTR_W_DSP,
693
    OPC_DEXTRV_L    = (0x11 << 6) | OPC_DEXTR_W_DSP,
694
    OPC_DEXTRV_R_L  = (0x15 << 6) | OPC_DEXTR_W_DSP,
695
    OPC_DEXTRV_RS_L = (0x17 << 6) | OPC_DEXTR_W_DSP,
696
    OPC_DEXTRV_S_H  = (0x0F << 6) | OPC_DEXTR_W_DSP,
697
    OPC_DEXTRV_W    = (0x01 << 6) | OPC_DEXTR_W_DSP,
698
    OPC_DEXTRV_R_W  = (0x05 << 6) | OPC_DEXTR_W_DSP,
699
    OPC_DEXTRV_RS_W = (0x07 << 6) | OPC_DEXTR_W_DSP,
700
    OPC_DSHILOV     = (0x1B << 6) | OPC_DEXTR_W_DSP,
701
};
702

    
703
#define MASK_DINSV(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
704
enum {
705
    /* DSP Bit/Manipulation Sub-class */
706
    OPC_DINSV = (0x00 << 6) | OPC_DINSV_DSP,
707
};
708

    
709
#define MASK_DPAQ_W_QH(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
710
enum {
711
    /* MIPS DSP Multiply Sub-class insns */
712
    OPC_DMADD         = (0x19 << 6) | OPC_DPAQ_W_QH_DSP,
713
    OPC_DMADDU        = (0x1D << 6) | OPC_DPAQ_W_QH_DSP,
714
    OPC_DMSUB         = (0x1B << 6) | OPC_DPAQ_W_QH_DSP,
715
    OPC_DMSUBU        = (0x1F << 6) | OPC_DPAQ_W_QH_DSP,
716
    OPC_DPA_W_QH      = (0x00 << 6) | OPC_DPAQ_W_QH_DSP,
717
    OPC_DPAQ_S_W_QH   = (0x04 << 6) | OPC_DPAQ_W_QH_DSP,
718
    OPC_DPAQ_SA_L_PW  = (0x0C << 6) | OPC_DPAQ_W_QH_DSP,
719
    OPC_DPAU_H_OBL    = (0x03 << 6) | OPC_DPAQ_W_QH_DSP,
720
    OPC_DPAU_H_OBR    = (0x07 << 6) | OPC_DPAQ_W_QH_DSP,
721
    OPC_DPS_W_QH      = (0x01 << 6) | OPC_DPAQ_W_QH_DSP,
722
    OPC_DPSQ_S_W_QH   = (0x05 << 6) | OPC_DPAQ_W_QH_DSP,
723
    OPC_DPSQ_SA_L_PW  = (0x0D << 6) | OPC_DPAQ_W_QH_DSP,
724
    OPC_DPSU_H_OBL    = (0x0B << 6) | OPC_DPAQ_W_QH_DSP,
725
    OPC_DPSU_H_OBR    = (0x0F << 6) | OPC_DPAQ_W_QH_DSP,
726
    OPC_MAQ_S_L_PWL   = (0x1C << 6) | OPC_DPAQ_W_QH_DSP,
727
    OPC_MAQ_S_L_PWR   = (0x1E << 6) | OPC_DPAQ_W_QH_DSP,
728
    OPC_MAQ_S_W_QHLL  = (0x14 << 6) | OPC_DPAQ_W_QH_DSP,
729
    OPC_MAQ_SA_W_QHLL = (0x10 << 6) | OPC_DPAQ_W_QH_DSP,
730
    OPC_MAQ_S_W_QHLR  = (0x15 << 6) | OPC_DPAQ_W_QH_DSP,
731
    OPC_MAQ_SA_W_QHLR = (0x11 << 6) | OPC_DPAQ_W_QH_DSP,
732
    OPC_MAQ_S_W_QHRL  = (0x16 << 6) | OPC_DPAQ_W_QH_DSP,
733
    OPC_MAQ_SA_W_QHRL = (0x12 << 6) | OPC_DPAQ_W_QH_DSP,
734
    OPC_MAQ_S_W_QHRR  = (0x17 << 6) | OPC_DPAQ_W_QH_DSP,
735
    OPC_MAQ_SA_W_QHRR = (0x13 << 6) | OPC_DPAQ_W_QH_DSP,
736
    OPC_MULSAQ_S_L_PW = (0x0E << 6) | OPC_DPAQ_W_QH_DSP,
737
    OPC_MULSAQ_S_W_QH = (0x06 << 6) | OPC_DPAQ_W_QH_DSP,
738
};
739

    
740
#define MASK_SHLL_OB(op) (MASK_SPECIAL3(op) | (op & (0x1F << 6)))
741
enum {
742
    /* MIPS DSP GPR-Based Shift Sub-class */
743
    OPC_SHLL_PW    = (0x10 << 6) | OPC_SHLL_OB_DSP,
744
    OPC_SHLL_S_PW  = (0x14 << 6) | OPC_SHLL_OB_DSP,
745
    OPC_SHLLV_OB   = (0x02 << 6) | OPC_SHLL_OB_DSP,
746
    OPC_SHLLV_PW   = (0x12 << 6) | OPC_SHLL_OB_DSP,
747
    OPC_SHLLV_S_PW = (0x16 << 6) | OPC_SHLL_OB_DSP,
748
    OPC_SHLLV_QH   = (0x0A << 6) | OPC_SHLL_OB_DSP,
749
    OPC_SHLLV_S_QH = (0x0E << 6) | OPC_SHLL_OB_DSP,
750
    OPC_SHRA_PW    = (0x11 << 6) | OPC_SHLL_OB_DSP,
751
    OPC_SHRA_R_PW  = (0x15 << 6) | OPC_SHLL_OB_DSP,
752
    OPC_SHRAV_OB   = (0x06 << 6) | OPC_SHLL_OB_DSP,
753
    OPC_SHRAV_R_OB = (0x07 << 6) | OPC_SHLL_OB_DSP,
754
    OPC_SHRAV_PW   = (0x13 << 6) | OPC_SHLL_OB_DSP,
755
    OPC_SHRAV_R_PW = (0x17 << 6) | OPC_SHLL_OB_DSP,
756
    OPC_SHRAV_QH   = (0x0B << 6) | OPC_SHLL_OB_DSP,
757
    OPC_SHRAV_R_QH = (0x0F << 6) | OPC_SHLL_OB_DSP,
758
    OPC_SHRLV_OB   = (0x03 << 6) | OPC_SHLL_OB_DSP,
759
    OPC_SHRLV_QH   = (0x1B << 6) | OPC_SHLL_OB_DSP,
760
    OPC_SHLL_OB    = (0x00 << 6) | OPC_SHLL_OB_DSP,
761
    OPC_SHLL_QH    = (0x08 << 6) | OPC_SHLL_OB_DSP,
762
    OPC_SHLL_S_QH  = (0x0C << 6) | OPC_SHLL_OB_DSP,
763
    OPC_SHRA_OB    = (0x04 << 6) | OPC_SHLL_OB_DSP,
764
    OPC_SHRA_R_OB  = (0x05 << 6) | OPC_SHLL_OB_DSP,
765
    OPC_SHRA_QH    = (0x09 << 6) | OPC_SHLL_OB_DSP,
766
    OPC_SHRA_R_QH  = (0x0D << 6) | OPC_SHLL_OB_DSP,
767
    OPC_SHRL_OB    = (0x01 << 6) | OPC_SHLL_OB_DSP,
768
    OPC_SHRL_QH    = (0x19 << 6) | OPC_SHLL_OB_DSP,
769
};
770

    
771
/* Coprocessor 0 (rs field) */
772
#define MASK_CP0(op)       MASK_OP_MAJOR(op) | (op & (0x1F << 21))
773

    
774
enum {
775
    OPC_MFC0     = (0x00 << 21) | OPC_CP0,
776
    OPC_DMFC0    = (0x01 << 21) | OPC_CP0,
777
    OPC_MTC0     = (0x04 << 21) | OPC_CP0,
778
    OPC_DMTC0    = (0x05 << 21) | OPC_CP0,
779
    OPC_MFTR     = (0x08 << 21) | OPC_CP0,
780
    OPC_RDPGPR   = (0x0A << 21) | OPC_CP0,
781
    OPC_MFMC0    = (0x0B << 21) | OPC_CP0,
782
    OPC_MTTR     = (0x0C << 21) | OPC_CP0,
783
    OPC_WRPGPR   = (0x0E << 21) | OPC_CP0,
784
    OPC_C0       = (0x10 << 21) | OPC_CP0,
785
    OPC_C0_FIRST = (0x10 << 21) | OPC_CP0,
786
    OPC_C0_LAST  = (0x1F << 21) | OPC_CP0,
787
};
788

    
789
/* MFMC0 opcodes */
790
#define MASK_MFMC0(op)     MASK_CP0(op) | (op & 0xFFFF)
791

    
792
enum {
793
    OPC_DMT      = 0x01 | (0 << 5) | (0x0F << 6) | (0x01 << 11) | OPC_MFMC0,
794
    OPC_EMT      = 0x01 | (1 << 5) | (0x0F << 6) | (0x01 << 11) | OPC_MFMC0,
795
    OPC_DVPE     = 0x01 | (0 << 5) | OPC_MFMC0,
796
    OPC_EVPE     = 0x01 | (1 << 5) | OPC_MFMC0,
797
    OPC_DI       = (0 << 5) | (0x0C << 11) | OPC_MFMC0,
798
    OPC_EI       = (1 << 5) | (0x0C << 11) | OPC_MFMC0,
799
};
800

    
801
/* Coprocessor 0 (with rs == C0) */
802
#define MASK_C0(op)        MASK_CP0(op) | (op & 0x3F)
803

    
804
enum {
805
    OPC_TLBR     = 0x01 | OPC_C0,
806
    OPC_TLBWI    = 0x02 | OPC_C0,
807
    OPC_TLBWR    = 0x06 | OPC_C0,
808
    OPC_TLBP     = 0x08 | OPC_C0,
809
    OPC_RFE      = 0x10 | OPC_C0,
810
    OPC_ERET     = 0x18 | OPC_C0,
811
    OPC_DERET    = 0x1F | OPC_C0,
812
    OPC_WAIT     = 0x20 | OPC_C0,
813
};
814

    
815
/* Coprocessor 1 (rs field) */
816
#define MASK_CP1(op)       MASK_OP_MAJOR(op) | (op & (0x1F << 21))
817

    
818
/* Values for the fmt field in FP instructions */
819
enum {
820
    /* 0 - 15 are reserved */
821
    FMT_S = 16,          /* single fp */
822
    FMT_D = 17,          /* double fp */
823
    FMT_E = 18,          /* extended fp */
824
    FMT_Q = 19,          /* quad fp */
825
    FMT_W = 20,          /* 32-bit fixed */
826
    FMT_L = 21,          /* 64-bit fixed */
827
    FMT_PS = 22,         /* paired single fp */
828
    /* 23 - 31 are reserved */
829
};
830

    
831
enum {
832
    OPC_MFC1     = (0x00 << 21) | OPC_CP1,
833
    OPC_DMFC1    = (0x01 << 21) | OPC_CP1,
834
    OPC_CFC1     = (0x02 << 21) | OPC_CP1,
835
    OPC_MFHC1    = (0x03 << 21) | OPC_CP1,
836
    OPC_MTC1     = (0x04 << 21) | OPC_CP1,
837
    OPC_DMTC1    = (0x05 << 21) | OPC_CP1,
838
    OPC_CTC1     = (0x06 << 21) | OPC_CP1,
839
    OPC_MTHC1    = (0x07 << 21) | OPC_CP1,
840
    OPC_BC1      = (0x08 << 21) | OPC_CP1, /* bc */
841
    OPC_BC1ANY2  = (0x09 << 21) | OPC_CP1,
842
    OPC_BC1ANY4  = (0x0A << 21) | OPC_CP1,
843
    OPC_S_FMT    = (FMT_S << 21) | OPC_CP1,
844
    OPC_D_FMT    = (FMT_D << 21) | OPC_CP1,
845
    OPC_E_FMT    = (FMT_E << 21) | OPC_CP1,
846
    OPC_Q_FMT    = (FMT_Q << 21) | OPC_CP1,
847
    OPC_W_FMT    = (FMT_W << 21) | OPC_CP1,
848
    OPC_L_FMT    = (FMT_L << 21) | OPC_CP1,
849
    OPC_PS_FMT   = (FMT_PS << 21) | OPC_CP1,
850
};
851

    
852
#define MASK_CP1_FUNC(op)       MASK_CP1(op) | (op & 0x3F)
853
#define MASK_BC1(op)            MASK_CP1(op) | (op & (0x3 << 16))
854

    
855
enum {
856
    OPC_BC1F     = (0x00 << 16) | OPC_BC1,
857
    OPC_BC1T     = (0x01 << 16) | OPC_BC1,
858
    OPC_BC1FL    = (0x02 << 16) | OPC_BC1,
859
    OPC_BC1TL    = (0x03 << 16) | OPC_BC1,
860
};
861

    
862
enum {
863
    OPC_BC1FANY2     = (0x00 << 16) | OPC_BC1ANY2,
864
    OPC_BC1TANY2     = (0x01 << 16) | OPC_BC1ANY2,
865
};
866

    
867
enum {
868
    OPC_BC1FANY4     = (0x00 << 16) | OPC_BC1ANY4,
869
    OPC_BC1TANY4     = (0x01 << 16) | OPC_BC1ANY4,
870
};
871

    
872
#define MASK_CP2(op)       MASK_OP_MAJOR(op) | (op & (0x1F << 21))
873

    
874
enum {
875
    OPC_MFC2    = (0x00 << 21) | OPC_CP2,
876
    OPC_DMFC2   = (0x01 << 21) | OPC_CP2,
877
    OPC_CFC2    = (0x02 << 21) | OPC_CP2,
878
    OPC_MFHC2   = (0x03 << 21) | OPC_CP2,
879
    OPC_MTC2    = (0x04 << 21) | OPC_CP2,
880
    OPC_DMTC2   = (0x05 << 21) | OPC_CP2,
881
    OPC_CTC2    = (0x06 << 21) | OPC_CP2,
882
    OPC_MTHC2   = (0x07 << 21) | OPC_CP2,
883
    OPC_BC2     = (0x08 << 21) | OPC_CP2,
884
};
885

    
886
#define MASK_LMI(op)  (MASK_OP_MAJOR(op) | (op & (0x1F << 21)) | (op & 0x1F))
887

    
888
enum {
889
    OPC_PADDSH  = (24 << 21) | (0x00) | OPC_CP2,
890
    OPC_PADDUSH = (25 << 21) | (0x00) | OPC_CP2,
891
    OPC_PADDH   = (26 << 21) | (0x00) | OPC_CP2,
892
    OPC_PADDW   = (27 << 21) | (0x00) | OPC_CP2,
893
    OPC_PADDSB  = (28 << 21) | (0x00) | OPC_CP2,
894
    OPC_PADDUSB = (29 << 21) | (0x00) | OPC_CP2,
895
    OPC_PADDB   = (30 << 21) | (0x00) | OPC_CP2,
896
    OPC_PADDD   = (31 << 21) | (0x00) | OPC_CP2,
897

    
898
    OPC_PSUBSH  = (24 << 21) | (0x01) | OPC_CP2,
899
    OPC_PSUBUSH = (25 << 21) | (0x01) | OPC_CP2,
900
    OPC_PSUBH   = (26 << 21) | (0x01) | OPC_CP2,
901
    OPC_PSUBW   = (27 << 21) | (0x01) | OPC_CP2,
902
    OPC_PSUBSB  = (28 << 21) | (0x01) | OPC_CP2,
903
    OPC_PSUBUSB = (29 << 21) | (0x01) | OPC_CP2,
904
    OPC_PSUBB   = (30 << 21) | (0x01) | OPC_CP2,
905
    OPC_PSUBD   = (31 << 21) | (0x01) | OPC_CP2,
906

    
907
    OPC_PSHUFH   = (24 << 21) | (0x02) | OPC_CP2,
908
    OPC_PACKSSWH = (25 << 21) | (0x02) | OPC_CP2,
909
    OPC_PACKSSHB = (26 << 21) | (0x02) | OPC_CP2,
910
    OPC_PACKUSHB = (27 << 21) | (0x02) | OPC_CP2,
911
    OPC_XOR_CP2  = (28 << 21) | (0x02) | OPC_CP2,
912
    OPC_NOR_CP2  = (29 << 21) | (0x02) | OPC_CP2,
913
    OPC_AND_CP2  = (30 << 21) | (0x02) | OPC_CP2,
914
    OPC_PANDN    = (31 << 21) | (0x02) | OPC_CP2,
915

    
916
    OPC_PUNPCKLHW = (24 << 21) | (0x03) | OPC_CP2,
917
    OPC_PUNPCKHHW = (25 << 21) | (0x03) | OPC_CP2,
918
    OPC_PUNPCKLBH = (26 << 21) | (0x03) | OPC_CP2,
919
    OPC_PUNPCKHBH = (27 << 21) | (0x03) | OPC_CP2,
920
    OPC_PINSRH_0  = (28 << 21) | (0x03) | OPC_CP2,
921
    OPC_PINSRH_1  = (29 << 21) | (0x03) | OPC_CP2,
922
    OPC_PINSRH_2  = (30 << 21) | (0x03) | OPC_CP2,
923
    OPC_PINSRH_3  = (31 << 21) | (0x03) | OPC_CP2,
924

    
925
    OPC_PAVGH   = (24 << 21) | (0x08) | OPC_CP2,
926
    OPC_PAVGB   = (25 << 21) | (0x08) | OPC_CP2,
927
    OPC_PMAXSH  = (26 << 21) | (0x08) | OPC_CP2,
928
    OPC_PMINSH  = (27 << 21) | (0x08) | OPC_CP2,
929
    OPC_PMAXUB  = (28 << 21) | (0x08) | OPC_CP2,
930
    OPC_PMINUB  = (29 << 21) | (0x08) | OPC_CP2,
931

    
932
    OPC_PCMPEQW = (24 << 21) | (0x09) | OPC_CP2,
933
    OPC_PCMPGTW = (25 << 21) | (0x09) | OPC_CP2,
934
    OPC_PCMPEQH = (26 << 21) | (0x09) | OPC_CP2,
935
    OPC_PCMPGTH = (27 << 21) | (0x09) | OPC_CP2,
936
    OPC_PCMPEQB = (28 << 21) | (0x09) | OPC_CP2,
937
    OPC_PCMPGTB = (29 << 21) | (0x09) | OPC_CP2,
938

    
939
    OPC_PSLLW   = (24 << 21) | (0x0A) | OPC_CP2,
940
    OPC_PSLLH   = (25 << 21) | (0x0A) | OPC_CP2,
941
    OPC_PMULLH  = (26 << 21) | (0x0A) | OPC_CP2,
942
    OPC_PMULHH  = (27 << 21) | (0x0A) | OPC_CP2,
943
    OPC_PMULUW  = (28 << 21) | (0x0A) | OPC_CP2,
944
    OPC_PMULHUH = (29 << 21) | (0x0A) | OPC_CP2,
945

    
946
    OPC_PSRLW     = (24 << 21) | (0x0B) | OPC_CP2,
947
    OPC_PSRLH     = (25 << 21) | (0x0B) | OPC_CP2,
948
    OPC_PSRAW     = (26 << 21) | (0x0B) | OPC_CP2,
949
    OPC_PSRAH     = (27 << 21) | (0x0B) | OPC_CP2,
950
    OPC_PUNPCKLWD = (28 << 21) | (0x0B) | OPC_CP2,
951
    OPC_PUNPCKHWD = (29 << 21) | (0x0B) | OPC_CP2,
952

    
953
    OPC_ADDU_CP2 = (24 << 21) | (0x0C) | OPC_CP2,
954
    OPC_OR_CP2   = (25 << 21) | (0x0C) | OPC_CP2,
955
    OPC_ADD_CP2  = (26 << 21) | (0x0C) | OPC_CP2,
956
    OPC_DADD_CP2 = (27 << 21) | (0x0C) | OPC_CP2,
957
    OPC_SEQU_CP2 = (28 << 21) | (0x0C) | OPC_CP2,
958
    OPC_SEQ_CP2  = (29 << 21) | (0x0C) | OPC_CP2,
959

    
960
    OPC_SUBU_CP2 = (24 << 21) | (0x0D) | OPC_CP2,
961
    OPC_PASUBUB  = (25 << 21) | (0x0D) | OPC_CP2,
962
    OPC_SUB_CP2  = (26 << 21) | (0x0D) | OPC_CP2,
963
    OPC_DSUB_CP2 = (27 << 21) | (0x0D) | OPC_CP2,
964
    OPC_SLTU_CP2 = (28 << 21) | (0x0D) | OPC_CP2,
965
    OPC_SLT_CP2  = (29 << 21) | (0x0D) | OPC_CP2,
966

    
967
    OPC_SLL_CP2  = (24 << 21) | (0x0E) | OPC_CP2,
968
    OPC_DSLL_CP2 = (25 << 21) | (0x0E) | OPC_CP2,
969
    OPC_PEXTRH   = (26 << 21) | (0x0E) | OPC_CP2,
970
    OPC_PMADDHW  = (27 << 21) | (0x0E) | OPC_CP2,
971
    OPC_SLEU_CP2 = (28 << 21) | (0x0E) | OPC_CP2,
972
    OPC_SLE_CP2  = (29 << 21) | (0x0E) | OPC_CP2,
973

    
974
    OPC_SRL_CP2  = (24 << 21) | (0x0F) | OPC_CP2,
975
    OPC_DSRL_CP2 = (25 << 21) | (0x0F) | OPC_CP2,
976
    OPC_SRA_CP2  = (26 << 21) | (0x0F) | OPC_CP2,
977
    OPC_DSRA_CP2 = (27 << 21) | (0x0F) | OPC_CP2,
978
    OPC_BIADD    = (28 << 21) | (0x0F) | OPC_CP2,
979
    OPC_PMOVMSKB = (29 << 21) | (0x0F) | OPC_CP2,
980
};
981

    
982

    
983
#define MASK_CP3(op)       MASK_OP_MAJOR(op) | (op & 0x3F)
984

    
985
enum {
986
    OPC_LWXC1   = 0x00 | OPC_CP3,
987
    OPC_LDXC1   = 0x01 | OPC_CP3,
988
    OPC_LUXC1   = 0x05 | OPC_CP3,
989
    OPC_SWXC1   = 0x08 | OPC_CP3,
990
    OPC_SDXC1   = 0x09 | OPC_CP3,
991
    OPC_SUXC1   = 0x0D | OPC_CP3,
992
    OPC_PREFX   = 0x0F | OPC_CP3,
993
    OPC_ALNV_PS = 0x1E | OPC_CP3,
994
    OPC_MADD_S  = 0x20 | OPC_CP3,
995
    OPC_MADD_D  = 0x21 | OPC_CP3,
996
    OPC_MADD_PS = 0x26 | OPC_CP3,
997
    OPC_MSUB_S  = 0x28 | OPC_CP3,
998
    OPC_MSUB_D  = 0x29 | OPC_CP3,
999
    OPC_MSUB_PS = 0x2E | OPC_CP3,
1000
    OPC_NMADD_S = 0x30 | OPC_CP3,
1001
    OPC_NMADD_D = 0x31 | OPC_CP3,
1002
    OPC_NMADD_PS= 0x36 | OPC_CP3,
1003
    OPC_NMSUB_S = 0x38 | OPC_CP3,
1004
    OPC_NMSUB_D = 0x39 | OPC_CP3,
1005
    OPC_NMSUB_PS= 0x3E | OPC_CP3,
1006
};
1007

    
1008
/* global register indices */
1009
static TCGv_ptr cpu_env;
1010
static TCGv cpu_gpr[32], cpu_PC;
1011
static TCGv cpu_HI[MIPS_DSP_ACC], cpu_LO[MIPS_DSP_ACC], cpu_ACX[MIPS_DSP_ACC];
1012
static TCGv cpu_dspctrl, btarget, bcond;
1013
static TCGv_i32 hflags;
1014
static TCGv_i32 fpu_fcr0, fpu_fcr31;
1015
static TCGv_i64 fpu_f64[32];
1016

    
1017
static uint32_t gen_opc_hflags[OPC_BUF_SIZE];
1018
static target_ulong gen_opc_btarget[OPC_BUF_SIZE];
1019

    
1020
#include "exec/gen-icount.h"
1021

    
1022
#define gen_helper_0e0i(name, arg) do {                           \
1023
    TCGv_i32 helper_tmp = tcg_const_i32(arg);                     \
1024
    gen_helper_##name(cpu_env, helper_tmp);                       \
1025
    tcg_temp_free_i32(helper_tmp);                                \
1026
    } while(0)
1027

    
1028
#define gen_helper_0e1i(name, arg1, arg2) do {                    \
1029
    TCGv_i32 helper_tmp = tcg_const_i32(arg2);                    \
1030
    gen_helper_##name(cpu_env, arg1, helper_tmp);                 \
1031
    tcg_temp_free_i32(helper_tmp);                                \
1032
    } while(0)
1033

    
1034
#define gen_helper_1e0i(name, ret, arg1) do {                     \
1035
    TCGv_i32 helper_tmp = tcg_const_i32(arg1);                    \
1036
    gen_helper_##name(ret, cpu_env, helper_tmp);                  \
1037
    tcg_temp_free_i32(helper_tmp);                                \
1038
    } while(0)
1039

    
1040
#define gen_helper_1e1i(name, ret, arg1, arg2) do {               \
1041
    TCGv_i32 helper_tmp = tcg_const_i32(arg2);                    \
1042
    gen_helper_##name(ret, cpu_env, arg1, helper_tmp);            \
1043
    tcg_temp_free_i32(helper_tmp);                                \
1044
    } while(0)
1045

    
1046
#define gen_helper_0e2i(name, arg1, arg2, arg3) do {              \
1047
    TCGv_i32 helper_tmp = tcg_const_i32(arg3);                    \
1048
    gen_helper_##name(cpu_env, arg1, arg2, helper_tmp);           \
1049
    tcg_temp_free_i32(helper_tmp);                                \
1050
    } while(0)
1051

    
1052
#define gen_helper_1e2i(name, ret, arg1, arg2, arg3) do {         \
1053
    TCGv_i32 helper_tmp = tcg_const_i32(arg3);                    \
1054
    gen_helper_##name(ret, cpu_env, arg1, arg2, helper_tmp);      \
1055
    tcg_temp_free_i32(helper_tmp);                                \
1056
    } while(0)
1057

    
1058
#define gen_helper_0e3i(name, arg1, arg2, arg3, arg4) do {        \
1059
    TCGv_i32 helper_tmp = tcg_const_i32(arg4);                    \
1060
    gen_helper_##name(cpu_env, arg1, arg2, arg3, helper_tmp);     \
1061
    tcg_temp_free_i32(helper_tmp);                                \
1062
    } while(0)
1063

    
1064
typedef struct DisasContext {
1065
    struct TranslationBlock *tb;
1066
    target_ulong pc, saved_pc;
1067
    uint32_t opcode;
1068
    int singlestep_enabled;
1069
    int insn_flags;
1070
    /* Routine used to access memory */
1071
    int mem_idx;
1072
    uint32_t hflags, saved_hflags;
1073
    int bstate;
1074
    target_ulong btarget;
1075
} DisasContext;
1076

    
1077
enum {
1078
    BS_NONE     = 0, /* We go out of the TB without reaching a branch or an
1079
                      * exception condition */
1080
    BS_STOP     = 1, /* We want to stop translation for any reason */
1081
    BS_BRANCH   = 2, /* We reached a branch condition     */
1082
    BS_EXCP     = 3, /* We reached an exception condition */
1083
};
1084

    
1085
static const char * const regnames[] = {
1086
    "r0", "at", "v0", "v1", "a0", "a1", "a2", "a3",
1087
    "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
1088
    "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
1089
    "t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra",
1090
};
1091

    
1092
static const char * const regnames_HI[] = {
1093
    "HI0", "HI1", "HI2", "HI3",
1094
};
1095

    
1096
static const char * const regnames_LO[] = {
1097
    "LO0", "LO1", "LO2", "LO3",
1098
};
1099

    
1100
static const char * const regnames_ACX[] = {
1101
    "ACX0", "ACX1", "ACX2", "ACX3",
1102
};
1103

    
1104
static const char * const fregnames[] = {
1105
    "f0",  "f1",  "f2",  "f3",  "f4",  "f5",  "f6",  "f7",
1106
    "f8",  "f9",  "f10", "f11", "f12", "f13", "f14", "f15",
1107
    "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1108
    "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
1109
};
1110

    
1111
#define MIPS_DEBUG(fmt, ...)                                                  \
1112
    do {                                                                      \
1113
        if (MIPS_DEBUG_DISAS) {                                               \
1114
            qemu_log_mask(CPU_LOG_TB_IN_ASM,                                  \
1115
                          TARGET_FMT_lx ": %08x " fmt "\n",                   \
1116
                          ctx->pc, ctx->opcode , ## __VA_ARGS__);             \
1117
        }                                                                     \
1118
    } while (0)
1119

    
1120
#define LOG_DISAS(...)                                                        \
1121
    do {                                                                      \
1122
        if (MIPS_DEBUG_DISAS) {                                               \
1123
            qemu_log_mask(CPU_LOG_TB_IN_ASM, ## __VA_ARGS__);                 \
1124
        }                                                                     \
1125
    } while (0)
1126

    
1127
#define MIPS_INVAL(op)                                                        \
1128
    MIPS_DEBUG("Invalid %s %03x %03x %03x", op, ctx->opcode >> 26,            \
1129
               ctx->opcode & 0x3F, ((ctx->opcode >> 16) & 0x1F))
1130

    
1131
/* General purpose registers moves. */
1132
static inline void gen_load_gpr (TCGv t, int reg)
1133
{
1134
    if (reg == 0)
1135
        tcg_gen_movi_tl(t, 0);
1136
    else
1137
        tcg_gen_mov_tl(t, cpu_gpr[reg]);
1138
}
1139

    
1140
static inline void gen_store_gpr (TCGv t, int reg)
1141
{
1142
    if (reg != 0)
1143
        tcg_gen_mov_tl(cpu_gpr[reg], t);
1144
}
1145

    
1146
/* Moves to/from ACX register.  */
1147
static inline void gen_load_ACX (TCGv t, int reg)
1148
{
1149
    tcg_gen_mov_tl(t, cpu_ACX[reg]);
1150
}
1151

    
1152
static inline void gen_store_ACX (TCGv t, int reg)
1153
{
1154
    tcg_gen_mov_tl(cpu_ACX[reg], t);
1155
}
1156

    
1157
/* Moves to/from shadow registers. */
1158
static inline void gen_load_srsgpr (int from, int to)
1159
{
1160
    TCGv t0 = tcg_temp_new();
1161

    
1162
    if (from == 0)
1163
        tcg_gen_movi_tl(t0, 0);
1164
    else {
1165
        TCGv_i32 t2 = tcg_temp_new_i32();
1166
        TCGv_ptr addr = tcg_temp_new_ptr();
1167

    
1168
        tcg_gen_ld_i32(t2, cpu_env, offsetof(CPUMIPSState, CP0_SRSCtl));
1169
        tcg_gen_shri_i32(t2, t2, CP0SRSCtl_PSS);
1170
        tcg_gen_andi_i32(t2, t2, 0xf);
1171
        tcg_gen_muli_i32(t2, t2, sizeof(target_ulong) * 32);
1172
        tcg_gen_ext_i32_ptr(addr, t2);
1173
        tcg_gen_add_ptr(addr, cpu_env, addr);
1174

    
1175
        tcg_gen_ld_tl(t0, addr, sizeof(target_ulong) * from);
1176
        tcg_temp_free_ptr(addr);
1177
        tcg_temp_free_i32(t2);
1178
    }
1179
    gen_store_gpr(t0, to);
1180
    tcg_temp_free(t0);
1181
}
1182

    
1183
static inline void gen_store_srsgpr (int from, int to)
1184
{
1185
    if (to != 0) {
1186
        TCGv t0 = tcg_temp_new();
1187
        TCGv_i32 t2 = tcg_temp_new_i32();
1188
        TCGv_ptr addr = tcg_temp_new_ptr();
1189

    
1190
        gen_load_gpr(t0, from);
1191
        tcg_gen_ld_i32(t2, cpu_env, offsetof(CPUMIPSState, CP0_SRSCtl));
1192
        tcg_gen_shri_i32(t2, t2, CP0SRSCtl_PSS);
1193
        tcg_gen_andi_i32(t2, t2, 0xf);
1194
        tcg_gen_muli_i32(t2, t2, sizeof(target_ulong) * 32);
1195
        tcg_gen_ext_i32_ptr(addr, t2);
1196
        tcg_gen_add_ptr(addr, cpu_env, addr);
1197

    
1198
        tcg_gen_st_tl(t0, addr, sizeof(target_ulong) * to);
1199
        tcg_temp_free_ptr(addr);
1200
        tcg_temp_free_i32(t2);
1201
        tcg_temp_free(t0);
1202
    }
1203
}
1204

    
1205
/* Floating point register moves. */
1206
static void gen_load_fpr32(TCGv_i32 t, int reg)
1207
{
1208
    tcg_gen_trunc_i64_i32(t, fpu_f64[reg]);
1209
}
1210

    
1211
static void gen_store_fpr32(TCGv_i32 t, int reg)
1212
{
1213
    TCGv_i64 t64 = tcg_temp_new_i64();
1214
    tcg_gen_extu_i32_i64(t64, t);
1215
    tcg_gen_deposit_i64(fpu_f64[reg], fpu_f64[reg], t64, 0, 32);
1216
    tcg_temp_free_i64(t64);
1217
}
1218

    
1219
static void gen_load_fpr32h(TCGv_i32 t, int reg)
1220
{
1221
    TCGv_i64 t64 = tcg_temp_new_i64();
1222
    tcg_gen_shri_i64(t64, fpu_f64[reg], 32);
1223
    tcg_gen_trunc_i64_i32(t, t64);
1224
    tcg_temp_free_i64(t64);
1225
}
1226

    
1227
static void gen_store_fpr32h(TCGv_i32 t, int reg)
1228
{
1229
    TCGv_i64 t64 = tcg_temp_new_i64();
1230
    tcg_gen_extu_i32_i64(t64, t);
1231
    tcg_gen_deposit_i64(fpu_f64[reg], fpu_f64[reg], t64, 32, 32);
1232
    tcg_temp_free_i64(t64);
1233
}
1234

    
1235
static void gen_load_fpr64(DisasContext *ctx, TCGv_i64 t, int reg)
1236
{
1237
    if (ctx->hflags & MIPS_HFLAG_F64) {
1238
        tcg_gen_mov_i64(t, fpu_f64[reg]);
1239
    } else {
1240
        tcg_gen_concat32_i64(t, fpu_f64[reg & ~1], fpu_f64[reg | 1]);
1241
    }
1242
}
1243

    
1244
static void gen_store_fpr64(DisasContext *ctx, TCGv_i64 t, int reg)
1245
{
1246
    if (ctx->hflags & MIPS_HFLAG_F64) {
1247
        tcg_gen_mov_i64(fpu_f64[reg], t);
1248
    } else {
1249
        TCGv_i64 t0;
1250
        tcg_gen_deposit_i64(fpu_f64[reg & ~1], fpu_f64[reg & ~1], t, 0, 32);
1251
        t0 = tcg_temp_new_i64();
1252
        tcg_gen_shri_i64(t0, t, 32);
1253
        tcg_gen_deposit_i64(fpu_f64[reg | 1], fpu_f64[reg | 1], t0, 0, 32);
1254
        tcg_temp_free_i64(t0);
1255
    }
1256
}
1257

    
1258
static inline int get_fp_bit (int cc)
1259
{
1260
    if (cc)
1261
        return 24 + cc;
1262
    else
1263
        return 23;
1264
}
1265

    
1266
/* Tests */
1267
static inline void gen_save_pc(target_ulong pc)
1268
{
1269
    tcg_gen_movi_tl(cpu_PC, pc);
1270
}
1271

    
1272
static inline void save_cpu_state (DisasContext *ctx, int do_save_pc)
1273
{
1274
    LOG_DISAS("hflags %08x saved %08x\n", ctx->hflags, ctx->saved_hflags);
1275
    if (do_save_pc && ctx->pc != ctx->saved_pc) {
1276
        gen_save_pc(ctx->pc);
1277
        ctx->saved_pc = ctx->pc;
1278
    }
1279
    if (ctx->hflags != ctx->saved_hflags) {
1280
        tcg_gen_movi_i32(hflags, ctx->hflags);
1281
        ctx->saved_hflags = ctx->hflags;
1282
        switch (ctx->hflags & MIPS_HFLAG_BMASK_BASE) {
1283
        case MIPS_HFLAG_BR:
1284
            break;
1285
        case MIPS_HFLAG_BC:
1286
        case MIPS_HFLAG_BL:
1287
        case MIPS_HFLAG_B:
1288
            tcg_gen_movi_tl(btarget, ctx->btarget);
1289
            break;
1290
        }
1291
    }
1292
}
1293

    
1294
static inline void restore_cpu_state (CPUMIPSState *env, DisasContext *ctx)
1295
{
1296
    ctx->saved_hflags = ctx->hflags;
1297
    switch (ctx->hflags & MIPS_HFLAG_BMASK_BASE) {
1298
    case MIPS_HFLAG_BR:
1299
        break;
1300
    case MIPS_HFLAG_BC:
1301
    case MIPS_HFLAG_BL:
1302
    case MIPS_HFLAG_B:
1303
        ctx->btarget = env->btarget;
1304
        break;
1305
    }
1306
}
1307

    
1308
static inline void
1309
generate_exception_err (DisasContext *ctx, int excp, int err)
1310
{
1311
    TCGv_i32 texcp = tcg_const_i32(excp);
1312
    TCGv_i32 terr = tcg_const_i32(err);
1313
    save_cpu_state(ctx, 1);
1314
    gen_helper_raise_exception_err(cpu_env, texcp, terr);
1315
    tcg_temp_free_i32(terr);
1316
    tcg_temp_free_i32(texcp);
1317
}
1318

    
1319
static inline void
1320
generate_exception (DisasContext *ctx, int excp)
1321
{
1322
    save_cpu_state(ctx, 1);
1323
    gen_helper_0e0i(raise_exception, excp);
1324
}
1325

    
1326
/* Addresses computation */
1327
static inline void gen_op_addr_add (DisasContext *ctx, TCGv ret, TCGv arg0, TCGv arg1)
1328
{
1329
    tcg_gen_add_tl(ret, arg0, arg1);
1330

    
1331
#if defined(TARGET_MIPS64)
1332
    /* For compatibility with 32-bit code, data reference in user mode
1333
       with Status_UX = 0 should be casted to 32-bit and sign extended.
1334
       See the MIPS64 PRA manual, section 4.10. */
1335
    if (((ctx->hflags & MIPS_HFLAG_KSU) == MIPS_HFLAG_UM) &&
1336
        !(ctx->hflags & MIPS_HFLAG_UX)) {
1337
        tcg_gen_ext32s_i64(ret, ret);
1338
    }
1339
#endif
1340
}
1341

    
1342
static inline void check_cp0_enabled(DisasContext *ctx)
1343
{
1344
    if (unlikely(!(ctx->hflags & MIPS_HFLAG_CP0)))
1345
        generate_exception_err(ctx, EXCP_CpU, 0);
1346
}
1347

    
1348
static inline void check_cp1_enabled(DisasContext *ctx)
1349
{
1350
    if (unlikely(!(ctx->hflags & MIPS_HFLAG_FPU)))
1351
        generate_exception_err(ctx, EXCP_CpU, 1);
1352
}
1353

    
1354
/* Verify that the processor is running with COP1X instructions enabled.
1355
   This is associated with the nabla symbol in the MIPS32 and MIPS64
1356
   opcode tables.  */
1357

    
1358
static inline void check_cop1x(DisasContext *ctx)
1359
{
1360
    if (unlikely(!(ctx->hflags & MIPS_HFLAG_COP1X)))
1361
        generate_exception(ctx, EXCP_RI);
1362
}
1363

    
1364
/* Verify that the processor is running with 64-bit floating-point
1365
   operations enabled.  */
1366

    
1367
static inline void check_cp1_64bitmode(DisasContext *ctx)
1368
{
1369
    if (unlikely(~ctx->hflags & (MIPS_HFLAG_F64 | MIPS_HFLAG_COP1X)))
1370
        generate_exception(ctx, EXCP_RI);
1371
}
1372

    
1373
/*
1374
 * Verify if floating point register is valid; an operation is not defined
1375
 * if bit 0 of any register specification is set and the FR bit in the
1376
 * Status register equals zero, since the register numbers specify an
1377
 * even-odd pair of adjacent coprocessor general registers. When the FR bit
1378
 * in the Status register equals one, both even and odd register numbers
1379
 * are valid. This limitation exists only for 64 bit wide (d,l,ps) registers.
1380
 *
1381
 * Multiple 64 bit wide registers can be checked by calling
1382
 * gen_op_cp1_registers(freg1 | freg2 | ... | fregN);
1383
 */
1384
static inline void check_cp1_registers(DisasContext *ctx, int regs)
1385
{
1386
    if (unlikely(!(ctx->hflags & MIPS_HFLAG_F64) && (regs & 1)))
1387
        generate_exception(ctx, EXCP_RI);
1388
}
1389

    
1390
/* Verify that the processor is running with DSP instructions enabled.
1391
   This is enabled by CP0 Status register MX(24) bit.
1392
 */
1393

    
1394
static inline void check_dsp(DisasContext *ctx)
1395
{
1396
    if (unlikely(!(ctx->hflags & MIPS_HFLAG_DSP))) {
1397
        if (ctx->insn_flags & ASE_DSP) {
1398
            generate_exception(ctx, EXCP_DSPDIS);
1399
        } else {
1400
            generate_exception(ctx, EXCP_RI);
1401
        }
1402
    }
1403
}
1404

    
1405
static inline void check_dspr2(DisasContext *ctx)
1406
{
1407
    if (unlikely(!(ctx->hflags & MIPS_HFLAG_DSPR2))) {
1408
        if (ctx->insn_flags & ASE_DSP) {
1409
            generate_exception(ctx, EXCP_DSPDIS);
1410
        } else {
1411
            generate_exception(ctx, EXCP_RI);
1412
        }
1413
    }
1414
}
1415

    
1416
/* This code generates a "reserved instruction" exception if the
1417
   CPU does not support the instruction set corresponding to flags. */
1418
static inline void check_insn(DisasContext *ctx, int flags)
1419
{
1420
    if (unlikely(!(ctx->insn_flags & flags))) {
1421
        generate_exception(ctx, EXCP_RI);
1422
    }
1423
}
1424

    
1425
/* This code generates a "reserved instruction" exception if 64-bit
1426
   instructions are not enabled. */
1427
static inline void check_mips_64(DisasContext *ctx)
1428
{
1429
    if (unlikely(!(ctx->hflags & MIPS_HFLAG_64)))
1430
        generate_exception(ctx, EXCP_RI);
1431
}
1432

    
1433
/* Define small wrappers for gen_load_fpr* so that we have a uniform
1434
   calling interface for 32 and 64-bit FPRs.  No sense in changing
1435
   all callers for gen_load_fpr32 when we need the CTX parameter for
1436
   this one use.  */
1437
#define gen_ldcmp_fpr32(ctx, x, y) gen_load_fpr32(x, y)
1438
#define gen_ldcmp_fpr64(ctx, x, y) gen_load_fpr64(ctx, x, y)
1439
#define FOP_CONDS(type, abs, fmt, ifmt, bits)                                 \
1440
static inline void gen_cmp ## type ## _ ## fmt(DisasContext *ctx, int n,      \
1441
                                               int ft, int fs, int cc)        \
1442
{                                                                             \
1443
    TCGv_i##bits fp0 = tcg_temp_new_i##bits ();                               \
1444
    TCGv_i##bits fp1 = tcg_temp_new_i##bits ();                               \
1445
    switch (ifmt) {                                                           \
1446
    case FMT_PS:                                                              \
1447
        check_cp1_64bitmode(ctx);                                             \
1448
        break;                                                                \
1449
    case FMT_D:                                                               \
1450
        if (abs) {                                                            \
1451
            check_cop1x(ctx);                                                 \
1452
        }                                                                     \
1453
        check_cp1_registers(ctx, fs | ft);                                    \
1454
        break;                                                                \
1455
    case FMT_S:                                                               \
1456
        if (abs) {                                                            \
1457
            check_cop1x(ctx);                                                 \
1458
        }                                                                     \
1459
        break;                                                                \
1460
    }                                                                         \
1461
    gen_ldcmp_fpr##bits (ctx, fp0, fs);                                       \
1462
    gen_ldcmp_fpr##bits (ctx, fp1, ft);                                       \
1463
    switch (n) {                                                              \
1464
    case  0: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _f, fp0, fp1, cc);    break;\
1465
    case  1: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _un, fp0, fp1, cc);   break;\
1466
    case  2: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _eq, fp0, fp1, cc);   break;\
1467
    case  3: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ueq, fp0, fp1, cc);  break;\
1468
    case  4: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _olt, fp0, fp1, cc);  break;\
1469
    case  5: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ult, fp0, fp1, cc);  break;\
1470
    case  6: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ole, fp0, fp1, cc);  break;\
1471
    case  7: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ule, fp0, fp1, cc);  break;\
1472
    case  8: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _sf, fp0, fp1, cc);   break;\
1473
    case  9: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngle, fp0, fp1, cc); break;\
1474
    case 10: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _seq, fp0, fp1, cc);  break;\
1475
    case 11: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngl, fp0, fp1, cc);  break;\
1476
    case 12: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _lt, fp0, fp1, cc);   break;\
1477
    case 13: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _nge, fp0, fp1, cc);  break;\
1478
    case 14: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _le, fp0, fp1, cc);   break;\
1479
    case 15: gen_helper_0e2i(cmp ## type ## _ ## fmt ## _ngt, fp0, fp1, cc);  break;\
1480
    default: abort();                                                         \
1481
    }                                                                         \
1482
    tcg_temp_free_i##bits (fp0);                                              \
1483
    tcg_temp_free_i##bits (fp1);                                              \
1484
}
1485

    
1486
FOP_CONDS(, 0, d, FMT_D, 64)
1487
FOP_CONDS(abs, 1, d, FMT_D, 64)
1488
FOP_CONDS(, 0, s, FMT_S, 32)
1489
FOP_CONDS(abs, 1, s, FMT_S, 32)
1490
FOP_CONDS(, 0, ps, FMT_PS, 64)
1491
FOP_CONDS(abs, 1, ps, FMT_PS, 64)
1492
#undef FOP_CONDS
1493
#undef gen_ldcmp_fpr32
1494
#undef gen_ldcmp_fpr64
1495

    
1496
/* load/store instructions. */
1497
#ifdef CONFIG_USER_ONLY
1498
#define OP_LD_ATOMIC(insn,fname)                                           \
1499
static inline void op_ld_##insn(TCGv ret, TCGv arg1, DisasContext *ctx)    \
1500
{                                                                          \
1501
    TCGv t0 = tcg_temp_new();                                              \
1502
    tcg_gen_mov_tl(t0, arg1);                                              \
1503
    tcg_gen_qemu_##fname(ret, arg1, ctx->mem_idx);                         \
1504
    tcg_gen_st_tl(t0, cpu_env, offsetof(CPUMIPSState, lladdr));                \
1505
    tcg_gen_st_tl(ret, cpu_env, offsetof(CPUMIPSState, llval));                \
1506
    tcg_temp_free(t0);                                                     \
1507
}
1508
#else
1509
#define OP_LD_ATOMIC(insn,fname)                                           \
1510
static inline void op_ld_##insn(TCGv ret, TCGv arg1, DisasContext *ctx)    \
1511
{                                                                          \
1512
    gen_helper_1e1i(insn, ret, arg1, ctx->mem_idx);                        \
1513
}
1514
#endif
1515
OP_LD_ATOMIC(ll,ld32s);
1516
#if defined(TARGET_MIPS64)
1517
OP_LD_ATOMIC(lld,ld64);
1518
#endif
1519
#undef OP_LD_ATOMIC
1520

    
1521
#ifdef CONFIG_USER_ONLY
1522
#define OP_ST_ATOMIC(insn,fname,ldname,almask)                               \
1523
static inline void op_st_##insn(TCGv arg1, TCGv arg2, int rt, DisasContext *ctx) \
1524
{                                                                            \
1525
    TCGv t0 = tcg_temp_new();                                                \
1526
    int l1 = gen_new_label();                                                \
1527
    int l2 = gen_new_label();                                                \
1528
                                                                             \
1529
    tcg_gen_andi_tl(t0, arg2, almask);                                       \
1530
    tcg_gen_brcondi_tl(TCG_COND_EQ, t0, 0, l1);                              \
1531
    tcg_gen_st_tl(arg2, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));          \
1532
    generate_exception(ctx, EXCP_AdES);                                      \
1533
    gen_set_label(l1);                                                       \
1534
    tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUMIPSState, lladdr));                  \
1535
    tcg_gen_brcond_tl(TCG_COND_NE, arg2, t0, l2);                            \
1536
    tcg_gen_movi_tl(t0, rt | ((almask << 3) & 0x20));                        \
1537
    tcg_gen_st_tl(t0, cpu_env, offsetof(CPUMIPSState, llreg));                   \
1538
    tcg_gen_st_tl(arg1, cpu_env, offsetof(CPUMIPSState, llnewval));              \
1539
    gen_helper_0e0i(raise_exception, EXCP_SC);                               \
1540
    gen_set_label(l2);                                                       \
1541
    tcg_gen_movi_tl(t0, 0);                                                  \
1542
    gen_store_gpr(t0, rt);                                                   \
1543
    tcg_temp_free(t0);                                                       \
1544
}
1545
#else
1546
#define OP_ST_ATOMIC(insn,fname,ldname,almask)                               \
1547
static inline void op_st_##insn(TCGv arg1, TCGv arg2, int rt, DisasContext *ctx) \
1548
{                                                                            \
1549
    TCGv t0 = tcg_temp_new();                                                \
1550
    gen_helper_1e2i(insn, t0, arg1, arg2, ctx->mem_idx);                     \
1551
    gen_store_gpr(t0, rt);                                                   \
1552
    tcg_temp_free(t0);                                                       \
1553
}
1554
#endif
1555
OP_ST_ATOMIC(sc,st32,ld32s,0x3);
1556
#if defined(TARGET_MIPS64)
1557
OP_ST_ATOMIC(scd,st64,ld64,0x7);
1558
#endif
1559
#undef OP_ST_ATOMIC
1560

    
1561
static void gen_base_offset_addr (DisasContext *ctx, TCGv addr,
1562
                                  int base, int16_t offset)
1563
{
1564
    if (base == 0) {
1565
        tcg_gen_movi_tl(addr, offset);
1566
    } else if (offset == 0) {
1567
        gen_load_gpr(addr, base);
1568
    } else {
1569
        tcg_gen_movi_tl(addr, offset);
1570
        gen_op_addr_add(ctx, addr, cpu_gpr[base], addr);
1571
    }
1572
}
1573

    
1574
static target_ulong pc_relative_pc (DisasContext *ctx)
1575
{
1576
    target_ulong pc = ctx->pc;
1577

    
1578
    if (ctx->hflags & MIPS_HFLAG_BMASK) {
1579
        int branch_bytes = ctx->hflags & MIPS_HFLAG_BDS16 ? 2 : 4;
1580

    
1581
        pc -= branch_bytes;
1582
    }
1583

    
1584
    pc &= ~(target_ulong)3;
1585
    return pc;
1586
}
1587

    
1588
/* Load */
1589
static void gen_ld(DisasContext *ctx, uint32_t opc,
1590
                   int rt, int base, int16_t offset)
1591
{
1592
    const char *opn = "ld";
1593
    TCGv t0, t1, t2;
1594

    
1595
    if (rt == 0 && ctx->insn_flags & (INSN_LOONGSON2E | INSN_LOONGSON2F)) {
1596
        /* Loongson CPU uses a load to zero register for prefetch.
1597
           We emulate it as a NOP. On other CPU we must perform the
1598
           actual memory access. */
1599
        MIPS_DEBUG("NOP");
1600
        return;
1601
    }
1602

    
1603
    t0 = tcg_temp_new();
1604
    gen_base_offset_addr(ctx, t0, base, offset);
1605

    
1606
    switch (opc) {
1607
#if defined(TARGET_MIPS64)
1608
    case OPC_LWU:
1609
        tcg_gen_qemu_ld32u(t0, t0, ctx->mem_idx);
1610
        gen_store_gpr(t0, rt);
1611
        opn = "lwu";
1612
        break;
1613
    case OPC_LD:
1614
        tcg_gen_qemu_ld64(t0, t0, ctx->mem_idx);
1615
        gen_store_gpr(t0, rt);
1616
        opn = "ld";
1617
        break;
1618
    case OPC_LLD:
1619
        save_cpu_state(ctx, 1);
1620
        op_ld_lld(t0, t0, ctx);
1621
        gen_store_gpr(t0, rt);
1622
        opn = "lld";
1623
        break;
1624
    case OPC_LDL:
1625
        t1 = tcg_temp_new();
1626
        tcg_gen_andi_tl(t1, t0, 7);
1627
#ifndef TARGET_WORDS_BIGENDIAN
1628
        tcg_gen_xori_tl(t1, t1, 7);
1629
#endif
1630
        tcg_gen_shli_tl(t1, t1, 3);
1631
        tcg_gen_andi_tl(t0, t0, ~7);
1632
        tcg_gen_qemu_ld64(t0, t0, ctx->mem_idx);
1633
        tcg_gen_shl_tl(t0, t0, t1);
1634
        tcg_gen_xori_tl(t1, t1, 63);
1635
        t2 = tcg_const_tl(0x7fffffffffffffffull);
1636
        tcg_gen_shr_tl(t2, t2, t1);
1637
        gen_load_gpr(t1, rt);
1638
        tcg_gen_and_tl(t1, t1, t2);
1639
        tcg_temp_free(t2);
1640
        tcg_gen_or_tl(t0, t0, t1);
1641
        tcg_temp_free(t1);
1642
        gen_store_gpr(t0, rt);
1643
        opn = "ldl";
1644
        break;
1645
    case OPC_LDR:
1646
        t1 = tcg_temp_new();
1647
        tcg_gen_andi_tl(t1, t0, 7);
1648
#ifdef TARGET_WORDS_BIGENDIAN
1649
        tcg_gen_xori_tl(t1, t1, 7);
1650
#endif
1651
        tcg_gen_shli_tl(t1, t1, 3);
1652
        tcg_gen_andi_tl(t0, t0, ~7);
1653
        tcg_gen_qemu_ld64(t0, t0, ctx->mem_idx);
1654
        tcg_gen_shr_tl(t0, t0, t1);
1655
        tcg_gen_xori_tl(t1, t1, 63);
1656
        t2 = tcg_const_tl(0xfffffffffffffffeull);
1657
        tcg_gen_shl_tl(t2, t2, t1);
1658
        gen_load_gpr(t1, rt);
1659
        tcg_gen_and_tl(t1, t1, t2);
1660
        tcg_temp_free(t2);
1661
        tcg_gen_or_tl(t0, t0, t1);
1662
        tcg_temp_free(t1);
1663
        gen_store_gpr(t0, rt);
1664
        opn = "ldr";
1665
        break;
1666
    case OPC_LDPC:
1667
        t1 = tcg_const_tl(pc_relative_pc(ctx));
1668
        gen_op_addr_add(ctx, t0, t0, t1);
1669
        tcg_temp_free(t1);
1670
        tcg_gen_qemu_ld64(t0, t0, ctx->mem_idx);
1671
        gen_store_gpr(t0, rt);
1672
        opn = "ldpc";
1673
        break;
1674
#endif
1675
    case OPC_LWPC:
1676
        t1 = tcg_const_tl(pc_relative_pc(ctx));
1677
        gen_op_addr_add(ctx, t0, t0, t1);
1678
        tcg_temp_free(t1);
1679
        tcg_gen_qemu_ld32s(t0, t0, ctx->mem_idx);
1680
        gen_store_gpr(t0, rt);
1681
        opn = "lwpc";
1682
        break;
1683
    case OPC_LW:
1684
        tcg_gen_qemu_ld32s(t0, t0, ctx->mem_idx);
1685
        gen_store_gpr(t0, rt);
1686
        opn = "lw";
1687
        break;
1688
    case OPC_LH:
1689
        tcg_gen_qemu_ld16s(t0, t0, ctx->mem_idx);
1690
        gen_store_gpr(t0, rt);
1691
        opn = "lh";
1692
        break;
1693
    case OPC_LHU:
1694
        tcg_gen_qemu_ld16u(t0, t0, ctx->mem_idx);
1695
        gen_store_gpr(t0, rt);
1696
        opn = "lhu";
1697
        break;
1698
    case OPC_LB:
1699
        tcg_gen_qemu_ld8s(t0, t0, ctx->mem_idx);
1700
        gen_store_gpr(t0, rt);
1701
        opn = "lb";
1702
        break;
1703
    case OPC_LBU:
1704
        tcg_gen_qemu_ld8u(t0, t0, ctx->mem_idx);
1705
        gen_store_gpr(t0, rt);
1706
        opn = "lbu";
1707
        break;
1708
    case OPC_LWL:
1709
        t1 = tcg_temp_new();
1710
        tcg_gen_andi_tl(t1, t0, 3);
1711
#ifndef TARGET_WORDS_BIGENDIAN
1712
        tcg_gen_xori_tl(t1, t1, 3);
1713
#endif
1714
        tcg_gen_shli_tl(t1, t1, 3);
1715
        tcg_gen_andi_tl(t0, t0, ~3);
1716
        tcg_gen_qemu_ld32u(t0, t0, ctx->mem_idx);
1717
        tcg_gen_shl_tl(t0, t0, t1);
1718
        tcg_gen_xori_tl(t1, t1, 31);
1719
        t2 = tcg_const_tl(0x7fffffffull);
1720
        tcg_gen_shr_tl(t2, t2, t1);
1721
        gen_load_gpr(t1, rt);
1722
        tcg_gen_and_tl(t1, t1, t2);
1723
        tcg_temp_free(t2);
1724
        tcg_gen_or_tl(t0, t0, t1);
1725
        tcg_temp_free(t1);
1726
        tcg_gen_ext32s_tl(t0, t0);
1727
        gen_store_gpr(t0, rt);
1728
        opn = "lwl";
1729
        break;
1730
    case OPC_LWR:
1731
        t1 = tcg_temp_new();
1732
        tcg_gen_andi_tl(t1, t0, 3);
1733
#ifdef TARGET_WORDS_BIGENDIAN
1734
        tcg_gen_xori_tl(t1, t1, 3);
1735
#endif
1736
        tcg_gen_shli_tl(t1, t1, 3);
1737
        tcg_gen_andi_tl(t0, t0, ~3);
1738
        tcg_gen_qemu_ld32u(t0, t0, ctx->mem_idx);
1739
        tcg_gen_shr_tl(t0, t0, t1);
1740
        tcg_gen_xori_tl(t1, t1, 31);
1741
        t2 = tcg_const_tl(0xfffffffeull);
1742
        tcg_gen_shl_tl(t2, t2, t1);
1743
        gen_load_gpr(t1, rt);
1744
        tcg_gen_and_tl(t1, t1, t2);
1745
        tcg_temp_free(t2);
1746
        tcg_gen_or_tl(t0, t0, t1);
1747
        tcg_temp_free(t1);
1748
        tcg_gen_ext32s_tl(t0, t0);
1749
        gen_store_gpr(t0, rt);
1750
        opn = "lwr";
1751
        break;
1752
    case OPC_LL:
1753
        save_cpu_state(ctx, 1);
1754
        op_ld_ll(t0, t0, ctx);
1755
        gen_store_gpr(t0, rt);
1756
        opn = "ll";
1757
        break;
1758
    }
1759
    (void)opn; /* avoid a compiler warning */
1760
    MIPS_DEBUG("%s %s, %d(%s)", opn, regnames[rt], offset, regnames[base]);
1761
    tcg_temp_free(t0);
1762
}
1763

    
1764
/* Store */
1765
static void gen_st (DisasContext *ctx, uint32_t opc, int rt,
1766
                    int base, int16_t offset)
1767
{
1768
    const char *opn = "st";
1769
    TCGv t0 = tcg_temp_new();
1770
    TCGv t1 = tcg_temp_new();
1771

    
1772
    gen_base_offset_addr(ctx, t0, base, offset);
1773
    gen_load_gpr(t1, rt);
1774
    switch (opc) {
1775
#if defined(TARGET_MIPS64)
1776
    case OPC_SD:
1777
        tcg_gen_qemu_st64(t1, t0, ctx->mem_idx);
1778
        opn = "sd";
1779
        break;
1780
    case OPC_SDL:
1781
        save_cpu_state(ctx, 1);
1782
        gen_helper_0e2i(sdl, t1, t0, ctx->mem_idx);
1783
        opn = "sdl";
1784
        break;
1785
    case OPC_SDR:
1786
        save_cpu_state(ctx, 1);
1787
        gen_helper_0e2i(sdr, t1, t0, ctx->mem_idx);
1788
        opn = "sdr";
1789
        break;
1790
#endif
1791
    case OPC_SW:
1792
        tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);
1793
        opn = "sw";
1794
        break;
1795
    case OPC_SH:
1796
        tcg_gen_qemu_st16(t1, t0, ctx->mem_idx);
1797
        opn = "sh";
1798
        break;
1799
    case OPC_SB:
1800
        tcg_gen_qemu_st8(t1, t0, ctx->mem_idx);
1801
        opn = "sb";
1802
        break;
1803
    case OPC_SWL:
1804
        save_cpu_state(ctx, 1);
1805
        gen_helper_0e2i(swl, t1, t0, ctx->mem_idx);
1806
        opn = "swl";
1807
        break;
1808
    case OPC_SWR:
1809
        save_cpu_state(ctx, 1);
1810
        gen_helper_0e2i(swr, t1, t0, ctx->mem_idx);
1811
        opn = "swr";
1812
        break;
1813
    }
1814
    (void)opn; /* avoid a compiler warning */
1815
    MIPS_DEBUG("%s %s, %d(%s)", opn, regnames[rt], offset, regnames[base]);
1816
    tcg_temp_free(t0);
1817
    tcg_temp_free(t1);
1818
}
1819

    
1820

    
1821
/* Store conditional */
1822
static void gen_st_cond (DisasContext *ctx, uint32_t opc, int rt,
1823
                         int base, int16_t offset)
1824
{
1825
    const char *opn = "st_cond";
1826
    TCGv t0, t1;
1827

    
1828
#ifdef CONFIG_USER_ONLY
1829
    t0 = tcg_temp_local_new();
1830
    t1 = tcg_temp_local_new();
1831
#else
1832
    t0 = tcg_temp_new();
1833
    t1 = tcg_temp_new();
1834
#endif
1835
    gen_base_offset_addr(ctx, t0, base, offset);
1836
    gen_load_gpr(t1, rt);
1837
    switch (opc) {
1838
#if defined(TARGET_MIPS64)
1839
    case OPC_SCD:
1840
        save_cpu_state(ctx, 1);
1841
        op_st_scd(t1, t0, rt, ctx);
1842
        opn = "scd";
1843
        break;
1844
#endif
1845
    case OPC_SC:
1846
        save_cpu_state(ctx, 1);
1847
        op_st_sc(t1, t0, rt, ctx);
1848
        opn = "sc";
1849
        break;
1850
    }
1851
    (void)opn; /* avoid a compiler warning */
1852
    MIPS_DEBUG("%s %s, %d(%s)", opn, regnames[rt], offset, regnames[base]);
1853
    tcg_temp_free(t1);
1854
    tcg_temp_free(t0);
1855
}
1856

    
1857
/* Load and store */
1858
static void gen_flt_ldst (DisasContext *ctx, uint32_t opc, int ft,
1859
                          int base, int16_t offset)
1860
{
1861
    const char *opn = "flt_ldst";
1862
    TCGv t0 = tcg_temp_new();
1863

    
1864
    gen_base_offset_addr(ctx, t0, base, offset);
1865
    /* Don't do NOP if destination is zero: we must perform the actual
1866
       memory access. */
1867
    switch (opc) {
1868
    case OPC_LWC1:
1869
        {
1870
            TCGv_i32 fp0 = tcg_temp_new_i32();
1871

    
1872
            tcg_gen_qemu_ld32s(t0, t0, ctx->mem_idx);
1873
            tcg_gen_trunc_tl_i32(fp0, t0);
1874
            gen_store_fpr32(fp0, ft);
1875
            tcg_temp_free_i32(fp0);
1876
        }
1877
        opn = "lwc1";
1878
        break;
1879
    case OPC_SWC1:
1880
        {
1881
            TCGv_i32 fp0 = tcg_temp_new_i32();
1882
            TCGv t1 = tcg_temp_new();
1883

    
1884
            gen_load_fpr32(fp0, ft);
1885
            tcg_gen_extu_i32_tl(t1, fp0);
1886
            tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);
1887
            tcg_temp_free(t1);
1888
            tcg_temp_free_i32(fp0);
1889
        }
1890
        opn = "swc1";
1891
        break;
1892
    case OPC_LDC1:
1893
        {
1894
            TCGv_i64 fp0 = tcg_temp_new_i64();
1895

    
1896
            tcg_gen_qemu_ld64(fp0, t0, ctx->mem_idx);
1897
            gen_store_fpr64(ctx, fp0, ft);
1898
            tcg_temp_free_i64(fp0);
1899
        }
1900
        opn = "ldc1";
1901
        break;
1902
    case OPC_SDC1:
1903
        {
1904
            TCGv_i64 fp0 = tcg_temp_new_i64();
1905

    
1906
            gen_load_fpr64(ctx, fp0, ft);
1907
            tcg_gen_qemu_st64(fp0, t0, ctx->mem_idx);
1908
            tcg_temp_free_i64(fp0);
1909
        }
1910
        opn = "sdc1";
1911
        break;
1912
    default:
1913
        MIPS_INVAL(opn);
1914
        generate_exception(ctx, EXCP_RI);
1915
        goto out;
1916
    }
1917
    (void)opn; /* avoid a compiler warning */
1918
    MIPS_DEBUG("%s %s, %d(%s)", opn, fregnames[ft], offset, regnames[base]);
1919
 out:
1920
    tcg_temp_free(t0);
1921
}
1922

    
1923
static void gen_cop1_ldst(CPUMIPSState *env, DisasContext *ctx,
1924
                          uint32_t op, int rt, int rs, int16_t imm)
1925
{
1926
    if (env->CP0_Config1 & (1 << CP0C1_FP)) {
1927
        check_cp1_enabled(ctx);
1928
        gen_flt_ldst(ctx, op, rt, rs, imm);
1929
    } else {
1930
        generate_exception_err(ctx, EXCP_CpU, 1);
1931
    }
1932
}
1933

    
1934
/* Arithmetic with immediate operand */
1935
static void gen_arith_imm(DisasContext *ctx, uint32_t opc,
1936
                          int rt, int rs, int16_t imm)
1937
{
1938
    target_ulong uimm = (target_long)imm; /* Sign extend to 32/64 bits */
1939
    const char *opn = "imm arith";
1940

    
1941
    if (rt == 0 && opc != OPC_ADDI && opc != OPC_DADDI) {
1942
        /* If no destination, treat it as a NOP.
1943
           For addi, we must generate the overflow exception when needed. */
1944
        MIPS_DEBUG("NOP");
1945
        return;
1946
    }
1947
    switch (opc) {
1948
    case OPC_ADDI:
1949
        {
1950
            TCGv t0 = tcg_temp_local_new();
1951
            TCGv t1 = tcg_temp_new();
1952
            TCGv t2 = tcg_temp_new();
1953
            int l1 = gen_new_label();
1954

    
1955
            gen_load_gpr(t1, rs);
1956
            tcg_gen_addi_tl(t0, t1, uimm);
1957
            tcg_gen_ext32s_tl(t0, t0);
1958

    
1959
            tcg_gen_xori_tl(t1, t1, ~uimm);
1960
            tcg_gen_xori_tl(t2, t0, uimm);
1961
            tcg_gen_and_tl(t1, t1, t2);
1962
            tcg_temp_free(t2);
1963
            tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
1964
            tcg_temp_free(t1);
1965
            /* operands of same sign, result different sign */
1966
            generate_exception(ctx, EXCP_OVERFLOW);
1967
            gen_set_label(l1);
1968
            tcg_gen_ext32s_tl(t0, t0);
1969
            gen_store_gpr(t0, rt);
1970
            tcg_temp_free(t0);
1971
        }
1972
        opn = "addi";
1973
        break;
1974
    case OPC_ADDIU:
1975
        if (rs != 0) {
1976
            tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
1977
            tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
1978
        } else {
1979
            tcg_gen_movi_tl(cpu_gpr[rt], uimm);
1980
        }
1981
        opn = "addiu";
1982
        break;
1983
#if defined(TARGET_MIPS64)
1984
    case OPC_DADDI:
1985
        {
1986
            TCGv t0 = tcg_temp_local_new();
1987
            TCGv t1 = tcg_temp_new();
1988
            TCGv t2 = tcg_temp_new();
1989
            int l1 = gen_new_label();
1990

    
1991
            gen_load_gpr(t1, rs);
1992
            tcg_gen_addi_tl(t0, t1, uimm);
1993

    
1994
            tcg_gen_xori_tl(t1, t1, ~uimm);
1995
            tcg_gen_xori_tl(t2, t0, uimm);
1996
            tcg_gen_and_tl(t1, t1, t2);
1997
            tcg_temp_free(t2);
1998
            tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
1999
            tcg_temp_free(t1);
2000
            /* operands of same sign, result different sign */
2001
            generate_exception(ctx, EXCP_OVERFLOW);
2002
            gen_set_label(l1);
2003
            gen_store_gpr(t0, rt);
2004
            tcg_temp_free(t0);
2005
        }
2006
        opn = "daddi";
2007
        break;
2008
    case OPC_DADDIU:
2009
        if (rs != 0) {
2010
            tcg_gen_addi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2011
        } else {
2012
            tcg_gen_movi_tl(cpu_gpr[rt], uimm);
2013
        }
2014
        opn = "daddiu";
2015
        break;
2016
#endif
2017
    }
2018
    (void)opn; /* avoid a compiler warning */
2019
    MIPS_DEBUG("%s %s, %s, " TARGET_FMT_lx, opn, regnames[rt], regnames[rs], uimm);
2020
}
2021

    
2022
/* Logic with immediate operand */
2023
static void gen_logic_imm(DisasContext *ctx, uint32_t opc,
2024
                          int rt, int rs, int16_t imm)
2025
{
2026
    target_ulong uimm;
2027

    
2028
    if (rt == 0) {
2029
        /* If no destination, treat it as a NOP. */
2030
        MIPS_DEBUG("NOP");
2031
        return;
2032
    }
2033
    uimm = (uint16_t)imm;
2034
    switch (opc) {
2035
    case OPC_ANDI:
2036
        if (likely(rs != 0))
2037
            tcg_gen_andi_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2038
        else
2039
            tcg_gen_movi_tl(cpu_gpr[rt], 0);
2040
        MIPS_DEBUG("andi %s, %s, " TARGET_FMT_lx, regnames[rt],
2041
                   regnames[rs], uimm);
2042
        break;
2043
    case OPC_ORI:
2044
        if (rs != 0)
2045
            tcg_gen_ori_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2046
        else
2047
            tcg_gen_movi_tl(cpu_gpr[rt], uimm);
2048
        MIPS_DEBUG("ori %s, %s, " TARGET_FMT_lx, regnames[rt],
2049
                   regnames[rs], uimm);
2050
        break;
2051
    case OPC_XORI:
2052
        if (likely(rs != 0))
2053
            tcg_gen_xori_tl(cpu_gpr[rt], cpu_gpr[rs], uimm);
2054
        else
2055
            tcg_gen_movi_tl(cpu_gpr[rt], uimm);
2056
        MIPS_DEBUG("xori %s, %s, " TARGET_FMT_lx, regnames[rt],
2057
                   regnames[rs], uimm);
2058
        break;
2059
    case OPC_LUI:
2060
        tcg_gen_movi_tl(cpu_gpr[rt], imm << 16);
2061
        MIPS_DEBUG("lui %s, " TARGET_FMT_lx, regnames[rt], uimm);
2062
        break;
2063

    
2064
    default:
2065
        MIPS_DEBUG("Unknown logical immediate opcode %08x", opc);
2066
        break;
2067
    }
2068
}
2069

    
2070
/* Set on less than with immediate operand */
2071
static void gen_slt_imm(DisasContext *ctx, uint32_t opc,
2072
                        int rt, int rs, int16_t imm)
2073
{
2074
    target_ulong uimm = (target_long)imm; /* Sign extend to 32/64 bits */
2075
    const char *opn = "imm arith";
2076
    TCGv t0;
2077

    
2078
    if (rt == 0) {
2079
        /* If no destination, treat it as a NOP. */
2080
        MIPS_DEBUG("NOP");
2081
        return;
2082
    }
2083
    t0 = tcg_temp_new();
2084
    gen_load_gpr(t0, rs);
2085
    switch (opc) {
2086
    case OPC_SLTI:
2087
        tcg_gen_setcondi_tl(TCG_COND_LT, cpu_gpr[rt], t0, uimm);
2088
        opn = "slti";
2089
        break;
2090
    case OPC_SLTIU:
2091
        tcg_gen_setcondi_tl(TCG_COND_LTU, cpu_gpr[rt], t0, uimm);
2092
        opn = "sltiu";
2093
        break;
2094
    }
2095
    (void)opn; /* avoid a compiler warning */
2096
    MIPS_DEBUG("%s %s, %s, " TARGET_FMT_lx, opn, regnames[rt], regnames[rs], uimm);
2097
    tcg_temp_free(t0);
2098
}
2099

    
2100
/* Shifts with immediate operand */
2101
static void gen_shift_imm(DisasContext *ctx, uint32_t opc,
2102
                          int rt, int rs, int16_t imm)
2103
{
2104
    target_ulong uimm = ((uint16_t)imm) & 0x1f;
2105
    const char *opn = "imm shift";
2106
    TCGv t0;
2107

    
2108
    if (rt == 0) {
2109
        /* If no destination, treat it as a NOP. */
2110
        MIPS_DEBUG("NOP");
2111
        return;
2112
    }
2113

    
2114
    t0 = tcg_temp_new();
2115
    gen_load_gpr(t0, rs);
2116
    switch (opc) {
2117
    case OPC_SLL:
2118
        tcg_gen_shli_tl(t0, t0, uimm);
2119
        tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
2120
        opn = "sll";
2121
        break;
2122
    case OPC_SRA:
2123
        tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm);
2124
        opn = "sra";
2125
        break;
2126
    case OPC_SRL:
2127
        if (uimm != 0) {
2128
            tcg_gen_ext32u_tl(t0, t0);
2129
            tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm);
2130
        } else {
2131
            tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
2132
        }
2133
        opn = "srl";
2134
        break;
2135
    case OPC_ROTR:
2136
        if (uimm != 0) {
2137
            TCGv_i32 t1 = tcg_temp_new_i32();
2138

    
2139
            tcg_gen_trunc_tl_i32(t1, t0);
2140
            tcg_gen_rotri_i32(t1, t1, uimm);
2141
            tcg_gen_ext_i32_tl(cpu_gpr[rt], t1);
2142
            tcg_temp_free_i32(t1);
2143
        } else {
2144
            tcg_gen_ext32s_tl(cpu_gpr[rt], t0);
2145
        }
2146
        opn = "rotr";
2147
        break;
2148
#if defined(TARGET_MIPS64)
2149
    case OPC_DSLL:
2150
        tcg_gen_shli_tl(cpu_gpr[rt], t0, uimm);
2151
        opn = "dsll";
2152
        break;
2153
    case OPC_DSRA:
2154
        tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm);
2155
        opn = "dsra";
2156
        break;
2157
    case OPC_DSRL:
2158
        tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm);
2159
        opn = "dsrl";
2160
        break;
2161
    case OPC_DROTR:
2162
        if (uimm != 0) {
2163
            tcg_gen_rotri_tl(cpu_gpr[rt], t0, uimm);
2164
        } else {
2165
            tcg_gen_mov_tl(cpu_gpr[rt], t0);
2166
        }
2167
        opn = "drotr";
2168
        break;
2169
    case OPC_DSLL32:
2170
        tcg_gen_shli_tl(cpu_gpr[rt], t0, uimm + 32);
2171
        opn = "dsll32";
2172
        break;
2173
    case OPC_DSRA32:
2174
        tcg_gen_sari_tl(cpu_gpr[rt], t0, uimm + 32);
2175
        opn = "dsra32";
2176
        break;
2177
    case OPC_DSRL32:
2178
        tcg_gen_shri_tl(cpu_gpr[rt], t0, uimm + 32);
2179
        opn = "dsrl32";
2180
        break;
2181
    case OPC_DROTR32:
2182
        tcg_gen_rotri_tl(cpu_gpr[rt], t0, uimm + 32);
2183
        opn = "drotr32";
2184
        break;
2185
#endif
2186
    }
2187
    (void)opn; /* avoid a compiler warning */
2188
    MIPS_DEBUG("%s %s, %s, " TARGET_FMT_lx, opn, regnames[rt], regnames[rs], uimm);
2189
    tcg_temp_free(t0);
2190
}
2191

    
2192
/* Arithmetic */
2193
static void gen_arith(DisasContext *ctx, uint32_t opc,
2194
                      int rd, int rs, int rt)
2195
{
2196
    const char *opn = "arith";
2197

    
2198
    if (rd == 0 && opc != OPC_ADD && opc != OPC_SUB
2199
       && opc != OPC_DADD && opc != OPC_DSUB) {
2200
        /* If no destination, treat it as a NOP.
2201
           For add & sub, we must generate the overflow exception when needed. */
2202
        MIPS_DEBUG("NOP");
2203
        return;
2204
    }
2205

    
2206
    switch (opc) {
2207
    case OPC_ADD:
2208
        {
2209
            TCGv t0 = tcg_temp_local_new();
2210
            TCGv t1 = tcg_temp_new();
2211
            TCGv t2 = tcg_temp_new();
2212
            int l1 = gen_new_label();
2213

    
2214
            gen_load_gpr(t1, rs);
2215
            gen_load_gpr(t2, rt);
2216
            tcg_gen_add_tl(t0, t1, t2);
2217
            tcg_gen_ext32s_tl(t0, t0);
2218
            tcg_gen_xor_tl(t1, t1, t2);
2219
            tcg_gen_xor_tl(t2, t0, t2);
2220
            tcg_gen_andc_tl(t1, t2, t1);
2221
            tcg_temp_free(t2);
2222
            tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2223
            tcg_temp_free(t1);
2224
            /* operands of same sign, result different sign */
2225
            generate_exception(ctx, EXCP_OVERFLOW);
2226
            gen_set_label(l1);
2227
            gen_store_gpr(t0, rd);
2228
            tcg_temp_free(t0);
2229
        }
2230
        opn = "add";
2231
        break;
2232
    case OPC_ADDU:
2233
        if (rs != 0 && rt != 0) {
2234
            tcg_gen_add_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2235
            tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2236
        } else if (rs == 0 && rt != 0) {
2237
            tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
2238
        } else if (rs != 0 && rt == 0) {
2239
            tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2240
        } else {
2241
            tcg_gen_movi_tl(cpu_gpr[rd], 0);
2242
        }
2243
        opn = "addu";
2244
        break;
2245
    case OPC_SUB:
2246
        {
2247
            TCGv t0 = tcg_temp_local_new();
2248
            TCGv t1 = tcg_temp_new();
2249
            TCGv t2 = tcg_temp_new();
2250
            int l1 = gen_new_label();
2251

    
2252
            gen_load_gpr(t1, rs);
2253
            gen_load_gpr(t2, rt);
2254
            tcg_gen_sub_tl(t0, t1, t2);
2255
            tcg_gen_ext32s_tl(t0, t0);
2256
            tcg_gen_xor_tl(t2, t1, t2);
2257
            tcg_gen_xor_tl(t1, t0, t1);
2258
            tcg_gen_and_tl(t1, t1, t2);
2259
            tcg_temp_free(t2);
2260
            tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2261
            tcg_temp_free(t1);
2262
            /* operands of different sign, first operand and result different sign */
2263
            generate_exception(ctx, EXCP_OVERFLOW);
2264
            gen_set_label(l1);
2265
            gen_store_gpr(t0, rd);
2266
            tcg_temp_free(t0);
2267
        }
2268
        opn = "sub";
2269
        break;
2270
    case OPC_SUBU:
2271
        if (rs != 0 && rt != 0) {
2272
            tcg_gen_sub_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2273
            tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2274
        } else if (rs == 0 && rt != 0) {
2275
            tcg_gen_neg_tl(cpu_gpr[rd], cpu_gpr[rt]);
2276
            tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2277
        } else if (rs != 0 && rt == 0) {
2278
            tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2279
        } else {
2280
            tcg_gen_movi_tl(cpu_gpr[rd], 0);
2281
        }
2282
        opn = "subu";
2283
        break;
2284
#if defined(TARGET_MIPS64)
2285
    case OPC_DADD:
2286
        {
2287
            TCGv t0 = tcg_temp_local_new();
2288
            TCGv t1 = tcg_temp_new();
2289
            TCGv t2 = tcg_temp_new();
2290
            int l1 = gen_new_label();
2291

    
2292
            gen_load_gpr(t1, rs);
2293
            gen_load_gpr(t2, rt);
2294
            tcg_gen_add_tl(t0, t1, t2);
2295
            tcg_gen_xor_tl(t1, t1, t2);
2296
            tcg_gen_xor_tl(t2, t0, t2);
2297
            tcg_gen_andc_tl(t1, t2, t1);
2298
            tcg_temp_free(t2);
2299
            tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2300
            tcg_temp_free(t1);
2301
            /* operands of same sign, result different sign */
2302
            generate_exception(ctx, EXCP_OVERFLOW);
2303
            gen_set_label(l1);
2304
            gen_store_gpr(t0, rd);
2305
            tcg_temp_free(t0);
2306
        }
2307
        opn = "dadd";
2308
        break;
2309
    case OPC_DADDU:
2310
        if (rs != 0 && rt != 0) {
2311
            tcg_gen_add_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2312
        } else if (rs == 0 && rt != 0) {
2313
            tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
2314
        } else if (rs != 0 && rt == 0) {
2315
            tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2316
        } else {
2317
            tcg_gen_movi_tl(cpu_gpr[rd], 0);
2318
        }
2319
        opn = "daddu";
2320
        break;
2321
    case OPC_DSUB:
2322
        {
2323
            TCGv t0 = tcg_temp_local_new();
2324
            TCGv t1 = tcg_temp_new();
2325
            TCGv t2 = tcg_temp_new();
2326
            int l1 = gen_new_label();
2327

    
2328
            gen_load_gpr(t1, rs);
2329
            gen_load_gpr(t2, rt);
2330
            tcg_gen_sub_tl(t0, t1, t2);
2331
            tcg_gen_xor_tl(t2, t1, t2);
2332
            tcg_gen_xor_tl(t1, t0, t1);
2333
            tcg_gen_and_tl(t1, t1, t2);
2334
            tcg_temp_free(t2);
2335
            tcg_gen_brcondi_tl(TCG_COND_GE, t1, 0, l1);
2336
            tcg_temp_free(t1);
2337
            /* operands of different sign, first operand and result different sign */
2338
            generate_exception(ctx, EXCP_OVERFLOW);
2339
            gen_set_label(l1);
2340
            gen_store_gpr(t0, rd);
2341
            tcg_temp_free(t0);
2342
        }
2343
        opn = "dsub";
2344
        break;
2345
    case OPC_DSUBU:
2346
        if (rs != 0 && rt != 0) {
2347
            tcg_gen_sub_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2348
        } else if (rs == 0 && rt != 0) {
2349
            tcg_gen_neg_tl(cpu_gpr[rd], cpu_gpr[rt]);
2350
        } else if (rs != 0 && rt == 0) {
2351
            tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2352
        } else {
2353
            tcg_gen_movi_tl(cpu_gpr[rd], 0);
2354
        }
2355
        opn = "dsubu";
2356
        break;
2357
#endif
2358
    case OPC_MUL:
2359
        if (likely(rs != 0 && rt != 0)) {
2360
            tcg_gen_mul_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2361
            tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
2362
        } else {
2363
            tcg_gen_movi_tl(cpu_gpr[rd], 0);
2364
        }
2365
        opn = "mul";
2366
        break;
2367
    }
2368
    (void)opn; /* avoid a compiler warning */
2369
    MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
2370
}
2371

    
2372
/* Conditional move */
2373
static void gen_cond_move(DisasContext *ctx, uint32_t opc,
2374
                          int rd, int rs, int rt)
2375
{
2376
    const char *opn = "cond move";
2377
    TCGv t0, t1, t2;
2378

    
2379
    if (rd == 0) {
2380
        /* If no destination, treat it as a NOP. */
2381
        MIPS_DEBUG("NOP");
2382
        return;
2383
    }
2384

    
2385
    t0 = tcg_temp_new();
2386
    gen_load_gpr(t0, rt);
2387
    t1 = tcg_const_tl(0);
2388
    t2 = tcg_temp_new();
2389
    gen_load_gpr(t2, rs);
2390
    switch (opc) {
2391
    case OPC_MOVN:
2392
        tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr[rd], t0, t1, t2, cpu_gpr[rd]);
2393
        opn = "movn";
2394
        break;
2395
    case OPC_MOVZ:
2396
        tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr[rd], t0, t1, t2, cpu_gpr[rd]);
2397
        opn = "movz";
2398
        break;
2399
    }
2400
    tcg_temp_free(t2);
2401
    tcg_temp_free(t1);
2402
    tcg_temp_free(t0);
2403

    
2404
    (void)opn; /* avoid a compiler warning */
2405
    MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
2406
}
2407

    
2408
/* Logic */
2409
static void gen_logic(DisasContext *ctx, uint32_t opc,
2410
                      int rd, int rs, int rt)
2411
{
2412
    const char *opn = "logic";
2413

    
2414
    if (rd == 0) {
2415
        /* If no destination, treat it as a NOP. */
2416
        MIPS_DEBUG("NOP");
2417
        return;
2418
    }
2419

    
2420
    switch (opc) {
2421
    case OPC_AND:
2422
        if (likely(rs != 0 && rt != 0)) {
2423
            tcg_gen_and_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2424
        } else {
2425
            tcg_gen_movi_tl(cpu_gpr[rd], 0);
2426
        }
2427
        opn = "and";
2428
        break;
2429
    case OPC_NOR:
2430
        if (rs != 0 && rt != 0) {
2431
            tcg_gen_nor_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2432
        } else if (rs == 0 && rt != 0) {
2433
            tcg_gen_not_tl(cpu_gpr[rd], cpu_gpr[rt]);
2434
        } else if (rs != 0 && rt == 0) {
2435
            tcg_gen_not_tl(cpu_gpr[rd], cpu_gpr[rs]);
2436
        } else {
2437
            tcg_gen_movi_tl(cpu_gpr[rd], ~((target_ulong)0));
2438
        }
2439
        opn = "nor";
2440
        break;
2441
    case OPC_OR:
2442
        if (likely(rs != 0 && rt != 0)) {
2443
            tcg_gen_or_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2444
        } else if (rs == 0 && rt != 0) {
2445
            tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
2446
        } else if (rs != 0 && rt == 0) {
2447
            tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2448
        } else {
2449
            tcg_gen_movi_tl(cpu_gpr[rd], 0);
2450
        }
2451
        opn = "or";
2452
        break;
2453
    case OPC_XOR:
2454
        if (likely(rs != 0 && rt != 0)) {
2455
            tcg_gen_xor_tl(cpu_gpr[rd], cpu_gpr[rs], cpu_gpr[rt]);
2456
        } else if (rs == 0 && rt != 0) {
2457
            tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rt]);
2458
        } else if (rs != 0 && rt == 0) {
2459
            tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
2460
        } else {
2461
            tcg_gen_movi_tl(cpu_gpr[rd], 0);
2462
        }
2463
        opn = "xor";
2464
        break;
2465
    }
2466
    (void)opn; /* avoid a compiler warning */
2467
    MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
2468
}
2469

    
2470
/* Set on lower than */
2471
static void gen_slt(DisasContext *ctx, uint32_t opc,
2472
                    int rd, int rs, int rt)
2473
{
2474
    const char *opn = "slt";
2475
    TCGv t0, t1;
2476

    
2477
    if (rd == 0) {
2478
        /* If no destination, treat it as a NOP. */
2479
        MIPS_DEBUG("NOP");
2480
        return;
2481
    }
2482

    
2483
    t0 = tcg_temp_new();
2484
    t1 = tcg_temp_new();
2485
    gen_load_gpr(t0, rs);
2486
    gen_load_gpr(t1, rt);
2487
    switch (opc) {
2488
    case OPC_SLT:
2489
        tcg_gen_setcond_tl(TCG_COND_LT, cpu_gpr[rd], t0, t1);
2490
        opn = "slt";
2491
        break;
2492
    case OPC_SLTU:
2493
        tcg_gen_setcond_tl(TCG_COND_LTU, cpu_gpr[rd], t0, t1);
2494
        opn = "sltu";
2495
        break;
2496
    }
2497
    (void)opn; /* avoid a compiler warning */
2498
    MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
2499
    tcg_temp_free(t0);
2500
    tcg_temp_free(t1);
2501
}
2502

    
2503
/* Shifts */
2504
static void gen_shift(DisasContext *ctx, uint32_t opc,
2505
                      int rd, int rs, int rt)
2506
{
2507
    const char *opn = "shifts";
2508
    TCGv t0, t1;
2509

    
2510
    if (rd == 0) {
2511
        /* If no destination, treat it as a NOP.
2512
           For add & sub, we must generate the overflow exception when needed. */
2513
        MIPS_DEBUG("NOP");
2514
        return;
2515
    }
2516

    
2517
    t0 = tcg_temp_new();
2518
    t1 = tcg_temp_new();
2519
    gen_load_gpr(t0, rs);
2520
    gen_load_gpr(t1, rt);
2521
    switch (opc) {
2522
    case OPC_SLLV:
2523
        tcg_gen_andi_tl(t0, t0, 0x1f);
2524
        tcg_gen_shl_tl(t0, t1, t0);
2525
        tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
2526
        opn = "sllv";
2527
        break;
2528
    case OPC_SRAV:
2529
        tcg_gen_andi_tl(t0, t0, 0x1f);
2530
        tcg_gen_sar_tl(cpu_gpr[rd], t1, t0);
2531
        opn = "srav";
2532
        break;
2533
    case OPC_SRLV:
2534
        tcg_gen_ext32u_tl(t1, t1);
2535
        tcg_gen_andi_tl(t0, t0, 0x1f);
2536
        tcg_gen_shr_tl(t0, t1, t0);
2537
        tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
2538
        opn = "srlv";
2539
        break;
2540
    case OPC_ROTRV:
2541
        {
2542
            TCGv_i32 t2 = tcg_temp_new_i32();
2543
            TCGv_i32 t3 = tcg_temp_new_i32();
2544

    
2545
            tcg_gen_trunc_tl_i32(t2, t0);
2546
            tcg_gen_trunc_tl_i32(t3, t1);
2547
            tcg_gen_andi_i32(t2, t2, 0x1f);
2548
            tcg_gen_rotr_i32(t2, t3, t2);
2549
            tcg_gen_ext_i32_tl(cpu_gpr[rd], t2);
2550
            tcg_temp_free_i32(t2);
2551
            tcg_temp_free_i32(t3);
2552
            opn = "rotrv";
2553
        }
2554
        break;
2555
#if defined(TARGET_MIPS64)
2556
    case OPC_DSLLV:
2557
        tcg_gen_andi_tl(t0, t0, 0x3f);
2558
        tcg_gen_shl_tl(cpu_gpr[rd], t1, t0);
2559
        opn = "dsllv";
2560
        break;
2561
    case OPC_DSRAV:
2562
        tcg_gen_andi_tl(t0, t0, 0x3f);
2563
        tcg_gen_sar_tl(cpu_gpr[rd], t1, t0);
2564
        opn = "dsrav";
2565
        break;
2566
    case OPC_DSRLV:
2567
        tcg_gen_andi_tl(t0, t0, 0x3f);
2568
        tcg_gen_shr_tl(cpu_gpr[rd], t1, t0);
2569
        opn = "dsrlv";
2570
        break;
2571
    case OPC_DROTRV:
2572
        tcg_gen_andi_tl(t0, t0, 0x3f);
2573
        tcg_gen_rotr_tl(cpu_gpr[rd], t1, t0);
2574
        opn = "drotrv";
2575
        break;
2576
#endif
2577
    }
2578
    (void)opn; /* avoid a compiler warning */
2579
    MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
2580
    tcg_temp_free(t0);
2581
    tcg_temp_free(t1);
2582
}
2583

    
2584
/* Arithmetic on HI/LO registers */
2585
static void gen_HILO(DisasContext *ctx, uint32_t opc, int acc, int reg)
2586
{
2587
    const char *opn = "hilo";
2588

    
2589
    if (reg == 0 && (opc == OPC_MFHI || opc == OPC_MFLO)) {
2590
        /* Treat as NOP. */
2591
        MIPS_DEBUG("NOP");
2592
        return;
2593
    }
2594

    
2595
    if (acc != 0) {
2596
        check_dsp(ctx);
2597
    }
2598

    
2599
    switch (opc) {
2600
    case OPC_MFHI:
2601
#if defined(TARGET_MIPS64)
2602
        if (acc != 0) {
2603
            tcg_gen_ext32s_tl(cpu_gpr[reg], cpu_HI[acc]);
2604
        } else
2605
#endif
2606
        {
2607
            tcg_gen_mov_tl(cpu_gpr[reg], cpu_HI[acc]);
2608
        }
2609
        opn = "mfhi";
2610
        break;
2611
    case OPC_MFLO:
2612
#if defined(TARGET_MIPS64)
2613
        if (acc != 0) {
2614
            tcg_gen_ext32s_tl(cpu_gpr[reg], cpu_LO[acc]);
2615
        } else
2616
#endif
2617
        {
2618
            tcg_gen_mov_tl(cpu_gpr[reg], cpu_LO[acc]);
2619
        }
2620
        opn = "mflo";
2621
        break;
2622
    case OPC_MTHI:
2623
        if (reg != 0) {
2624
#if defined(TARGET_MIPS64)
2625
            if (acc != 0) {
2626
                tcg_gen_ext32s_tl(cpu_HI[acc], cpu_gpr[reg]);
2627
            } else
2628
#endif
2629
            {
2630
                tcg_gen_mov_tl(cpu_HI[acc], cpu_gpr[reg]);
2631
            }
2632
        } else {
2633
            tcg_gen_movi_tl(cpu_HI[acc], 0);
2634
        }
2635
        opn = "mthi";
2636
        break;
2637
    case OPC_MTLO:
2638
        if (reg != 0) {
2639
#if defined(TARGET_MIPS64)
2640
            if (acc != 0) {
2641
                tcg_gen_ext32s_tl(cpu_LO[acc], cpu_gpr[reg]);
2642
            } else
2643
#endif
2644
            {
2645
                tcg_gen_mov_tl(cpu_LO[acc], cpu_gpr[reg]);
2646
            }
2647
        } else {
2648
            tcg_gen_movi_tl(cpu_LO[acc], 0);
2649
        }
2650
        opn = "mtlo";
2651
        break;
2652
    }
2653
    (void)opn; /* avoid a compiler warning */
2654
    MIPS_DEBUG("%s %s", opn, regnames[reg]);
2655
}
2656

    
2657
static void gen_muldiv(DisasContext *ctx, uint32_t opc,
2658
                       int acc, int rs, int rt)
2659
{
2660
    const char *opn = "mul/div";
2661
    TCGv t0, t1;
2662

    
2663
    t0 = tcg_temp_new();
2664
    t1 = tcg_temp_new();
2665

    
2666
    gen_load_gpr(t0, rs);
2667
    gen_load_gpr(t1, rt);
2668

    
2669
    if (acc != 0) {
2670
        check_dsp(ctx);
2671
    }
2672

    
2673
    switch (opc) {
2674
    case OPC_DIV:
2675
        {
2676
            TCGv t2 = tcg_temp_new();
2677
            TCGv t3 = tcg_temp_new();
2678
            tcg_gen_ext32s_tl(t0, t0);
2679
            tcg_gen_ext32s_tl(t1, t1);
2680
            tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, INT_MIN);
2681
            tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1);
2682
            tcg_gen_and_tl(t2, t2, t3);
2683
            tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
2684
            tcg_gen_or_tl(t2, t2, t3);
2685
            tcg_gen_movi_tl(t3, 0);
2686
            tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
2687
            tcg_gen_div_tl(cpu_LO[acc], t0, t1);
2688
            tcg_gen_rem_tl(cpu_HI[acc], t0, t1);
2689
            tcg_gen_ext32s_tl(cpu_LO[acc], cpu_LO[acc]);
2690
            tcg_gen_ext32s_tl(cpu_HI[acc], cpu_HI[acc]);
2691
            tcg_temp_free(t3);
2692
            tcg_temp_free(t2);
2693
        }
2694
        opn = "div";
2695
        break;
2696
    case OPC_DIVU:
2697
        {
2698
            TCGv t2 = tcg_const_tl(0);
2699
            TCGv t3 = tcg_const_tl(1);
2700
            tcg_gen_ext32u_tl(t0, t0);
2701
            tcg_gen_ext32u_tl(t1, t1);
2702
            tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
2703
            tcg_gen_divu_tl(cpu_LO[acc], t0, t1);
2704
            tcg_gen_remu_tl(cpu_HI[acc], t0, t1);
2705
            tcg_gen_ext32s_tl(cpu_LO[acc], cpu_LO[acc]);
2706
            tcg_gen_ext32s_tl(cpu_HI[acc], cpu_HI[acc]);
2707
            tcg_temp_free(t3);
2708
            tcg_temp_free(t2);
2709
        }
2710
        opn = "divu";
2711
        break;
2712
    case OPC_MULT:
2713
        {
2714
            TCGv_i32 t2 = tcg_temp_new_i32();
2715
            TCGv_i32 t3 = tcg_temp_new_i32();
2716
            tcg_gen_trunc_tl_i32(t2, t0);
2717
            tcg_gen_trunc_tl_i32(t3, t1);
2718
            tcg_gen_muls2_i32(t2, t3, t2, t3);
2719
            tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
2720
            tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
2721
            tcg_temp_free_i32(t2);
2722
            tcg_temp_free_i32(t3);
2723
        }
2724
        opn = "mult";
2725
        break;
2726
    case OPC_MULTU:
2727
        {
2728
            TCGv_i32 t2 = tcg_temp_new_i32();
2729
            TCGv_i32 t3 = tcg_temp_new_i32();
2730
            tcg_gen_trunc_tl_i32(t2, t0);
2731
            tcg_gen_trunc_tl_i32(t3, t1);
2732
            tcg_gen_mulu2_i32(t2, t3, t2, t3);
2733
            tcg_gen_ext_i32_tl(cpu_LO[acc], t2);
2734
            tcg_gen_ext_i32_tl(cpu_HI[acc], t3);
2735
            tcg_temp_free_i32(t2);
2736
            tcg_temp_free_i32(t3);
2737
        }
2738
        opn = "multu";
2739
        break;
2740
#if defined(TARGET_MIPS64)
2741
    case OPC_DDIV:
2742
        {
2743
            TCGv t2 = tcg_temp_new();
2744
            TCGv t3 = tcg_temp_new();
2745
            tcg_gen_setcondi_tl(TCG_COND_EQ, t2, t0, -1LL << 63);
2746
            tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, -1LL);
2747
            tcg_gen_and_tl(t2, t2, t3);
2748
            tcg_gen_setcondi_tl(TCG_COND_EQ, t3, t1, 0);
2749
            tcg_gen_or_tl(t2, t2, t3);
2750
            tcg_gen_movi_tl(t3, 0);
2751
            tcg_gen_movcond_tl(TCG_COND_NE, t1, t2, t3, t2, t1);
2752
            tcg_gen_div_tl(cpu_LO[acc], t0, t1);
2753
            tcg_gen_rem_tl(cpu_HI[acc], t0, t1);
2754
            tcg_temp_free(t3);
2755
            tcg_temp_free(t2);
2756
        }
2757
        opn = "ddiv";
2758
        break;
2759
    case OPC_DDIVU:
2760
        {
2761
            TCGv t2 = tcg_const_tl(0);
2762
            TCGv t3 = tcg_const_tl(1);
2763
            tcg_gen_movcond_tl(TCG_COND_EQ, t1, t1, t2, t3, t1);
2764
            tcg_gen_divu_i64(cpu_LO[acc], t0, t1);
2765
            tcg_gen_remu_i64(cpu_HI[acc], t0, t1);
2766
            tcg_temp_free(t3);
2767
            tcg_temp_free(t2);
2768
        }
2769
        opn = "ddivu";
2770
        break;
2771
    case OPC_DMULT:
2772
        tcg_gen_muls2_i64(cpu_LO[acc], cpu_HI[acc], t0, t1);
2773
        opn = "dmult";
2774
        break;
2775
    case OPC_DMULTU:
2776
        tcg_gen_mulu2_i64(cpu_LO[acc], cpu_HI[acc], t0, t1);
2777
        opn = "dmultu";
2778
        break;
2779
#endif
2780
    case OPC_MADD:
2781
        {
2782
            TCGv_i64 t2 = tcg_temp_new_i64();
2783
            TCGv_i64 t3 = tcg_temp_new_i64();
2784

    
2785
            tcg_gen_ext_tl_i64(t2, t0);
2786
            tcg_gen_ext_tl_i64(t3, t1);
2787
            tcg_gen_mul_i64(t2, t2, t3);
2788
            tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
2789
            tcg_gen_add_i64(t2, t2, t3);
2790
            tcg_temp_free_i64(t3);
2791
            tcg_gen_trunc_i64_tl(t0, t2);
2792
            tcg_gen_shri_i64(t2, t2, 32);
2793
            tcg_gen_trunc_i64_tl(t1, t2);
2794
            tcg_temp_free_i64(t2);
2795
            tcg_gen_ext32s_tl(cpu_LO[acc], t0);
2796
            tcg_gen_ext32s_tl(cpu_HI[acc], t1);
2797
        }
2798
        opn = "madd";
2799
        break;
2800
    case OPC_MADDU:
2801
        {
2802
            TCGv_i64 t2 = tcg_temp_new_i64();
2803
            TCGv_i64 t3 = tcg_temp_new_i64();
2804

    
2805
            tcg_gen_ext32u_tl(t0, t0);
2806
            tcg_gen_ext32u_tl(t1, t1);
2807
            tcg_gen_extu_tl_i64(t2, t0);
2808
            tcg_gen_extu_tl_i64(t3, t1);
2809
            tcg_gen_mul_i64(t2, t2, t3);
2810
            tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
2811
            tcg_gen_add_i64(t2, t2, t3);
2812
            tcg_temp_free_i64(t3);
2813
            tcg_gen_trunc_i64_tl(t0, t2);
2814
            tcg_gen_shri_i64(t2, t2, 32);
2815
            tcg_gen_trunc_i64_tl(t1, t2);
2816
            tcg_temp_free_i64(t2);
2817
            tcg_gen_ext32s_tl(cpu_LO[acc], t0);
2818
            tcg_gen_ext32s_tl(cpu_HI[acc], t1);
2819
        }
2820
        opn = "maddu";
2821
        break;
2822
    case OPC_MSUB:
2823
        {
2824
            TCGv_i64 t2 = tcg_temp_new_i64();
2825
            TCGv_i64 t3 = tcg_temp_new_i64();
2826

    
2827
            tcg_gen_ext_tl_i64(t2, t0);
2828
            tcg_gen_ext_tl_i64(t3, t1);
2829
            tcg_gen_mul_i64(t2, t2, t3);
2830
            tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
2831
            tcg_gen_sub_i64(t2, t3, t2);
2832
            tcg_temp_free_i64(t3);
2833
            tcg_gen_trunc_i64_tl(t0, t2);
2834
            tcg_gen_shri_i64(t2, t2, 32);
2835
            tcg_gen_trunc_i64_tl(t1, t2);
2836
            tcg_temp_free_i64(t2);
2837
            tcg_gen_ext32s_tl(cpu_LO[acc], t0);
2838
            tcg_gen_ext32s_tl(cpu_HI[acc], t1);
2839
        }
2840
        opn = "msub";
2841
        break;
2842
    case OPC_MSUBU:
2843
        {
2844
            TCGv_i64 t2 = tcg_temp_new_i64();
2845
            TCGv_i64 t3 = tcg_temp_new_i64();
2846

    
2847
            tcg_gen_ext32u_tl(t0, t0);
2848
            tcg_gen_ext32u_tl(t1, t1);
2849
            tcg_gen_extu_tl_i64(t2, t0);
2850
            tcg_gen_extu_tl_i64(t3, t1);
2851
            tcg_gen_mul_i64(t2, t2, t3);
2852
            tcg_gen_concat_tl_i64(t3, cpu_LO[acc], cpu_HI[acc]);
2853
            tcg_gen_sub_i64(t2, t3, t2);
2854
            tcg_temp_free_i64(t3);
2855
            tcg_gen_trunc_i64_tl(t0, t2);
2856
            tcg_gen_shri_i64(t2, t2, 32);
2857
            tcg_gen_trunc_i64_tl(t1, t2);
2858
            tcg_temp_free_i64(t2);
2859
            tcg_gen_ext32s_tl(cpu_LO[acc], t0);
2860
            tcg_gen_ext32s_tl(cpu_HI[acc], t1);
2861
        }
2862
        opn = "msubu";
2863
        break;
2864
    default:
2865
        MIPS_INVAL(opn);
2866
        generate_exception(ctx, EXCP_RI);
2867
        goto out;
2868
    }
2869
    (void)opn; /* avoid a compiler warning */
2870
    MIPS_DEBUG("%s %s %s", opn, regnames[rs], regnames[rt]);
2871
 out:
2872
    tcg_temp_free(t0);
2873
    tcg_temp_free(t1);
2874
}
2875

    
2876
static void gen_mul_vr54xx (DisasContext *ctx, uint32_t opc,
2877
                            int rd, int rs, int rt)
2878
{
2879
    const char *opn = "mul vr54xx";
2880
    TCGv t0 = tcg_temp_new();
2881
    TCGv t1 = tcg_temp_new();
2882

    
2883
    gen_load_gpr(t0, rs);
2884
    gen_load_gpr(t1, rt);
2885

    
2886
    switch (opc) {
2887
    case OPC_VR54XX_MULS:
2888
        gen_helper_muls(t0, cpu_env, t0, t1);
2889
        opn = "muls";
2890
        break;
2891
    case OPC_VR54XX_MULSU:
2892
        gen_helper_mulsu(t0, cpu_env, t0, t1);
2893
        opn = "mulsu";
2894
        break;
2895
    case OPC_VR54XX_MACC:
2896
        gen_helper_macc(t0, cpu_env, t0, t1);
2897
        opn = "macc";
2898
        break;
2899
    case OPC_VR54XX_MACCU:
2900
        gen_helper_maccu(t0, cpu_env, t0, t1);
2901
        opn = "maccu";
2902
        break;
2903
    case OPC_VR54XX_MSAC:
2904
        gen_helper_msac(t0, cpu_env, t0, t1);
2905
        opn = "msac";
2906
        break;
2907
    case OPC_VR54XX_MSACU:
2908
        gen_helper_msacu(t0, cpu_env, t0, t1);
2909
        opn = "msacu";
2910
        break;
2911
    case OPC_VR54XX_MULHI:
2912
        gen_helper_mulhi(t0, cpu_env, t0, t1);
2913
        opn = "mulhi";
2914
        break;
2915
    case OPC_VR54XX_MULHIU:
2916
        gen_helper_mulhiu(t0, cpu_env, t0, t1);
2917
        opn = "mulhiu";
2918
        break;
2919
    case OPC_VR54XX_MULSHI:
2920
        gen_helper_mulshi(t0, cpu_env, t0, t1);
2921
        opn = "mulshi";
2922
        break;
2923
    case OPC_VR54XX_MULSHIU:
2924
        gen_helper_mulshiu(t0, cpu_env, t0, t1);
2925
        opn = "mulshiu";
2926
        break;
2927
    case OPC_VR54XX_MACCHI:
2928
        gen_helper_macchi(t0, cpu_env, t0, t1);
2929
        opn = "macchi";
2930
        break;
2931
    case OPC_VR54XX_MACCHIU:
2932
        gen_helper_macchiu(t0, cpu_env, t0, t1);
2933
        opn = "macchiu";
2934
        break;
2935
    case OPC_VR54XX_MSACHI:
2936
        gen_helper_msachi(t0, cpu_env, t0, t1);
2937
        opn = "msachi";
2938
        break;
2939
    case OPC_VR54XX_MSACHIU:
2940
        gen_helper_msachiu(t0, cpu_env, t0, t1);
2941
        opn = "msachiu";
2942
        break;
2943
    default:
2944
        MIPS_INVAL("mul vr54xx");
2945
        generate_exception(ctx, EXCP_RI);
2946
        goto out;
2947
    }
2948
    gen_store_gpr(t0, rd);
2949
    (void)opn; /* avoid a compiler warning */
2950
    MIPS_DEBUG("%s %s, %s, %s", opn, regnames[rd], regnames[rs], regnames[rt]);
2951

    
2952
 out:
2953
    tcg_temp_free(t0);
2954
    tcg_temp_free(t1);
2955
}
2956

    
2957
static void gen_cl (DisasContext *ctx, uint32_t opc,
2958
                    int rd, int rs)
2959
{
2960
    const char *opn = "CLx";
2961
    TCGv t0;
2962

    
2963
    if (rd == 0) {
2964
        /* Treat as NOP. */
2965
        MIPS_DEBUG("NOP");
2966
        return;
2967
    }
2968
    t0 = tcg_temp_new();
2969
    gen_load_gpr(t0, rs);
2970
    switch (opc) {
2971
    case OPC_CLO:
2972
        gen_helper_clo(cpu_gpr[rd], t0);
2973
        opn = "clo";
2974
        break;
2975
    case OPC_CLZ:
2976
        gen_helper_clz(cpu_gpr[rd], t0);
2977
        opn = "clz";
2978
        break;
2979
#if defined(TARGET_MIPS64)
2980
    case OPC_DCLO:
2981
        gen_helper_dclo(cpu_gpr[rd], t0);
2982
        opn = "dclo";
2983
        break;
2984
    case OPC_DCLZ:
2985
        gen_helper_dclz(cpu_gpr[rd], t0);
2986
        opn = "dclz";
2987
        break;
2988
#endif
2989
    }
2990
    (void)opn; /* avoid a compiler warning */
2991
    MIPS_DEBUG("%s %s, %s", opn, regnames[rd], regnames[rs]);
2992
    tcg_temp_free(t0);
2993
}
2994

    
2995
/* Godson integer instructions */
2996
static void gen_loongson_integer(DisasContext *ctx, uint32_t opc,
2997
                                 int rd, int rs, int rt)
2998
{
2999
    const char *opn = "loongson";
3000
    TCGv t0, t1;
3001

    
3002
    if (rd == 0) {
3003
        /* Treat as NOP. */
3004
        MIPS_DEBUG("NOP");
3005
        return;
3006
    }
3007

    
3008
    switch (opc) {
3009
    case OPC_MULT_G_2E:
3010
    case OPC_MULT_G_2F:
3011
    case OPC_MULTU_G_2E:
3012
    case OPC_MULTU_G_2F:
3013
#if defined(TARGET_MIPS64)
3014
    case OPC_DMULT_G_2E:
3015
    case OPC_DMULT_G_2F:
3016
    case OPC_DMULTU_G_2E:
3017
    case OPC_DMULTU_G_2F:
3018
#endif
3019
        t0 = tcg_temp_new();
3020
        t1 = tcg_temp_new();
3021
        break;
3022
    default:
3023
        t0 = tcg_temp_local_new();
3024
        t1 = tcg_temp_local_new();
3025
        break;
3026
    }
3027

    
3028
    gen_load_gpr(t0, rs);
3029
    gen_load_gpr(t1, rt);
3030

    
3031
    switch (opc) {
3032
    case OPC_MULT_G_2E:
3033
    case OPC_MULT_G_2F:
3034
        tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3035
        tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3036
        opn = "mult.g";
3037
        break;
3038
    case OPC_MULTU_G_2E:
3039
    case OPC_MULTU_G_2F:
3040
        tcg_gen_ext32u_tl(t0, t0);
3041
        tcg_gen_ext32u_tl(t1, t1);
3042
        tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3043
        tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3044
        opn = "multu.g";
3045
        break;
3046
    case OPC_DIV_G_2E:
3047
    case OPC_DIV_G_2F:
3048
        {
3049
            int l1 = gen_new_label();
3050
            int l2 = gen_new_label();
3051
            int l3 = gen_new_label();
3052
            tcg_gen_ext32s_tl(t0, t0);
3053
            tcg_gen_ext32s_tl(t1, t1);
3054
            tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3055
            tcg_gen_movi_tl(cpu_gpr[rd], 0);
3056
            tcg_gen_br(l3);
3057
            gen_set_label(l1);
3058
            tcg_gen_brcondi_tl(TCG_COND_NE, t0, INT_MIN, l2);
3059
            tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1, l2);
3060
            tcg_gen_mov_tl(cpu_gpr[rd], t0);
3061
            tcg_gen_br(l3);
3062
            gen_set_label(l2);
3063
            tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
3064
            tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3065
            gen_set_label(l3);
3066
        }
3067
        opn = "div.g";
3068
        break;
3069
    case OPC_DIVU_G_2E:
3070
    case OPC_DIVU_G_2F:
3071
        {
3072
            int l1 = gen_new_label();
3073
            int l2 = gen_new_label();
3074
            tcg_gen_ext32u_tl(t0, t0);
3075
            tcg_gen_ext32u_tl(t1, t1);
3076
            tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3077
            tcg_gen_movi_tl(cpu_gpr[rd], 0);
3078
            tcg_gen_br(l2);
3079
            gen_set_label(l1);
3080
            tcg_gen_divu_tl(cpu_gpr[rd], t0, t1);
3081
            tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3082
            gen_set_label(l2);
3083
        }
3084
        opn = "divu.g";
3085
        break;
3086
    case OPC_MOD_G_2E:
3087
    case OPC_MOD_G_2F:
3088
        {
3089
            int l1 = gen_new_label();
3090
            int l2 = gen_new_label();
3091
            int l3 = gen_new_label();
3092
            tcg_gen_ext32u_tl(t0, t0);
3093
            tcg_gen_ext32u_tl(t1, t1);
3094
            tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
3095
            tcg_gen_brcondi_tl(TCG_COND_NE, t0, INT_MIN, l2);
3096
            tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1, l2);
3097
            gen_set_label(l1);
3098
            tcg_gen_movi_tl(cpu_gpr[rd], 0);
3099
            tcg_gen_br(l3);
3100
            gen_set_label(l2);
3101
            tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
3102
            tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3103
            gen_set_label(l3);
3104
        }
3105
        opn = "mod.g";
3106
        break;
3107
    case OPC_MODU_G_2E:
3108
    case OPC_MODU_G_2F:
3109
        {
3110
            int l1 = gen_new_label();
3111
            int l2 = gen_new_label();
3112
            tcg_gen_ext32u_tl(t0, t0);
3113
            tcg_gen_ext32u_tl(t1, t1);
3114
            tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3115
            tcg_gen_movi_tl(cpu_gpr[rd], 0);
3116
            tcg_gen_br(l2);
3117
            gen_set_label(l1);
3118
            tcg_gen_remu_tl(cpu_gpr[rd], t0, t1);
3119
            tcg_gen_ext32s_tl(cpu_gpr[rd], cpu_gpr[rd]);
3120
            gen_set_label(l2);
3121
        }
3122
        opn = "modu.g";
3123
        break;
3124
#if defined(TARGET_MIPS64)
3125
    case OPC_DMULT_G_2E:
3126
    case OPC_DMULT_G_2F:
3127
        tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3128
        opn = "dmult.g";
3129
        break;
3130
    case OPC_DMULTU_G_2E:
3131
    case OPC_DMULTU_G_2F:
3132
        tcg_gen_mul_tl(cpu_gpr[rd], t0, t1);
3133
        opn = "dmultu.g";
3134
        break;
3135
    case OPC_DDIV_G_2E:
3136
    case OPC_DDIV_G_2F:
3137
        {
3138
            int l1 = gen_new_label();
3139
            int l2 = gen_new_label();
3140
            int l3 = gen_new_label();
3141
            tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3142
            tcg_gen_movi_tl(cpu_gpr[rd], 0);
3143
            tcg_gen_br(l3);
3144
            gen_set_label(l1);
3145
            tcg_gen_brcondi_tl(TCG_COND_NE, t0, -1LL << 63, l2);
3146
            tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1LL, l2);
3147
            tcg_gen_mov_tl(cpu_gpr[rd], t0);
3148
            tcg_gen_br(l3);
3149
            gen_set_label(l2);
3150
            tcg_gen_div_tl(cpu_gpr[rd], t0, t1);
3151
            gen_set_label(l3);
3152
        }
3153
        opn = "ddiv.g";
3154
        break;
3155
    case OPC_DDIVU_G_2E:
3156
    case OPC_DDIVU_G_2F:
3157
        {
3158
            int l1 = gen_new_label();
3159
            int l2 = gen_new_label();
3160
            tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3161
            tcg_gen_movi_tl(cpu_gpr[rd], 0);
3162
            tcg_gen_br(l2);
3163
            gen_set_label(l1);
3164
            tcg_gen_divu_tl(cpu_gpr[rd], t0, t1);
3165
            gen_set_label(l2);
3166
        }
3167
        opn = "ddivu.g";
3168
        break;
3169
    case OPC_DMOD_G_2E:
3170
    case OPC_DMOD_G_2F:
3171
        {
3172
            int l1 = gen_new_label();
3173
            int l2 = gen_new_label();
3174
            int l3 = gen_new_label();
3175
            tcg_gen_brcondi_tl(TCG_COND_EQ, t1, 0, l1);
3176
            tcg_gen_brcondi_tl(TCG_COND_NE, t0, -1LL << 63, l2);
3177
            tcg_gen_brcondi_tl(TCG_COND_NE, t1, -1LL, l2);
3178
            gen_set_label(l1);
3179
            tcg_gen_movi_tl(cpu_gpr[rd], 0);
3180
            tcg_gen_br(l3);
3181
            gen_set_label(l2);
3182
            tcg_gen_rem_tl(cpu_gpr[rd], t0, t1);
3183
            gen_set_label(l3);
3184
        }
3185
        opn = "dmod.g";
3186
        break;
3187
    case OPC_DMODU_G_2E:
3188
    case OPC_DMODU_G_2F:
3189
        {
3190
            int l1 = gen_new_label();
3191
            int l2 = gen_new_label();
3192
            tcg_gen_brcondi_tl(TCG_COND_NE, t1, 0, l1);
3193
            tcg_gen_movi_tl(cpu_gpr[rd], 0);
3194
            tcg_gen_br(l2);
3195
            gen_set_label(l1);
3196
            tcg_gen_remu_tl(cpu_gpr[rd], t0, t1);
3197
            gen_set_label(l2);
3198
        }
3199
        opn = "dmodu.g";
3200
        break;
3201
#endif
3202
    }
3203

    
3204
    (void)opn; /* avoid a compiler warning */
3205
    MIPS_DEBUG("%s %s, %s", opn, regnames[rd], regnames[rs]);
3206
    tcg_temp_free(t0);
3207
    tcg_temp_free(t1);
3208
}
3209

    
3210
/* Loongson multimedia instructions */
3211
static void gen_loongson_multimedia(DisasContext *ctx, int rd, int rs, int rt)
3212
{
3213
    const char *opn = "loongson_cp2";
3214
    uint32_t opc, shift_max;
3215
    TCGv_i64 t0, t1;
3216

    
3217
    opc = MASK_LMI(ctx->opcode);
3218
    switch (opc) {
3219
    case OPC_ADD_CP2:
3220
    case OPC_SUB_CP2:
3221
    case OPC_DADD_CP2:
3222
    case OPC_DSUB_CP2:
3223
        t0 = tcg_temp_local_new_i64();
3224
        t1 = tcg_temp_local_new_i64();
3225
        break;
3226
    default:
3227
        t0 = tcg_temp_new_i64();
3228
        t1 = tcg_temp_new_i64();
3229
        break;
3230
    }
3231

    
3232
    gen_load_fpr64(ctx, t0, rs);
3233
    gen_load_fpr64(ctx, t1, rt);
3234

    
3235
#define LMI_HELPER(UP, LO) \
3236
    case OPC_##UP: gen_helper_##LO(t0, t0, t1); opn = #LO; break
3237
#define LMI_HELPER_1(UP, LO) \
3238
    case OPC_##UP: gen_helper_##LO(t0, t0); opn = #LO; break
3239
#define LMI_DIRECT(UP, LO, OP) \
3240
    case OPC_##UP: tcg_gen_##OP##_i64(t0, t0, t1); opn = #LO; break
3241

    
3242
    switch (opc) {
3243
    LMI_HELPER(PADDSH, paddsh);
3244
    LMI_HELPER(PADDUSH, paddush);
3245
    LMI_HELPER(PADDH, paddh);
3246
    LMI_HELPER(PADDW, paddw);
3247
    LMI_HELPER(PADDSB, paddsb);
3248
    LMI_HELPER(PADDUSB, paddusb);
3249
    LMI_HELPER(PADDB, paddb);
3250

    
3251
    LMI_HELPER(PSUBSH, psubsh);
3252
    LMI_HELPER(PSUBUSH, psubush);
3253
    LMI_HELPER(PSUBH, psubh);
3254
    LMI_HELPER(PSUBW, psubw);
3255
    LMI_HELPER(PSUBSB, psubsb);
3256
    LMI_HELPER(PSUBUSB, psubusb);
3257
    LMI_HELPER(PSUBB, psubb);
3258

    
3259
    LMI_HELPER(PSHUFH, pshufh);
3260
    LMI_HELPER(PACKSSWH, packsswh);
3261
    LMI_HELPER(PACKSSHB, packsshb);
3262
    LMI_HELPER(PACKUSHB, packushb);
3263

    
3264
    LMI_HELPER(PUNPCKLHW, punpcklhw);
3265
    LMI_HELPER(PUNPCKHHW, punpckhhw);
3266
    LMI_HELPER(PUNPCKLBH, punpcklbh);
3267
    LMI_HELPER(PUNPCKHBH, punpckhbh);
3268
    LMI_HELPER(PUNPCKLWD, punpcklwd);
3269
    LMI_HELPER(PUNPCKHWD, punpckhwd);
3270

    
3271
    LMI_HELPER(PAVGH, pavgh);
3272
    LMI_HELPER(PAVGB, pavgb);
3273
    LMI_HELPER(PMAXSH, pmaxsh);
3274
    LMI_HELPER(PMINSH, pminsh);
3275
    LMI_HELPER(PMAXUB, pmaxub);
3276
    LMI_HELPER(PMINUB, pminub);
3277

    
3278
    LMI_HELPER(PCMPEQW, pcmpeqw);
3279
    LMI_HELPER(PCMPGTW, pcmpgtw);
3280
    LMI_HELPER(PCMPEQH, pcmpeqh);
3281
    LMI_HELPER(PCMPGTH, pcmpgth);
3282
    LMI_HELPER(PCMPEQB, pcmpeqb);
3283
    LMI_HELPER(PCMPGTB, pcmpgtb);
3284

    
3285
    LMI_HELPER(PSLLW, psllw);
3286
    LMI_HELPER(PSLLH, psllh);
3287
    LMI_HELPER(PSRLW, psrlw);
3288
    LMI_HELPER(PSRLH, psrlh);
3289
    LMI_HELPER(PSRAW, psraw);
3290
    LMI_HELPER(PSRAH, psrah);
3291

    
3292
    LMI_HELPER(PMULLH, pmullh);
3293
    LMI_HELPER(PMULHH, pmulhh);
3294
    LMI_HELPER(PMULHUH, pmulhuh);
3295
    LMI_HELPER(PMADDHW, pmaddhw);
3296

    
3297
    LMI_HELPER(PASUBUB, pasubub);
3298
    LMI_HELPER_1(BIADD, biadd);
3299
    LMI_HELPER_1(PMOVMSKB, pmovmskb);
3300

    
3301
    LMI_DIRECT(PADDD, paddd, add);
3302
    LMI_DIRECT(PSUBD, psubd, sub);
3303
    LMI_DIRECT(XOR_CP2, xor, xor);
3304
    LMI_DIRECT(NOR_CP2, nor, nor);
3305
    LMI_DIRECT(AND_CP2, and, and);
3306
    LMI_DIRECT(PANDN, pandn, andc);
3307
    LMI_DIRECT(OR, or, or);
3308

    
3309
    case OPC_PINSRH_0:
3310
        tcg_gen_deposit_i64(t0, t0, t1, 0, 16);
3311
        opn = "pinsrh_0";
3312
        break;
3313
    case OPC_PINSRH_1:
3314
        tcg_gen_deposit_i64(t0, t0, t1, 16, 16);
3315
        opn = "pinsrh_1";
3316
        break;
3317
    case OPC_PINSRH_2:
3318
        tcg_gen_deposit_i64(t0, t0, t1, 32, 16);
3319
        opn = "pinsrh_2";
3320
        break;
3321
    case OPC_PINSRH_3:
3322
        tcg_gen_deposit_i64(t0, t0, t1, 48, 16);
3323
        opn = "pinsrh_3";
3324
        break;
3325

    
3326
    case OPC_PEXTRH:
3327
        tcg_gen_andi_i64(t1, t1, 3);
3328
        tcg_gen_shli_i64(t1, t1, 4);
3329
        tcg_gen_shr_i64(t0, t0, t1);
3330
        tcg_gen_ext16u_i64(t0, t0);
3331
        opn = "pextrh";
3332
        break;
3333

    
3334
    case OPC_ADDU_CP2:
3335
        tcg_gen_add_i64(t0, t0, t1);
3336
        tcg_gen_ext32s_i64(t0, t0);
3337
        opn = "addu";
3338
        break;
3339
    case OPC_SUBU_CP2:
3340
        tcg_gen_sub_i64(t0, t0, t1);
3341
        tcg_gen_ext32s_i64(t0, t0);
3342
        opn = "addu";
3343
        break;
3344

    
3345
    case OPC_SLL_CP2:
3346
        opn = "sll";
3347
        shift_max = 32;
3348
        goto do_shift;
3349
    case OPC_SRL_CP2:
3350
        opn = "srl";
3351
        shift_max = 32;
3352
        goto do_shift;
3353
    case OPC_SRA_CP2:
3354
        opn = "sra";
3355
        shift_max = 32;
3356
        goto do_shift;
3357
    case OPC_DSLL_CP2:
3358
        opn = "dsll";
3359
        shift_max = 64;
3360
        goto do_shift;
3361
    case OPC_DSRL_CP2:
3362
        opn = "dsrl";
3363
        shift_max = 64;
3364
        goto do_shift;
3365
    case OPC_DSRA_CP2:
3366
        opn = "dsra";
3367
        shift_max = 64;
3368
        goto do_shift;
3369
    do_shift:
3370
        /* Make sure shift count isn't TCG undefined behaviour.  */
3371
        tcg_gen_andi_i64(t1, t1, shift_max - 1);
3372

    
3373
        switch (opc) {
3374
        case OPC_SLL_CP2:
3375
        case OPC_DSLL_CP2:
3376
            tcg_gen_shl_i64(t0, t0, t1);
3377
            break;
3378
        case OPC_SRA_CP2:
3379
        case OPC_DSRA_CP2:
3380
            /* Since SRA is UndefinedResult without sign-extended inputs,
3381
               we can treat SRA and DSRA the same.  */
3382
            tcg_gen_sar_i64(t0, t0, t1);
3383
            break;
3384
        case OPC_SRL_CP2:
3385
            /* We want to shift in zeros for SRL; zero-extend first.  */
3386
            tcg_gen_ext32u_i64(t0, t0);
3387
            /* FALLTHRU */
3388
        case OPC_DSRL_CP2:
3389
            tcg_gen_shr_i64(t0, t0, t1);
3390
            break;
3391
        }
3392

    
3393
        if (shift_max == 32) {
3394
            tcg_gen_ext32s_i64(t0, t0);
3395
        }
3396

    
3397
        /* Shifts larger than MAX produce zero.  */
3398
        tcg_gen_setcondi_i64(TCG_COND_LTU, t1, t1, shift_max);
3399
        tcg_gen_neg_i64(t1, t1);
3400
        tcg_gen_and_i64(t0, t0, t1);
3401
        break;
3402

    
3403
    case OPC_ADD_CP2:
3404
    case OPC_DADD_CP2:
3405
        {
3406
            TCGv_i64 t2 = tcg_temp_new_i64();
3407
            int lab = gen_new_label();
3408

    
3409
            tcg_gen_mov_i64(t2, t0);
3410
            tcg_gen_add_i64(t0, t1, t2);
3411
            if (opc == OPC_ADD_CP2) {
3412
                tcg_gen_ext32s_i64(t0, t0);
3413
            }
3414
            tcg_gen_xor_i64(t1, t1, t2);
3415
            tcg_gen_xor_i64(t2, t2, t0);
3416
            tcg_gen_andc_i64(t1, t2, t1);
3417
            tcg_temp_free_i64(t2);
3418
            tcg_gen_brcondi_i64(TCG_COND_GE, t1, 0, lab);
3419
            generate_exception(ctx, EXCP_OVERFLOW);
3420
            gen_set_label(lab);
3421

    
3422
            opn = (opc == OPC_ADD_CP2 ? "add" : "dadd");
3423
            break;
3424
        }
3425

    
3426
    case OPC_SUB_CP2:
3427
    case OPC_DSUB_CP2:
3428
        {
3429
            TCGv_i64 t2 = tcg_temp_new_i64();
3430
            int lab = gen_new_label();
3431

    
3432
            tcg_gen_mov_i64(t2, t0);
3433
            tcg_gen_sub_i64(t0, t1, t2);
3434
            if (opc == OPC_SUB_CP2) {
3435
                tcg_gen_ext32s_i64(t0, t0);
3436
            }
3437
            tcg_gen_xor_i64(t1, t1, t2);
3438
            tcg_gen_xor_i64(t2, t2, t0);
3439
            tcg_gen_and_i64(t1, t1, t2);
3440
            tcg_temp_free_i64(t2);
3441
            tcg_gen_brcondi_i64(TCG_COND_GE, t1, 0, lab);
3442
            generate_exception(ctx, EXCP_OVERFLOW);
3443
            gen_set_label(lab);
3444

    
3445
            opn = (opc == OPC_SUB_CP2 ? "sub" : "dsub");
3446
            break;
3447
        }
3448

    
3449
    case OPC_PMULUW:
3450
        tcg_gen_ext32u_i64(t0, t0);
3451
        tcg_gen_ext32u_i64(t1, t1);
3452
        tcg_gen_mul_i64(t0, t0, t1);
3453
        opn = "pmuluw";
3454
        break;
3455

    
3456
    case OPC_SEQU_CP2:
3457
    case OPC_SEQ_CP2:
3458
    case OPC_SLTU_CP2:
3459
    case OPC_SLT_CP2:
3460
    case OPC_SLEU_CP2:
3461
    case OPC_SLE_CP2:
3462
        /* ??? Document is unclear: Set FCC[CC].  Does that mean the
3463
           FD field is the CC field?  */
3464
    default:
3465
        MIPS_INVAL(opn);
3466
        generate_exception(ctx, EXCP_RI);
3467
        return;
3468
    }
3469

    
3470
#undef LMI_HELPER
3471
#undef LMI_DIRECT
3472

    
3473
    gen_store_fpr64(ctx, t0, rd);
3474

    
3475
    (void)opn; /* avoid a compiler warning */
3476
    MIPS_DEBUG("%s %s, %s, %s", opn,
3477
               fregnames[rd], fregnames[rs], fregnames[rt]);
3478
    tcg_temp_free_i64(t0);
3479
    tcg_temp_free_i64(t1);
3480
}
3481

    
3482
/* Traps */
3483
static void gen_trap (DisasContext *ctx, uint32_t opc,
3484
                      int rs, int rt, int16_t imm)
3485
{
3486
    int cond;
3487
    TCGv t0 = tcg_temp_new();
3488
    TCGv t1 = tcg_temp_new();
3489

    
3490
    cond = 0;
3491
    /* Load needed operands */
3492
    switch (opc) {
3493
    case OPC_TEQ:
3494
    case OPC_TGE:
3495
    case OPC_TGEU:
3496
    case OPC_TLT:
3497
    case OPC_TLTU:
3498
    case OPC_TNE:
3499
        /* Compare two registers */
3500
        if (rs != rt) {
3501
            gen_load_gpr(t0, rs);
3502
            gen_load_gpr(t1, rt);
3503
            cond = 1;
3504
        }
3505
        break;
3506
    case OPC_TEQI:
3507
    case OPC_TGEI:
3508
    case OPC_TGEIU:
3509
    case OPC_TLTI:
3510
    case OPC_TLTIU:
3511
    case OPC_TNEI:
3512
        /* Compare register to immediate */
3513
        if (rs != 0 || imm != 0) {
3514
            gen_load_gpr(t0, rs);
3515
            tcg_gen_movi_tl(t1, (int32_t)imm);
3516
            cond = 1;
3517
        }
3518
        break;
3519
    }
3520
    if (cond == 0) {
3521
        switch (opc) {
3522
        case OPC_TEQ:   /* rs == rs */
3523
        case OPC_TEQI:  /* r0 == 0  */
3524
        case OPC_TGE:   /* rs >= rs */
3525
        case OPC_TGEI:  /* r0 >= 0  */
3526
        case OPC_TGEU:  /* rs >= rs unsigned */
3527
        case OPC_TGEIU: /* r0 >= 0  unsigned */
3528
            /* Always trap */
3529
            generate_exception(ctx, EXCP_TRAP);
3530
            break;
3531
        case OPC_TLT:   /* rs < rs           */
3532
        case OPC_TLTI:  /* r0 < 0            */
3533
        case OPC_TLTU:  /* rs < rs unsigned  */
3534
        case OPC_TLTIU: /* r0 < 0  unsigned  */
3535
        case OPC_TNE:   /* rs != rs          */
3536
        case OPC_TNEI:  /* r0 != 0           */
3537
            /* Never trap: treat as NOP. */
3538
            break;
3539
        }
3540
    } else {
3541
        int l1 = gen_new_label();
3542

    
3543
        switch (opc) {
3544
        case OPC_TEQ:
3545
        case OPC_TEQI:
3546
            tcg_gen_brcond_tl(TCG_COND_NE, t0, t1, l1);
3547
            break;
3548
        case OPC_TGE:
3549
        case OPC_TGEI:
3550
            tcg_gen_brcond_tl(TCG_COND_LT, t0, t1, l1);
3551
            break;
3552
        case OPC_TGEU:
3553
        case OPC_TGEIU:
3554
            tcg_gen_brcond_tl(TCG_COND_LTU, t0, t1, l1);
3555
            break;
3556
        case OPC_TLT:
3557
        case OPC_TLTI:
3558
            tcg_gen_brcond_tl(TCG_COND_GE, t0, t1, l1);
3559
            break;
3560
        case OPC_TLTU:
3561
        case OPC_TLTIU:
3562
            tcg_gen_brcond_tl(TCG_COND_GEU, t0, t1, l1);
3563
            break;
3564
        case OPC_TNE:
3565
        case OPC_TNEI:
3566
            tcg_gen_brcond_tl(TCG_COND_EQ, t0, t1, l1);
3567
            break;
3568
        }
3569
        generate_exception(ctx, EXCP_TRAP);
3570
        gen_set_label(l1);
3571
    }
3572
    tcg_temp_free(t0);
3573
    tcg_temp_free(t1);
3574
}
3575

    
3576
static inline void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest)
3577
{
3578
    TranslationBlock *tb;
3579
    tb = ctx->tb;
3580
    if ((tb->pc & TARGET_PAGE_MASK) == (dest & TARGET_PAGE_MASK) &&
3581
        likely(!ctx->singlestep_enabled)) {
3582
        tcg_gen_goto_tb(n);
3583
        gen_save_pc(dest);
3584
        tcg_gen_exit_tb((uintptr_t)tb + n);
3585
    } else {
3586
        gen_save_pc(dest);
3587
        if (ctx->singlestep_enabled) {
3588
            save_cpu_state(ctx, 0);
3589
            gen_helper_0e0i(raise_exception, EXCP_DEBUG);
3590
        }
3591
        tcg_gen_exit_tb(0);
3592
    }
3593
}
3594

    
3595
/* Branches (before delay slot) */
3596
static void gen_compute_branch (DisasContext *ctx, uint32_t opc,
3597
                                int insn_bytes,
3598
                                int rs, int rt, int32_t offset)
3599
{
3600
    target_ulong btgt = -1;
3601
    int blink = 0;
3602
    int bcond_compute = 0;
3603
    TCGv t0 = tcg_temp_new();
3604
    TCGv t1 = tcg_temp_new();
3605

    
3606
    if (ctx->hflags & MIPS_HFLAG_BMASK) {
3607
#ifdef MIPS_DEBUG_DISAS
3608
        LOG_DISAS("Branch in delay slot at PC 0x" TARGET_FMT_lx "\n", ctx->pc);
3609
#endif
3610
        generate_exception(ctx, EXCP_RI);
3611
        goto out;
3612
    }
3613

    
3614
    /* Load needed operands */
3615
    switch (opc) {
3616
    case OPC_BEQ:
3617
    case OPC_BEQL:
3618
    case OPC_BNE:
3619
    case OPC_BNEL:
3620
        /* Compare two registers */
3621
        if (rs != rt) {
3622
            gen_load_gpr(t0, rs);
3623
            gen_load_gpr(t1, rt);
3624
            bcond_compute = 1;
3625
        }
3626
        btgt = ctx->pc + insn_bytes + offset;
3627
        break;
3628
    case OPC_BGEZ:
3629
    case OPC_BGEZAL:
3630
    case OPC_BGEZALS:
3631
    case OPC_BGEZALL:
3632
    case OPC_BGEZL:
3633
    case OPC_BGTZ:
3634
    case OPC_BGTZL:
3635
    case OPC_BLEZ:
3636
    case OPC_BLEZL:
3637
    case OPC_BLTZ:
3638
    case OPC_BLTZAL:
3639
    case OPC_BLTZALS:
3640
    case OPC_BLTZALL:
3641
    case OPC_BLTZL:
3642
        /* Compare to zero */
3643
        if (rs != 0) {
3644
            gen_load_gpr(t0, rs);
3645
            bcond_compute = 1;
3646
        }
3647
        btgt = ctx->pc + insn_bytes + offset;
3648
        break;
3649
    case OPC_BPOSGE32:
3650
#if defined(TARGET_MIPS64)
3651
    case OPC_BPOSGE64:
3652
        tcg_gen_andi_tl(t0, cpu_dspctrl, 0x7F);
3653
#else
3654
        tcg_gen_andi_tl(t0, cpu_dspctrl, 0x3F);
3655
#endif
3656
        bcond_compute = 1;
3657
        btgt = ctx->pc + insn_bytes + offset;
3658
        break;
3659
    case OPC_J:
3660
    case OPC_JAL:
3661
    case OPC_JALX:
3662
    case OPC_JALS:
3663
    case OPC_JALXS:
3664
        /* Jump to immediate */
3665
        btgt = ((ctx->pc + insn_bytes) & (int32_t)0xF0000000) | (uint32_t)offset;
3666
        break;
3667
    case OPC_JR:
3668
    case OPC_JALR:
3669
    case OPC_JALRC:
3670
    case OPC_JALRS:
3671
        /* Jump to register */
3672
        if (offset != 0 && offset != 16) {
3673
            /* Hint = 0 is JR/JALR, hint 16 is JR.HB/JALR.HB, the
3674
               others are reserved. */
3675
            MIPS_INVAL("jump hint");
3676
            generate_exception(ctx, EXCP_RI);
3677
            goto out;
3678
        }
3679
        gen_load_gpr(btarget, rs);
3680
        break;
3681
    default:
3682
        MIPS_INVAL("branch/jump");
3683
        generate_exception(ctx, EXCP_RI);
3684
        goto out;
3685
    }
3686
    if (bcond_compute == 0) {
3687
        /* No condition to be computed */
3688
        switch (opc) {
3689
        case OPC_BEQ:     /* rx == rx        */
3690
        case OPC_BEQL:    /* rx == rx likely */
3691
        case OPC_BGEZ:    /* 0 >= 0          */
3692
        case OPC_BGEZL:   /* 0 >= 0 likely   */
3693
        case OPC_BLEZ:    /* 0 <= 0          */
3694
        case OPC_BLEZL:   /* 0 <= 0 likely   */
3695
            /* Always take */
3696
            ctx->hflags |= MIPS_HFLAG_B;
3697
            MIPS_DEBUG("balways");
3698
            break;
3699
        case OPC_BGEZALS:
3700
        case OPC_BGEZAL:  /* 0 >= 0          */
3701
        case OPC_BGEZALL: /* 0 >= 0 likely   */
3702
            ctx->hflags |= (opc == OPC_BGEZALS
3703
                            ? MIPS_HFLAG_BDS16
3704
                            : MIPS_HFLAG_BDS32);
3705
            /* Always take and link */
3706
            blink = 31;
3707
            ctx->hflags |= MIPS_HFLAG_B;
3708
            MIPS_DEBUG("balways and link");
3709
            break;
3710
        case OPC_BNE:     /* rx != rx        */
3711
        case OPC_BGTZ:    /* 0 > 0           */
3712
        case OPC_BLTZ:    /* 0 < 0           */
3713
            /* Treat as NOP. */
3714
            MIPS_DEBUG("bnever (NOP)");
3715
            goto out;
3716
        case OPC_BLTZALS:
3717
        case OPC_BLTZAL:  /* 0 < 0           */
3718
            ctx->hflags |= (opc == OPC_BLTZALS
3719
                            ? MIPS_HFLAG_BDS16
3720
                            : MIPS_HFLAG_BDS32);
3721
            /* Handle as an unconditional branch to get correct delay
3722
               slot checking.  */
3723
            blink = 31;
3724
            btgt = ctx->pc + (opc == OPC_BLTZALS ? 6 : 8);
3725
            ctx->hflags |= MIPS_HFLAG_B;
3726
            MIPS_DEBUG("bnever and link");
3727
            break;
3728
        case OPC_BLTZALL: /* 0 < 0 likely */
3729
            tcg_gen_movi_tl(cpu_gpr[31], ctx->pc + 8);
3730
            /* Skip the instruction in the delay slot */
3731
            MIPS_DEBUG("bnever, link and skip");
3732
            ctx->pc += 4;
3733
            goto out;
3734
        case OPC_BNEL:    /* rx != rx likely */
3735
        case OPC_BGTZL:   /* 0 > 0 likely */
3736
        case OPC_BLTZL:   /* 0 < 0 likely */
3737
            /* Skip the instruction in the delay slot */
3738
            MIPS_DEBUG("bnever and skip");
3739
            ctx->pc += 4;
3740
            goto out;
3741
        case OPC_J:
3742
            ctx->hflags |= MIPS_HFLAG_B;
3743
            MIPS_DEBUG("j " TARGET_FMT_lx, btgt);
3744
            break;
3745
        case OPC_JALXS:
3746
        case OPC_JALX:
3747
            ctx->hflags |= MIPS_HFLAG_BX;
3748
            /* Fallthrough */
3749
        case OPC_JALS:
3750
        case OPC_JAL:
3751
            blink = 31;
3752
            ctx->hflags |= MIPS_HFLAG_B;
3753
            ctx->hflags |= ((opc == OPC_JALS || opc == OPC_JALXS)
3754
                            ? MIPS_HFLAG_BDS16
3755
                            : MIPS_HFLAG_BDS32);
3756
            MIPS_DEBUG("jal " TARGET_FMT_lx, btgt);
3757
            break;
3758
        case OPC_JR:
3759
            ctx->hflags |= MIPS_HFLAG_BR;
3760
            if (insn_bytes == 4)
3761
                ctx->hflags |= MIPS_HFLAG_BDS32;
3762
            MIPS_DEBUG("jr %s", regnames[rs]);
3763
            break;
3764
        case OPC_JALRS:
3765
        case OPC_JALR:
3766
        case OPC_JALRC:
3767
            blink = rt;
3768
            ctx->hflags |= MIPS_HFLAG_BR;
3769
            ctx->hflags |= (opc == OPC_JALRS
3770
                            ? MIPS_HFLAG_BDS16
3771
                            : MIPS_HFLAG_BDS32);
3772
            MIPS_DEBUG("jalr %s, %s", regnames[rt], regnames[rs]);
3773
            break;
3774
        default:
3775
            MIPS_INVAL("branch/jump");
3776
            generate_exception(ctx, EXCP_RI);
3777
            goto out;
3778
        }
3779
    } else {
3780
        switch (opc) {
3781
        case OPC_BEQ:
3782
            tcg_gen_setcond_tl(TCG_COND_EQ, bcond, t0, t1);
3783
            MIPS_DEBUG("beq %s, %s, " TARGET_FMT_lx,
3784
                       regnames[rs], regnames[rt], btgt);
3785
            goto not_likely;
3786
        case OPC_BEQL:
3787
            tcg_gen_setcond_tl(TCG_COND_EQ, bcond, t0, t1);
3788
            MIPS_DEBUG("beql %s, %s, " TARGET_FMT_lx,
3789
                       regnames[rs], regnames[rt], btgt);
3790
            goto likely;
3791
        case OPC_BNE:
3792
            tcg_gen_setcond_tl(TCG_COND_NE, bcond, t0, t1);
3793
            MIPS_DEBUG("bne %s, %s, " TARGET_FMT_lx,
3794
                       regnames[rs], regnames[rt], btgt);
3795
            goto not_likely;
3796
        case OPC_BNEL:
3797
            tcg_gen_setcond_tl(TCG_COND_NE, bcond, t0, t1);
3798
            MIPS_DEBUG("bnel %s, %s, " TARGET_FMT_lx,
3799
                       regnames[rs], regnames[rt], btgt);
3800
            goto likely;
3801
        case OPC_BGEZ:
3802
            tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
3803
            MIPS_DEBUG("bgez %s, " TARGET_FMT_lx, regnames[rs], btgt);
3804
            goto not_likely;
3805
        case OPC_BGEZL:
3806
            tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
3807
            MIPS_DEBUG("bgezl %s, " TARGET_FMT_lx, regnames[rs], btgt);
3808
            goto likely;
3809
        case OPC_BGEZALS:
3810
        case OPC_BGEZAL:
3811
            ctx->hflags |= (opc == OPC_BGEZALS
3812
                            ? MIPS_HFLAG_BDS16
3813
                            : MIPS_HFLAG_BDS32);
3814
            tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
3815
            MIPS_DEBUG("bgezal %s, " TARGET_FMT_lx, regnames[rs], btgt);
3816
            blink = 31;
3817
            goto not_likely;
3818
        case OPC_BGEZALL:
3819
            tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 0);
3820
            blink = 31;
3821
            MIPS_DEBUG("bgezall %s, " TARGET_FMT_lx, regnames[rs], btgt);
3822
            goto likely;
3823
        case OPC_BGTZ:
3824
            tcg_gen_setcondi_tl(TCG_COND_GT, bcond, t0, 0);
3825
            MIPS_DEBUG("bgtz %s, " TARGET_FMT_lx, regnames[rs], btgt);
3826
            goto not_likely;
3827
        case OPC_BGTZL:
3828
            tcg_gen_setcondi_tl(TCG_COND_GT, bcond, t0, 0);
3829
            MIPS_DEBUG("bgtzl %s, " TARGET_FMT_lx, regnames[rs], btgt);
3830
            goto likely;
3831
        case OPC_BLEZ:
3832
            tcg_gen_setcondi_tl(TCG_COND_LE, bcond, t0, 0);
3833
            MIPS_DEBUG("blez %s, " TARGET_FMT_lx, regnames[rs], btgt);
3834
            goto not_likely;
3835
        case OPC_BLEZL:
3836
            tcg_gen_setcondi_tl(TCG_COND_LE, bcond, t0, 0);
3837
            MIPS_DEBUG("blezl %s, " TARGET_FMT_lx, regnames[rs], btgt);
3838
            goto likely;
3839
        case OPC_BLTZ:
3840
            tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
3841
            MIPS_DEBUG("bltz %s, " TARGET_FMT_lx, regnames[rs], btgt);
3842
            goto not_likely;
3843
        case OPC_BLTZL:
3844
            tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
3845
            MIPS_DEBUG("bltzl %s, " TARGET_FMT_lx, regnames[rs], btgt);
3846
            goto likely;
3847
        case OPC_BPOSGE32:
3848
            tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 32);
3849
            MIPS_DEBUG("bposge32 " TARGET_FMT_lx, btgt);
3850
            goto not_likely;
3851
#if defined(TARGET_MIPS64)
3852
        case OPC_BPOSGE64:
3853
            tcg_gen_setcondi_tl(TCG_COND_GE, bcond, t0, 64);
3854
            MIPS_DEBUG("bposge64 " TARGET_FMT_lx, btgt);
3855
            goto not_likely;
3856
#endif
3857
        case OPC_BLTZALS:
3858
        case OPC_BLTZAL:
3859
            ctx->hflags |= (opc == OPC_BLTZALS
3860
                            ? MIPS_HFLAG_BDS16
3861
                            : MIPS_HFLAG_BDS32);
3862
            tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
3863
            blink = 31;
3864
            MIPS_DEBUG("bltzal %s, " TARGET_FMT_lx, regnames[rs], btgt);
3865
        not_likely:
3866
            ctx->hflags |= MIPS_HFLAG_BC;
3867
            break;
3868
        case OPC_BLTZALL:
3869
            tcg_gen_setcondi_tl(TCG_COND_LT, bcond, t0, 0);
3870
            blink = 31;
3871
            MIPS_DEBUG("bltzall %s, " TARGET_FMT_lx, regnames[rs], btgt);
3872
        likely:
3873
            ctx->hflags |= MIPS_HFLAG_BL;
3874
            break;
3875
        default:
3876
            MIPS_INVAL("conditional branch/jump");
3877
            generate_exception(ctx, EXCP_RI);
3878
            goto out;
3879
        }
3880
    }
3881
    MIPS_DEBUG("enter ds: link %d cond %02x target " TARGET_FMT_lx,
3882
               blink, ctx->hflags, btgt);
3883

    
3884
    ctx->btarget = btgt;
3885
    if (blink > 0) {
3886
        int post_delay = insn_bytes;
3887
        int lowbit = !!(ctx->hflags & MIPS_HFLAG_M16);
3888

    
3889
        if (opc != OPC_JALRC)
3890
            post_delay += ((ctx->hflags & MIPS_HFLAG_BDS16) ? 2 : 4);
3891

    
3892
        tcg_gen_movi_tl(cpu_gpr[blink], ctx->pc + post_delay + lowbit);
3893
    }
3894

    
3895
 out:
3896
    if (insn_bytes == 2)
3897
        ctx->hflags |= MIPS_HFLAG_B16;
3898
    tcg_temp_free(t0);
3899
    tcg_temp_free(t1);
3900
}
3901

    
3902
/* special3 bitfield operations */
3903
static void gen_bitops (DisasContext *ctx, uint32_t opc, int rt,
3904
                        int rs, int lsb, int msb)
3905
{
3906
    TCGv t0 = tcg_temp_new();
3907
    TCGv t1 = tcg_temp_new();
3908

    
3909
    gen_load_gpr(t1, rs);
3910
    switch (opc) {
3911
    case OPC_EXT:
3912
        if (lsb + msb > 31)
3913
            goto fail;
3914
        tcg_gen_shri_tl(t0, t1, lsb);
3915
        if (msb != 31) {
3916
            tcg_gen_andi_tl(t0, t0, (1 << (msb + 1)) - 1);
3917
        } else {
3918
            tcg_gen_ext32s_tl(t0, t0);
3919
        }
3920
        break;
3921
#if defined(TARGET_MIPS64)
3922
    case OPC_DEXTM:
3923
        tcg_gen_shri_tl(t0, t1, lsb);
3924
        if (msb != 31) {
3925
            tcg_gen_andi_tl(t0, t0, (1ULL << (msb + 1 + 32)) - 1);
3926
        }
3927
        break;
3928
    case OPC_DEXTU:
3929
        tcg_gen_shri_tl(t0, t1, lsb + 32);
3930
        tcg_gen_andi_tl(t0, t0, (1ULL << (msb + 1)) - 1);
3931
        break;
3932
    case OPC_DEXT:
3933
        tcg_gen_shri_tl(t0, t1, lsb);
3934
        tcg_gen_andi_tl(t0, t0, (1ULL << (msb + 1)) - 1);
3935
        break;
3936
#endif
3937
    case OPC_INS:
3938
        if (lsb > msb)
3939
            goto fail;
3940
        gen_load_gpr(t0, rt);
3941
        tcg_gen_deposit_tl(t0, t0, t1, lsb, msb - lsb + 1);
3942
        tcg_gen_ext32s_tl(t0, t0);
3943
        break;
3944
#if defined(TARGET_MIPS64)
3945
    case OPC_DINSM:
3946
        gen_load_gpr(t0, rt);
3947
        tcg_gen_deposit_tl(t0, t0, t1, lsb, msb + 32 - lsb + 1);
3948
        break;
3949
    case OPC_DINSU:
3950
        gen_load_gpr(t0, rt);
3951
        tcg_gen_deposit_tl(t0, t0, t1, lsb + 32, msb - lsb + 1);
3952
        break;
3953
    case OPC_DINS:
3954
        gen_load_gpr(t0, rt);
3955
        tcg_gen_deposit_tl(t0, t0, t1, lsb, msb - lsb + 1);
3956
        break;
3957
#endif
3958
    default:
3959
fail:
3960
        MIPS_INVAL("bitops");
3961
        generate_exception(ctx, EXCP_RI);
3962
        tcg_temp_free(t0);
3963
        tcg_temp_free(t1);
3964
        return;
3965
    }
3966
    gen_store_gpr(t0, rt);
3967
    tcg_temp_free(t0);
3968
    tcg_temp_free(t1);
3969
}
3970

    
3971
static void gen_bshfl (DisasContext *ctx, uint32_t op2, int rt, int rd)
3972
{
3973
    TCGv t0;
3974

    
3975
    if (rd == 0) {
3976
        /* If no destination, treat it as a NOP. */
3977
        MIPS_DEBUG("NOP");
3978
        return;
3979
    }
3980

    
3981
    t0 = tcg_temp_new();
3982
    gen_load_gpr(t0, rt);
3983
    switch (op2) {
3984
    case OPC_WSBH:
3985
        {
3986
            TCGv t1 = tcg_temp_new();
3987

    
3988
            tcg_gen_shri_tl(t1, t0, 8);
3989
            tcg_gen_andi_tl(t1, t1, 0x00FF00FF);
3990
            tcg_gen_shli_tl(t0, t0, 8);
3991
            tcg_gen_andi_tl(t0, t0, ~0x00FF00FF);
3992
            tcg_gen_or_tl(t0, t0, t1);
3993
            tcg_temp_free(t1);
3994
            tcg_gen_ext32s_tl(cpu_gpr[rd], t0);
3995
        }
3996
        break;
3997
    case OPC_SEB:
3998
        tcg_gen_ext8s_tl(cpu_gpr[rd], t0);
3999
        break;
4000
    case OPC_SEH:
4001
        tcg_gen_ext16s_tl(cpu_gpr[rd], t0);
4002
        break;
4003
#if defined(TARGET_MIPS64)
4004
    case OPC_DSBH:
4005
        {
4006
            TCGv t1 = tcg_temp_new();
4007

    
4008
            tcg_gen_shri_tl(t1, t0, 8);
4009
            tcg_gen_andi_tl(t1, t1, 0x00FF00FF00FF00FFULL);
4010
            tcg_gen_shli_tl(t0, t0, 8);
4011
            tcg_gen_andi_tl(t0, t0, ~0x00FF00FF00FF00FFULL);
4012
            tcg_gen_or_tl(cpu_gpr[rd], t0, t1);
4013
            tcg_temp_free(t1);
4014
        }
4015
        break;
4016
    case OPC_DSHD:
4017
        {
4018
            TCGv t1 = tcg_temp_new();
4019

    
4020
            tcg_gen_shri_tl(t1, t0, 16);
4021
            tcg_gen_andi_tl(t1, t1, 0x0000FFFF0000FFFFULL);
4022
            tcg_gen_shli_tl(t0, t0, 16);
4023
            tcg_gen_andi_tl(t0, t0, ~0x0000FFFF0000FFFFULL);
4024
            tcg_gen_or_tl(t0, t0, t1);
4025
            tcg_gen_shri_tl(t1, t0, 32);
4026
            tcg_gen_shli_tl(t0, t0, 32);
4027
            tcg_gen_or_tl(cpu_gpr[rd], t0, t1);
4028
            tcg_temp_free(t1);
4029
        }
4030
        break;
4031
#endif
4032
    default:
4033
        MIPS_INVAL("bsfhl");
4034
        generate_exception(ctx, EXCP_RI);
4035
        tcg_temp_free(t0);
4036
        return;
4037
    }
4038
    tcg_temp_free(t0);
4039
}
4040

    
4041
#ifndef CONFIG_USER_ONLY
4042
/* CP0 (MMU and control) */
4043
static inline void gen_mfc0_load32 (TCGv arg, target_ulong off)
4044
{
4045
    TCGv_i32 t0 = tcg_temp_new_i32();
4046

    
4047
    tcg_gen_ld_i32(t0, cpu_env, off);
4048
    tcg_gen_ext_i32_tl(arg, t0);
4049
    tcg_temp_free_i32(t0);
4050
}
4051

    
4052
static inline void gen_mfc0_load64 (TCGv arg, target_ulong off)
4053
{
4054
    tcg_gen_ld_tl(arg, cpu_env, off);
4055
    tcg_gen_ext32s_tl(arg, arg);
4056
}
4057

    
4058
static inline void gen_mtc0_store32 (TCGv arg, target_ulong off)
4059
{
4060
    TCGv_i32 t0 = tcg_temp_new_i32();
4061

    
4062
    tcg_gen_trunc_tl_i32(t0, arg);
4063
    tcg_gen_st_i32(t0, cpu_env, off);
4064
    tcg_temp_free_i32(t0);
4065
}
4066

    
4067
static inline void gen_mtc0_store64 (TCGv arg, target_ulong off)
4068
{
4069
    tcg_gen_ext32s_tl(arg, arg);
4070
    tcg_gen_st_tl(arg, cpu_env, off);
4071
}
4072

    
4073
static void gen_mfc0(DisasContext *ctx, TCGv arg, int reg, int sel)
4074
{
4075
    const char *rn = "invalid";
4076

    
4077
    if (sel != 0)
4078
        check_insn(ctx, ISA_MIPS32);
4079

    
4080
    switch (reg) {
4081
    case 0:
4082
        switch (sel) {
4083
        case 0:
4084
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Index));
4085
            rn = "Index";
4086
            break;
4087
        case 1:
4088
            check_insn(ctx, ASE_MT);
4089
            gen_helper_mfc0_mvpcontrol(arg, cpu_env);
4090
            rn = "MVPControl";
4091
            break;
4092
        case 2:
4093
            check_insn(ctx, ASE_MT);
4094
            gen_helper_mfc0_mvpconf0(arg, cpu_env);
4095
            rn = "MVPConf0";
4096
            break;
4097
        case 3:
4098
            check_insn(ctx, ASE_MT);
4099
            gen_helper_mfc0_mvpconf1(arg, cpu_env);
4100
            rn = "MVPConf1";
4101
            break;
4102
        default:
4103
            goto die;
4104
        }
4105
        break;
4106
    case 1:
4107
        switch (sel) {
4108
        case 0:
4109
            gen_helper_mfc0_random(arg, cpu_env);
4110
            rn = "Random";
4111
            break;
4112
        case 1:
4113
            check_insn(ctx, ASE_MT);
4114
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEControl));
4115
            rn = "VPEControl";
4116
            break;
4117
        case 2:
4118
            check_insn(ctx, ASE_MT);
4119
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf0));
4120
            rn = "VPEConf0";
4121
            break;
4122
        case 3:
4123
            check_insn(ctx, ASE_MT);
4124
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf1));
4125
            rn = "VPEConf1";
4126
            break;
4127
        case 4:
4128
            check_insn(ctx, ASE_MT);
4129
            gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_YQMask));
4130
            rn = "YQMask";
4131
            break;
4132
        case 5:
4133
            check_insn(ctx, ASE_MT);
4134
            gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_VPESchedule));
4135
            rn = "VPESchedule";
4136
            break;
4137
        case 6:
4138
            check_insn(ctx, ASE_MT);
4139
            gen_mfc0_load64(arg, offsetof(CPUMIPSState, CP0_VPEScheFBack));
4140
            rn = "VPEScheFBack";
4141
            break;
4142
        case 7:
4143
            check_insn(ctx, ASE_MT);
4144
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEOpt));
4145
            rn = "VPEOpt";
4146
            break;
4147
        default:
4148
            goto die;
4149
        }
4150
        break;
4151
    case 2:
4152
        switch (sel) {
4153
        case 0:
4154
            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryLo0));
4155
            tcg_gen_ext32s_tl(arg, arg);
4156
            rn = "EntryLo0";
4157
            break;
4158
        case 1:
4159
            check_insn(ctx, ASE_MT);
4160
            gen_helper_mfc0_tcstatus(arg, cpu_env);
4161
            rn = "TCStatus";
4162
            break;
4163
        case 2:
4164
            check_insn(ctx, ASE_MT);
4165
            gen_helper_mfc0_tcbind(arg, cpu_env);
4166
            rn = "TCBind";
4167
            break;
4168
        case 3:
4169
            check_insn(ctx, ASE_MT);
4170
            gen_helper_mfc0_tcrestart(arg, cpu_env);
4171
            rn = "TCRestart";
4172
            break;
4173
        case 4:
4174
            check_insn(ctx, ASE_MT);
4175
            gen_helper_mfc0_tchalt(arg, cpu_env);
4176
            rn = "TCHalt";
4177
            break;
4178
        case 5:
4179
            check_insn(ctx, ASE_MT);
4180
            gen_helper_mfc0_tccontext(arg, cpu_env);
4181
            rn = "TCContext";
4182
            break;
4183
        case 6:
4184
            check_insn(ctx, ASE_MT);
4185
            gen_helper_mfc0_tcschedule(arg, cpu_env);
4186
            rn = "TCSchedule";
4187
            break;
4188
        case 7:
4189
            check_insn(ctx, ASE_MT);
4190
            gen_helper_mfc0_tcschefback(arg, cpu_env);
4191
            rn = "TCScheFBack";
4192
            break;
4193
        default:
4194
            goto die;
4195
        }
4196
        break;
4197
    case 3:
4198
        switch (sel) {
4199
        case 0:
4200
            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryLo1));
4201
            tcg_gen_ext32s_tl(arg, arg);
4202
            rn = "EntryLo1";
4203
            break;
4204
        default:
4205
            goto die;
4206
        }
4207
        break;
4208
    case 4:
4209
        switch (sel) {
4210
        case 0:
4211
            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_Context));
4212
            tcg_gen_ext32s_tl(arg, arg);
4213
            rn = "Context";
4214
            break;
4215
        case 1:
4216
//            gen_helper_mfc0_contextconfig(arg); /* SmartMIPS ASE */
4217
            rn = "ContextConfig";
4218
//            break;
4219
        default:
4220
            goto die;
4221
        }
4222
        break;
4223
    case 5:
4224
        switch (sel) {
4225
        case 0:
4226
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageMask));
4227
            rn = "PageMask";
4228
            break;
4229
        case 1:
4230
            check_insn(ctx, ISA_MIPS32R2);
4231
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageGrain));
4232
            rn = "PageGrain";
4233
            break;
4234
        default:
4235
            goto die;
4236
        }
4237
        break;
4238
    case 6:
4239
        switch (sel) {
4240
        case 0:
4241
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Wired));
4242
            rn = "Wired";
4243
            break;
4244
        case 1:
4245
            check_insn(ctx, ISA_MIPS32R2);
4246
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf0));
4247
            rn = "SRSConf0";
4248
            break;
4249
        case 2:
4250
            check_insn(ctx, ISA_MIPS32R2);
4251
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf1));
4252
            rn = "SRSConf1";
4253
            break;
4254
        case 3:
4255
            check_insn(ctx, ISA_MIPS32R2);
4256
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf2));
4257
            rn = "SRSConf2";
4258
            break;
4259
        case 4:
4260
            check_insn(ctx, ISA_MIPS32R2);
4261
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf3));
4262
            rn = "SRSConf3";
4263
            break;
4264
        case 5:
4265
            check_insn(ctx, ISA_MIPS32R2);
4266
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf4));
4267
            rn = "SRSConf4";
4268
            break;
4269
        default:
4270
            goto die;
4271
        }
4272
        break;
4273
    case 7:
4274
        switch (sel) {
4275
        case 0:
4276
            check_insn(ctx, ISA_MIPS32R2);
4277
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_HWREna));
4278
            rn = "HWREna";
4279
            break;
4280
        default:
4281
            goto die;
4282
        }
4283
        break;
4284
    case 8:
4285
        switch (sel) {
4286
        case 0:
4287
            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));
4288
            tcg_gen_ext32s_tl(arg, arg);
4289
            rn = "BadVAddr";
4290
            break;
4291
        default:
4292
            goto die;
4293
       }
4294
        break;
4295
    case 9:
4296
        switch (sel) {
4297
        case 0:
4298
            /* Mark as an IO operation because we read the time.  */
4299
            if (use_icount)
4300
                gen_io_start();
4301
            gen_helper_mfc0_count(arg, cpu_env);
4302
            if (use_icount) {
4303
                gen_io_end();
4304
            }
4305
            /* Break the TB to be able to take timer interrupts immediately
4306
               after reading count.  */
4307
            ctx->bstate = BS_STOP;
4308
            rn = "Count";
4309
            break;
4310
        /* 6,7 are implementation dependent */
4311
        default:
4312
            goto die;
4313
        }
4314
        break;
4315
    case 10:
4316
        switch (sel) {
4317
        case 0:
4318
            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryHi));
4319
            tcg_gen_ext32s_tl(arg, arg);
4320
            rn = "EntryHi";
4321
            break;
4322
        default:
4323
            goto die;
4324
        }
4325
        break;
4326
    case 11:
4327
        switch (sel) {
4328
        case 0:
4329
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Compare));
4330
            rn = "Compare";
4331
            break;
4332
        /* 6,7 are implementation dependent */
4333
        default:
4334
            goto die;
4335
        }
4336
        break;
4337
    case 12:
4338
        switch (sel) {
4339
        case 0:
4340
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Status));
4341
            rn = "Status";
4342
            break;
4343
        case 1:
4344
            check_insn(ctx, ISA_MIPS32R2);
4345
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_IntCtl));
4346
            rn = "IntCtl";
4347
            break;
4348
        case 2:
4349
            check_insn(ctx, ISA_MIPS32R2);
4350
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSCtl));
4351
            rn = "SRSCtl";
4352
            break;
4353
        case 3:
4354
            check_insn(ctx, ISA_MIPS32R2);
4355
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
4356
            rn = "SRSMap";
4357
            break;
4358
        default:
4359
            goto die;
4360
       }
4361
        break;
4362
    case 13:
4363
        switch (sel) {
4364
        case 0:
4365
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Cause));
4366
            rn = "Cause";
4367
            break;
4368
        default:
4369
            goto die;
4370
       }
4371
        break;
4372
    case 14:
4373
        switch (sel) {
4374
        case 0:
4375
            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
4376
            tcg_gen_ext32s_tl(arg, arg);
4377
            rn = "EPC";
4378
            break;
4379
        default:
4380
            goto die;
4381
        }
4382
        break;
4383
    case 15:
4384
        switch (sel) {
4385
        case 0:
4386
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PRid));
4387
            rn = "PRid";
4388
            break;
4389
        case 1:
4390
            check_insn(ctx, ISA_MIPS32R2);
4391
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_EBase));
4392
            rn = "EBase";
4393
            break;
4394
        default:
4395
            goto die;
4396
       }
4397
        break;
4398
    case 16:
4399
        switch (sel) {
4400
        case 0:
4401
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config0));
4402
            rn = "Config";
4403
            break;
4404
        case 1:
4405
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config1));
4406
            rn = "Config1";
4407
            break;
4408
        case 2:
4409
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config2));
4410
            rn = "Config2";
4411
            break;
4412
        case 3:
4413
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config3));
4414
            rn = "Config3";
4415
            break;
4416
        /* 4,5 are reserved */
4417
        /* 6,7 are implementation dependent */
4418
        case 6:
4419
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config6));
4420
            rn = "Config6";
4421
            break;
4422
        case 7:
4423
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config7));
4424
            rn = "Config7";
4425
            break;
4426
        default:
4427
            goto die;
4428
        }
4429
        break;
4430
    case 17:
4431
        switch (sel) {
4432
        case 0:
4433
            gen_helper_mfc0_lladdr(arg, cpu_env);
4434
            rn = "LLAddr";
4435
            break;
4436
        default:
4437
            goto die;
4438
        }
4439
        break;
4440
    case 18:
4441
        switch (sel) {
4442
        case 0 ... 7:
4443
            gen_helper_1e0i(mfc0_watchlo, arg, sel);
4444
            rn = "WatchLo";
4445
            break;
4446
        default:
4447
            goto die;
4448
        }
4449
        break;
4450
    case 19:
4451
        switch (sel) {
4452
        case 0 ...7:
4453
            gen_helper_1e0i(mfc0_watchhi, arg, sel);
4454
            rn = "WatchHi";
4455
            break;
4456
        default:
4457
            goto die;
4458
        }
4459
        break;
4460
    case 20:
4461
        switch (sel) {
4462
        case 0:
4463
#if defined(TARGET_MIPS64)
4464
            check_insn(ctx, ISA_MIPS3);
4465
            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_XContext));
4466
            tcg_gen_ext32s_tl(arg, arg);
4467
            rn = "XContext";
4468
            break;
4469
#endif
4470
        default:
4471
            goto die;
4472
        }
4473
        break;
4474
    case 21:
4475
       /* Officially reserved, but sel 0 is used for R1x000 framemask */
4476
        switch (sel) {
4477
        case 0:
4478
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Framemask));
4479
            rn = "Framemask";
4480
            break;
4481
        default:
4482
            goto die;
4483
        }
4484
        break;
4485
    case 22:
4486
        tcg_gen_movi_tl(arg, 0); /* unimplemented */
4487
        rn = "'Diagnostic"; /* implementation dependent */
4488
        break;
4489
    case 23:
4490
        switch (sel) {
4491
        case 0:
4492
            gen_helper_mfc0_debug(arg, cpu_env); /* EJTAG support */
4493
            rn = "Debug";
4494
            break;
4495
        case 1:
4496
//            gen_helper_mfc0_tracecontrol(arg); /* PDtrace support */
4497
            rn = "TraceControl";
4498
//            break;
4499
        case 2:
4500
//            gen_helper_mfc0_tracecontrol2(arg); /* PDtrace support */
4501
            rn = "TraceControl2";
4502
//            break;
4503
        case 3:
4504
//            gen_helper_mfc0_usertracedata(arg); /* PDtrace support */
4505
            rn = "UserTraceData";
4506
//            break;
4507
        case 4:
4508
//            gen_helper_mfc0_tracebpc(arg); /* PDtrace support */
4509
            rn = "TraceBPC";
4510
//            break;
4511
        default:
4512
            goto die;
4513
        }
4514
        break;
4515
    case 24:
4516
        switch (sel) {
4517
        case 0:
4518
            /* EJTAG support */
4519
            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
4520
            tcg_gen_ext32s_tl(arg, arg);
4521
            rn = "DEPC";
4522
            break;
4523
        default:
4524
            goto die;
4525
        }
4526
        break;
4527
    case 25:
4528
        switch (sel) {
4529
        case 0:
4530
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Performance0));
4531
            rn = "Performance0";
4532
            break;
4533
        case 1:
4534
//            gen_helper_mfc0_performance1(arg);
4535
            rn = "Performance1";
4536
//            break;
4537
        case 2:
4538
//            gen_helper_mfc0_performance2(arg);
4539
            rn = "Performance2";
4540
//            break;
4541
        case 3:
4542
//            gen_helper_mfc0_performance3(arg);
4543
            rn = "Performance3";
4544
//            break;
4545
        case 4:
4546
//            gen_helper_mfc0_performance4(arg);
4547
            rn = "Performance4";
4548
//            break;
4549
        case 5:
4550
//            gen_helper_mfc0_performance5(arg);
4551
            rn = "Performance5";
4552
//            break;
4553
        case 6:
4554
//            gen_helper_mfc0_performance6(arg);
4555
            rn = "Performance6";
4556
//            break;
4557
        case 7:
4558
//            gen_helper_mfc0_performance7(arg);
4559
            rn = "Performance7";
4560
//            break;
4561
        default:
4562
            goto die;
4563
        }
4564
        break;
4565
    case 26:
4566
        tcg_gen_movi_tl(arg, 0); /* unimplemented */
4567
        rn = "ECC";
4568
        break;
4569
    case 27:
4570
        switch (sel) {
4571
        case 0 ... 3:
4572
            tcg_gen_movi_tl(arg, 0); /* unimplemented */
4573
            rn = "CacheErr";
4574
            break;
4575
        default:
4576
            goto die;
4577
        }
4578
        break;
4579
    case 28:
4580
        switch (sel) {
4581
        case 0:
4582
        case 2:
4583
        case 4:
4584
        case 6:
4585
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagLo));
4586
            rn = "TagLo";
4587
            break;
4588
        case 1:
4589
        case 3:
4590
        case 5:
4591
        case 7:
4592
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataLo));
4593
            rn = "DataLo";
4594
            break;
4595
        default:
4596
            goto die;
4597
        }
4598
        break;
4599
    case 29:
4600
        switch (sel) {
4601
        case 0:
4602
        case 2:
4603
        case 4:
4604
        case 6:
4605
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagHi));
4606
            rn = "TagHi";
4607
            break;
4608
        case 1:
4609
        case 3:
4610
        case 5:
4611
        case 7:
4612
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataHi));
4613
            rn = "DataHi";
4614
            break;
4615
        default:
4616
            goto die;
4617
        }
4618
        break;
4619
    case 30:
4620
        switch (sel) {
4621
        case 0:
4622
            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
4623
            tcg_gen_ext32s_tl(arg, arg);
4624
            rn = "ErrorEPC";
4625
            break;
4626
        default:
4627
            goto die;
4628
        }
4629
        break;
4630
    case 31:
4631
        switch (sel) {
4632
        case 0:
4633
            /* EJTAG support */
4634
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
4635
            rn = "DESAVE";
4636
            break;
4637
        default:
4638
            goto die;
4639
        }
4640
        break;
4641
    default:
4642
       goto die;
4643
    }
4644
    (void)rn; /* avoid a compiler warning */
4645
    LOG_DISAS("mfc0 %s (reg %d sel %d)\n", rn, reg, sel);
4646
    return;
4647

    
4648
die:
4649
    LOG_DISAS("mfc0 %s (reg %d sel %d)\n", rn, reg, sel);
4650
    generate_exception(ctx, EXCP_RI);
4651
}
4652

    
4653
static void gen_mtc0(DisasContext *ctx, TCGv arg, int reg, int sel)
4654
{
4655
    const char *rn = "invalid";
4656

    
4657
    if (sel != 0)
4658
        check_insn(ctx, ISA_MIPS32);
4659

    
4660
    if (use_icount)
4661
        gen_io_start();
4662

    
4663
    switch (reg) {
4664
    case 0:
4665
        switch (sel) {
4666
        case 0:
4667
            gen_helper_mtc0_index(cpu_env, arg);
4668
            rn = "Index";
4669
            break;
4670
        case 1:
4671
            check_insn(ctx, ASE_MT);
4672
            gen_helper_mtc0_mvpcontrol(cpu_env, arg);
4673
            rn = "MVPControl";
4674
            break;
4675
        case 2:
4676
            check_insn(ctx, ASE_MT);
4677
            /* ignored */
4678
            rn = "MVPConf0";
4679
            break;
4680
        case 3:
4681
            check_insn(ctx, ASE_MT);
4682
            /* ignored */
4683
            rn = "MVPConf1";
4684
            break;
4685
        default:
4686
            goto die;
4687
        }
4688
        break;
4689
    case 1:
4690
        switch (sel) {
4691
        case 0:
4692
            /* ignored */
4693
            rn = "Random";
4694
            break;
4695
        case 1:
4696
            check_insn(ctx, ASE_MT);
4697
            gen_helper_mtc0_vpecontrol(cpu_env, arg);
4698
            rn = "VPEControl";
4699
            break;
4700
        case 2:
4701
            check_insn(ctx, ASE_MT);
4702
            gen_helper_mtc0_vpeconf0(cpu_env, arg);
4703
            rn = "VPEConf0";
4704
            break;
4705
        case 3:
4706
            check_insn(ctx, ASE_MT);
4707
            gen_helper_mtc0_vpeconf1(cpu_env, arg);
4708
            rn = "VPEConf1";
4709
            break;
4710
        case 4:
4711
            check_insn(ctx, ASE_MT);
4712
            gen_helper_mtc0_yqmask(cpu_env, arg);
4713
            rn = "YQMask";
4714
            break;
4715
        case 5:
4716
            check_insn(ctx, ASE_MT);
4717
            gen_mtc0_store64(arg, offsetof(CPUMIPSState, CP0_VPESchedule));
4718
            rn = "VPESchedule";
4719
            break;
4720
        case 6:
4721
            check_insn(ctx, ASE_MT);
4722
            gen_mtc0_store64(arg, offsetof(CPUMIPSState, CP0_VPEScheFBack));
4723
            rn = "VPEScheFBack";
4724
            break;
4725
        case 7:
4726
            check_insn(ctx, ASE_MT);
4727
            gen_helper_mtc0_vpeopt(cpu_env, arg);
4728
            rn = "VPEOpt";
4729
            break;
4730
        default:
4731
            goto die;
4732
        }
4733
        break;
4734
    case 2:
4735
        switch (sel) {
4736
        case 0:
4737
            gen_helper_mtc0_entrylo0(cpu_env, arg);
4738
            rn = "EntryLo0";
4739
            break;
4740
        case 1:
4741
            check_insn(ctx, ASE_MT);
4742
            gen_helper_mtc0_tcstatus(cpu_env, arg);
4743
            rn = "TCStatus";
4744
            break;
4745
        case 2:
4746
            check_insn(ctx, ASE_MT);
4747
            gen_helper_mtc0_tcbind(cpu_env, arg);
4748
            rn = "TCBind";
4749
            break;
4750
        case 3:
4751
            check_insn(ctx, ASE_MT);
4752
            gen_helper_mtc0_tcrestart(cpu_env, arg);
4753
            rn = "TCRestart";
4754
            break;
4755
        case 4:
4756
            check_insn(ctx, ASE_MT);
4757
            gen_helper_mtc0_tchalt(cpu_env, arg);
4758
            rn = "TCHalt";
4759
            break;
4760
        case 5:
4761
            check_insn(ctx, ASE_MT);
4762
            gen_helper_mtc0_tccontext(cpu_env, arg);
4763
            rn = "TCContext";
4764
            break;
4765
        case 6:
4766
            check_insn(ctx, ASE_MT);
4767
            gen_helper_mtc0_tcschedule(cpu_env, arg);
4768
            rn = "TCSchedule";
4769
            break;
4770
        case 7:
4771
            check_insn(ctx, ASE_MT);
4772
            gen_helper_mtc0_tcschefback(cpu_env, arg);
4773
            rn = "TCScheFBack";
4774
            break;
4775
        default:
4776
            goto die;
4777
        }
4778
        break;
4779
    case 3:
4780
        switch (sel) {
4781
        case 0:
4782
            gen_helper_mtc0_entrylo1(cpu_env, arg);
4783
            rn = "EntryLo1";
4784
            break;
4785
        default:
4786
            goto die;
4787
        }
4788
        break;
4789
    case 4:
4790
        switch (sel) {
4791
        case 0:
4792
            gen_helper_mtc0_context(cpu_env, arg);
4793
            rn = "Context";
4794
            break;
4795
        case 1:
4796
//            gen_helper_mtc0_contextconfig(cpu_env, arg); /* SmartMIPS ASE */
4797
            rn = "ContextConfig";
4798
//            break;
4799
        default:
4800
            goto die;
4801
        }
4802
        break;
4803
    case 5:
4804
        switch (sel) {
4805
        case 0:
4806
            gen_helper_mtc0_pagemask(cpu_env, arg);
4807
            rn = "PageMask";
4808
            break;
4809
        case 1:
4810
            check_insn(ctx, ISA_MIPS32R2);
4811
            gen_helper_mtc0_pagegrain(cpu_env, arg);
4812
            rn = "PageGrain";
4813
            break;
4814
        default:
4815
            goto die;
4816
        }
4817
        break;
4818
    case 6:
4819
        switch (sel) {
4820
        case 0:
4821
            gen_helper_mtc0_wired(cpu_env, arg);
4822
            rn = "Wired";
4823
            break;
4824
        case 1:
4825
            check_insn(ctx, ISA_MIPS32R2);
4826
            gen_helper_mtc0_srsconf0(cpu_env, arg);
4827
            rn = "SRSConf0";
4828
            break;
4829
        case 2:
4830
            check_insn(ctx, ISA_MIPS32R2);
4831
            gen_helper_mtc0_srsconf1(cpu_env, arg);
4832
            rn = "SRSConf1";
4833
            break;
4834
        case 3:
4835
            check_insn(ctx, ISA_MIPS32R2);
4836
            gen_helper_mtc0_srsconf2(cpu_env, arg);
4837
            rn = "SRSConf2";
4838
            break;
4839
        case 4:
4840
            check_insn(ctx, ISA_MIPS32R2);
4841
            gen_helper_mtc0_srsconf3(cpu_env, arg);
4842
            rn = "SRSConf3";
4843
            break;
4844
        case 5:
4845
            check_insn(ctx, ISA_MIPS32R2);
4846
            gen_helper_mtc0_srsconf4(cpu_env, arg);
4847
            rn = "SRSConf4";
4848
            break;
4849
        default:
4850
            goto die;
4851
        }
4852
        break;
4853
    case 7:
4854
        switch (sel) {
4855
        case 0:
4856
            check_insn(ctx, ISA_MIPS32R2);
4857
            gen_helper_mtc0_hwrena(cpu_env, arg);
4858
            rn = "HWREna";
4859
            break;
4860
        default:
4861
            goto die;
4862
        }
4863
        break;
4864
    case 8:
4865
        /* ignored */
4866
        rn = "BadVAddr";
4867
        break;
4868
    case 9:
4869
        switch (sel) {
4870
        case 0:
4871
            gen_helper_mtc0_count(cpu_env, arg);
4872
            rn = "Count";
4873
            break;
4874
        /* 6,7 are implementation dependent */
4875
        default:
4876
            goto die;
4877
        }
4878
        break;
4879
    case 10:
4880
        switch (sel) {
4881
        case 0:
4882
            gen_helper_mtc0_entryhi(cpu_env, arg);
4883
            rn = "EntryHi";
4884
            break;
4885
        default:
4886
            goto die;
4887
        }
4888
        break;
4889
    case 11:
4890
        switch (sel) {
4891
        case 0:
4892
            gen_helper_mtc0_compare(cpu_env, arg);
4893
            rn = "Compare";
4894
            break;
4895
        /* 6,7 are implementation dependent */
4896
        default:
4897
            goto die;
4898
        }
4899
        break;
4900
    case 12:
4901
        switch (sel) {
4902
        case 0:
4903
            save_cpu_state(ctx, 1);
4904
            gen_helper_mtc0_status(cpu_env, arg);
4905
            /* BS_STOP isn't good enough here, hflags may have changed. */
4906
            gen_save_pc(ctx->pc + 4);
4907
            ctx->bstate = BS_EXCP;
4908
            rn = "Status";
4909
            break;
4910
        case 1:
4911
            check_insn(ctx, ISA_MIPS32R2);
4912
            gen_helper_mtc0_intctl(cpu_env, arg);
4913
            /* Stop translation as we may have switched the execution mode */
4914
            ctx->bstate = BS_STOP;
4915
            rn = "IntCtl";
4916
            break;
4917
        case 2:
4918
            check_insn(ctx, ISA_MIPS32R2);
4919
            gen_helper_mtc0_srsctl(cpu_env, arg);
4920
            /* Stop translation as we may have switched the execution mode */
4921
            ctx->bstate = BS_STOP;
4922
            rn = "SRSCtl";
4923
            break;
4924
        case 3:
4925
            check_insn(ctx, ISA_MIPS32R2);
4926
            gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
4927
            /* Stop translation as we may have switched the execution mode */
4928
            ctx->bstate = BS_STOP;
4929
            rn = "SRSMap";
4930
            break;
4931
        default:
4932
            goto die;
4933
        }
4934
        break;
4935
    case 13:
4936
        switch (sel) {
4937
        case 0:
4938
            save_cpu_state(ctx, 1);
4939
            gen_helper_mtc0_cause(cpu_env, arg);
4940
            rn = "Cause";
4941
            break;
4942
        default:
4943
            goto die;
4944
        }
4945
        break;
4946
    case 14:
4947
        switch (sel) {
4948
        case 0:
4949
            gen_mtc0_store64(arg, offsetof(CPUMIPSState, CP0_EPC));
4950
            rn = "EPC";
4951
            break;
4952
        default:
4953
            goto die;
4954
        }
4955
        break;
4956
    case 15:
4957
        switch (sel) {
4958
        case 0:
4959
            /* ignored */
4960
            rn = "PRid";
4961
            break;
4962
        case 1:
4963
            check_insn(ctx, ISA_MIPS32R2);
4964
            gen_helper_mtc0_ebase(cpu_env, arg);
4965
            rn = "EBase";
4966
            break;
4967
        default:
4968
            goto die;
4969
        }
4970
        break;
4971
    case 16:
4972
        switch (sel) {
4973
        case 0:
4974
            gen_helper_mtc0_config0(cpu_env, arg);
4975
            rn = "Config";
4976
            /* Stop translation as we may have switched the execution mode */
4977
            ctx->bstate = BS_STOP;
4978
            break;
4979
        case 1:
4980
            /* ignored, read only */
4981
            rn = "Config1";
4982
            break;
4983
        case 2:
4984
            gen_helper_mtc0_config2(cpu_env, arg);
4985
            rn = "Config2";
4986
            /* Stop translation as we may have switched the execution mode */
4987
            ctx->bstate = BS_STOP;
4988
            break;
4989
        case 3:
4990
            /* ignored, read only */
4991
            rn = "Config3";
4992
            break;
4993
        /* 4,5 are reserved */
4994
        /* 6,7 are implementation dependent */
4995
        case 6:
4996
            /* ignored */
4997
            rn = "Config6";
4998
            break;
4999
        case 7:
5000
            /* ignored */
5001
            rn = "Config7";
5002
            break;
5003
        default:
5004
            rn = "Invalid config selector";
5005
            goto die;
5006
        }
5007
        break;
5008
    case 17:
5009
        switch (sel) {
5010
        case 0:
5011
            gen_helper_mtc0_lladdr(cpu_env, arg);
5012
            rn = "LLAddr";
5013
            break;
5014
        default:
5015
            goto die;
5016
        }
5017
        break;
5018
    case 18:
5019
        switch (sel) {
5020
        case 0 ... 7:
5021
            gen_helper_0e1i(mtc0_watchlo, arg, sel);
5022
            rn = "WatchLo";
5023
            break;
5024
        default:
5025
            goto die;
5026
        }
5027
        break;
5028
    case 19:
5029
        switch (sel) {
5030
        case 0 ... 7:
5031
            gen_helper_0e1i(mtc0_watchhi, arg, sel);
5032
            rn = "WatchHi";
5033
            break;
5034
        default:
5035
            goto die;
5036
        }
5037
        break;
5038
    case 20:
5039
        switch (sel) {
5040
        case 0:
5041
#if defined(TARGET_MIPS64)
5042
            check_insn(ctx, ISA_MIPS3);
5043
            gen_helper_mtc0_xcontext(cpu_env, arg);
5044
            rn = "XContext";
5045
            break;
5046
#endif
5047
        default:
5048
            goto die;
5049
        }
5050
        break;
5051
    case 21:
5052
       /* Officially reserved, but sel 0 is used for R1x000 framemask */
5053
        switch (sel) {
5054
        case 0:
5055
            gen_helper_mtc0_framemask(cpu_env, arg);
5056
            rn = "Framemask";
5057
            break;
5058
        default:
5059
            goto die;
5060
        }
5061
        break;
5062
    case 22:
5063
        /* ignored */
5064
        rn = "Diagnostic"; /* implementation dependent */
5065
        break;
5066
    case 23:
5067
        switch (sel) {
5068
        case 0:
5069
            gen_helper_mtc0_debug(cpu_env, arg); /* EJTAG support */
5070
            /* BS_STOP isn't good enough here, hflags may have changed. */
5071
            gen_save_pc(ctx->pc + 4);
5072
            ctx->bstate = BS_EXCP;
5073
            rn = "Debug";
5074
            break;
5075
        case 1:
5076
//            gen_helper_mtc0_tracecontrol(cpu_env, arg); /* PDtrace support */
5077
            rn = "TraceControl";
5078
            /* Stop translation as we may have switched the execution mode */
5079
            ctx->bstate = BS_STOP;
5080
//            break;
5081
        case 2:
5082
//            gen_helper_mtc0_tracecontrol2(cpu_env, arg); /* PDtrace support */
5083
            rn = "TraceControl2";
5084
            /* Stop translation as we may have switched the execution mode */
5085
            ctx->bstate = BS_STOP;
5086
//            break;
5087
        case 3:
5088
            /* Stop translation as we may have switched the execution mode */
5089
            ctx->bstate = BS_STOP;
5090
//            gen_helper_mtc0_usertracedata(cpu_env, arg); /* PDtrace support */
5091
            rn = "UserTraceData";
5092
            /* Stop translation as we may have switched the execution mode */
5093
            ctx->bstate = BS_STOP;
5094
//            break;
5095
        case 4:
5096
//            gen_helper_mtc0_tracebpc(cpu_env, arg); /* PDtrace support */
5097
            /* Stop translation as we may have switched the execution mode */
5098
            ctx->bstate = BS_STOP;
5099
            rn = "TraceBPC";
5100
//            break;
5101
        default:
5102
            goto die;
5103
        }
5104
        break;
5105
    case 24:
5106
        switch (sel) {
5107
        case 0:
5108
            /* EJTAG support */
5109
            gen_mtc0_store64(arg, offsetof(CPUMIPSState, CP0_DEPC));
5110
            rn = "DEPC";
5111
            break;
5112
        default:
5113
            goto die;
5114
        }
5115
        break;
5116
    case 25:
5117
        switch (sel) {
5118
        case 0:
5119
            gen_helper_mtc0_performance0(cpu_env, arg);
5120
            rn = "Performance0";
5121
            break;
5122
        case 1:
5123
//            gen_helper_mtc0_performance1(arg);
5124
            rn = "Performance1";
5125
//            break;
5126
        case 2:
5127
//            gen_helper_mtc0_performance2(arg);
5128
            rn = "Performance2";
5129
//            break;
5130
        case 3:
5131
//            gen_helper_mtc0_performance3(arg);
5132
            rn = "Performance3";
5133
//            break;
5134
        case 4:
5135
//            gen_helper_mtc0_performance4(arg);
5136
            rn = "Performance4";
5137
//            break;
5138
        case 5:
5139
//            gen_helper_mtc0_performance5(arg);
5140
            rn = "Performance5";
5141
//            break;
5142
        case 6:
5143
//            gen_helper_mtc0_performance6(arg);
5144
            rn = "Performance6";
5145
//            break;
5146
        case 7:
5147
//            gen_helper_mtc0_performance7(arg);
5148
            rn = "Performance7";
5149
//            break;
5150
        default:
5151
            goto die;
5152
        }
5153
       break;
5154
    case 26:
5155
        /* ignored */
5156
        rn = "ECC";
5157
        break;
5158
    case 27:
5159
        switch (sel) {
5160
        case 0 ... 3:
5161
            /* ignored */
5162
            rn = "CacheErr";
5163
            break;
5164
        default:
5165
            goto die;
5166
        }
5167
       break;
5168
    case 28:
5169
        switch (sel) {
5170
        case 0:
5171
        case 2:
5172
        case 4:
5173
        case 6:
5174
            gen_helper_mtc0_taglo(cpu_env, arg);
5175
            rn = "TagLo";
5176
            break;
5177
        case 1:
5178
        case 3:
5179
        case 5:
5180
        case 7:
5181
            gen_helper_mtc0_datalo(cpu_env, arg);
5182
            rn = "DataLo";
5183
            break;
5184
        default:
5185
            goto die;
5186
        }
5187
        break;
5188
    case 29:
5189
        switch (sel) {
5190
        case 0:
5191
        case 2:
5192
        case 4:
5193
        case 6:
5194
            gen_helper_mtc0_taghi(cpu_env, arg);
5195
            rn = "TagHi";
5196
            break;
5197
        case 1:
5198
        case 3:
5199
        case 5:
5200
        case 7:
5201
            gen_helper_mtc0_datahi(cpu_env, arg);
5202
            rn = "DataHi";
5203
            break;
5204
        default:
5205
            rn = "invalid sel";
5206
            goto die;
5207
        }
5208
       break;
5209
    case 30:
5210
        switch (sel) {
5211
        case 0:
5212
            gen_mtc0_store64(arg, offsetof(CPUMIPSState, CP0_ErrorEPC));
5213
            rn = "ErrorEPC";
5214
            break;
5215
        default:
5216
            goto die;
5217
        }
5218
        break;
5219
    case 31:
5220
        switch (sel) {
5221
        case 0:
5222
            /* EJTAG support */
5223
            gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
5224
            rn = "DESAVE";
5225
            break;
5226
        default:
5227
            goto die;
5228
        }
5229
        /* Stop translation as we may have switched the execution mode */
5230
        ctx->bstate = BS_STOP;
5231
        break;
5232
    default:
5233
       goto die;
5234
    }
5235
    (void)rn; /* avoid a compiler warning */
5236
    LOG_DISAS("mtc0 %s (reg %d sel %d)\n", rn, reg, sel);
5237
    /* For simplicity assume that all writes can cause interrupts.  */
5238
    if (use_icount) {
5239
        gen_io_end();
5240
        ctx->bstate = BS_STOP;
5241
    }
5242
    return;
5243

    
5244
die:
5245
    LOG_DISAS("mtc0 %s (reg %d sel %d)\n", rn, reg, sel);
5246
    generate_exception(ctx, EXCP_RI);
5247
}
5248

    
5249
#if defined(TARGET_MIPS64)
5250
static void gen_dmfc0(DisasContext *ctx, TCGv arg, int reg, int sel)
5251
{
5252
    const char *rn = "invalid";
5253

    
5254
    if (sel != 0)
5255
        check_insn(ctx, ISA_MIPS64);
5256

    
5257
    switch (reg) {
5258
    case 0:
5259
        switch (sel) {
5260
        case 0:
5261
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Index));
5262
            rn = "Index";
5263
            break;
5264
        case 1:
5265
            check_insn(ctx, ASE_MT);
5266
            gen_helper_mfc0_mvpcontrol(arg, cpu_env);
5267
            rn = "MVPControl";
5268
            break;
5269
        case 2:
5270
            check_insn(ctx, ASE_MT);
5271
            gen_helper_mfc0_mvpconf0(arg, cpu_env);
5272
            rn = "MVPConf0";
5273
            break;
5274
        case 3:
5275
            check_insn(ctx, ASE_MT);
5276
            gen_helper_mfc0_mvpconf1(arg, cpu_env);
5277
            rn = "MVPConf1";
5278
            break;
5279
        default:
5280
            goto die;
5281
        }
5282
        break;
5283
    case 1:
5284
        switch (sel) {
5285
        case 0:
5286
            gen_helper_mfc0_random(arg, cpu_env);
5287
            rn = "Random";
5288
            break;
5289
        case 1:
5290
            check_insn(ctx, ASE_MT);
5291
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEControl));
5292
            rn = "VPEControl";
5293
            break;
5294
        case 2:
5295
            check_insn(ctx, ASE_MT);
5296
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf0));
5297
            rn = "VPEConf0";
5298
            break;
5299
        case 3:
5300
            check_insn(ctx, ASE_MT);
5301
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEConf1));
5302
            rn = "VPEConf1";
5303
            break;
5304
        case 4:
5305
            check_insn(ctx, ASE_MT);
5306
            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_YQMask));
5307
            rn = "YQMask";
5308
            break;
5309
        case 5:
5310
            check_insn(ctx, ASE_MT);
5311
            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPESchedule));
5312
            rn = "VPESchedule";
5313
            break;
5314
        case 6:
5315
            check_insn(ctx, ASE_MT);
5316
            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPEScheFBack));
5317
            rn = "VPEScheFBack";
5318
            break;
5319
        case 7:
5320
            check_insn(ctx, ASE_MT);
5321
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_VPEOpt));
5322
            rn = "VPEOpt";
5323
            break;
5324
        default:
5325
            goto die;
5326
        }
5327
        break;
5328
    case 2:
5329
        switch (sel) {
5330
        case 0:
5331
            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryLo0));
5332
            rn = "EntryLo0";
5333
            break;
5334
        case 1:
5335
            check_insn(ctx, ASE_MT);
5336
            gen_helper_mfc0_tcstatus(arg, cpu_env);
5337
            rn = "TCStatus";
5338
            break;
5339
        case 2:
5340
            check_insn(ctx, ASE_MT);
5341
            gen_helper_mfc0_tcbind(arg, cpu_env);
5342
            rn = "TCBind";
5343
            break;
5344
        case 3:
5345
            check_insn(ctx, ASE_MT);
5346
            gen_helper_dmfc0_tcrestart(arg, cpu_env);
5347
            rn = "TCRestart";
5348
            break;
5349
        case 4:
5350
            check_insn(ctx, ASE_MT);
5351
            gen_helper_dmfc0_tchalt(arg, cpu_env);
5352
            rn = "TCHalt";
5353
            break;
5354
        case 5:
5355
            check_insn(ctx, ASE_MT);
5356
            gen_helper_dmfc0_tccontext(arg, cpu_env);
5357
            rn = "TCContext";
5358
            break;
5359
        case 6:
5360
            check_insn(ctx, ASE_MT);
5361
            gen_helper_dmfc0_tcschedule(arg, cpu_env);
5362
            rn = "TCSchedule";
5363
            break;
5364
        case 7:
5365
            check_insn(ctx, ASE_MT);
5366
            gen_helper_dmfc0_tcschefback(arg, cpu_env);
5367
            rn = "TCScheFBack";
5368
            break;
5369
        default:
5370
            goto die;
5371
        }
5372
        break;
5373
    case 3:
5374
        switch (sel) {
5375
        case 0:
5376
            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryLo1));
5377
            rn = "EntryLo1";
5378
            break;
5379
        default:
5380
            goto die;
5381
        }
5382
        break;
5383
    case 4:
5384
        switch (sel) {
5385
        case 0:
5386
            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_Context));
5387
            rn = "Context";
5388
            break;
5389
        case 1:
5390
//            gen_helper_dmfc0_contextconfig(arg); /* SmartMIPS ASE */
5391
            rn = "ContextConfig";
5392
//            break;
5393
        default:
5394
            goto die;
5395
        }
5396
        break;
5397
    case 5:
5398
        switch (sel) {
5399
        case 0:
5400
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageMask));
5401
            rn = "PageMask";
5402
            break;
5403
        case 1:
5404
            check_insn(ctx, ISA_MIPS32R2);
5405
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PageGrain));
5406
            rn = "PageGrain";
5407
            break;
5408
        default:
5409
            goto die;
5410
        }
5411
        break;
5412
    case 6:
5413
        switch (sel) {
5414
        case 0:
5415
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Wired));
5416
            rn = "Wired";
5417
            break;
5418
        case 1:
5419
            check_insn(ctx, ISA_MIPS32R2);
5420
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf0));
5421
            rn = "SRSConf0";
5422
            break;
5423
        case 2:
5424
            check_insn(ctx, ISA_MIPS32R2);
5425
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf1));
5426
            rn = "SRSConf1";
5427
            break;
5428
        case 3:
5429
            check_insn(ctx, ISA_MIPS32R2);
5430
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf2));
5431
            rn = "SRSConf2";
5432
            break;
5433
        case 4:
5434
            check_insn(ctx, ISA_MIPS32R2);
5435
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf3));
5436
            rn = "SRSConf3";
5437
            break;
5438
        case 5:
5439
            check_insn(ctx, ISA_MIPS32R2);
5440
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSConf4));
5441
            rn = "SRSConf4";
5442
            break;
5443
        default:
5444
            goto die;
5445
        }
5446
        break;
5447
    case 7:
5448
        switch (sel) {
5449
        case 0:
5450
            check_insn(ctx, ISA_MIPS32R2);
5451
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_HWREna));
5452
            rn = "HWREna";
5453
            break;
5454
        default:
5455
            goto die;
5456
        }
5457
        break;
5458
    case 8:
5459
        switch (sel) {
5460
        case 0:
5461
            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_BadVAddr));
5462
            rn = "BadVAddr";
5463
            break;
5464
        default:
5465
            goto die;
5466
        }
5467
        break;
5468
    case 9:
5469
        switch (sel) {
5470
        case 0:
5471
            /* Mark as an IO operation because we read the time.  */
5472
            if (use_icount)
5473
                gen_io_start();
5474
            gen_helper_mfc0_count(arg, cpu_env);
5475
            if (use_icount) {
5476
                gen_io_end();
5477
            }
5478
            /* Break the TB to be able to take timer interrupts immediately
5479
               after reading count.  */
5480
            ctx->bstate = BS_STOP;
5481
            rn = "Count";
5482
            break;
5483
        /* 6,7 are implementation dependent */
5484
        default:
5485
            goto die;
5486
        }
5487
        break;
5488
    case 10:
5489
        switch (sel) {
5490
        case 0:
5491
            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EntryHi));
5492
            rn = "EntryHi";
5493
            break;
5494
        default:
5495
            goto die;
5496
        }
5497
        break;
5498
    case 11:
5499
        switch (sel) {
5500
        case 0:
5501
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Compare));
5502
            rn = "Compare";
5503
            break;
5504
        /* 6,7 are implementation dependent */
5505
        default:
5506
            goto die;
5507
        }
5508
        break;
5509
    case 12:
5510
        switch (sel) {
5511
        case 0:
5512
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Status));
5513
            rn = "Status";
5514
            break;
5515
        case 1:
5516
            check_insn(ctx, ISA_MIPS32R2);
5517
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_IntCtl));
5518
            rn = "IntCtl";
5519
            break;
5520
        case 2:
5521
            check_insn(ctx, ISA_MIPS32R2);
5522
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSCtl));
5523
            rn = "SRSCtl";
5524
            break;
5525
        case 3:
5526
            check_insn(ctx, ISA_MIPS32R2);
5527
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
5528
            rn = "SRSMap";
5529
            break;
5530
        default:
5531
            goto die;
5532
        }
5533
        break;
5534
    case 13:
5535
        switch (sel) {
5536
        case 0:
5537
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Cause));
5538
            rn = "Cause";
5539
            break;
5540
        default:
5541
            goto die;
5542
        }
5543
        break;
5544
    case 14:
5545
        switch (sel) {
5546
        case 0:
5547
            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
5548
            rn = "EPC";
5549
            break;
5550
        default:
5551
            goto die;
5552
        }
5553
        break;
5554
    case 15:
5555
        switch (sel) {
5556
        case 0:
5557
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_PRid));
5558
            rn = "PRid";
5559
            break;
5560
        case 1:
5561
            check_insn(ctx, ISA_MIPS32R2);
5562
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_EBase));
5563
            rn = "EBase";
5564
            break;
5565
        default:
5566
            goto die;
5567
        }
5568
        break;
5569
    case 16:
5570
        switch (sel) {
5571
        case 0:
5572
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config0));
5573
            rn = "Config";
5574
            break;
5575
        case 1:
5576
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config1));
5577
            rn = "Config1";
5578
            break;
5579
        case 2:
5580
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config2));
5581
            rn = "Config2";
5582
            break;
5583
        case 3:
5584
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config3));
5585
            rn = "Config3";
5586
            break;
5587
       /* 6,7 are implementation dependent */
5588
        case 6:
5589
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config6));
5590
            rn = "Config6";
5591
            break;
5592
        case 7:
5593
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Config7));
5594
            rn = "Config7";
5595
            break;
5596
        default:
5597
            goto die;
5598
        }
5599
        break;
5600
    case 17:
5601
        switch (sel) {
5602
        case 0:
5603
            gen_helper_dmfc0_lladdr(arg, cpu_env);
5604
            rn = "LLAddr";
5605
            break;
5606
        default:
5607
            goto die;
5608
        }
5609
        break;
5610
    case 18:
5611
        switch (sel) {
5612
        case 0 ... 7:
5613
            gen_helper_1e0i(dmfc0_watchlo, arg, sel);
5614
            rn = "WatchLo";
5615
            break;
5616
        default:
5617
            goto die;
5618
        }
5619
        break;
5620
    case 19:
5621
        switch (sel) {
5622
        case 0 ... 7:
5623
            gen_helper_1e0i(mfc0_watchhi, arg, sel);
5624
            rn = "WatchHi";
5625
            break;
5626
        default:
5627
            goto die;
5628
        }
5629
        break;
5630
    case 20:
5631
        switch (sel) {
5632
        case 0:
5633
            check_insn(ctx, ISA_MIPS3);
5634
            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_XContext));
5635
            rn = "XContext";
5636
            break;
5637
        default:
5638
            goto die;
5639
        }
5640
        break;
5641
    case 21:
5642
       /* Officially reserved, but sel 0 is used for R1x000 framemask */
5643
        switch (sel) {
5644
        case 0:
5645
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Framemask));
5646
            rn = "Framemask";
5647
            break;
5648
        default:
5649
            goto die;
5650
        }
5651
        break;
5652
    case 22:
5653
        tcg_gen_movi_tl(arg, 0); /* unimplemented */
5654
        rn = "'Diagnostic"; /* implementation dependent */
5655
        break;
5656
    case 23:
5657
        switch (sel) {
5658
        case 0:
5659
            gen_helper_mfc0_debug(arg, cpu_env); /* EJTAG support */
5660
            rn = "Debug";
5661
            break;
5662
        case 1:
5663
//            gen_helper_dmfc0_tracecontrol(arg, cpu_env); /* PDtrace support */
5664
            rn = "TraceControl";
5665
//            break;
5666
        case 2:
5667
//            gen_helper_dmfc0_tracecontrol2(arg, cpu_env); /* PDtrace support */
5668
            rn = "TraceControl2";
5669
//            break;
5670
        case 3:
5671
//            gen_helper_dmfc0_usertracedata(arg, cpu_env); /* PDtrace support */
5672
            rn = "UserTraceData";
5673
//            break;
5674
        case 4:
5675
//            gen_helper_dmfc0_tracebpc(arg, cpu_env); /* PDtrace support */
5676
            rn = "TraceBPC";
5677
//            break;
5678
        default:
5679
            goto die;
5680
        }
5681
        break;
5682
    case 24:
5683
        switch (sel) {
5684
        case 0:
5685
            /* EJTAG support */
5686
            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
5687
            rn = "DEPC";
5688
            break;
5689
        default:
5690
            goto die;
5691
        }
5692
        break;
5693
    case 25:
5694
        switch (sel) {
5695
        case 0:
5696
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_Performance0));
5697
            rn = "Performance0";
5698
            break;
5699
        case 1:
5700
//            gen_helper_dmfc0_performance1(arg);
5701
            rn = "Performance1";
5702
//            break;
5703
        case 2:
5704
//            gen_helper_dmfc0_performance2(arg);
5705
            rn = "Performance2";
5706
//            break;
5707
        case 3:
5708
//            gen_helper_dmfc0_performance3(arg);
5709
            rn = "Performance3";
5710
//            break;
5711
        case 4:
5712
//            gen_helper_dmfc0_performance4(arg);
5713
            rn = "Performance4";
5714
//            break;
5715
        case 5:
5716
//            gen_helper_dmfc0_performance5(arg);
5717
            rn = "Performance5";
5718
//            break;
5719
        case 6:
5720
//            gen_helper_dmfc0_performance6(arg);
5721
            rn = "Performance6";
5722
//            break;
5723
        case 7:
5724
//            gen_helper_dmfc0_performance7(arg);
5725
            rn = "Performance7";
5726
//            break;
5727
        default:
5728
            goto die;
5729
        }
5730
        break;
5731
    case 26:
5732
        tcg_gen_movi_tl(arg, 0); /* unimplemented */
5733
        rn = "ECC";
5734
        break;
5735
    case 27:
5736
        switch (sel) {
5737
        /* ignored */
5738
        case 0 ... 3:
5739
            tcg_gen_movi_tl(arg, 0); /* unimplemented */
5740
            rn = "CacheErr";
5741
            break;
5742
        default:
5743
            goto die;
5744
        }
5745
        break;
5746
    case 28:
5747
        switch (sel) {
5748
        case 0:
5749
        case 2:
5750
        case 4:
5751
        case 6:
5752
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagLo));
5753
            rn = "TagLo";
5754
            break;
5755
        case 1:
5756
        case 3:
5757
        case 5:
5758
        case 7:
5759
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataLo));
5760
            rn = "DataLo";
5761
            break;
5762
        default:
5763
            goto die;
5764
        }
5765
        break;
5766
    case 29:
5767
        switch (sel) {
5768
        case 0:
5769
        case 2:
5770
        case 4:
5771
        case 6:
5772
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_TagHi));
5773
            rn = "TagHi";
5774
            break;
5775
        case 1:
5776
        case 3:
5777
        case 5:
5778
        case 7:
5779
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DataHi));
5780
            rn = "DataHi";
5781
            break;
5782
        default:
5783
            goto die;
5784
        }
5785
        break;
5786
    case 30:
5787
        switch (sel) {
5788
        case 0:
5789
            tcg_gen_ld_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
5790
            rn = "ErrorEPC";
5791
            break;
5792
        default:
5793
            goto die;
5794
        }
5795
        break;
5796
    case 31:
5797
        switch (sel) {
5798
        case 0:
5799
            /* EJTAG support */
5800
            gen_mfc0_load32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
5801
            rn = "DESAVE";
5802
            break;
5803
        default:
5804
            goto die;
5805
        }
5806
        break;
5807
    default:
5808
        goto die;
5809
    }
5810
    (void)rn; /* avoid a compiler warning */
5811
    LOG_DISAS("dmfc0 %s (reg %d sel %d)\n", rn, reg, sel);
5812
    return;
5813

    
5814
die:
5815
    LOG_DISAS("dmfc0 %s (reg %d sel %d)\n", rn, reg, sel);
5816
    generate_exception(ctx, EXCP_RI);
5817
}
5818

    
5819
static void gen_dmtc0(DisasContext *ctx, TCGv arg, int reg, int sel)
5820
{
5821
    const char *rn = "invalid";
5822

    
5823
    if (sel != 0)
5824
        check_insn(ctx, ISA_MIPS64);
5825

    
5826
    if (use_icount)
5827
        gen_io_start();
5828

    
5829
    switch (reg) {
5830
    case 0:
5831
        switch (sel) {
5832
        case 0:
5833
            gen_helper_mtc0_index(cpu_env, arg);
5834
            rn = "Index";
5835
            break;
5836
        case 1:
5837
            check_insn(ctx, ASE_MT);
5838
            gen_helper_mtc0_mvpcontrol(cpu_env, arg);
5839
            rn = "MVPControl";
5840
            break;
5841
        case 2:
5842
            check_insn(ctx, ASE_MT);
5843
            /* ignored */
5844
            rn = "MVPConf0";
5845
            break;
5846
        case 3:
5847
            check_insn(ctx, ASE_MT);
5848
            /* ignored */
5849
            rn = "MVPConf1";
5850
            break;
5851
        default:
5852
            goto die;
5853
        }
5854
        break;
5855
    case 1:
5856
        switch (sel) {
5857
        case 0:
5858
            /* ignored */
5859
            rn = "Random";
5860
            break;
5861
        case 1:
5862
            check_insn(ctx, ASE_MT);
5863
            gen_helper_mtc0_vpecontrol(cpu_env, arg);
5864
            rn = "VPEControl";
5865
            break;
5866
        case 2:
5867
            check_insn(ctx, ASE_MT);
5868
            gen_helper_mtc0_vpeconf0(cpu_env, arg);
5869
            rn = "VPEConf0";
5870
            break;
5871
        case 3:
5872
            check_insn(ctx, ASE_MT);
5873
            gen_helper_mtc0_vpeconf1(cpu_env, arg);
5874
            rn = "VPEConf1";
5875
            break;
5876
        case 4:
5877
            check_insn(ctx, ASE_MT);
5878
            gen_helper_mtc0_yqmask(cpu_env, arg);
5879
            rn = "YQMask";
5880
            break;
5881
        case 5:
5882
            check_insn(ctx, ASE_MT);
5883
            tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPESchedule));
5884
            rn = "VPESchedule";
5885
            break;
5886
        case 6:
5887
            check_insn(ctx, ASE_MT);
5888
            tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_VPEScheFBack));
5889
            rn = "VPEScheFBack";
5890
            break;
5891
        case 7:
5892
            check_insn(ctx, ASE_MT);
5893
            gen_helper_mtc0_vpeopt(cpu_env, arg);
5894
            rn = "VPEOpt";
5895
            break;
5896
        default:
5897
            goto die;
5898
        }
5899
        break;
5900
    case 2:
5901
        switch (sel) {
5902
        case 0:
5903
            gen_helper_mtc0_entrylo0(cpu_env, arg);
5904
            rn = "EntryLo0";
5905
            break;
5906
        case 1:
5907
            check_insn(ctx, ASE_MT);
5908
            gen_helper_mtc0_tcstatus(cpu_env, arg);
5909
            rn = "TCStatus";
5910
            break;
5911
        case 2:
5912
            check_insn(ctx, ASE_MT);
5913
            gen_helper_mtc0_tcbind(cpu_env, arg);
5914
            rn = "TCBind";
5915
            break;
5916
        case 3:
5917
            check_insn(ctx, ASE_MT);
5918
            gen_helper_mtc0_tcrestart(cpu_env, arg);
5919
            rn = "TCRestart";
5920
            break;
5921
        case 4:
5922
            check_insn(ctx, ASE_MT);
5923
            gen_helper_mtc0_tchalt(cpu_env, arg);
5924
            rn = "TCHalt";
5925
            break;
5926
        case 5:
5927
            check_insn(ctx, ASE_MT);
5928
            gen_helper_mtc0_tccontext(cpu_env, arg);
5929
            rn = "TCContext";
5930
            break;
5931
        case 6:
5932
            check_insn(ctx, ASE_MT);
5933
            gen_helper_mtc0_tcschedule(cpu_env, arg);
5934
            rn = "TCSchedule";
5935
            break;
5936
        case 7:
5937
            check_insn(ctx, ASE_MT);
5938
            gen_helper_mtc0_tcschefback(cpu_env, arg);
5939
            rn = "TCScheFBack";
5940
            break;
5941
        default:
5942
            goto die;
5943
        }
5944
        break;
5945
    case 3:
5946
        switch (sel) {
5947
        case 0:
5948
            gen_helper_mtc0_entrylo1(cpu_env, arg);
5949
            rn = "EntryLo1";
5950
            break;
5951
        default:
5952
            goto die;
5953
        }
5954
        break;
5955
    case 4:
5956
        switch (sel) {
5957
        case 0:
5958
            gen_helper_mtc0_context(cpu_env, arg);
5959
            rn = "Context";
5960
            break;
5961
        case 1:
5962
//           gen_helper_mtc0_contextconfig(cpu_env, arg); /* SmartMIPS ASE */
5963
            rn = "ContextConfig";
5964
//           break;
5965
        default:
5966
            goto die;
5967
        }
5968
        break;
5969
    case 5:
5970
        switch (sel) {
5971
        case 0:
5972
            gen_helper_mtc0_pagemask(cpu_env, arg);
5973
            rn = "PageMask";
5974
            break;
5975
        case 1:
5976
            check_insn(ctx, ISA_MIPS32R2);
5977
            gen_helper_mtc0_pagegrain(cpu_env, arg);
5978
            rn = "PageGrain";
5979
            break;
5980
        default:
5981
            goto die;
5982
        }
5983
        break;
5984
    case 6:
5985
        switch (sel) {
5986
        case 0:
5987
            gen_helper_mtc0_wired(cpu_env, arg);
5988
            rn = "Wired";
5989
            break;
5990
        case 1:
5991
            check_insn(ctx, ISA_MIPS32R2);
5992
            gen_helper_mtc0_srsconf0(cpu_env, arg);
5993
            rn = "SRSConf0";
5994
            break;
5995
        case 2:
5996
            check_insn(ctx, ISA_MIPS32R2);
5997
            gen_helper_mtc0_srsconf1(cpu_env, arg);
5998
            rn = "SRSConf1";
5999
            break;
6000
        case 3:
6001
            check_insn(ctx, ISA_MIPS32R2);
6002
            gen_helper_mtc0_srsconf2(cpu_env, arg);
6003
            rn = "SRSConf2";
6004
            break;
6005
        case 4:
6006
            check_insn(ctx, ISA_MIPS32R2);
6007
            gen_helper_mtc0_srsconf3(cpu_env, arg);
6008
            rn = "SRSConf3";
6009
            break;
6010
        case 5:
6011
            check_insn(ctx, ISA_MIPS32R2);
6012
            gen_helper_mtc0_srsconf4(cpu_env, arg);
6013
            rn = "SRSConf4";
6014
            break;
6015
        default:
6016
            goto die;
6017
        }
6018
        break;
6019
    case 7:
6020
        switch (sel) {
6021
        case 0:
6022
            check_insn(ctx, ISA_MIPS32R2);
6023
            gen_helper_mtc0_hwrena(cpu_env, arg);
6024
            rn = "HWREna";
6025
            break;
6026
        default:
6027
            goto die;
6028
        }
6029
        break;
6030
    case 8:
6031
        /* ignored */
6032
        rn = "BadVAddr";
6033
        break;
6034
    case 9:
6035
        switch (sel) {
6036
        case 0:
6037
            gen_helper_mtc0_count(cpu_env, arg);
6038
            rn = "Count";
6039
            break;
6040
        /* 6,7 are implementation dependent */
6041
        default:
6042
            goto die;
6043
        }
6044
        /* Stop translation as we may have switched the execution mode */
6045
        ctx->bstate = BS_STOP;
6046
        break;
6047
    case 10:
6048
        switch (sel) {
6049
        case 0:
6050
            gen_helper_mtc0_entryhi(cpu_env, arg);
6051
            rn = "EntryHi";
6052
            break;
6053
        default:
6054
            goto die;
6055
        }
6056
        break;
6057
    case 11:
6058
        switch (sel) {
6059
        case 0:
6060
            gen_helper_mtc0_compare(cpu_env, arg);
6061
            rn = "Compare";
6062
            break;
6063
        /* 6,7 are implementation dependent */
6064
        default:
6065
            goto die;
6066
        }
6067
        /* Stop translation as we may have switched the execution mode */
6068
        ctx->bstate = BS_STOP;
6069
        break;
6070
    case 12:
6071
        switch (sel) {
6072
        case 0:
6073
            save_cpu_state(ctx, 1);
6074
            gen_helper_mtc0_status(cpu_env, arg);
6075
            /* BS_STOP isn't good enough here, hflags may have changed. */
6076
            gen_save_pc(ctx->pc + 4);
6077
            ctx->bstate = BS_EXCP;
6078
            rn = "Status";
6079
            break;
6080
        case 1:
6081
            check_insn(ctx, ISA_MIPS32R2);
6082
            gen_helper_mtc0_intctl(cpu_env, arg);
6083
            /* Stop translation as we may have switched the execution mode */
6084
            ctx->bstate = BS_STOP;
6085
            rn = "IntCtl";
6086
            break;
6087
        case 2:
6088
            check_insn(ctx, ISA_MIPS32R2);
6089
            gen_helper_mtc0_srsctl(cpu_env, arg);
6090
            /* Stop translation as we may have switched the execution mode */
6091
            ctx->bstate = BS_STOP;
6092
            rn = "SRSCtl";
6093
            break;
6094
        case 3:
6095
            check_insn(ctx, ISA_MIPS32R2);
6096
            gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_SRSMap));
6097
            /* Stop translation as we may have switched the execution mode */
6098
            ctx->bstate = BS_STOP;
6099
            rn = "SRSMap";
6100
            break;
6101
        default:
6102
            goto die;
6103
        }
6104
        break;
6105
    case 13:
6106
        switch (sel) {
6107
        case 0:
6108
            save_cpu_state(ctx, 1);
6109
            /* Mark as an IO operation because we may trigger a software
6110
               interrupt.  */
6111
            if (use_icount) {
6112
                gen_io_start();
6113
            }
6114
            gen_helper_mtc0_cause(cpu_env, arg);
6115
            if (use_icount) {
6116
                gen_io_end();
6117
            }
6118
            /* Stop translation as we may have triggered an intetrupt */
6119
            ctx->bstate = BS_STOP;
6120
            rn = "Cause";
6121
            break;
6122
        default:
6123
            goto die;
6124
        }
6125
        break;
6126
    case 14:
6127
        switch (sel) {
6128
        case 0:
6129
            tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_EPC));
6130
            rn = "EPC";
6131
            break;
6132
        default:
6133
            goto die;
6134
        }
6135
        break;
6136
    case 15:
6137
        switch (sel) {
6138
        case 0:
6139
            /* ignored */
6140
            rn = "PRid";
6141
            break;
6142
        case 1:
6143
            check_insn(ctx, ISA_MIPS32R2);
6144
            gen_helper_mtc0_ebase(cpu_env, arg);
6145
            rn = "EBase";
6146
            break;
6147
        default:
6148
            goto die;
6149
        }
6150
        break;
6151
    case 16:
6152
        switch (sel) {
6153
        case 0:
6154
            gen_helper_mtc0_config0(cpu_env, arg);
6155
            rn = "Config";
6156
            /* Stop translation as we may have switched the execution mode */
6157
            ctx->bstate = BS_STOP;
6158
            break;
6159
        case 1:
6160
            /* ignored, read only */
6161
            rn = "Config1";
6162
            break;
6163
        case 2:
6164
            gen_helper_mtc0_config2(cpu_env, arg);
6165
            rn = "Config2";
6166
            /* Stop translation as we may have switched the execution mode */
6167
            ctx->bstate = BS_STOP;
6168
            break;
6169
        case 3:
6170
            /* ignored */
6171
            rn = "Config3";
6172
            break;
6173
        /* 6,7 are implementation dependent */
6174
        default:
6175
            rn = "Invalid config selector";
6176
            goto die;
6177
        }
6178
        break;
6179
    case 17:
6180
        switch (sel) {
6181
        case 0:
6182
            gen_helper_mtc0_lladdr(cpu_env, arg);
6183
            rn = "LLAddr";
6184
            break;
6185
        default:
6186
            goto die;
6187
        }
6188
        break;
6189
    case 18:
6190
        switch (sel) {
6191
        case 0 ... 7:
6192
            gen_helper_0e1i(mtc0_watchlo, arg, sel);
6193
            rn = "WatchLo";
6194
            break;
6195
        default:
6196
            goto die;
6197
        }
6198
        break;
6199
    case 19:
6200
        switch (sel) {
6201
        case 0 ... 7:
6202
            gen_helper_0e1i(mtc0_watchhi, arg, sel);
6203
            rn = "WatchHi";
6204
            break;
6205
        default:
6206
            goto die;
6207
        }
6208
        break;
6209
    case 20:
6210
        switch (sel) {
6211
        case 0:
6212
            check_insn(ctx, ISA_MIPS3);
6213
            gen_helper_mtc0_xcontext(cpu_env, arg);
6214
            rn = "XContext";
6215
            break;
6216
        default:
6217
            goto die;
6218
        }
6219
        break;
6220
    case 21:
6221
       /* Officially reserved, but sel 0 is used for R1x000 framemask */
6222
        switch (sel) {
6223
        case 0:
6224
            gen_helper_mtc0_framemask(cpu_env, arg);
6225
            rn = "Framemask";
6226
            break;
6227
        default:
6228
            goto die;
6229
        }
6230
        break;
6231
    case 22:
6232
        /* ignored */
6233
        rn = "Diagnostic"; /* implementation dependent */
6234
        break;
6235
    case 23:
6236
        switch (sel) {
6237
        case 0:
6238
            gen_helper_mtc0_debug(cpu_env, arg); /* EJTAG support */
6239
            /* BS_STOP isn't good enough here, hflags may have changed. */
6240
            gen_save_pc(ctx->pc + 4);
6241
            ctx->bstate = BS_EXCP;
6242
            rn = "Debug";
6243
            break;
6244
        case 1:
6245
//            gen_helper_mtc0_tracecontrol(cpu_env, arg); /* PDtrace support */
6246
            /* Stop translation as we may have switched the execution mode */
6247
            ctx->bstate = BS_STOP;
6248
            rn = "TraceControl";
6249
//            break;
6250
        case 2:
6251
//            gen_helper_mtc0_tracecontrol2(cpu_env, arg); /* PDtrace support */
6252
            /* Stop translation as we may have switched the execution mode */
6253
            ctx->bstate = BS_STOP;
6254
            rn = "TraceControl2";
6255
//            break;
6256
        case 3:
6257
//            gen_helper_mtc0_usertracedata(cpu_env, arg); /* PDtrace support */
6258
            /* Stop translation as we may have switched the execution mode */
6259
            ctx->bstate = BS_STOP;
6260
            rn = "UserTraceData";
6261
//            break;
6262
        case 4:
6263
//            gen_helper_mtc0_tracebpc(cpu_env, arg); /* PDtrace support */
6264
            /* Stop translation as we may have switched the execution mode */
6265
            ctx->bstate = BS_STOP;
6266
            rn = "TraceBPC";
6267
//            break;
6268
        default:
6269
            goto die;
6270
        }
6271
        break;
6272
    case 24:
6273
        switch (sel) {
6274
        case 0:
6275
            /* EJTAG support */
6276
            tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_DEPC));
6277
            rn = "DEPC";
6278
            break;
6279
        default:
6280
            goto die;
6281
        }
6282
        break;
6283
    case 25:
6284
        switch (sel) {
6285
        case 0:
6286
            gen_helper_mtc0_performance0(cpu_env, arg);
6287
            rn = "Performance0";
6288
            break;
6289
        case 1:
6290
//            gen_helper_mtc0_performance1(cpu_env, arg);
6291
            rn = "Performance1";
6292
//            break;
6293
        case 2:
6294
//            gen_helper_mtc0_performance2(cpu_env, arg);
6295
            rn = "Performance2";
6296
//            break;
6297
        case 3:
6298
//            gen_helper_mtc0_performance3(cpu_env, arg);
6299
            rn = "Performance3";
6300
//            break;
6301
        case 4:
6302
//            gen_helper_mtc0_performance4(cpu_env, arg);
6303
            rn = "Performance4";
6304
//            break;
6305
        case 5:
6306
//            gen_helper_mtc0_performance5(cpu_env, arg);
6307
            rn = "Performance5";
6308
//            break;
6309
        case 6:
6310
//            gen_helper_mtc0_performance6(cpu_env, arg);
6311
            rn = "Performance6";
6312
//            break;
6313
        case 7:
6314
//            gen_helper_mtc0_performance7(cpu_env, arg);
6315
            rn = "Performance7";
6316
//            break;
6317
        default:
6318
            goto die;
6319
        }
6320
        break;
6321
    case 26:
6322
        /* ignored */
6323
        rn = "ECC";
6324
        break;
6325
    case 27:
6326
        switch (sel) {
6327
        case 0 ... 3:
6328
            /* ignored */
6329
            rn = "CacheErr";
6330
            break;
6331
        default:
6332
            goto die;
6333
        }
6334
        break;
6335
    case 28:
6336
        switch (sel) {
6337
        case 0:
6338
        case 2:
6339
        case 4:
6340
        case 6:
6341
            gen_helper_mtc0_taglo(cpu_env, arg);
6342
            rn = "TagLo";
6343
            break;
6344
        case 1:
6345
        case 3:
6346
        case 5:
6347
        case 7:
6348
            gen_helper_mtc0_datalo(cpu_env, arg);
6349
            rn = "DataLo";
6350
            break;
6351
        default:
6352
            goto die;
6353
        }
6354
        break;
6355
    case 29:
6356
        switch (sel) {
6357
        case 0:
6358
        case 2:
6359
        case 4:
6360
        case 6:
6361
            gen_helper_mtc0_taghi(cpu_env, arg);
6362
            rn = "TagHi";
6363
            break;
6364
        case 1:
6365
        case 3:
6366
        case 5:
6367
        case 7:
6368
            gen_helper_mtc0_datahi(cpu_env, arg);
6369
            rn = "DataHi";
6370
            break;
6371
        default:
6372
            rn = "invalid sel";
6373
            goto die;
6374
        }
6375
        break;
6376
    case 30:
6377
        switch (sel) {
6378
        case 0:
6379
            tcg_gen_st_tl(arg, cpu_env, offsetof(CPUMIPSState, CP0_ErrorEPC));
6380
            rn = "ErrorEPC";
6381
            break;
6382
        default:
6383
            goto die;
6384
        }
6385
        break;
6386
    case 31:
6387
        switch (sel) {
6388
        case 0:
6389
            /* EJTAG support */
6390
            gen_mtc0_store32(arg, offsetof(CPUMIPSState, CP0_DESAVE));
6391
            rn = "DESAVE";
6392
            break;
6393
        default:
6394
            goto die;
6395
        }
6396
        /* Stop translation as we may have switched the execution mode */
6397
        ctx->bstate = BS_STOP;
6398
        break;
6399
    default:
6400
        goto die;
6401
    }
6402
    (void)rn; /* avoid a compiler warning */
6403
    LOG_DISAS("dmtc0 %s (reg %d sel %d)\n", rn, reg, sel);
6404
    /* For simplicity assume that all writes can cause interrupts.  */
6405
    if (use_icount) {
6406
        gen_io_end();
6407
        ctx->bstate = BS_STOP;
6408
    }
6409
    return;
6410

    
6411
die:
6412
    LOG_DISAS("dmtc0 %s (reg %d sel %d)\n", rn, reg, sel);
6413
    generate_exception(ctx, EXCP_RI);
6414
}
6415
#endif /* TARGET_MIPS64 */
6416

    
6417
static void gen_mftr(CPUMIPSState *env, DisasContext *ctx, int rt, int rd,
6418
                     int u, int sel, int h)
6419
{
6420
    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
6421
    TCGv t0 = tcg_temp_local_new();
6422

    
6423
    if ((env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) == 0 &&
6424
        ((env->tcs[other_tc].CP0_TCBind & (0xf << CP0TCBd_CurVPE)) !=
6425
         (env->active_tc.CP0_TCBind & (0xf << CP0TCBd_CurVPE))))
6426
        tcg_gen_movi_tl(t0, -1);
6427
    else if ((env->CP0_VPEControl & (0xff << CP0VPECo_TargTC)) >
6428
             (env->mvp->CP0_MVPConf0 & (0xff << CP0MVPC0_PTC)))
6429
        tcg_gen_movi_tl(t0, -1);
6430
    else if (u == 0) {
6431
        switch (rt) {
6432
        case 1:
6433
            switch (sel) {
6434
            case 1:
6435
                gen_helper_mftc0_vpecontrol(t0, cpu_env);
6436
                break;
6437
            case 2:
6438
                gen_helper_mftc0_vpeconf0(t0, cpu_env);
6439
                break;
6440
            default:
6441
                goto die;
6442
                break;
6443
            }
6444
            break;
6445
        case 2:
6446
            switch (sel) {
6447
            case 1:
6448
                gen_helper_mftc0_tcstatus(t0, cpu_env);
6449
                break;
6450
            case 2:
6451
                gen_helper_mftc0_tcbind(t0, cpu_env);
6452
                break;
6453
            case 3:
6454
                gen_helper_mftc0_tcrestart(t0, cpu_env);
6455
                break;
6456
            case 4:
6457
                gen_helper_mftc0_tchalt(t0, cpu_env);
6458
                break;
6459
            case 5:
6460
                gen_helper_mftc0_tccontext(t0, cpu_env);
6461
                break;
6462
            case 6:
6463
                gen_helper_mftc0_tcschedule(t0, cpu_env);
6464
                break;
6465
            case 7:
6466
                gen_helper_mftc0_tcschefback(t0, cpu_env);
6467
                break;
6468
            default:
6469
                gen_mfc0(ctx, t0, rt, sel);
6470
                break;
6471
            }
6472
            break;
6473
        case 10:
6474
            switch (sel) {
6475
            case 0:
6476
                gen_helper_mftc0_entryhi(t0, cpu_env);
6477
                break;
6478
            default:
6479
                gen_mfc0(ctx, t0, rt, sel);
6480
                break;
6481
            }
6482
        case 12:
6483
            switch (sel) {
6484
            case 0:
6485
                gen_helper_mftc0_status(t0, cpu_env);
6486
                break;
6487
            default:
6488
                gen_mfc0(ctx, t0, rt, sel);
6489
                break;
6490
            }
6491
        case 13:
6492
            switch (sel) {
6493
            case 0:
6494
                gen_helper_mftc0_cause(t0, cpu_env);
6495
                break;
6496
            default:
6497
                goto die;
6498
                break;
6499
            }
6500
            break;
6501
        case 14:
6502
            switch (sel) {
6503
            case 0:
6504
                gen_helper_mftc0_epc(t0, cpu_env);
6505
                break;
6506
            default:
6507
                goto die;
6508
                break;
6509
            }
6510
            break;
6511
        case 15:
6512
            switch (sel) {
6513
            case 1:
6514
                gen_helper_mftc0_ebase(t0, cpu_env);
6515
                break;
6516
            default:
6517
                goto die;
6518
                break;
6519
            }
6520
            break;
6521
        case 16:
6522
            switch (sel) {
6523
            case 0 ... 7:
6524
                gen_helper_mftc0_configx(t0, cpu_env, tcg_const_tl(sel));
6525
                break;
6526
            default:
6527
                goto die;
6528
                break;
6529
            }
6530
            break;
6531
        case 23:
6532
            switch (sel) {
6533
            case 0:
6534
                gen_helper_mftc0_debug(t0, cpu_env);
6535
                break;
6536
            default:
6537
                gen_mfc0(ctx, t0, rt, sel);
6538
                break;
6539
            }
6540
            break;
6541
        default:
6542
            gen_mfc0(ctx, t0, rt, sel);
6543
        }
6544
    } else switch (sel) {
6545
    /* GPR registers. */
6546
    case 0:
6547
        gen_helper_1e0i(mftgpr, t0, rt);
6548
        break;
6549
    /* Auxiliary CPU registers */
6550
    case 1:
6551
        switch (rt) {
6552
        case 0:
6553
            gen_helper_1e0i(mftlo, t0, 0);
6554
            break;
6555
        case 1:
6556
            gen_helper_1e0i(mfthi, t0, 0);
6557
            break;
6558
        case 2:
6559
            gen_helper_1e0i(mftacx, t0, 0);
6560
            break;
6561
        case 4:
6562
            gen_helper_1e0i(mftlo, t0, 1);
6563
            break;
6564
        case 5:
6565
            gen_helper_1e0i(mfthi, t0, 1);
6566
            break;
6567
        case 6:
6568
            gen_helper_1e0i(mftacx, t0, 1);
6569
            break;
6570
        case 8:
6571
            gen_helper_1e0i(mftlo, t0, 2);
6572
            break;
6573
        case 9:
6574
            gen_helper_1e0i(mfthi, t0, 2);
6575
            break;
6576
        case 10:
6577
            gen_helper_1e0i(mftacx, t0, 2);
6578
            break;
6579
        case 12:
6580
            gen_helper_1e0i(mftlo, t0, 3);
6581
            break;
6582
        case 13:
6583
            gen_helper_1e0i(mfthi, t0, 3);
6584
            break;
6585
        case 14:
6586
            gen_helper_1e0i(mftacx, t0, 3);
6587
            break;
6588
        case 16:
6589
            gen_helper_mftdsp(t0, cpu_env);
6590
            break;
6591
        default:
6592
            goto die;
6593
        }
6594
        break;
6595
    /* Floating point (COP1). */
6596
    case 2:
6597
        /* XXX: For now we support only a single FPU context. */
6598
        if (h == 0) {
6599
            TCGv_i32 fp0 = tcg_temp_new_i32();
6600

    
6601
            gen_load_fpr32(fp0, rt);
6602
            tcg_gen_ext_i32_tl(t0, fp0);
6603
            tcg_temp_free_i32(fp0);
6604
        } else {
6605
            TCGv_i32 fp0 = tcg_temp_new_i32();
6606

    
6607
            gen_load_fpr32h(fp0, rt);
6608
            tcg_gen_ext_i32_tl(t0, fp0);
6609
            tcg_temp_free_i32(fp0);
6610
        }
6611
        break;
6612
    case 3:
6613
        /* XXX: For now we support only a single FPU context. */
6614
        gen_helper_1e0i(cfc1, t0, rt);
6615
        break;
6616
    /* COP2: Not implemented. */
6617
    case 4:
6618
    case 5:
6619
        /* fall through */
6620
    default:
6621
        goto die;
6622
    }
6623
    LOG_DISAS("mftr (reg %d u %d sel %d h %d)\n", rt, u, sel, h);
6624
    gen_store_gpr(t0, rd);
6625
    tcg_temp_free(t0);
6626
    return;
6627

    
6628
die:
6629
    tcg_temp_free(t0);
6630
    LOG_DISAS("mftr (reg %d u %d sel %d h %d)\n", rt, u, sel, h);
6631
    generate_exception(ctx, EXCP_RI);
6632
}
6633

    
6634
static void gen_mttr(CPUMIPSState *env, DisasContext *ctx, int rd, int rt,
6635
                     int u, int sel, int h)
6636
{
6637
    int other_tc = env->CP0_VPEControl & (0xff << CP0VPECo_TargTC);
6638
    TCGv t0 = tcg_temp_local_new();
6639

    
6640
    gen_load_gpr(t0, rt);
6641
    if ((env->CP0_VPEConf0 & (1 << CP0VPEC0_MVP)) == 0 &&
6642
        ((env->tcs[other_tc].CP0_TCBind & (0xf << CP0TCBd_CurVPE)) !=
6643
         (env->active_tc.CP0_TCBind & (0xf << CP0TCBd_CurVPE))))
6644
        /* NOP */ ;
6645
    else if ((env->CP0_VPEControl & (0xff << CP0VPECo_TargTC)) >
6646
             (env->mvp->CP0_MVPConf0 & (0xff << CP0MVPC0_PTC)))
6647
        /* NOP */ ;
6648
    else if (u == 0) {
6649
        switch (rd) {
6650
        case 1:
6651
            switch (sel) {
6652
            case 1:
6653
                gen_helper_mttc0_vpecontrol(cpu_env, t0);
6654
                break;
6655
            case 2:
6656
                gen_helper_mttc0_vpeconf0(cpu_env, t0);
6657
                break;
6658
            default:
6659
                goto die;
6660
                break;
6661
            }
6662
            break;
6663
        case 2:
6664
            switch (sel) {
6665
            case 1:
6666
                gen_helper_mttc0_tcstatus(cpu_env, t0);
6667
                break;
6668
            case 2:
6669
                gen_helper_mttc0_tcbind(cpu_env, t0);
6670
                break;
6671
            case 3:
6672
                gen_helper_mttc0_tcrestart(cpu_env, t0);
6673
                break;
6674
            case 4:
6675
                gen_helper_mttc0_tchalt(cpu_env, t0);
6676
                break;
6677
            case 5:
6678
                gen_helper_mttc0_tccontext(cpu_env, t0);
6679
                break;
6680
            case 6:
6681
                gen_helper_mttc0_tcschedule(cpu_env, t0);
6682
                break;
6683
            case 7:
6684
                gen_helper_mttc0_tcschefback(cpu_env, t0);
6685
                break;
6686
            default:
6687
                gen_mtc0(ctx, t0, rd, sel);
6688
                break;
6689
            }
6690
            break;
6691
        case 10:
6692
            switch (sel) {
6693
            case 0:
6694
                gen_helper_mttc0_entryhi(cpu_env, t0);
6695
                break;
6696
            default:
6697
                gen_mtc0(ctx, t0, rd, sel);
6698
                break;
6699
            }
6700
        case 12:
6701
            switch (sel) {
6702
            case 0:
6703
                gen_helper_mttc0_status(cpu_env, t0);
6704
                break;
6705
            default:
6706
                gen_mtc0(ctx, t0, rd, sel);
6707
                break;
6708
            }
6709
        case 13:
6710
            switch (sel) {
6711
            case 0:
6712
                gen_helper_mttc0_cause(cpu_env, t0);
6713
                break;
6714
            default:
6715
                goto die;
6716
                break;
6717
            }
6718
            break;
6719
        case 15:
6720
            switch (sel) {
6721
            case 1:
6722
                gen_helper_mttc0_ebase(cpu_env, t0);
6723
                break;
6724
            default:
6725
                goto die;
6726
                break;
6727
            }
6728
            break;
6729
        case 23:
6730
            switch (sel) {
6731
            case 0:
6732
                gen_helper_mttc0_debug(cpu_env, t0);
6733
                break;
6734
            default:
6735
                gen_mtc0(ctx, t0, rd, sel);
6736
                break;
6737
            }
6738
            break;
6739
        default:
6740
            gen_mtc0(ctx, t0, rd, sel);
6741
        }
6742
    } else switch (sel) {
6743
    /* GPR registers. */
6744
    case 0:
6745
        gen_helper_0e1i(mttgpr, t0, rd);
6746
        break;
6747
    /* Auxiliary CPU registers */
6748
    case 1:
6749
        switch (rd) {
6750
        case 0:
6751
            gen_helper_0e1i(mttlo, t0, 0);
6752
            break;
6753
        case 1:
6754
            gen_helper_0e1i(mtthi, t0, 0);
6755
            break;
6756
        case 2:
6757
            gen_helper_0e1i(mttacx, t0, 0);
6758
            break;
6759
        case 4:
6760
            gen_helper_0e1i(mttlo, t0, 1);
6761
            break;
6762
        case 5:
6763
            gen_helper_0e1i(mtthi, t0, 1);
6764
            break;
6765
        case 6:
6766
            gen_helper_0e1i(mttacx, t0, 1);
6767
            break;
6768
        case 8:
6769
            gen_helper_0e1i(mttlo, t0, 2);
6770
            break;
6771
        case 9:
6772
            gen_helper_0e1i(mtthi, t0, 2);
6773
            break;
6774
        case 10:
6775
            gen_helper_0e1i(mttacx, t0, 2);
6776
            break;
6777
        case 12:
6778
            gen_helper_0e1i(mttlo, t0, 3);
6779
            break;
6780
        case 13:
6781
            gen_helper_0e1i(mtthi, t0, 3);
6782
            break;
6783
        case 14:
6784
            gen_helper_0e1i(mttacx, t0, 3);
6785
            break;
6786
        case 16:
6787
            gen_helper_mttdsp(cpu_env, t0);
6788
            break;
6789
        default:
6790
            goto die;
6791
        }
6792
        break;
6793
    /* Floating point (COP1). */
6794
    case 2:
6795
        /* XXX: For now we support only a single FPU context. */
6796
        if (h == 0) {
6797
            TCGv_i32 fp0 = tcg_temp_new_i32();
6798

    
6799
            tcg_gen_trunc_tl_i32(fp0, t0);
6800
            gen_store_fpr32(fp0, rd);
6801
            tcg_temp_free_i32(fp0);
6802
        } else {
6803
            TCGv_i32 fp0 = tcg_temp_new_i32();
6804

    
6805
            tcg_gen_trunc_tl_i32(fp0, t0);
6806
            gen_store_fpr32h(fp0, rd);
6807
            tcg_temp_free_i32(fp0);
6808
        }
6809
        break;
6810
    case 3:
6811
        /* XXX: For now we support only a single FPU context. */
6812
        gen_helper_0e1i(ctc1, t0, rd);
6813
        break;
6814
    /* COP2: Not implemented. */
6815
    case 4:
6816
    case 5:
6817
        /* fall through */
6818
    default:
6819
        goto die;
6820
    }
6821
    LOG_DISAS("mttr (reg %d u %d sel %d h %d)\n", rd, u, sel, h);
6822
    tcg_temp_free(t0);
6823
    return;
6824

    
6825
die:
6826
    tcg_temp_free(t0);
6827
    LOG_DISAS("mttr (reg %d u %d sel %d h %d)\n", rd, u, sel, h);
6828
    generate_exception(ctx, EXCP_RI);
6829
}
6830

    
6831
static void gen_cp0 (CPUMIPSState *env, DisasContext *ctx, uint32_t opc, int rt, int rd)
6832
{
6833
    const char *opn = "ldst";
6834

    
6835
    check_cp0_enabled(ctx);
6836
    switch (opc) {
6837
    case OPC_MFC0:
6838
        if (rt == 0) {
6839
            /* Treat as NOP. */
6840
            return;
6841
        }
6842
        gen_mfc0(ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
6843
        opn = "mfc0";
6844
        break;
6845
    case OPC_MTC0:
6846
        {
6847
            TCGv t0 = tcg_temp_new();
6848

    
6849
            gen_load_gpr(t0, rt);
6850
            gen_mtc0(ctx, t0, rd, ctx->opcode & 0x7);
6851
            tcg_temp_free(t0);
6852
        }
6853
        opn = "mtc0";
6854
        break;
6855
#if defined(TARGET_MIPS64)
6856
    case OPC_DMFC0:
6857
        check_insn(ctx, ISA_MIPS3);
6858
        if (rt == 0) {
6859
            /* Treat as NOP. */
6860
            return;
6861
        }
6862
        gen_dmfc0(ctx, cpu_gpr[rt], rd, ctx->opcode & 0x7);
6863
        opn = "dmfc0";
6864
        break;
6865
    case OPC_DMTC0:
6866
        check_insn(ctx, ISA_MIPS3);
6867
        {
6868
            TCGv t0 = tcg_temp_new();
6869

    
6870
            gen_load_gpr(t0, rt);
6871
            gen_dmtc0(ctx, t0, rd, ctx->opcode & 0x7);
6872
            tcg_temp_free(t0);
6873
        }
6874
        opn = "dmtc0";
6875
        break;
6876
#endif
6877
    case OPC_MFTR:
6878
        check_insn(ctx, ASE_MT);
6879
        if (rd == 0) {
6880
            /* Treat as NOP. */
6881
            return;
6882
        }
6883
        gen_mftr(env, ctx, rt, rd, (ctx->opcode >> 5) & 1,
6884
                 ctx->opcode & 0x7, (ctx->opcode >> 4) & 1);
6885
        opn = "mftr";
6886
        break;
6887
    case OPC_MTTR:
6888
        check_insn(ctx, ASE_MT);
6889
        gen_mttr(env, ctx, rd, rt, (ctx->opcode >> 5) & 1,
6890
                 ctx->opcode & 0x7, (ctx->opcode >> 4) & 1);
6891
        opn = "mttr";
6892
        break;
6893
    case OPC_TLBWI:
6894
        opn = "tlbwi";
6895
        if (!env->tlb->helper_tlbwi)
6896
            goto die;
6897
        gen_helper_tlbwi(cpu_env);
6898
        break;
6899
    case OPC_TLBWR:
6900
        opn = "tlbwr";
6901
        if (!env->tlb->helper_tlbwr)
6902
            goto die;
6903
        gen_helper_tlbwr(cpu_env);
6904
        break;
6905
    case OPC_TLBP:
6906
        opn = "tlbp";
6907
        if (!env->tlb->helper_tlbp)
6908
            goto die;
6909
        gen_helper_tlbp(cpu_env);
6910
        break;
6911
    case OPC_TLBR:
6912
        opn = "tlbr";
6913
        if (!env->tlb->helper_tlbr)
6914
            goto die;
6915
        gen_helper_tlbr(cpu_env);
6916
        break;
6917
    case OPC_ERET:
6918
        opn = "eret";
6919
        check_insn(ctx, ISA_MIPS2);
6920
        gen_helper_eret(cpu_env);
6921
        ctx->bstate = BS_EXCP;
6922
        break;
6923
    case OPC_DERET:
6924
        opn = "deret";
6925
        check_insn(ctx, ISA_MIPS32);
6926
        if (!(ctx->hflags & MIPS_HFLAG_DM)) {
6927
            MIPS_INVAL(opn);
6928
            generate_exception(ctx, EXCP_RI);
6929
        } else {
6930
            gen_helper_deret(cpu_env);
6931
            ctx->bstate = BS_EXCP;
6932
        }
6933
        break;
6934
    case OPC_WAIT:
6935
        opn = "wait";
6936
        check_insn(ctx, ISA_MIPS3 | ISA_MIPS32);
6937
        /* If we get an exception, we want to restart at next instruction */
6938
        ctx->pc += 4;
6939
        save_cpu_state(ctx, 1);
6940
        ctx->pc -= 4;
6941
        gen_helper_wait(cpu_env);
6942
        ctx->bstate = BS_EXCP;
6943
        break;
6944
    default:
6945
 die:
6946
        MIPS_INVAL(opn);
6947
        generate_exception(ctx, EXCP_RI);
6948
        return;
6949
    }
6950
    (void)opn; /* avoid a compiler warning */
6951
    MIPS_DEBUG("%s %s %d", opn, regnames[rt], rd);
6952
}
6953
#endif /* !CONFIG_USER_ONLY */
6954

    
6955
/* CP1 Branches (before delay slot) */
6956
static void gen_compute_branch1(DisasContext *ctx, uint32_t op,
6957
                                int32_t cc, int32_t offset)
6958
{
6959
    target_ulong btarget;
6960
    const char *opn = "cp1 cond branch";
6961
    TCGv_i32 t0 = tcg_temp_new_i32();
6962

    
6963
    if (cc != 0)
6964
        check_insn(ctx, ISA_MIPS4 | ISA_MIPS32);
6965

    
6966
    btarget = ctx->pc + 4 + offset;
6967

    
6968
    switch (op) {
6969
    case OPC_BC1F:
6970
        tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
6971
        tcg_gen_not_i32(t0, t0);
6972
        tcg_gen_andi_i32(t0, t0, 1);
6973
        tcg_gen_extu_i32_tl(bcond, t0);
6974
        opn = "bc1f";
6975
        goto not_likely;
6976
    case OPC_BC1FL:
6977
        tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
6978
        tcg_gen_not_i32(t0, t0);
6979
        tcg_gen_andi_i32(t0, t0, 1);
6980
        tcg_gen_extu_i32_tl(bcond, t0);
6981
        opn = "bc1fl";
6982
        goto likely;
6983
    case OPC_BC1T:
6984
        tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
6985
        tcg_gen_andi_i32(t0, t0, 1);
6986
        tcg_gen_extu_i32_tl(bcond, t0);
6987
        opn = "bc1t";
6988
        goto not_likely;
6989
    case OPC_BC1TL:
6990
        tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
6991
        tcg_gen_andi_i32(t0, t0, 1);
6992
        tcg_gen_extu_i32_tl(bcond, t0);
6993
        opn = "bc1tl";
6994
    likely:
6995
        ctx->hflags |= MIPS_HFLAG_BL;
6996
        break;
6997
    case OPC_BC1FANY2:
6998
        {
6999
            TCGv_i32 t1 = tcg_temp_new_i32();
7000
            tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
7001
            tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
7002
            tcg_gen_nand_i32(t0, t0, t1);
7003
            tcg_temp_free_i32(t1);
7004
            tcg_gen_andi_i32(t0, t0, 1);
7005
            tcg_gen_extu_i32_tl(bcond, t0);
7006
        }
7007
        opn = "bc1any2f";
7008
        goto not_likely;
7009
    case OPC_BC1TANY2:
7010
        {
7011
            TCGv_i32 t1 = tcg_temp_new_i32();
7012
            tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
7013
            tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
7014
            tcg_gen_or_i32(t0, t0, t1);
7015
            tcg_temp_free_i32(t1);
7016
            tcg_gen_andi_i32(t0, t0, 1);
7017
            tcg_gen_extu_i32_tl(bcond, t0);
7018
        }
7019
        opn = "bc1any2t";
7020
        goto not_likely;
7021
    case OPC_BC1FANY4:
7022
        {
7023
            TCGv_i32 t1 = tcg_temp_new_i32();
7024
            tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
7025
            tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
7026
            tcg_gen_and_i32(t0, t0, t1);
7027
            tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+2));
7028
            tcg_gen_and_i32(t0, t0, t1);
7029
            tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+3));
7030
            tcg_gen_nand_i32(t0, t0, t1);
7031
            tcg_temp_free_i32(t1);
7032
            tcg_gen_andi_i32(t0, t0, 1);
7033
            tcg_gen_extu_i32_tl(bcond, t0);
7034
        }
7035
        opn = "bc1any4f";
7036
        goto not_likely;
7037
    case OPC_BC1TANY4:
7038
        {
7039
            TCGv_i32 t1 = tcg_temp_new_i32();
7040
            tcg_gen_shri_i32(t0, fpu_fcr31, get_fp_bit(cc));
7041
            tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+1));
7042
            tcg_gen_or_i32(t0, t0, t1);
7043
            tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+2));
7044
            tcg_gen_or_i32(t0, t0, t1);
7045
            tcg_gen_shri_i32(t1, fpu_fcr31, get_fp_bit(cc+3));
7046
            tcg_gen_or_i32(t0, t0, t1);
7047
            tcg_temp_free_i32(t1);
7048
            tcg_gen_andi_i32(t0, t0, 1);
7049
            tcg_gen_extu_i32_tl(bcond, t0);
7050
        }
7051
        opn = "bc1any4t";
7052
    not_likely:
7053
        ctx->hflags |= MIPS_HFLAG_BC;
7054
        break;
7055
    default:
7056
        MIPS_INVAL(opn);
7057
        generate_exception (ctx, EXCP_RI);
7058
        goto out;
7059
    }
7060
    (void)opn; /* avoid a compiler warning */
7061
    MIPS_DEBUG("%s: cond %02x target " TARGET_FMT_lx, opn,
7062
               ctx->hflags, btarget);
7063
    ctx->btarget = btarget;
7064

    
7065
 out:
7066
    tcg_temp_free_i32(t0);
7067
}
7068

    
7069
/* Coprocessor 1 (FPU) */
7070

    
7071
#define FOP(func, fmt) (((fmt) << 21) | (func))
7072

    
7073
enum fopcode {
7074
    OPC_ADD_S = FOP(0, FMT_S),
7075
    OPC_SUB_S = FOP(1, FMT_S),
7076
    OPC_MUL_S = FOP(2, FMT_S),
7077
    OPC_DIV_S = FOP(3, FMT_S),
7078
    OPC_SQRT_S = FOP(4, FMT_S),
7079
    OPC_ABS_S = FOP(5, FMT_S),
7080
    OPC_MOV_S = FOP(6, FMT_S),
7081
    OPC_NEG_S = FOP(7, FMT_S),
7082
    OPC_ROUND_L_S = FOP(8, FMT_S),
7083
    OPC_TRUNC_L_S = FOP(9, FMT_S),
7084
    OPC_CEIL_L_S = FOP(10, FMT_S),
7085
    OPC_FLOOR_L_S = FOP(11, FMT_S),
7086
    OPC_ROUND_W_S = FOP(12, FMT_S),
7087
    OPC_TRUNC_W_S = FOP(13, FMT_S),
7088
    OPC_CEIL_W_S = FOP(14, FMT_S),
7089
    OPC_FLOOR_W_S = FOP(15, FMT_S),
7090
    OPC_MOVCF_S = FOP(17, FMT_S),
7091
    OPC_MOVZ_S = FOP(18, FMT_S),
7092
    OPC_MOVN_S = FOP(19, FMT_S),
7093
    OPC_RECIP_S = FOP(21, FMT_S),
7094
    OPC_RSQRT_S = FOP(22, FMT_S),
7095
    OPC_RECIP2_S = FOP(28, FMT_S),
7096
    OPC_RECIP1_S = FOP(29, FMT_S),
7097
    OPC_RSQRT1_S = FOP(30, FMT_S),
7098
    OPC_RSQRT2_S = FOP(31, FMT_S),
7099
    OPC_CVT_D_S = FOP(33, FMT_S),
7100
    OPC_CVT_W_S = FOP(36, FMT_S),
7101
    OPC_CVT_L_S = FOP(37, FMT_S),
7102
    OPC_CVT_PS_S = FOP(38, FMT_S),
7103
    OPC_CMP_F_S = FOP (48, FMT_S),
7104
    OPC_CMP_UN_S = FOP (49, FMT_S),
7105
    OPC_CMP_EQ_S = FOP (50, FMT_S),
7106
    OPC_CMP_UEQ_S = FOP (51, FMT_S),
7107
    OPC_CMP_OLT_S = FOP (52, FMT_S),
7108
    OPC_CMP_ULT_S = FOP (53, FMT_S),
7109
    OPC_CMP_OLE_S = FOP (54, FMT_S),
7110
    OPC_CMP_ULE_S = FOP (55, FMT_S),
7111
    OPC_CMP_SF_S = FOP (56, FMT_S),
7112
    OPC_CMP_NGLE_S = FOP (57, FMT_S),
7113
    OPC_CMP_SEQ_S = FOP (58, FMT_S),
7114
    OPC_CMP_NGL_S = FOP (59, FMT_S),
7115
    OPC_CMP_LT_S = FOP (60, FMT_S),
7116
    OPC_CMP_NGE_S = FOP (61, FMT_S),
7117
    OPC_CMP_LE_S = FOP (62, FMT_S),
7118
    OPC_CMP_NGT_S = FOP (63, FMT_S),
7119

    
7120
    OPC_ADD_D = FOP(0, FMT_D),
7121
    OPC_SUB_D = FOP(1, FMT_D),
7122
    OPC_MUL_D = FOP(2, FMT_D),
7123
    OPC_DIV_D = FOP(3, FMT_D),
7124
    OPC_SQRT_D = FOP(4, FMT_D),
7125
    OPC_ABS_D = FOP(5, FMT_D),
7126
    OPC_MOV_D = FOP(6, FMT_D),
7127
    OPC_NEG_D = FOP(7, FMT_D),
7128
    OPC_ROUND_L_D = FOP(8, FMT_D),
7129
    OPC_TRUNC_L_D = FOP(9, FMT_D),
7130
    OPC_CEIL_L_D = FOP(10, FMT_D),
7131
    OPC_FLOOR_L_D = FOP(11, FMT_D),
7132
    OPC_ROUND_W_D = FOP(12, FMT_D),
7133
    OPC_TRUNC_W_D = FOP(13, FMT_D),
7134
    OPC_CEIL_W_D = FOP(14, FMT_D),
7135
    OPC_FLOOR_W_D = FOP(15, FMT_D),
7136
    OPC_MOVCF_D = FOP(17, FMT_D),
7137
    OPC_MOVZ_D = FOP(18, FMT_D),
7138
    OPC_MOVN_D = FOP(19, FMT_D),
7139
    OPC_RECIP_D = FOP(21, FMT_D),
7140
    OPC_RSQRT_D = FOP(22, FMT_D),
7141
    OPC_RECIP2_D = FOP(28, FMT_D),
7142
    OPC_RECIP1_D = FOP(29, FMT_D),
7143
    OPC_RSQRT1_D = FOP(30, FMT_D),
7144
    OPC_RSQRT2_D = FOP(31, FMT_D),
7145
    OPC_CVT_S_D = FOP(32, FMT_D),
7146
    OPC_CVT_W_D = FOP(36, FMT_D),
7147
    OPC_CVT_L_D = FOP(37, FMT_D),
7148
    OPC_CMP_F_D = FOP (48, FMT_D),
7149
    OPC_CMP_UN_D = FOP (49, FMT_D),
7150
    OPC_CMP_EQ_D = FOP (50, FMT_D),
7151
    OPC_CMP_UEQ_D = FOP (51, FMT_D),
7152
    OPC_CMP_OLT_D = FOP (52, FMT_D),
7153
    OPC_CMP_ULT_D = FOP (53, FMT_D),
7154
    OPC_CMP_OLE_D = FOP (54, FMT_D),
7155
    OPC_CMP_ULE_D = FOP (55, FMT_D),
7156
    OPC_CMP_SF_D = FOP (56, FMT_D),
7157
    OPC_CMP_NGLE_D = FOP (57, FMT_D),
7158
    OPC_CMP_SEQ_D = FOP (58, FMT_D),
7159
    OPC_CMP_NGL_D = FOP (59, FMT_D),
7160
    OPC_CMP_LT_D = FOP (60, FMT_D),
7161
    OPC_CMP_NGE_D = FOP (61, FMT_D),
7162
    OPC_CMP_LE_D = FOP (62, FMT_D),
7163
    OPC_CMP_NGT_D = FOP (63, FMT_D),
7164

    
7165
    OPC_CVT_S_W = FOP(32, FMT_W),
7166
    OPC_CVT_D_W = FOP(33, FMT_W),
7167
    OPC_CVT_S_L = FOP(32, FMT_L),
7168
    OPC_CVT_D_L = FOP(33, FMT_L),
7169
    OPC_CVT_PS_PW = FOP(38, FMT_W),
7170

    
7171
    OPC_ADD_PS = FOP(0, FMT_PS),
7172
    OPC_SUB_PS = FOP(1, FMT_PS),
7173
    OPC_MUL_PS = FOP(2, FMT_PS),
7174
    OPC_DIV_PS = FOP(3, FMT_PS),
7175
    OPC_ABS_PS = FOP(5, FMT_PS),
7176
    OPC_MOV_PS = FOP(6, FMT_PS),
7177
    OPC_NEG_PS = FOP(7, FMT_PS),
7178
    OPC_MOVCF_PS = FOP(17, FMT_PS),
7179
    OPC_MOVZ_PS = FOP(18, FMT_PS),
7180
    OPC_MOVN_PS = FOP(19, FMT_PS),
7181
    OPC_ADDR_PS = FOP(24, FMT_PS),
7182
    OPC_MULR_PS = FOP(26, FMT_PS),
7183
    OPC_RECIP2_PS = FOP(28, FMT_PS),
7184
    OPC_RECIP1_PS = FOP(29, FMT_PS),
7185
    OPC_RSQRT1_PS = FOP(30, FMT_PS),
7186
    OPC_RSQRT2_PS = FOP(31, FMT_PS),
7187

    
7188
    OPC_CVT_S_PU = FOP(32, FMT_PS),
7189
    OPC_CVT_PW_PS = FOP(36, FMT_PS),
7190
    OPC_CVT_S_PL = FOP(40, FMT_PS),
7191
    OPC_PLL_PS = FOP(44, FMT_PS),
7192
    OPC_PLU_PS = FOP(45, FMT_PS),
7193
    OPC_PUL_PS = FOP(46, FMT_PS),
7194
    OPC_PUU_PS = FOP(47, FMT_PS),
7195
    OPC_CMP_F_PS = FOP (48, FMT_PS),
7196
    OPC_CMP_UN_PS = FOP (49, FMT_PS),
7197
    OPC_CMP_EQ_PS = FOP (50, FMT_PS),
7198
    OPC_CMP_UEQ_PS = FOP (51, FMT_PS),
7199
    OPC_CMP_OLT_PS = FOP (52, FMT_PS),
7200
    OPC_CMP_ULT_PS = FOP (53, FMT_PS),
7201
    OPC_CMP_OLE_PS = FOP (54, FMT_PS),
7202
    OPC_CMP_ULE_PS = FOP (55, FMT_PS),
7203
    OPC_CMP_SF_PS = FOP (56, FMT_PS),
7204
    OPC_CMP_NGLE_PS = FOP (57, FMT_PS),
7205
    OPC_CMP_SEQ_PS = FOP (58, FMT_PS),
7206
    OPC_CMP_NGL_PS = FOP (59, FMT_PS),
7207
    OPC_CMP_LT_PS = FOP (60, FMT_PS),
7208
    OPC_CMP_NGE_PS = FOP (61, FMT_PS),
7209
    OPC_CMP_LE_PS = FOP (62, FMT_PS),
7210
    OPC_CMP_NGT_PS = FOP (63, FMT_PS),
7211
};
7212

    
7213
static void gen_cp1 (DisasContext *ctx, uint32_t opc, int rt, int fs)
7214
{
7215
    const char *opn = "cp1 move";
7216
    TCGv t0 = tcg_temp_new();
7217

    
7218
    switch (opc) {
7219
    case OPC_MFC1:
7220
        {
7221
            TCGv_i32 fp0 = tcg_temp_new_i32();
7222

    
7223
            gen_load_fpr32(fp0, fs);
7224
            tcg_gen_ext_i32_tl(t0, fp0);
7225
            tcg_temp_free_i32(fp0);
7226
        }
7227
        gen_store_gpr(t0, rt);
7228
        opn = "mfc1";
7229
        break;
7230
    case OPC_MTC1:
7231
        gen_load_gpr(t0, rt);
7232
        {
7233
            TCGv_i32 fp0 = tcg_temp_new_i32();
7234

    
7235
            tcg_gen_trunc_tl_i32(fp0, t0);
7236
            gen_store_fpr32(fp0, fs);
7237
            tcg_temp_free_i32(fp0);
7238
        }
7239
        opn = "mtc1";
7240
        break;
7241
    case OPC_CFC1:
7242
        gen_helper_1e0i(cfc1, t0, fs);
7243
        gen_store_gpr(t0, rt);
7244
        opn = "cfc1";
7245
        break;
7246
    case OPC_CTC1:
7247
        gen_load_gpr(t0, rt);
7248
        gen_helper_0e1i(ctc1, t0, fs);
7249
        opn = "ctc1";
7250
        break;
7251
#if defined(TARGET_MIPS64)
7252
    case OPC_DMFC1:
7253
        gen_load_fpr64(ctx, t0, fs);
7254
        gen_store_gpr(t0, rt);
7255
        opn = "dmfc1";
7256
        break;
7257
    case OPC_DMTC1:
7258
        gen_load_gpr(t0, rt);
7259
        gen_store_fpr64(ctx, t0, fs);
7260
        opn = "dmtc1";
7261
        break;
7262
#endif
7263
    case OPC_MFHC1:
7264
        {
7265
            TCGv_i32 fp0 = tcg_temp_new_i32();
7266

    
7267
            gen_load_fpr32h(fp0, fs);
7268
            tcg_gen_ext_i32_tl(t0, fp0);
7269
            tcg_temp_free_i32(fp0);
7270
        }
7271
        gen_store_gpr(t0, rt);
7272
        opn = "mfhc1";
7273
        break;
7274
    case OPC_MTHC1:
7275
        gen_load_gpr(t0, rt);
7276
        {
7277
            TCGv_i32 fp0 = tcg_temp_new_i32();
7278

    
7279
            tcg_gen_trunc_tl_i32(fp0, t0);
7280
            gen_store_fpr32h(fp0, fs);
7281
            tcg_temp_free_i32(fp0);
7282
        }
7283
        opn = "mthc1";
7284
        break;
7285
    default:
7286
        MIPS_INVAL(opn);
7287
        generate_exception (ctx, EXCP_RI);
7288
        goto out;
7289
    }
7290
    (void)opn; /* avoid a compiler warning */
7291
    MIPS_DEBUG("%s %s %s", opn, regnames[rt], fregnames[fs]);
7292

    
7293
 out:
7294
    tcg_temp_free(t0);
7295
}
7296

    
7297
static void gen_movci (DisasContext *ctx, int rd, int rs, int cc, int tf)
7298
{
7299
    int l1;
7300
    TCGCond cond;
7301
    TCGv_i32 t0;
7302

    
7303
    if (rd == 0) {
7304
        /* Treat as NOP. */
7305
        return;
7306
    }
7307

    
7308
    if (tf)
7309
        cond = TCG_COND_EQ;
7310
    else
7311
        cond = TCG_COND_NE;
7312

    
7313
    l1 = gen_new_label();
7314
    t0 = tcg_temp_new_i32();
7315
    tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
7316
    tcg_gen_brcondi_i32(cond, t0, 0, l1);
7317
    tcg_temp_free_i32(t0);
7318
    if (rs == 0) {
7319
        tcg_gen_movi_tl(cpu_gpr[rd], 0);
7320
    } else {
7321
        tcg_gen_mov_tl(cpu_gpr[rd], cpu_gpr[rs]);
7322
    }
7323
    gen_set_label(l1);
7324
}
7325

    
7326
static inline void gen_movcf_s (int fs, int fd, int cc, int tf)
7327
{
7328
    int cond;
7329
    TCGv_i32 t0 = tcg_temp_new_i32();
7330
    int l1 = gen_new_label();
7331

    
7332
    if (tf)
7333
        cond = TCG_COND_EQ;
7334
    else
7335
        cond = TCG_COND_NE;
7336

    
7337
    tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
7338
    tcg_gen_brcondi_i32(cond, t0, 0, l1);
7339
    gen_load_fpr32(t0, fs);
7340
    gen_store_fpr32(t0, fd);
7341
    gen_set_label(l1);
7342
    tcg_temp_free_i32(t0);
7343
}
7344

    
7345
static inline void gen_movcf_d (DisasContext *ctx, int fs, int fd, int cc, int tf)
7346
{
7347
    int cond;
7348
    TCGv_i32 t0 = tcg_temp_new_i32();
7349
    TCGv_i64 fp0;
7350
    int l1 = gen_new_label();
7351

    
7352
    if (tf)
7353
        cond = TCG_COND_EQ;
7354
    else
7355
        cond = TCG_COND_NE;
7356

    
7357
    tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
7358
    tcg_gen_brcondi_i32(cond, t0, 0, l1);
7359
    tcg_temp_free_i32(t0);
7360
    fp0 = tcg_temp_new_i64();
7361
    gen_load_fpr64(ctx, fp0, fs);
7362
    gen_store_fpr64(ctx, fp0, fd);
7363
    tcg_temp_free_i64(fp0);
7364
    gen_set_label(l1);
7365
}
7366

    
7367
static inline void gen_movcf_ps (int fs, int fd, int cc, int tf)
7368
{
7369
    int cond;
7370
    TCGv_i32 t0 = tcg_temp_new_i32();
7371
    int l1 = gen_new_label();
7372
    int l2 = gen_new_label();
7373

    
7374
    if (tf)
7375
        cond = TCG_COND_EQ;
7376
    else
7377
        cond = TCG_COND_NE;
7378

    
7379
    tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc));
7380
    tcg_gen_brcondi_i32(cond, t0, 0, l1);
7381
    gen_load_fpr32(t0, fs);
7382
    gen_store_fpr32(t0, fd);
7383
    gen_set_label(l1);
7384

    
7385
    tcg_gen_andi_i32(t0, fpu_fcr31, 1 << get_fp_bit(cc+1));
7386
    tcg_gen_brcondi_i32(cond, t0, 0, l2);
7387
    gen_load_fpr32h(t0, fs);
7388
    gen_store_fpr32h(t0, fd);
7389
    tcg_temp_free_i32(t0);
7390
    gen_set_label(l2);
7391
}
7392

    
7393

    
7394
static void gen_farith (DisasContext *ctx, enum fopcode op1,
7395
                        int ft, int fs, int fd, int cc)
7396
{
7397
    const char *opn = "farith";
7398
    const char *condnames[] = {
7399
            "c.f",
7400
            "c.un",
7401
            "c.eq",
7402
            "c.ueq",
7403
            "c.olt",
7404
            "c.ult",
7405
            "c.ole",
7406
            "c.ule",
7407
            "c.sf",
7408
            "c.ngle",
7409
            "c.seq",
7410
            "c.ngl",
7411
            "c.lt",
7412
            "c.nge",
7413
            "c.le",
7414
            "c.ngt",
7415
    };
7416
    const char *condnames_abs[] = {
7417
            "cabs.f",
7418
            "cabs.un",
7419
            "cabs.eq",
7420
            "cabs.ueq",
7421
            "cabs.olt",
7422
            "cabs.ult",
7423
            "cabs.ole",
7424
            "cabs.ule",
7425
            "cabs.sf",
7426
            "cabs.ngle",
7427
            "cabs.seq",
7428
            "cabs.ngl",
7429
            "cabs.lt",
7430
            "cabs.nge",
7431
            "cabs.le",
7432
            "cabs.ngt",
7433
    };
7434
    enum { BINOP, CMPOP, OTHEROP } optype = OTHEROP;
7435
    uint32_t func = ctx->opcode & 0x3f;
7436

    
7437
    switch (op1) {
7438
    case OPC_ADD_S:
7439
        {
7440
            TCGv_i32 fp0 = tcg_temp_new_i32();
7441
            TCGv_i32 fp1 = tcg_temp_new_i32();
7442

    
7443
            gen_load_fpr32(fp0, fs);
7444
            gen_load_fpr32(fp1, ft);
7445
            gen_helper_float_add_s(fp0, cpu_env, fp0, fp1);
7446
            tcg_temp_free_i32(fp1);
7447
            gen_store_fpr32(fp0, fd);
7448
            tcg_temp_free_i32(fp0);
7449
        }
7450
        opn = "add.s";
7451
        optype = BINOP;
7452
        break;
7453
    case OPC_SUB_S:
7454
        {
7455
            TCGv_i32 fp0 = tcg_temp_new_i32();
7456
            TCGv_i32 fp1 = tcg_temp_new_i32();
7457

    
7458
            gen_load_fpr32(fp0, fs);
7459
            gen_load_fpr32(fp1, ft);
7460
            gen_helper_float_sub_s(fp0, cpu_env, fp0, fp1);
7461
            tcg_temp_free_i32(fp1);
7462
            gen_store_fpr32(fp0, fd);
7463
            tcg_temp_free_i32(fp0);
7464
        }
7465
        opn = "sub.s";
7466
        optype = BINOP;
7467
        break;
7468
    case OPC_MUL_S:
7469
        {
7470
            TCGv_i32 fp0 = tcg_temp_new_i32();
7471
            TCGv_i32 fp1 = tcg_temp_new_i32();
7472

    
7473
            gen_load_fpr32(fp0, fs);
7474
            gen_load_fpr32(fp1, ft);
7475
            gen_helper_float_mul_s(fp0, cpu_env, fp0, fp1);
7476
            tcg_temp_free_i32(fp1);
7477
            gen_store_fpr32(fp0, fd);
7478
            tcg_temp_free_i32(fp0);
7479
        }
7480
        opn = "mul.s";
7481
        optype = BINOP;
7482
        break;
7483
    case OPC_DIV_S:
7484
        {
7485
            TCGv_i32 fp0 = tcg_temp_new_i32();
7486
            TCGv_i32 fp1 = tcg_temp_new_i32();
7487

    
7488
            gen_load_fpr32(fp0, fs);
7489
            gen_load_fpr32(fp1, ft);
7490
            gen_helper_float_div_s(fp0, cpu_env, fp0, fp1);
7491
            tcg_temp_free_i32(fp1);
7492
            gen_store_fpr32(fp0, fd);
7493
            tcg_temp_free_i32(fp0);
7494
        }
7495
        opn = "div.s";
7496
        optype = BINOP;
7497
        break;
7498
    case OPC_SQRT_S:
7499
        {
7500
            TCGv_i32 fp0 = tcg_temp_new_i32();
7501

    
7502
            gen_load_fpr32(fp0, fs);
7503
            gen_helper_float_sqrt_s(fp0, cpu_env, fp0);
7504
            gen_store_fpr32(fp0, fd);
7505
            tcg_temp_free_i32(fp0);
7506
        }
7507
        opn = "sqrt.s";
7508
        break;
7509
    case OPC_ABS_S:
7510
        {
7511
            TCGv_i32 fp0 = tcg_temp_new_i32();
7512

    
7513
            gen_load_fpr32(fp0, fs);
7514
            gen_helper_float_abs_s(fp0, fp0);
7515
            gen_store_fpr32(fp0, fd);
7516
            tcg_temp_free_i32(fp0);
7517
        }
7518
        opn = "abs.s";
7519
        break;
7520
    case OPC_MOV_S:
7521
        {
7522
            TCGv_i32 fp0 = tcg_temp_new_i32();
7523

    
7524
            gen_load_fpr32(fp0, fs);
7525
            gen_store_fpr32(fp0, fd);
7526
            tcg_temp_free_i32(fp0);
7527
        }
7528
        opn = "mov.s";
7529
        break;
7530
    case OPC_NEG_S:
7531
        {
7532
            TCGv_i32 fp0 = tcg_temp_new_i32();
7533

    
7534
            gen_load_fpr32(fp0, fs);
7535
            gen_helper_float_chs_s(fp0, fp0);
7536
            gen_store_fpr32(fp0, fd);
7537
            tcg_temp_free_i32(fp0);
7538
        }
7539
        opn = "neg.s";
7540
        break;
7541
    case OPC_ROUND_L_S:
7542
        check_cp1_64bitmode(ctx);
7543
        {
7544
            TCGv_i32 fp32 = tcg_temp_new_i32();
7545
            TCGv_i64 fp64 = tcg_temp_new_i64();
7546

    
7547
            gen_load_fpr32(fp32, fs);
7548
            gen_helper_float_roundl_s(fp64, cpu_env, fp32);
7549
            tcg_temp_free_i32(fp32);
7550
            gen_store_fpr64(ctx, fp64, fd);
7551
            tcg_temp_free_i64(fp64);
7552
        }
7553
        opn = "round.l.s";
7554
        break;
7555
    case OPC_TRUNC_L_S:
7556
        check_cp1_64bitmode(ctx);
7557
        {
7558
            TCGv_i32 fp32 = tcg_temp_new_i32();
7559
            TCGv_i64 fp64 = tcg_temp_new_i64();
7560

    
7561
            gen_load_fpr32(fp32, fs);
7562
            gen_helper_float_truncl_s(fp64, cpu_env, fp32);
7563
            tcg_temp_free_i32(fp32);
7564
            gen_store_fpr64(ctx, fp64, fd);
7565
            tcg_temp_free_i64(fp64);
7566
        }
7567
        opn = "trunc.l.s";
7568
        break;
7569
    case OPC_CEIL_L_S:
7570
        check_cp1_64bitmode(ctx);
7571
        {
7572
            TCGv_i32 fp32 = tcg_temp_new_i32();
7573
            TCGv_i64 fp64 = tcg_temp_new_i64();
7574

    
7575
            gen_load_fpr32(fp32, fs);
7576
            gen_helper_float_ceill_s(fp64, cpu_env, fp32);
7577
            tcg_temp_free_i32(fp32);
7578
            gen_store_fpr64(ctx, fp64, fd);
7579
            tcg_temp_free_i64(fp64);
7580
        }
7581
        opn = "ceil.l.s";
7582
        break;
7583
    case OPC_FLOOR_L_S:
7584
        check_cp1_64bitmode(ctx);
7585
        {
7586
            TCGv_i32 fp32 = tcg_temp_new_i32();
7587
            TCGv_i64 fp64 = tcg_temp_new_i64();
7588

    
7589
            gen_load_fpr32(fp32, fs);
7590
            gen_helper_float_floorl_s(fp64, cpu_env, fp32);
7591
            tcg_temp_free_i32(fp32);
7592
            gen_store_fpr64(ctx, fp64, fd);
7593
            tcg_temp_free_i64(fp64);
7594
        }
7595
        opn = "floor.l.s";
7596
        break;
7597
    case OPC_ROUND_W_S:
7598
        {
7599
            TCGv_i32 fp0 = tcg_temp_new_i32();
7600

    
7601
            gen_load_fpr32(fp0, fs);
7602
            gen_helper_float_roundw_s(fp0, cpu_env, fp0);
7603
            gen_store_fpr32(fp0, fd);
7604
            tcg_temp_free_i32(fp0);
7605
        }
7606
        opn = "round.w.s";
7607
        break;
7608
    case OPC_TRUNC_W_S:
7609
        {
7610
            TCGv_i32 fp0 = tcg_temp_new_i32();
7611

    
7612
            gen_load_fpr32(fp0, fs);
7613
            gen_helper_float_truncw_s(fp0, cpu_env, fp0);
7614
            gen_store_fpr32(fp0, fd);
7615
            tcg_temp_free_i32(fp0);
7616
        }
7617
        opn = "trunc.w.s";
7618
        break;
7619
    case OPC_CEIL_W_S:
7620
        {
7621
            TCGv_i32 fp0 = tcg_temp_new_i32();
7622

    
7623
            gen_load_fpr32(fp0, fs);
7624
            gen_helper_float_ceilw_s(fp0, cpu_env, fp0);
7625
            gen_store_fpr32(fp0, fd);
7626
            tcg_temp_free_i32(fp0);
7627
        }
7628
        opn = "ceil.w.s";
7629
        break;
7630
    case OPC_FLOOR_W_S:
7631
        {
7632
            TCGv_i32 fp0 = tcg_temp_new_i32();
7633

    
7634
            gen_load_fpr32(fp0, fs);
7635
            gen_helper_float_floorw_s(fp0, cpu_env, fp0);
7636
            gen_store_fpr32(fp0, fd);
7637
            tcg_temp_free_i32(fp0);
7638
        }
7639
        opn = "floor.w.s";
7640
        break;
7641
    case OPC_MOVCF_S:
7642
        gen_movcf_s(fs, fd, (ft >> 2) & 0x7, ft & 0x1);
7643
        opn = "movcf.s";
7644
        break;
7645
    case OPC_MOVZ_S:
7646
        {
7647
            int l1 = gen_new_label();
7648
            TCGv_i32 fp0;
7649

    
7650
            if (ft != 0) {
7651
                tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
7652
            }
7653
            fp0 = tcg_temp_new_i32();
7654
            gen_load_fpr32(fp0, fs);
7655
            gen_store_fpr32(fp0, fd);
7656
            tcg_temp_free_i32(fp0);
7657
            gen_set_label(l1);
7658
        }
7659
        opn = "movz.s";
7660
        break;
7661
    case OPC_MOVN_S:
7662
        {
7663
            int l1 = gen_new_label();
7664
            TCGv_i32 fp0;
7665

    
7666
            if (ft != 0) {
7667
                tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
7668
                fp0 = tcg_temp_new_i32();
7669
                gen_load_fpr32(fp0, fs);
7670
                gen_store_fpr32(fp0, fd);
7671
                tcg_temp_free_i32(fp0);
7672
                gen_set_label(l1);
7673
            }
7674
        }
7675
        opn = "movn.s";
7676
        break;
7677
    case OPC_RECIP_S:
7678
        check_cop1x(ctx);
7679
        {
7680
            TCGv_i32 fp0 = tcg_temp_new_i32();
7681

    
7682
            gen_load_fpr32(fp0, fs);
7683
            gen_helper_float_recip_s(fp0, cpu_env, fp0);
7684
            gen_store_fpr32(fp0, fd);
7685
            tcg_temp_free_i32(fp0);
7686
        }
7687
        opn = "recip.s";
7688
        break;
7689
    case OPC_RSQRT_S:
7690
        check_cop1x(ctx);
7691
        {
7692
            TCGv_i32 fp0 = tcg_temp_new_i32();
7693

    
7694
            gen_load_fpr32(fp0, fs);
7695
            gen_helper_float_rsqrt_s(fp0, cpu_env, fp0);
7696
            gen_store_fpr32(fp0, fd);
7697
            tcg_temp_free_i32(fp0);
7698
        }
7699
        opn = "rsqrt.s";
7700
        break;
7701
    case OPC_RECIP2_S:
7702
        check_cp1_64bitmode(ctx);
7703
        {
7704
            TCGv_i32 fp0 = tcg_temp_new_i32();
7705
            TCGv_i32 fp1 = tcg_temp_new_i32();
7706

    
7707
            gen_load_fpr32(fp0, fs);
7708
            gen_load_fpr32(fp1, ft);
7709
            gen_helper_float_recip2_s(fp0, cpu_env, fp0, fp1);
7710
            tcg_temp_free_i32(fp1);
7711
            gen_store_fpr32(fp0, fd);
7712
            tcg_temp_free_i32(fp0);
7713
        }
7714
        opn = "recip2.s";
7715
        break;
7716
    case OPC_RECIP1_S:
7717
        check_cp1_64bitmode(ctx);
7718
        {
7719
            TCGv_i32 fp0 = tcg_temp_new_i32();
7720

    
7721
            gen_load_fpr32(fp0, fs);
7722
            gen_helper_float_recip1_s(fp0, cpu_env, fp0);
7723
            gen_store_fpr32(fp0, fd);
7724
            tcg_temp_free_i32(fp0);
7725
        }
7726
        opn = "recip1.s";
7727
        break;
7728
    case OPC_RSQRT1_S:
7729
        check_cp1_64bitmode(ctx);
7730
        {
7731
            TCGv_i32 fp0 = tcg_temp_new_i32();
7732

    
7733
            gen_load_fpr32(fp0, fs);
7734
            gen_helper_float_rsqrt1_s(fp0, cpu_env, fp0);
7735
            gen_store_fpr32(fp0, fd);
7736
            tcg_temp_free_i32(fp0);
7737
        }
7738
        opn = "rsqrt1.s";
7739
        break;
7740
    case OPC_RSQRT2_S:
7741
        check_cp1_64bitmode(ctx);
7742
        {
7743
            TCGv_i32 fp0 = tcg_temp_new_i32();
7744
            TCGv_i32 fp1 = tcg_temp_new_i32();
7745

    
7746
            gen_load_fpr32(fp0, fs);
7747
            gen_load_fpr32(fp1, ft);
7748
            gen_helper_float_rsqrt2_s(fp0, cpu_env, fp0, fp1);
7749
            tcg_temp_free_i32(fp1);
7750
            gen_store_fpr32(fp0, fd);
7751
            tcg_temp_free_i32(fp0);
7752
        }
7753
        opn = "rsqrt2.s";
7754
        break;
7755
    case OPC_CVT_D_S:
7756
        check_cp1_registers(ctx, fd);
7757
        {
7758
            TCGv_i32 fp32 = tcg_temp_new_i32();
7759
            TCGv_i64 fp64 = tcg_temp_new_i64();
7760

    
7761
            gen_load_fpr32(fp32, fs);
7762
            gen_helper_float_cvtd_s(fp64, cpu_env, fp32);
7763
            tcg_temp_free_i32(fp32);
7764
            gen_store_fpr64(ctx, fp64, fd);
7765
            tcg_temp_free_i64(fp64);
7766
        }
7767
        opn = "cvt.d.s";
7768
        break;
7769
    case OPC_CVT_W_S:
7770
        {
7771
            TCGv_i32 fp0 = tcg_temp_new_i32();
7772

    
7773
            gen_load_fpr32(fp0, fs);
7774
            gen_helper_float_cvtw_s(fp0, cpu_env, fp0);
7775
            gen_store_fpr32(fp0, fd);
7776
            tcg_temp_free_i32(fp0);
7777
        }
7778
        opn = "cvt.w.s";
7779
        break;
7780
    case OPC_CVT_L_S:
7781
        check_cp1_64bitmode(ctx);
7782
        {
7783
            TCGv_i32 fp32 = tcg_temp_new_i32();
7784
            TCGv_i64 fp64 = tcg_temp_new_i64();
7785

    
7786
            gen_load_fpr32(fp32, fs);
7787
            gen_helper_float_cvtl_s(fp64, cpu_env, fp32);
7788
            tcg_temp_free_i32(fp32);
7789
            gen_store_fpr64(ctx, fp64, fd);
7790
            tcg_temp_free_i64(fp64);
7791
        }
7792
        opn = "cvt.l.s";
7793
        break;
7794
    case OPC_CVT_PS_S:
7795
        check_cp1_64bitmode(ctx);
7796
        {
7797
            TCGv_i64 fp64 = tcg_temp_new_i64();
7798
            TCGv_i32 fp32_0 = tcg_temp_new_i32();
7799
            TCGv_i32 fp32_1 = tcg_temp_new_i32();
7800

    
7801
            gen_load_fpr32(fp32_0, fs);
7802
            gen_load_fpr32(fp32_1, ft);
7803
            tcg_gen_concat_i32_i64(fp64, fp32_1, fp32_0);
7804
            tcg_temp_free_i32(fp32_1);
7805
            tcg_temp_free_i32(fp32_0);
7806
            gen_store_fpr64(ctx, fp64, fd);
7807
            tcg_temp_free_i64(fp64);
7808
        }
7809
        opn = "cvt.ps.s";
7810
        break;
7811
    case OPC_CMP_F_S:
7812
    case OPC_CMP_UN_S:
7813
    case OPC_CMP_EQ_S:
7814
    case OPC_CMP_UEQ_S:
7815
    case OPC_CMP_OLT_S:
7816
    case OPC_CMP_ULT_S:
7817
    case OPC_CMP_OLE_S:
7818
    case OPC_CMP_ULE_S:
7819
    case OPC_CMP_SF_S:
7820
    case OPC_CMP_NGLE_S:
7821
    case OPC_CMP_SEQ_S:
7822
    case OPC_CMP_NGL_S:
7823
    case OPC_CMP_LT_S:
7824
    case OPC_CMP_NGE_S:
7825
    case OPC_CMP_LE_S:
7826
    case OPC_CMP_NGT_S:
7827
        if (ctx->opcode & (1 << 6)) {
7828
            gen_cmpabs_s(ctx, func-48, ft, fs, cc);
7829
            opn = condnames_abs[func-48];
7830
        } else {
7831
            gen_cmp_s(ctx, func-48, ft, fs, cc);
7832
            opn = condnames[func-48];
7833
        }
7834
        break;
7835
    case OPC_ADD_D:
7836
        check_cp1_registers(ctx, fs | ft | fd);
7837
        {
7838
            TCGv_i64 fp0 = tcg_temp_new_i64();
7839
            TCGv_i64 fp1 = tcg_temp_new_i64();
7840

    
7841
            gen_load_fpr64(ctx, fp0, fs);
7842
            gen_load_fpr64(ctx, fp1, ft);
7843
            gen_helper_float_add_d(fp0, cpu_env, fp0, fp1);
7844
            tcg_temp_free_i64(fp1);
7845
            gen_store_fpr64(ctx, fp0, fd);
7846
            tcg_temp_free_i64(fp0);
7847
        }
7848
        opn = "add.d";
7849
        optype = BINOP;
7850
        break;
7851
    case OPC_SUB_D:
7852
        check_cp1_registers(ctx, fs | ft | fd);
7853
        {
7854
            TCGv_i64 fp0 = tcg_temp_new_i64();
7855
            TCGv_i64 fp1 = tcg_temp_new_i64();
7856

    
7857
            gen_load_fpr64(ctx, fp0, fs);
7858
            gen_load_fpr64(ctx, fp1, ft);
7859
            gen_helper_float_sub_d(fp0, cpu_env, fp0, fp1);
7860
            tcg_temp_free_i64(fp1);
7861
            gen_store_fpr64(ctx, fp0, fd);
7862
            tcg_temp_free_i64(fp0);
7863
        }
7864
        opn = "sub.d";
7865
        optype = BINOP;
7866
        break;
7867
    case OPC_MUL_D:
7868
        check_cp1_registers(ctx, fs | ft | fd);
7869
        {
7870
            TCGv_i64 fp0 = tcg_temp_new_i64();
7871
            TCGv_i64 fp1 = tcg_temp_new_i64();
7872

    
7873
            gen_load_fpr64(ctx, fp0, fs);
7874
            gen_load_fpr64(ctx, fp1, ft);
7875
            gen_helper_float_mul_d(fp0, cpu_env, fp0, fp1);
7876
            tcg_temp_free_i64(fp1);
7877
            gen_store_fpr64(ctx, fp0, fd);
7878
            tcg_temp_free_i64(fp0);
7879
        }
7880
        opn = "mul.d";
7881
        optype = BINOP;
7882
        break;
7883
    case OPC_DIV_D:
7884
        check_cp1_registers(ctx, fs | ft | fd);
7885
        {
7886
            TCGv_i64 fp0 = tcg_temp_new_i64();
7887
            TCGv_i64 fp1 = tcg_temp_new_i64();
7888

    
7889
            gen_load_fpr64(ctx, fp0, fs);
7890
            gen_load_fpr64(ctx, fp1, ft);
7891
            gen_helper_float_div_d(fp0, cpu_env, fp0, fp1);
7892
            tcg_temp_free_i64(fp1);
7893
            gen_store_fpr64(ctx, fp0, fd);
7894
            tcg_temp_free_i64(fp0);
7895
        }
7896
        opn = "div.d";
7897
        optype = BINOP;
7898
        break;
7899
    case OPC_SQRT_D:
7900
        check_cp1_registers(ctx, fs | fd);
7901
        {
7902
            TCGv_i64 fp0 = tcg_temp_new_i64();
7903

    
7904
            gen_load_fpr64(ctx, fp0, fs);
7905
            gen_helper_float_sqrt_d(fp0, cpu_env, fp0);
7906
            gen_store_fpr64(ctx, fp0, fd);
7907
            tcg_temp_free_i64(fp0);
7908
        }
7909
        opn = "sqrt.d";
7910
        break;
7911
    case OPC_ABS_D:
7912
        check_cp1_registers(ctx, fs | fd);
7913
        {
7914
            TCGv_i64 fp0 = tcg_temp_new_i64();
7915

    
7916
            gen_load_fpr64(ctx, fp0, fs);
7917
            gen_helper_float_abs_d(fp0, fp0);
7918
            gen_store_fpr64(ctx, fp0, fd);
7919
            tcg_temp_free_i64(fp0);
7920
        }
7921
        opn = "abs.d";
7922
        break;
7923
    case OPC_MOV_D:
7924
        check_cp1_registers(ctx, fs | fd);
7925
        {
7926
            TCGv_i64 fp0 = tcg_temp_new_i64();
7927

    
7928
            gen_load_fpr64(ctx, fp0, fs);
7929
            gen_store_fpr64(ctx, fp0, fd);
7930
            tcg_temp_free_i64(fp0);
7931
        }
7932
        opn = "mov.d";
7933
        break;
7934
    case OPC_NEG_D:
7935
        check_cp1_registers(ctx, fs | fd);
7936
        {
7937
            TCGv_i64 fp0 = tcg_temp_new_i64();
7938

    
7939
            gen_load_fpr64(ctx, fp0, fs);
7940
            gen_helper_float_chs_d(fp0, fp0);
7941
            gen_store_fpr64(ctx, fp0, fd);
7942
            tcg_temp_free_i64(fp0);
7943
        }
7944
        opn = "neg.d";
7945
        break;
7946
    case OPC_ROUND_L_D:
7947
        check_cp1_64bitmode(ctx);
7948
        {
7949
            TCGv_i64 fp0 = tcg_temp_new_i64();
7950

    
7951
            gen_load_fpr64(ctx, fp0, fs);
7952
            gen_helper_float_roundl_d(fp0, cpu_env, fp0);
7953
            gen_store_fpr64(ctx, fp0, fd);
7954
            tcg_temp_free_i64(fp0);
7955
        }
7956
        opn = "round.l.d";
7957
        break;
7958
    case OPC_TRUNC_L_D:
7959
        check_cp1_64bitmode(ctx);
7960
        {
7961
            TCGv_i64 fp0 = tcg_temp_new_i64();
7962

    
7963
            gen_load_fpr64(ctx, fp0, fs);
7964
            gen_helper_float_truncl_d(fp0, cpu_env, fp0);
7965
            gen_store_fpr64(ctx, fp0, fd);
7966
            tcg_temp_free_i64(fp0);
7967
        }
7968
        opn = "trunc.l.d";
7969
        break;
7970
    case OPC_CEIL_L_D:
7971
        check_cp1_64bitmode(ctx);
7972
        {
7973
            TCGv_i64 fp0 = tcg_temp_new_i64();
7974

    
7975
            gen_load_fpr64(ctx, fp0, fs);
7976
            gen_helper_float_ceill_d(fp0, cpu_env, fp0);
7977
            gen_store_fpr64(ctx, fp0, fd);
7978
            tcg_temp_free_i64(fp0);
7979
        }
7980
        opn = "ceil.l.d";
7981
        break;
7982
    case OPC_FLOOR_L_D:
7983
        check_cp1_64bitmode(ctx);
7984
        {
7985
            TCGv_i64 fp0 = tcg_temp_new_i64();
7986

    
7987
            gen_load_fpr64(ctx, fp0, fs);
7988
            gen_helper_float_floorl_d(fp0, cpu_env, fp0);
7989
            gen_store_fpr64(ctx, fp0, fd);
7990
            tcg_temp_free_i64(fp0);
7991
        }
7992
        opn = "floor.l.d";
7993
        break;
7994
    case OPC_ROUND_W_D:
7995
        check_cp1_registers(ctx, fs);
7996
        {
7997
            TCGv_i32 fp32 = tcg_temp_new_i32();
7998
            TCGv_i64 fp64 = tcg_temp_new_i64();
7999

    
8000
            gen_load_fpr64(ctx, fp64, fs);
8001
            gen_helper_float_roundw_d(fp32, cpu_env, fp64);
8002
            tcg_temp_free_i64(fp64);
8003
            gen_store_fpr32(fp32, fd);
8004
            tcg_temp_free_i32(fp32);
8005
        }
8006
        opn = "round.w.d";
8007
        break;
8008
    case OPC_TRUNC_W_D:
8009
        check_cp1_registers(ctx, fs);
8010
        {
8011
            TCGv_i32 fp32 = tcg_temp_new_i32();
8012
            TCGv_i64 fp64 = tcg_temp_new_i64();
8013

    
8014
            gen_load_fpr64(ctx, fp64, fs);
8015
            gen_helper_float_truncw_d(fp32, cpu_env, fp64);
8016
            tcg_temp_free_i64(fp64);
8017
            gen_store_fpr32(fp32, fd);
8018
            tcg_temp_free_i32(fp32);
8019
        }
8020
        opn = "trunc.w.d";
8021
        break;
8022
    case OPC_CEIL_W_D:
8023
        check_cp1_registers(ctx, fs);
8024
        {
8025
            TCGv_i32 fp32 = tcg_temp_new_i32();
8026
            TCGv_i64 fp64 = tcg_temp_new_i64();
8027

    
8028
            gen_load_fpr64(ctx, fp64, fs);
8029
            gen_helper_float_ceilw_d(fp32, cpu_env, fp64);
8030
            tcg_temp_free_i64(fp64);
8031
            gen_store_fpr32(fp32, fd);
8032
            tcg_temp_free_i32(fp32);
8033
        }
8034
        opn = "ceil.w.d";
8035
        break;
8036
    case OPC_FLOOR_W_D:
8037
        check_cp1_registers(ctx, fs);
8038
        {
8039
            TCGv_i32 fp32 = tcg_temp_new_i32();
8040
            TCGv_i64 fp64 = tcg_temp_new_i64();
8041

    
8042
            gen_load_fpr64(ctx, fp64, fs);
8043
            gen_helper_float_floorw_d(fp32, cpu_env, fp64);
8044
            tcg_temp_free_i64(fp64);
8045
            gen_store_fpr32(fp32, fd);
8046
            tcg_temp_free_i32(fp32);
8047
        }
8048
        opn = "floor.w.d";
8049
        break;
8050
    case OPC_MOVCF_D:
8051
        gen_movcf_d(ctx, fs, fd, (ft >> 2) & 0x7, ft & 0x1);
8052
        opn = "movcf.d";
8053
        break;
8054
    case OPC_MOVZ_D:
8055
        {
8056
            int l1 = gen_new_label();
8057
            TCGv_i64 fp0;
8058

    
8059
            if (ft != 0) {
8060
                tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
8061
            }
8062
            fp0 = tcg_temp_new_i64();
8063
            gen_load_fpr64(ctx, fp0, fs);
8064
            gen_store_fpr64(ctx, fp0, fd);
8065
            tcg_temp_free_i64(fp0);
8066
            gen_set_label(l1);
8067
        }
8068
        opn = "movz.d";
8069
        break;
8070
    case OPC_MOVN_D:
8071
        {
8072
            int l1 = gen_new_label();
8073
            TCGv_i64 fp0;
8074

    
8075
            if (ft != 0) {
8076
                tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
8077
                fp0 = tcg_temp_new_i64();
8078
                gen_load_fpr64(ctx, fp0, fs);
8079
                gen_store_fpr64(ctx, fp0, fd);
8080
                tcg_temp_free_i64(fp0);
8081
                gen_set_label(l1);
8082
            }
8083
        }
8084
        opn = "movn.d";
8085
        break;
8086
    case OPC_RECIP_D:
8087
        check_cp1_64bitmode(ctx);
8088
        {
8089
            TCGv_i64 fp0 = tcg_temp_new_i64();
8090

    
8091
            gen_load_fpr64(ctx, fp0, fs);
8092
            gen_helper_float_recip_d(fp0, cpu_env, fp0);
8093
            gen_store_fpr64(ctx, fp0, fd);
8094
            tcg_temp_free_i64(fp0);
8095
        }
8096
        opn = "recip.d";
8097
        break;
8098
    case OPC_RSQRT_D:
8099
        check_cp1_64bitmode(ctx);
8100
        {
8101
            TCGv_i64 fp0 = tcg_temp_new_i64();
8102

    
8103
            gen_load_fpr64(ctx, fp0, fs);
8104
            gen_helper_float_rsqrt_d(fp0, cpu_env, fp0);
8105
            gen_store_fpr64(ctx, fp0, fd);
8106
            tcg_temp_free_i64(fp0);
8107
        }
8108
        opn = "rsqrt.d";
8109
        break;
8110
    case OPC_RECIP2_D:
8111
        check_cp1_64bitmode(ctx);
8112
        {
8113
            TCGv_i64 fp0 = tcg_temp_new_i64();
8114
            TCGv_i64 fp1 = tcg_temp_new_i64();
8115

    
8116
            gen_load_fpr64(ctx, fp0, fs);
8117
            gen_load_fpr64(ctx, fp1, ft);
8118
            gen_helper_float_recip2_d(fp0, cpu_env, fp0, fp1);
8119
            tcg_temp_free_i64(fp1);
8120
            gen_store_fpr64(ctx, fp0, fd);
8121
            tcg_temp_free_i64(fp0);
8122
        }
8123
        opn = "recip2.d";
8124
        break;
8125
    case OPC_RECIP1_D:
8126
        check_cp1_64bitmode(ctx);
8127
        {
8128
            TCGv_i64 fp0 = tcg_temp_new_i64();
8129

    
8130
            gen_load_fpr64(ctx, fp0, fs);
8131
            gen_helper_float_recip1_d(fp0, cpu_env, fp0);
8132
            gen_store_fpr64(ctx, fp0, fd);
8133
            tcg_temp_free_i64(fp0);
8134
        }
8135
        opn = "recip1.d";
8136
        break;
8137
    case OPC_RSQRT1_D:
8138
        check_cp1_64bitmode(ctx);
8139
        {
8140
            TCGv_i64 fp0 = tcg_temp_new_i64();
8141

    
8142
            gen_load_fpr64(ctx, fp0, fs);
8143
            gen_helper_float_rsqrt1_d(fp0, cpu_env, fp0);
8144
            gen_store_fpr64(ctx, fp0, fd);
8145
            tcg_temp_free_i64(fp0);
8146
        }
8147
        opn = "rsqrt1.d";
8148
        break;
8149
    case OPC_RSQRT2_D:
8150
        check_cp1_64bitmode(ctx);
8151
        {
8152
            TCGv_i64 fp0 = tcg_temp_new_i64();
8153
            TCGv_i64 fp1 = tcg_temp_new_i64();
8154

    
8155
            gen_load_fpr64(ctx, fp0, fs);
8156
            gen_load_fpr64(ctx, fp1, ft);
8157
            gen_helper_float_rsqrt2_d(fp0, cpu_env, fp0, fp1);
8158
            tcg_temp_free_i64(fp1);
8159
            gen_store_fpr64(ctx, fp0, fd);
8160
            tcg_temp_free_i64(fp0);
8161
        }
8162
        opn = "rsqrt2.d";
8163
        break;
8164
    case OPC_CMP_F_D:
8165
    case OPC_CMP_UN_D:
8166
    case OPC_CMP_EQ_D:
8167
    case OPC_CMP_UEQ_D:
8168
    case OPC_CMP_OLT_D:
8169
    case OPC_CMP_ULT_D:
8170
    case OPC_CMP_OLE_D:
8171
    case OPC_CMP_ULE_D:
8172
    case OPC_CMP_SF_D:
8173
    case OPC_CMP_NGLE_D:
8174
    case OPC_CMP_SEQ_D:
8175
    case OPC_CMP_NGL_D:
8176
    case OPC_CMP_LT_D:
8177
    case OPC_CMP_NGE_D:
8178
    case OPC_CMP_LE_D:
8179
    case OPC_CMP_NGT_D:
8180
        if (ctx->opcode & (1 << 6)) {
8181
            gen_cmpabs_d(ctx, func-48, ft, fs, cc);
8182
            opn = condnames_abs[func-48];
8183
        } else {
8184
            gen_cmp_d(ctx, func-48, ft, fs, cc);
8185
            opn = condnames[func-48];
8186
        }
8187
        break;
8188
    case OPC_CVT_S_D:
8189
        check_cp1_registers(ctx, fs);
8190
        {
8191
            TCGv_i32 fp32 = tcg_temp_new_i32();
8192
            TCGv_i64 fp64 = tcg_temp_new_i64();
8193

    
8194
            gen_load_fpr64(ctx, fp64, fs);
8195
            gen_helper_float_cvts_d(fp32, cpu_env, fp64);
8196
            tcg_temp_free_i64(fp64);
8197
            gen_store_fpr32(fp32, fd);
8198
            tcg_temp_free_i32(fp32);
8199
        }
8200
        opn = "cvt.s.d";
8201
        break;
8202
    case OPC_CVT_W_D:
8203
        check_cp1_registers(ctx, fs);
8204
        {
8205
            TCGv_i32 fp32 = tcg_temp_new_i32();
8206
            TCGv_i64 fp64 = tcg_temp_new_i64();
8207

    
8208
            gen_load_fpr64(ctx, fp64, fs);
8209
            gen_helper_float_cvtw_d(fp32, cpu_env, fp64);
8210
            tcg_temp_free_i64(fp64);
8211
            gen_store_fpr32(fp32, fd);
8212
            tcg_temp_free_i32(fp32);
8213
        }
8214
        opn = "cvt.w.d";
8215
        break;
8216
    case OPC_CVT_L_D:
8217
        check_cp1_64bitmode(ctx);
8218
        {
8219
            TCGv_i64 fp0 = tcg_temp_new_i64();
8220

    
8221
            gen_load_fpr64(ctx, fp0, fs);
8222
            gen_helper_float_cvtl_d(fp0, cpu_env, fp0);
8223
            gen_store_fpr64(ctx, fp0, fd);
8224
            tcg_temp_free_i64(fp0);
8225
        }
8226
        opn = "cvt.l.d";
8227
        break;
8228
    case OPC_CVT_S_W:
8229
        {
8230
            TCGv_i32 fp0 = tcg_temp_new_i32();
8231

    
8232
            gen_load_fpr32(fp0, fs);
8233
            gen_helper_float_cvts_w(fp0, cpu_env, fp0);
8234
            gen_store_fpr32(fp0, fd);
8235
            tcg_temp_free_i32(fp0);
8236
        }
8237
        opn = "cvt.s.w";
8238
        break;
8239
    case OPC_CVT_D_W:
8240
        check_cp1_registers(ctx, fd);
8241
        {
8242
            TCGv_i32 fp32 = tcg_temp_new_i32();
8243
            TCGv_i64 fp64 = tcg_temp_new_i64();
8244

    
8245
            gen_load_fpr32(fp32, fs);
8246
            gen_helper_float_cvtd_w(fp64, cpu_env, fp32);
8247
            tcg_temp_free_i32(fp32);
8248
            gen_store_fpr64(ctx, fp64, fd);
8249
            tcg_temp_free_i64(fp64);
8250
        }
8251
        opn = "cvt.d.w";
8252
        break;
8253
    case OPC_CVT_S_L:
8254
        check_cp1_64bitmode(ctx);
8255
        {
8256
            TCGv_i32 fp32 = tcg_temp_new_i32();
8257
            TCGv_i64 fp64 = tcg_temp_new_i64();
8258

    
8259
            gen_load_fpr64(ctx, fp64, fs);
8260
            gen_helper_float_cvts_l(fp32, cpu_env, fp64);
8261
            tcg_temp_free_i64(fp64);
8262
            gen_store_fpr32(fp32, fd);
8263
            tcg_temp_free_i32(fp32);
8264
        }
8265
        opn = "cvt.s.l";
8266
        break;
8267
    case OPC_CVT_D_L:
8268
        check_cp1_64bitmode(ctx);
8269
        {
8270
            TCGv_i64 fp0 = tcg_temp_new_i64();
8271

    
8272
            gen_load_fpr64(ctx, fp0, fs);
8273
            gen_helper_float_cvtd_l(fp0, cpu_env, fp0);
8274
            gen_store_fpr64(ctx, fp0, fd);
8275
            tcg_temp_free_i64(fp0);
8276
        }
8277
        opn = "cvt.d.l";
8278
        break;
8279
    case OPC_CVT_PS_PW:
8280
        check_cp1_64bitmode(ctx);
8281
        {
8282
            TCGv_i64 fp0 = tcg_temp_new_i64();
8283

    
8284
            gen_load_fpr64(ctx, fp0, fs);
8285
            gen_helper_float_cvtps_pw(fp0, cpu_env, fp0);
8286
            gen_store_fpr64(ctx, fp0, fd);
8287
            tcg_temp_free_i64(fp0);
8288
        }
8289
        opn = "cvt.ps.pw";
8290
        break;
8291
    case OPC_ADD_PS:
8292
        check_cp1_64bitmode(ctx);
8293
        {
8294
            TCGv_i64 fp0 = tcg_temp_new_i64();
8295
            TCGv_i64 fp1 = tcg_temp_new_i64();
8296

    
8297
            gen_load_fpr64(ctx, fp0, fs);
8298
            gen_load_fpr64(ctx, fp1, ft);
8299
            gen_helper_float_add_ps(fp0, cpu_env, fp0, fp1);
8300
            tcg_temp_free_i64(fp1);
8301
            gen_store_fpr64(ctx, fp0, fd);
8302
            tcg_temp_free_i64(fp0);
8303
        }
8304
        opn = "add.ps";
8305
        break;
8306
    case OPC_SUB_PS:
8307
        check_cp1_64bitmode(ctx);
8308
        {
8309
            TCGv_i64 fp0 = tcg_temp_new_i64();
8310
            TCGv_i64 fp1 = tcg_temp_new_i64();
8311

    
8312
            gen_load_fpr64(ctx, fp0, fs);
8313
            gen_load_fpr64(ctx, fp1, ft);
8314
            gen_helper_float_sub_ps(fp0, cpu_env, fp0, fp1);
8315
            tcg_temp_free_i64(fp1);
8316
            gen_store_fpr64(ctx, fp0, fd);
8317
            tcg_temp_free_i64(fp0);
8318
        }
8319
        opn = "sub.ps";
8320
        break;
8321
    case OPC_MUL_PS:
8322
        check_cp1_64bitmode(ctx);
8323
        {
8324
            TCGv_i64 fp0 = tcg_temp_new_i64();
8325
            TCGv_i64 fp1 = tcg_temp_new_i64();
8326

    
8327
            gen_load_fpr64(ctx, fp0, fs);
8328
            gen_load_fpr64(ctx, fp1, ft);
8329
            gen_helper_float_mul_ps(fp0, cpu_env, fp0, fp1);
8330
            tcg_temp_free_i64(fp1);
8331
            gen_store_fpr64(ctx, fp0, fd);
8332
            tcg_temp_free_i64(fp0);
8333
        }
8334
        opn = "mul.ps";
8335
        break;
8336
    case OPC_ABS_PS:
8337
        check_cp1_64bitmode(ctx);
8338
        {
8339
            TCGv_i64 fp0 = tcg_temp_new_i64();
8340

    
8341
            gen_load_fpr64(ctx, fp0, fs);
8342
            gen_helper_float_abs_ps(fp0, fp0);
8343
            gen_store_fpr64(ctx, fp0, fd);
8344
            tcg_temp_free_i64(fp0);
8345
        }
8346
        opn = "abs.ps";
8347
        break;
8348
    case OPC_MOV_PS:
8349
        check_cp1_64bitmode(ctx);
8350
        {
8351
            TCGv_i64 fp0 = tcg_temp_new_i64();
8352

    
8353
            gen_load_fpr64(ctx, fp0, fs);
8354
            gen_store_fpr64(ctx, fp0, fd);
8355
            tcg_temp_free_i64(fp0);
8356
        }
8357
        opn = "mov.ps";
8358
        break;
8359
    case OPC_NEG_PS:
8360
        check_cp1_64bitmode(ctx);
8361
        {
8362
            TCGv_i64 fp0 = tcg_temp_new_i64();
8363

    
8364
            gen_load_fpr64(ctx, fp0, fs);
8365
            gen_helper_float_chs_ps(fp0, fp0);
8366
            gen_store_fpr64(ctx, fp0, fd);
8367
            tcg_temp_free_i64(fp0);
8368
        }
8369
        opn = "neg.ps";
8370
        break;
8371
    case OPC_MOVCF_PS:
8372
        check_cp1_64bitmode(ctx);
8373
        gen_movcf_ps(fs, fd, (ft >> 2) & 0x7, ft & 0x1);
8374
        opn = "movcf.ps";
8375
        break;
8376
    case OPC_MOVZ_PS:
8377
        check_cp1_64bitmode(ctx);
8378
        {
8379
            int l1 = gen_new_label();
8380
            TCGv_i64 fp0;
8381

    
8382
            if (ft != 0)
8383
                tcg_gen_brcondi_tl(TCG_COND_NE, cpu_gpr[ft], 0, l1);
8384
            fp0 = tcg_temp_new_i64();
8385
            gen_load_fpr64(ctx, fp0, fs);
8386
            gen_store_fpr64(ctx, fp0, fd);
8387
            tcg_temp_free_i64(fp0);
8388
            gen_set_label(l1);
8389
        }
8390
        opn = "movz.ps";
8391
        break;
8392
    case OPC_MOVN_PS:
8393
        check_cp1_64bitmode(ctx);
8394
        {
8395
            int l1 = gen_new_label();
8396
            TCGv_i64 fp0;
8397

    
8398
            if (ft != 0) {
8399
                tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_gpr[ft], 0, l1);
8400
                fp0 = tcg_temp_new_i64();
8401
                gen_load_fpr64(ctx, fp0, fs);
8402
                gen_store_fpr64(ctx, fp0, fd);
8403
                tcg_temp_free_i64(fp0);
8404
                gen_set_label(l1);
8405
            }
8406
        }
8407
        opn = "movn.ps";
8408
        break;
8409
    case OPC_ADDR_PS:
8410
        check_cp1_64bitmode(ctx);
8411
        {
8412
            TCGv_i64 fp0 = tcg_temp_new_i64();
8413
            TCGv_i64 fp1 = tcg_temp_new_i64();
8414

    
8415
            gen_load_fpr64(ctx, fp0, ft);
8416
            gen_load_fpr64(ctx, fp1, fs);
8417
            gen_helper_float_addr_ps(fp0, cpu_env, fp0, fp1);
8418
            tcg_temp_free_i64(fp1);
8419
            gen_store_fpr64(ctx, fp0, fd);
8420
            tcg_temp_free_i64(fp0);
8421
        }
8422
        opn = "addr.ps";
8423
        break;
8424
    case OPC_MULR_PS:
8425
        check_cp1_64bitmode(ctx);
8426
        {
8427
            TCGv_i64 fp0 = tcg_temp_new_i64();
8428
            TCGv_i64 fp1 = tcg_temp_new_i64();
8429

    
8430
            gen_load_fpr64(ctx, fp0, ft);
8431
            gen_load_fpr64(ctx, fp1, fs);
8432
            gen_helper_float_mulr_ps(fp0, cpu_env, fp0, fp1);
8433
            tcg_temp_free_i64(fp1);
8434
            gen_store_fpr64(ctx, fp0, fd);
8435
            tcg_temp_free_i64(fp0);
8436
        }
8437
        opn = "mulr.ps";
8438
        break;
8439
    case OPC_RECIP2_PS:
8440
        check_cp1_64bitmode(ctx);
8441
        {
8442
            TCGv_i64 fp0 = tcg_temp_new_i64();
8443
            TCGv_i64 fp1 = tcg_temp_new_i64();
8444

    
8445
            gen_load_fpr64(ctx, fp0, fs);
8446
            gen_load_fpr64(ctx, fp1, ft);
8447
            gen_helper_float_recip2_ps(fp0, cpu_env, fp0, fp1);
8448
            tcg_temp_free_i64(fp1);
8449
            gen_store_fpr64(ctx, fp0, fd);
8450
            tcg_temp_free_i64(fp0);
8451
        }
8452
        opn = "recip2.ps";
8453
        break;
8454
    case OPC_RECIP1_PS:
8455
        check_cp1_64bitmode(ctx);
8456
        {
8457
            TCGv_i64 fp0 = tcg_temp_new_i64();
8458

    
8459
            gen_load_fpr64(ctx, fp0, fs);
8460
            gen_helper_float_recip1_ps(fp0, cpu_env, fp0);
8461
            gen_store_fpr64(ctx, fp0, fd);
8462
            tcg_temp_free_i64(fp0);
8463
        }
8464
        opn = "recip1.ps";
8465
        break;
8466
    case OPC_RSQRT1_PS:
8467
        check_cp1_64bitmode(ctx);
8468
        {
8469
            TCGv_i64 fp0 = tcg_temp_new_i64();
8470

    
8471
            gen_load_fpr64(ctx, fp0, fs);
8472
            gen_helper_float_rsqrt1_ps(fp0, cpu_env, fp0);
8473
            gen_store_fpr64(ctx, fp0, fd);
8474
            tcg_temp_free_i64(fp0);
8475
        }
8476
        opn = "rsqrt1.ps";
8477
        break;
8478
    case OPC_RSQRT2_PS:
8479
        check_cp1_64bitmode(ctx);
8480
        {
8481
            TCGv_i64 fp0 = tcg_temp_new_i64();
8482
            TCGv_i64 fp1 = tcg_temp_new_i64();
8483

    
8484
            gen_load_fpr64(ctx, fp0, fs);
8485
            gen_load_fpr64(ctx, fp1, ft);
8486
            gen_helper_float_rsqrt2_ps(fp0, cpu_env, fp0, fp1);
8487
            tcg_temp_free_i64(fp1);
8488
            gen_store_fpr64(ctx, fp0, fd);
8489
            tcg_temp_free_i64(fp0);
8490
        }
8491
        opn = "rsqrt2.ps";
8492
        break;
8493
    case OPC_CVT_S_PU:
8494
        check_cp1_64bitmode(ctx);
8495
        {
8496
            TCGv_i32 fp0 = tcg_temp_new_i32();
8497

    
8498
            gen_load_fpr32h(fp0, fs);
8499
            gen_helper_float_cvts_pu(fp0, cpu_env, fp0);
8500
            gen_store_fpr32(fp0, fd);
8501
            tcg_temp_free_i32(fp0);
8502
        }
8503
        opn = "cvt.s.pu";
8504
        break;
8505
    case OPC_CVT_PW_PS:
8506
        check_cp1_64bitmode(ctx);
8507
        {
8508
            TCGv_i64 fp0 = tcg_temp_new_i64();
8509

    
8510
            gen_load_fpr64(ctx, fp0, fs);
8511
            gen_helper_float_cvtpw_ps(fp0, cpu_env, fp0);
8512
            gen_store_fpr64(ctx, fp0, fd);
8513
            tcg_temp_free_i64(fp0);
8514
        }
8515
        opn = "cvt.pw.ps";
8516
        break;
8517
    case OPC_CVT_S_PL:
8518
        check_cp1_64bitmode(ctx);
8519
        {
8520
            TCGv_i32 fp0 = tcg_temp_new_i32();
8521

    
8522
            gen_load_fpr32(fp0, fs);
8523
            gen_helper_float_cvts_pl(fp0, cpu_env, fp0);
8524
            gen_store_fpr32(fp0, fd);
8525
            tcg_temp_free_i32(fp0);
8526
        }
8527
        opn = "cvt.s.pl";
8528
        break;
8529
    case OPC_PLL_PS:
8530
        check_cp1_64bitmode(ctx);
8531
        {
8532
            TCGv_i32 fp0 = tcg_temp_new_i32();
8533
            TCGv_i32 fp1 = tcg_temp_new_i32();
8534

    
8535
            gen_load_fpr32(fp0, fs);
8536
            gen_load_fpr32(fp1, ft);
8537
            gen_store_fpr32h(fp0, fd);
8538
            gen_store_fpr32(fp1, fd);
8539
            tcg_temp_free_i32(fp0);
8540
            tcg_temp_free_i32(fp1);
8541
        }
8542
        opn = "pll.ps";
8543
        break;
8544
    case OPC_PLU_PS:
8545
        check_cp1_64bitmode(ctx);
8546
        {
8547
            TCGv_i32 fp0 = tcg_temp_new_i32();
8548
            TCGv_i32 fp1 = tcg_temp_new_i32();
8549

    
8550
            gen_load_fpr32(fp0, fs);
8551
            gen_load_fpr32h(fp1, ft);
8552
            gen_store_fpr32(fp1, fd);
8553
            gen_store_fpr32h(fp0, fd);
8554
            tcg_temp_free_i32(fp0);
8555
            tcg_temp_free_i32(fp1);
8556
        }
8557
        opn = "plu.ps";
8558
        break;
8559
    case OPC_PUL_PS:
8560
        check_cp1_64bitmode(ctx);
8561
        {
8562
            TCGv_i32 fp0 = tcg_temp_new_i32();
8563
            TCGv_i32 fp1 = tcg_temp_new_i32();
8564

    
8565
            gen_load_fpr32h(fp0, fs);
8566
            gen_load_fpr32(fp1, ft);
8567
            gen_store_fpr32(fp1, fd);
8568
            gen_store_fpr32h(fp0, fd);
8569
            tcg_temp_free_i32(fp0);
8570
            tcg_temp_free_i32(fp1);
8571
        }
8572
        opn = "pul.ps";
8573
        break;
8574
    case OPC_PUU_PS:
8575
        check_cp1_64bitmode(ctx);
8576
        {
8577
            TCGv_i32 fp0 = tcg_temp_new_i32();
8578
            TCGv_i32 fp1 = tcg_temp_new_i32();
8579

    
8580
            gen_load_fpr32h(fp0, fs);
8581
            gen_load_fpr32h(fp1, ft);
8582
            gen_store_fpr32(fp1, fd);
8583
            gen_store_fpr32h(fp0, fd);
8584
            tcg_temp_free_i32(fp0);
8585
            tcg_temp_free_i32(fp1);
8586
        }
8587
        opn = "puu.ps";
8588
        break;
8589
    case OPC_CMP_F_PS:
8590
    case OPC_CMP_UN_PS:
8591
    case OPC_CMP_EQ_PS:
8592
    case OPC_CMP_UEQ_PS:
8593
    case OPC_CMP_OLT_PS:
8594
    case OPC_CMP_ULT_PS:
8595
    case OPC_CMP_OLE_PS:
8596
    case OPC_CMP_ULE_PS:
8597
    case OPC_CMP_SF_PS:
8598
    case OPC_CMP_NGLE_PS:
8599
    case OPC_CMP_SEQ_PS:
8600
    case OPC_CMP_NGL_PS:
8601
    case OPC_CMP_LT_PS:
8602
    case OPC_CMP_NGE_PS:
8603
    case OPC_CMP_LE_PS:
8604
    case OPC_CMP_NGT_PS:
8605
        if (ctx->opcode & (1 << 6)) {
8606
            gen_cmpabs_ps(ctx, func-48, ft, fs, cc);
8607
            opn = condnames_abs[func-48];
8608
        } else {
8609
            gen_cmp_ps(ctx, func-48, ft, fs, cc);
8610
            opn = condnames[func-48];
8611
        }
8612
        break;
8613
    default:
8614
        MIPS_INVAL(opn);
8615
        generate_exception (ctx, EXCP_RI);
8616
        return;
8617
    }
8618
    (void)opn; /* avoid a compiler warning */
8619
    switch (optype) {
8620
    case BINOP:
8621
        MIPS_DEBUG("%s %s, %s, %s", opn, fregnames[fd], fregnames[fs], fregnames[ft]);
8622
        break;
8623
    case CMPOP:
8624
        MIPS_DEBUG("%s %s,%s", opn, fregnames[fs], fregnames[ft]);
8625
        break;
8626
    default:
8627
        MIPS_DEBUG("%s %s,%s", opn, fregnames[fd], fregnames[fs]);
8628
        break;
8629
    }
8630
}
8631

    
8632
/* Coprocessor 3 (FPU) */
8633
static void gen_flt3_ldst (DisasContext *ctx, uint32_t opc,
8634
                           int fd, int fs, int base, int index)
8635
{
8636
    const char *opn = "extended float load/store";
8637
    int store = 0;
8638
    TCGv t0 = tcg_temp_new();
8639

    
8640
    if (base == 0) {
8641
        gen_load_gpr(t0, index);
8642
    } else if (index == 0) {
8643
        gen_load_gpr(t0, base);
8644
    } else {
8645
        gen_op_addr_add(ctx, t0, cpu_gpr[base], cpu_gpr[index]);
8646
    }
8647
    /* Don't do NOP if destination is zero: we must perform the actual
8648
       memory access. */
8649
    switch (opc) {
8650
    case OPC_LWXC1:
8651
        check_cop1x(ctx);
8652
        {
8653
            TCGv_i32 fp0 = tcg_temp_new_i32();
8654

    
8655
            tcg_gen_qemu_ld32s(t0, t0, ctx->mem_idx);
8656
            tcg_gen_trunc_tl_i32(fp0, t0);
8657
            gen_store_fpr32(fp0, fd);
8658
            tcg_temp_free_i32(fp0);
8659
        }
8660
        opn = "lwxc1";
8661
        break;
8662
    case OPC_LDXC1:
8663
        check_cop1x(ctx);
8664
        check_cp1_registers(ctx, fd);
8665
        {
8666
            TCGv_i64 fp0 = tcg_temp_new_i64();
8667

    
8668
            tcg_gen_qemu_ld64(fp0, t0, ctx->mem_idx);
8669
            gen_store_fpr64(ctx, fp0, fd);
8670
            tcg_temp_free_i64(fp0);
8671
        }
8672
        opn = "ldxc1";
8673
        break;
8674
    case OPC_LUXC1:
8675
        check_cp1_64bitmode(ctx);
8676
        tcg_gen_andi_tl(t0, t0, ~0x7);
8677
        {
8678
            TCGv_i64 fp0 = tcg_temp_new_i64();
8679

    
8680
            tcg_gen_qemu_ld64(fp0, t0, ctx->mem_idx);
8681
            gen_store_fpr64(ctx, fp0, fd);
8682
            tcg_temp_free_i64(fp0);
8683
        }
8684
        opn = "luxc1";
8685
        break;
8686
    case OPC_SWXC1:
8687
        check_cop1x(ctx);
8688
        {
8689
            TCGv_i32 fp0 = tcg_temp_new_i32();
8690
            TCGv t1 = tcg_temp_new();
8691

    
8692
            gen_load_fpr32(fp0, fs);
8693
            tcg_gen_extu_i32_tl(t1, fp0);
8694
            tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);
8695
            tcg_temp_free_i32(fp0);
8696
            tcg_temp_free(t1);
8697
        }
8698
        opn = "swxc1";
8699
        store = 1;
8700
        break;
8701
    case OPC_SDXC1:
8702
        check_cop1x(ctx);
8703
        check_cp1_registers(ctx, fs);
8704
        {
8705
            TCGv_i64 fp0 = tcg_temp_new_i64();
8706

    
8707
            gen_load_fpr64(ctx, fp0, fs);
8708
            tcg_gen_qemu_st64(fp0, t0, ctx->mem_idx);
8709
            tcg_temp_free_i64(fp0);
8710
        }
8711
        opn = "sdxc1";
8712
        store = 1;
8713
        break;
8714
    case OPC_SUXC1:
8715
        check_cp1_64bitmode(ctx);
8716
        tcg_gen_andi_tl(t0, t0, ~0x7);
8717
        {
8718
            TCGv_i64 fp0 = tcg_temp_new_i64();
8719

    
8720
            gen_load_fpr64(ctx, fp0, fs);
8721
            tcg_gen_qemu_st64(fp0, t0, ctx->mem_idx);
8722
            tcg_temp_free_i64(fp0);
8723
        }
8724
        opn = "suxc1";
8725
        store = 1;
8726
        break;
8727
    }
8728
    tcg_temp_free(t0);
8729
    (void)opn; (void)store; /* avoid compiler warnings */
8730
    MIPS_DEBUG("%s %s, %s(%s)", opn, fregnames[store ? fs : fd],
8731
               regnames[index], regnames[base]);
8732
}
8733

    
8734
static void gen_flt3_arith (DisasContext *ctx, uint32_t opc,
8735
                            int fd, int fr, int fs, int ft)
8736
{
8737
    const char *opn = "flt3_arith";
8738

    
8739
    switch (opc) {
8740
    case OPC_ALNV_PS:
8741
        check_cp1_64bitmode(ctx);
8742
        {
8743
            TCGv t0 = tcg_temp_local_new();
8744
            TCGv_i32 fp = tcg_temp_new_i32();
8745
            TCGv_i32 fph = tcg_temp_new_i32();
8746
            int l1 = gen_new_label();
8747
            int l2 = gen_new_label();
8748

    
8749
            gen_load_gpr(t0, fr);
8750
            tcg_gen_andi_tl(t0, t0, 0x7);
8751

    
8752
            tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0, l1);
8753
            gen_load_fpr32(fp, fs);
8754
            gen_load_fpr32h(fph, fs);
8755
            gen_store_fpr32(fp, fd);
8756
            gen_store_fpr32h(fph, fd);
8757
            tcg_gen_br(l2);
8758
            gen_set_label(l1);
8759
            tcg_gen_brcondi_tl(TCG_COND_NE, t0, 4, l2);
8760
            tcg_temp_free(t0);
8761
#ifdef TARGET_WORDS_BIGENDIAN
8762
            gen_load_fpr32(fp, fs);
8763
            gen_load_fpr32h(fph, ft);
8764
            gen_store_fpr32h(fp, fd);
8765
            gen_store_fpr32(fph, fd);
8766
#else
8767
            gen_load_fpr32h(fph, fs);
8768
            gen_load_fpr32(fp, ft);
8769
            gen_store_fpr32(fph, fd);
8770
            gen_store_fpr32h(fp, fd);
8771
#endif
8772
            gen_set_label(l2);
8773
            tcg_temp_free_i32(fp);
8774
            tcg_temp_free_i32(fph);
8775
        }
8776
        opn = "alnv.ps";
8777
        break;
8778
    case OPC_MADD_S:
8779
        check_cop1x(ctx);
8780
        {
8781
            TCGv_i32 fp0 = tcg_temp_new_i32();
8782
            TCGv_i32 fp1 = tcg_temp_new_i32();
8783
            TCGv_i32 fp2 = tcg_temp_new_i32();
8784

    
8785
            gen_load_fpr32(fp0, fs);
8786
            gen_load_fpr32(fp1, ft);
8787
            gen_load_fpr32(fp2, fr);
8788
            gen_helper_float_madd_s(fp2, cpu_env, fp0, fp1, fp2);
8789
            tcg_temp_free_i32(fp0);
8790
            tcg_temp_free_i32(fp1);
8791
            gen_store_fpr32(fp2, fd);
8792
            tcg_temp_free_i32(fp2);
8793
        }
8794
        opn = "madd.s";
8795
        break;
8796
    case OPC_MADD_D:
8797
        check_cop1x(ctx);
8798
        check_cp1_registers(ctx, fd | fs | ft | fr);
8799
        {
8800
            TCGv_i64 fp0 = tcg_temp_new_i64();
8801
            TCGv_i64 fp1 = tcg_temp_new_i64();
8802
            TCGv_i64 fp2 = tcg_temp_new_i64();
8803

    
8804
            gen_load_fpr64(ctx, fp0, fs);
8805
            gen_load_fpr64(ctx, fp1, ft);
8806
            gen_load_fpr64(ctx, fp2, fr);
8807
            gen_helper_float_madd_d(fp2, cpu_env, fp0, fp1, fp2);
8808
            tcg_temp_free_i64(fp0);
8809
            tcg_temp_free_i64(fp1);
8810
            gen_store_fpr64(ctx, fp2, fd);
8811
            tcg_temp_free_i64(fp2);
8812
        }
8813
        opn = "madd.d";
8814
        break;
8815
    case OPC_MADD_PS:
8816
        check_cp1_64bitmode(ctx);
8817
        {
8818
            TCGv_i64 fp0 = tcg_temp_new_i64();
8819
            TCGv_i64 fp1 = tcg_temp_new_i64();
8820
            TCGv_i64 fp2 = tcg_temp_new_i64();
8821

    
8822
            gen_load_fpr64(ctx, fp0, fs);
8823
            gen_load_fpr64(ctx, fp1, ft);
8824
            gen_load_fpr64(ctx, fp2, fr);
8825
            gen_helper_float_madd_ps(fp2, cpu_env, fp0, fp1, fp2);
8826
            tcg_temp_free_i64(fp0);
8827
            tcg_temp_free_i64(fp1);
8828
            gen_store_fpr64(ctx, fp2, fd);
8829
            tcg_temp_free_i64(fp2);
8830
        }
8831
        opn = "madd.ps";
8832
        break;
8833
    case OPC_MSUB_S:
8834
        check_cop1x(ctx);
8835
        {
8836
            TCGv_i32 fp0 = tcg_temp_new_i32();
8837
            TCGv_i32 fp1 = tcg_temp_new_i32();
8838
            TCGv_i32 fp2 = tcg_temp_new_i32();
8839

    
8840
            gen_load_fpr32(fp0, fs);
8841
            gen_load_fpr32(fp1, ft);
8842
            gen_load_fpr32(fp2, fr);
8843
            gen_helper_float_msub_s(fp2, cpu_env, fp0, fp1, fp2);
8844
            tcg_temp_free_i32(fp0);
8845
            tcg_temp_free_i32(fp1);
8846
            gen_store_fpr32(fp2, fd);
8847
            tcg_temp_free_i32(fp2);
8848
        }
8849
        opn = "msub.s";
8850
        break;
8851
    case OPC_MSUB_D:
8852
        check_cop1x(ctx);
8853
        check_cp1_registers(ctx, fd | fs | ft | fr);
8854
        {
8855
            TCGv_i64 fp0 = tcg_temp_new_i64();
8856
            TCGv_i64 fp1 = tcg_temp_new_i64();
8857
            TCGv_i64 fp2 = tcg_temp_new_i64();
8858

    
8859
            gen_load_fpr64(ctx, fp0, fs);
8860
            gen_load_fpr64(ctx, fp1, ft);
8861
            gen_load_fpr64(ctx, fp2, fr);
8862
            gen_helper_float_msub_d(fp2, cpu_env, fp0, fp1, fp2);
8863
            tcg_temp_free_i64(fp0);
8864
            tcg_temp_free_i64(fp1);
8865
            gen_store_fpr64(ctx, fp2, fd);
8866
            tcg_temp_free_i64(fp2);
8867
        }
8868
        opn = "msub.d";
8869
        break;
8870
    case OPC_MSUB_PS:
8871
        check_cp1_64bitmode(ctx);
8872
        {
8873
            TCGv_i64 fp0 = tcg_temp_new_i64();
8874
            TCGv_i64 fp1 = tcg_temp_new_i64();
8875
            TCGv_i64 fp2 = tcg_temp_new_i64();
8876

    
8877
            gen_load_fpr64(ctx, fp0, fs);
8878
            gen_load_fpr64(ctx, fp1, ft);
8879
            gen_load_fpr64(ctx, fp2, fr);
8880
            gen_helper_float_msub_ps(fp2, cpu_env, fp0, fp1, fp2);
8881
            tcg_temp_free_i64(fp0);
8882
            tcg_temp_free_i64(fp1);
8883
            gen_store_fpr64(ctx, fp2, fd);
8884
            tcg_temp_free_i64(fp2);
8885
        }
8886
        opn = "msub.ps";
8887
        break;
8888
    case OPC_NMADD_S:
8889
        check_cop1x(ctx);
8890
        {
8891
            TCGv_i32 fp0 = tcg_temp_new_i32();
8892
            TCGv_i32 fp1 = tcg_temp_new_i32();
8893
            TCGv_i32 fp2 = tcg_temp_new_i32();
8894

    
8895
            gen_load_fpr32(fp0, fs);
8896
            gen_load_fpr32(fp1, ft);
8897
            gen_load_fpr32(fp2, fr);
8898
            gen_helper_float_nmadd_s(fp2, cpu_env, fp0, fp1, fp2);
8899
            tcg_temp_free_i32(fp0);
8900
            tcg_temp_free_i32(fp1);
8901
            gen_store_fpr32(fp2, fd);
8902
            tcg_temp_free_i32(fp2);
8903
        }
8904
        opn = "nmadd.s";
8905
        break;
8906
    case OPC_NMADD_D:
8907
        check_cop1x(ctx);
8908
        check_cp1_registers(ctx, fd | fs | ft | fr);
8909
        {
8910
            TCGv_i64 fp0 = tcg_temp_new_i64();
8911
            TCGv_i64 fp1 = tcg_temp_new_i64();
8912
            TCGv_i64 fp2 = tcg_temp_new_i64();
8913

    
8914
            gen_load_fpr64(ctx, fp0, fs);
8915
            gen_load_fpr64(ctx, fp1, ft);
8916
            gen_load_fpr64(ctx, fp2, fr);
8917
            gen_helper_float_nmadd_d(fp2, cpu_env, fp0, fp1, fp2);
8918
            tcg_temp_free_i64(fp0);
8919
            tcg_temp_free_i64(fp1);
8920
            gen_store_fpr64(ctx, fp2, fd);
8921
            tcg_temp_free_i64(fp2);
8922
        }
8923
        opn = "nmadd.d";
8924
        break;
8925
    case OPC_NMADD_PS:
8926
        check_cp1_64bitmode(ctx);
8927
        {
8928
            TCGv_i64 fp0 = tcg_temp_new_i64();
8929
            TCGv_i64 fp1 = tcg_temp_new_i64();
8930
            TCGv_i64 fp2 = tcg_temp_new_i64();
8931

    
8932
            gen_load_fpr64(ctx, fp0, fs);
8933
            gen_load_fpr64(ctx, fp1, ft);
8934
            gen_load_fpr64(ctx, fp2, fr);
8935
            gen_helper_float_nmadd_ps(fp2, cpu_env, fp0, fp1, fp2);
8936
            tcg_temp_free_i64(fp0);
8937
            tcg_temp_free_i64(fp1);
8938
            gen_store_fpr64(ctx, fp2, fd);
8939
            tcg_temp_free_i64(fp2);
8940
        }
8941
        opn = "nmadd.ps";
8942
        break;
8943
    case OPC_NMSUB_S:
8944
        check_cop1x(ctx);
8945
        {
8946
            TCGv_i32 fp0 = tcg_temp_new_i32();
8947
            TCGv_i32 fp1 = tcg_temp_new_i32();
8948
            TCGv_i32 fp2 = tcg_temp_new_i32();
8949

    
8950
            gen_load_fpr32(fp0, fs);
8951
            gen_load_fpr32(fp1, ft);
8952
            gen_load_fpr32(fp2, fr);
8953
            gen_helper_float_nmsub_s(fp2, cpu_env, fp0, fp1, fp2);
8954
            tcg_temp_free_i32(fp0);
8955
            tcg_temp_free_i32(fp1);
8956
            gen_store_fpr32(fp2, fd);
8957
            tcg_temp_free_i32(fp2);
8958
        }
8959
        opn = "nmsub.s";
8960
        break;
8961
    case OPC_NMSUB_D:
8962
        check_cop1x(ctx);
8963
        check_cp1_registers(ctx, fd | fs | ft | fr);
8964
        {
8965
            TCGv_i64 fp0 = tcg_temp_new_i64();
8966
            TCGv_i64 fp1 = tcg_temp_new_i64();
8967
            TCGv_i64 fp2 = tcg_temp_new_i64();
8968

    
8969
            gen_load_fpr64(ctx, fp0, fs);
8970
            gen_load_fpr64(ctx, fp1, ft);
8971
            gen_load_fpr64(ctx, fp2, fr);
8972
            gen_helper_float_nmsub_d(fp2, cpu_env, fp0, fp1, fp2);
8973
            tcg_temp_free_i64(fp0);
8974
            tcg_temp_free_i64(fp1);
8975
            gen_store_fpr64(ctx, fp2, fd);
8976
            tcg_temp_free_i64(fp2);
8977
        }
8978
        opn = "nmsub.d";
8979
        break;
8980
    case OPC_NMSUB_PS:
8981
        check_cp1_64bitmode(ctx);
8982
        {
8983
            TCGv_i64 fp0 = tcg_temp_new_i64();
8984
            TCGv_i64 fp1 = tcg_temp_new_i64();
8985
            TCGv_i64 fp2 = tcg_temp_new_i64();
8986

    
8987
            gen_load_fpr64(ctx, fp0, fs);
8988
            gen_load_fpr64(ctx, fp1, ft);
8989
            gen_load_fpr64(ctx, fp2, fr);
8990
            gen_helper_float_nmsub_ps(fp2, cpu_env, fp0, fp1, fp2);
8991
            tcg_temp_free_i64(fp0);
8992
            tcg_temp_free_i64(fp1);
8993
            gen_store_fpr64(ctx, fp2, fd);
8994
            tcg_temp_free_i64(fp2);
8995
        }
8996
        opn = "nmsub.ps";
8997
        break;
8998
    default:
8999
        MIPS_INVAL(opn);
9000
        generate_exception (ctx, EXCP_RI);
9001
        return;
9002
    }
9003
    (void)opn; /* avoid a compiler warning */
9004
    MIPS_DEBUG("%s %s, %s, %s, %s", opn, fregnames[fd], fregnames[fr],
9005
               fregnames[fs], fregnames[ft]);
9006
}
9007

    
9008
static void gen_rdhwr(DisasContext *ctx, int rt, int rd)
9009
{
9010
    TCGv t0;
9011

    
9012
#if !defined(CONFIG_USER_ONLY)
9013
    /* The Linux kernel will emulate rdhwr if it's not supported natively.
9014
       Therefore only check the ISA in system mode.  */
9015
    check_insn(ctx, ISA_MIPS32R2);
9016
#endif
9017
    t0 = tcg_temp_new();
9018

    
9019
    switch (rd) {
9020
    case 0:
9021
        save_cpu_state(ctx, 1);
9022
        gen_helper_rdhwr_cpunum(t0, cpu_env);
9023
        gen_store_gpr(t0, rt);
9024
        break;
9025
    case 1:
9026
        save_cpu_state(ctx, 1);
9027
        gen_helper_rdhwr_synci_step(t0, cpu_env);
9028
        gen_store_gpr(t0, rt);
9029
        break;
9030
    case 2:
9031
        save_cpu_state(ctx, 1);
9032
        gen_helper_rdhwr_cc(t0, cpu_env);
9033
        gen_store_gpr(t0, rt);
9034
        break;
9035
    case 3:
9036
        save_cpu_state(ctx, 1);
9037
        gen_helper_rdhwr_ccres(t0, cpu_env);
9038
        gen_store_gpr(t0, rt);
9039
        break;
9040
    case 29:
9041
#if defined(CONFIG_USER_ONLY)
9042
        tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUMIPSState, tls_value));
9043
        gen_store_gpr(t0, rt);
9044
        break;
9045
#else
9046
        /* XXX: Some CPUs implement this in hardware.
9047
           Not supported yet. */
9048
#endif
9049
    default:            /* Invalid */
9050
        MIPS_INVAL("rdhwr");
9051
        generate_exception(ctx, EXCP_RI);
9052
        break;
9053
    }
9054
    tcg_temp_free(t0);
9055
}
9056

    
9057
static void handle_delay_slot(DisasContext *ctx, int insn_bytes)
9058
{
9059
    if (ctx->hflags & MIPS_HFLAG_BMASK) {
9060
        int proc_hflags = ctx->hflags & MIPS_HFLAG_BMASK;
9061
        /* Branches completion */
9062
        ctx->hflags &= ~MIPS_HFLAG_BMASK;
9063
        ctx->bstate = BS_BRANCH;
9064
        save_cpu_state(ctx, 0);
9065
        /* FIXME: Need to clear can_do_io.  */
9066
        switch (proc_hflags & MIPS_HFLAG_BMASK_BASE) {
9067
        case MIPS_HFLAG_B:
9068
            /* unconditional branch */
9069
            MIPS_DEBUG("unconditional branch");
9070
            if (proc_hflags & MIPS_HFLAG_BX) {
9071
                tcg_gen_xori_i32(hflags, hflags, MIPS_HFLAG_M16);
9072
            }
9073
            gen_goto_tb(ctx, 0, ctx->btarget);
9074
            break;
9075
        case MIPS_HFLAG_BL:
9076
            /* blikely taken case */
9077
            MIPS_DEBUG("blikely branch taken");
9078
            gen_goto_tb(ctx, 0, ctx->btarget);
9079
            break;
9080
        case MIPS_HFLAG_BC:
9081
            /* Conditional branch */
9082
            MIPS_DEBUG("conditional branch");
9083
            {
9084
                int l1 = gen_new_label();
9085

    
9086
                tcg_gen_brcondi_tl(TCG_COND_NE, bcond, 0, l1);
9087
                gen_goto_tb(ctx, 1, ctx->pc + insn_bytes);
9088
                gen_set_label(l1);
9089
                gen_goto_tb(ctx, 0, ctx->btarget);
9090
            }
9091
            break;
9092
        case MIPS_HFLAG_BR:
9093
            /* unconditional branch to register */
9094
            MIPS_DEBUG("branch to register");
9095
            if (ctx->insn_flags & (ASE_MIPS16 | ASE_MICROMIPS)) {
9096
                TCGv t0 = tcg_temp_new();
9097
                TCGv_i32 t1 = tcg_temp_new_i32();
9098

    
9099
                tcg_gen_andi_tl(t0, btarget, 0x1);
9100
                tcg_gen_trunc_tl_i32(t1, t0);
9101
                tcg_temp_free(t0);
9102
                tcg_gen_andi_i32(hflags, hflags, ~(uint32_t)MIPS_HFLAG_M16);
9103
                tcg_gen_shli_i32(t1, t1, MIPS_HFLAG_M16_SHIFT);
9104
                tcg_gen_or_i32(hflags, hflags, t1);
9105
                tcg_temp_free_i32(t1);
9106

    
9107
                tcg_gen_andi_tl(cpu_PC, btarget, ~(target_ulong)0x1);
9108
            } else {
9109
                tcg_gen_mov_tl(cpu_PC, btarget);
9110
            }
9111
            if (ctx->singlestep_enabled) {
9112
                save_cpu_state(ctx, 0);
9113
                gen_helper_0e0i(raise_exception, EXCP_DEBUG);
9114
            }
9115
            tcg_gen_exit_tb(0);
9116
            break;
9117
        default:
9118
            MIPS_DEBUG("unknown branch");
9119
            break;
9120
        }
9121
    }
9122
}
9123

    
9124
/* ISA extensions (ASEs) */
9125
/* MIPS16 extension to MIPS32 */
9126

    
9127
/* MIPS16 major opcodes */
9128
enum {
9129
  M16_OPC_ADDIUSP = 0x00,
9130
  M16_OPC_ADDIUPC = 0x01,
9131
  M16_OPC_B = 0x02,
9132
  M16_OPC_JAL = 0x03,
9133
  M16_OPC_BEQZ = 0x04,
9134
  M16_OPC_BNEQZ = 0x05,
9135
  M16_OPC_SHIFT = 0x06,
9136
  M16_OPC_LD = 0x07,
9137
  M16_OPC_RRIA = 0x08,
9138
  M16_OPC_ADDIU8 = 0x09,
9139
  M16_OPC_SLTI = 0x0a,
9140
  M16_OPC_SLTIU = 0x0b,
9141
  M16_OPC_I8 = 0x0c,
9142
  M16_OPC_LI = 0x0d,
9143
  M16_OPC_CMPI = 0x0e,
9144
  M16_OPC_SD = 0x0f,
9145
  M16_OPC_LB = 0x10,
9146
  M16_OPC_LH = 0x11,
9147
  M16_OPC_LWSP = 0x12,
9148
  M16_OPC_LW = 0x13,
9149
  M16_OPC_LBU = 0x14,
9150
  M16_OPC_LHU = 0x15,
9151
  M16_OPC_LWPC = 0x16,
9152
  M16_OPC_LWU = 0x17,
9153
  M16_OPC_SB = 0x18,
9154
  M16_OPC_SH = 0x19,
9155
  M16_OPC_SWSP = 0x1a,
9156
  M16_OPC_SW = 0x1b,
9157
  M16_OPC_RRR = 0x1c,
9158
  M16_OPC_RR = 0x1d,
9159
  M16_OPC_EXTEND = 0x1e,
9160
  M16_OPC_I64 = 0x1f
9161
};
9162

    
9163
/* I8 funct field */
9164
enum {
9165
  I8_BTEQZ = 0x0,
9166
  I8_BTNEZ = 0x1,
9167
  I8_SWRASP = 0x2,
9168
  I8_ADJSP = 0x3,
9169
  I8_SVRS = 0x4,
9170
  I8_MOV32R = 0x5,
9171
  I8_MOVR32 = 0x7
9172
};
9173

    
9174
/* RRR f field */
9175
enum {
9176
  RRR_DADDU = 0x0,
9177
  RRR_ADDU = 0x1,
9178
  RRR_DSUBU = 0x2,
9179
  RRR_SUBU = 0x3
9180
};
9181

    
9182
/* RR funct field */
9183
enum {
9184
  RR_JR = 0x00,
9185
  RR_SDBBP = 0x01,
9186
  RR_SLT = 0x02,
9187
  RR_SLTU = 0x03,
9188
  RR_SLLV = 0x04,
9189
  RR_BREAK = 0x05,
9190
  RR_SRLV = 0x06,
9191
  RR_SRAV = 0x07,
9192
  RR_DSRL = 0x08,
9193
  RR_CMP = 0x0a,
9194
  RR_NEG = 0x0b,
9195
  RR_AND = 0x0c,
9196
  RR_OR = 0x0d,
9197
  RR_XOR = 0x0e,
9198
  RR_NOT = 0x0f,
9199
  RR_MFHI = 0x10,
9200
  RR_CNVT = 0x11,
9201
  RR_MFLO = 0x12,
9202
  RR_DSRA = 0x13,
9203
  RR_DSLLV = 0x14,
9204
  RR_DSRLV = 0x16,
9205
  RR_DSRAV = 0x17,
9206
  RR_MULT = 0x18,
9207
  RR_MULTU = 0x19,
9208
  RR_DIV = 0x1a,
9209
  RR_DIVU = 0x1b,
9210
  RR_DMULT = 0x1c,
9211
  RR_DMULTU = 0x1d,
9212
  RR_DDIV = 0x1e,
9213
  RR_DDIVU = 0x1f
9214
};
9215

    
9216
/* I64 funct field */
9217
enum {
9218
  I64_LDSP = 0x0,
9219
  I64_SDSP = 0x1,
9220
  I64_SDRASP = 0x2,
9221
  I64_DADJSP = 0x3,
9222
  I64_LDPC = 0x4,
9223
  I64_DADDIU5 = 0x5,
9224
  I64_DADDIUPC = 0x6,
9225
  I64_DADDIUSP = 0x7
9226
};
9227

    
9228
/* RR ry field for CNVT */
9229
enum {
9230
  RR_RY_CNVT_ZEB = 0x0,
9231
  RR_RY_CNVT_ZEH = 0x1,
9232
  RR_RY_CNVT_ZEW = 0x2,
9233
  RR_RY_CNVT_SEB = 0x4,
9234
  RR_RY_CNVT_SEH = 0x5,
9235
  RR_RY_CNVT_SEW = 0x6,
9236
};
9237

    
9238
static int xlat (int r)
9239
{
9240
  static int map[] = { 16, 17, 2, 3, 4, 5, 6, 7 };
9241

    
9242
  return map[r];
9243
}
9244

    
9245
static void gen_mips16_save (DisasContext *ctx,
9246
                             int xsregs, int aregs,
9247
                             int do_ra, int do_s0, int do_s1,
9248
                             int framesize)
9249
{
9250
    TCGv t0 = tcg_temp_new();
9251
    TCGv t1 = tcg_temp_new();
9252
    int args, astatic;
9253

    
9254
    switch (aregs) {
9255
    case 0:
9256
    case 1:
9257
    case 2:
9258
    case 3:
9259
    case 11:
9260
        args = 0;
9261
        break;
9262
    case 4:
9263
    case 5:
9264
    case 6:
9265
    case 7:
9266
        args = 1;
9267
        break;
9268
    case 8:
9269
    case 9:
9270
    case 10:
9271
        args = 2;
9272
        break;
9273
    case 12:
9274
    case 13:
9275
        args = 3;
9276
        break;
9277
    case 14:
9278
        args = 4;
9279
        break;
9280
    default:
9281
        generate_exception(ctx, EXCP_RI);
9282
        return;
9283
    }
9284

    
9285
    switch (args) {
9286
    case 4:
9287
        gen_base_offset_addr(ctx, t0, 29, 12);
9288
        gen_load_gpr(t1, 7);
9289
        tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);
9290
        /* Fall through */
9291
    case 3:
9292
        gen_base_offset_addr(ctx, t0, 29, 8);
9293
        gen_load_gpr(t1, 6);
9294
        tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);
9295
        /* Fall through */
9296
    case 2:
9297
        gen_base_offset_addr(ctx, t0, 29, 4);
9298
        gen_load_gpr(t1, 5);
9299
        tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);
9300
        /* Fall through */
9301
    case 1:
9302
        gen_base_offset_addr(ctx, t0, 29, 0);
9303
        gen_load_gpr(t1, 4);
9304
        tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);
9305
    }
9306

    
9307
    gen_load_gpr(t0, 29);
9308

    
9309
#define DECR_AND_STORE(reg) do {                \
9310
        tcg_gen_subi_tl(t0, t0, 4);             \
9311
        gen_load_gpr(t1, reg);                  \
9312
        tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);                  \
9313
    } while (0)
9314

    
9315
    if (do_ra) {
9316
        DECR_AND_STORE(31);
9317
    }
9318

    
9319
    switch (xsregs) {
9320
    case 7:
9321
        DECR_AND_STORE(30);
9322
        /* Fall through */
9323
    case 6:
9324
        DECR_AND_STORE(23);
9325
        /* Fall through */
9326
    case 5:
9327
        DECR_AND_STORE(22);
9328
        /* Fall through */
9329
    case 4:
9330
        DECR_AND_STORE(21);
9331
        /* Fall through */
9332
    case 3:
9333
        DECR_AND_STORE(20);
9334
        /* Fall through */
9335
    case 2:
9336
        DECR_AND_STORE(19);
9337
        /* Fall through */
9338
    case 1:
9339
        DECR_AND_STORE(18);
9340
    }
9341

    
9342
    if (do_s1) {
9343
        DECR_AND_STORE(17);
9344
    }
9345
    if (do_s0) {
9346
        DECR_AND_STORE(16);
9347
    }
9348

    
9349
    switch (aregs) {
9350
    case 0:
9351
    case 4:
9352
    case 8:
9353
    case 12:
9354
    case 14:
9355
        astatic = 0;
9356
        break;
9357
    case 1:
9358
    case 5:
9359
    case 9:
9360
    case 13:
9361
        astatic = 1;
9362
        break;
9363
    case 2:
9364
    case 6:
9365
    case 10:
9366
        astatic = 2;
9367
        break;
9368
    case 3:
9369
    case 7:
9370
        astatic = 3;
9371
        break;
9372
    case 11:
9373
        astatic = 4;
9374
        break;
9375
    default:
9376
        generate_exception(ctx, EXCP_RI);
9377
        return;
9378
    }
9379

    
9380
    if (astatic > 0) {
9381
        DECR_AND_STORE(7);
9382
        if (astatic > 1) {
9383
            DECR_AND_STORE(6);
9384
            if (astatic > 2) {
9385
                DECR_AND_STORE(5);
9386
                if (astatic > 3) {
9387
                    DECR_AND_STORE(4);
9388
                }
9389
            }
9390
        }
9391
    }
9392
#undef DECR_AND_STORE
9393

    
9394
    tcg_gen_subi_tl(cpu_gpr[29], cpu_gpr[29], framesize);
9395
    tcg_temp_free(t0);
9396
    tcg_temp_free(t1);
9397
}
9398

    
9399
static void gen_mips16_restore (DisasContext *ctx,
9400
                                int xsregs, int aregs,
9401
                                int do_ra, int do_s0, int do_s1,
9402
                                int framesize)
9403
{
9404
    int astatic;
9405
    TCGv t0 = tcg_temp_new();
9406
    TCGv t1 = tcg_temp_new();
9407

    
9408
    tcg_gen_addi_tl(t0, cpu_gpr[29], framesize);
9409

    
9410
#define DECR_AND_LOAD(reg) do {                   \
9411
        tcg_gen_subi_tl(t0, t0, 4);               \
9412
        tcg_gen_qemu_ld32s(t1, t0, ctx->mem_idx); \
9413
        gen_store_gpr(t1, reg);                   \
9414
    } while (0)
9415

    
9416
    if (do_ra) {
9417
        DECR_AND_LOAD(31);
9418
    }
9419

    
9420
    switch (xsregs) {
9421
    case 7:
9422
        DECR_AND_LOAD(30);
9423
        /* Fall through */
9424
    case 6:
9425
        DECR_AND_LOAD(23);
9426
        /* Fall through */
9427
    case 5:
9428
        DECR_AND_LOAD(22);
9429
        /* Fall through */
9430
    case 4:
9431
        DECR_AND_LOAD(21);
9432
        /* Fall through */
9433
    case 3:
9434
        DECR_AND_LOAD(20);
9435
        /* Fall through */
9436
    case 2:
9437
        DECR_AND_LOAD(19);
9438
        /* Fall through */
9439
    case 1:
9440
        DECR_AND_LOAD(18);
9441
    }
9442

    
9443
    if (do_s1) {
9444
        DECR_AND_LOAD(17);
9445
    }
9446
    if (do_s0) {
9447
        DECR_AND_LOAD(16);
9448
    }
9449

    
9450
    switch (aregs) {
9451
    case 0:
9452
    case 4:
9453
    case 8:
9454
    case 12:
9455
    case 14:
9456
        astatic = 0;
9457
        break;
9458
    case 1:
9459
    case 5:
9460
    case 9:
9461
    case 13:
9462
        astatic = 1;
9463
        break;
9464
    case 2:
9465
    case 6:
9466
    case 10:
9467
        astatic = 2;
9468
        break;
9469
    case 3:
9470
    case 7:
9471
        astatic = 3;
9472
        break;
9473
    case 11:
9474
        astatic = 4;
9475
        break;
9476
    default:
9477
        generate_exception(ctx, EXCP_RI);
9478
        return;
9479
    }
9480

    
9481
    if (astatic > 0) {
9482
        DECR_AND_LOAD(7);
9483
        if (astatic > 1) {
9484
            DECR_AND_LOAD(6);
9485
            if (astatic > 2) {
9486
                DECR_AND_LOAD(5);
9487
                if (astatic > 3) {
9488
                    DECR_AND_LOAD(4);
9489
                }
9490
            }
9491
        }
9492
    }
9493
#undef DECR_AND_LOAD
9494

    
9495
    tcg_gen_addi_tl(cpu_gpr[29], cpu_gpr[29], framesize);
9496
    tcg_temp_free(t0);
9497
    tcg_temp_free(t1);
9498
}
9499

    
9500
static void gen_addiupc (DisasContext *ctx, int rx, int imm,
9501
                         int is_64_bit, int extended)
9502
{
9503
    TCGv t0;
9504

    
9505
    if (extended && (ctx->hflags & MIPS_HFLAG_BMASK)) {
9506
        generate_exception(ctx, EXCP_RI);
9507
        return;
9508
    }
9509

    
9510
    t0 = tcg_temp_new();
9511

    
9512
    tcg_gen_movi_tl(t0, pc_relative_pc(ctx));
9513
    tcg_gen_addi_tl(cpu_gpr[rx], t0, imm);
9514
    if (!is_64_bit) {
9515
        tcg_gen_ext32s_tl(cpu_gpr[rx], cpu_gpr[rx]);
9516
    }
9517

    
9518
    tcg_temp_free(t0);
9519
}
9520

    
9521
#if defined(TARGET_MIPS64)
9522
static void decode_i64_mips16 (DisasContext *ctx,
9523
                               int ry, int funct, int16_t offset,
9524
                               int extended)
9525
{
9526
    switch (funct) {
9527
    case I64_LDSP:
9528
        check_mips_64(ctx);
9529
        offset = extended ? offset : offset << 3;
9530
        gen_ld(ctx, OPC_LD, ry, 29, offset);
9531
        break;
9532
    case I64_SDSP:
9533
        check_mips_64(ctx);
9534
        offset = extended ? offset : offset << 3;
9535
        gen_st(ctx, OPC_SD, ry, 29, offset);
9536
        break;
9537
    case I64_SDRASP:
9538
        check_mips_64(ctx);
9539
        offset = extended ? offset : (ctx->opcode & 0xff) << 3;
9540
        gen_st(ctx, OPC_SD, 31, 29, offset);
9541
        break;
9542
    case I64_DADJSP:
9543
        check_mips_64(ctx);
9544
        offset = extended ? offset : ((int8_t)ctx->opcode) << 3;
9545
        gen_arith_imm(ctx, OPC_DADDIU, 29, 29, offset);
9546
        break;
9547
    case I64_LDPC:
9548
        if (extended && (ctx->hflags & MIPS_HFLAG_BMASK)) {
9549
            generate_exception(ctx, EXCP_RI);
9550
        } else {
9551
            offset = extended ? offset : offset << 3;
9552
            gen_ld(ctx, OPC_LDPC, ry, 0, offset);
9553
        }
9554
        break;
9555
    case I64_DADDIU5:
9556
        check_mips_64(ctx);
9557
        offset = extended ? offset : ((int8_t)(offset << 3)) >> 3;
9558
        gen_arith_imm(ctx, OPC_DADDIU, ry, ry, offset);
9559
        break;
9560
    case I64_DADDIUPC:
9561
        check_mips_64(ctx);
9562
        offset = extended ? offset : offset << 2;
9563
        gen_addiupc(ctx, ry, offset, 1, extended);
9564
        break;
9565
    case I64_DADDIUSP:
9566
        check_mips_64(ctx);
9567
        offset = extended ? offset : offset << 2;
9568
        gen_arith_imm(ctx, OPC_DADDIU, ry, 29, offset);
9569
        break;
9570
    }
9571
}
9572
#endif
9573

    
9574
static int decode_extended_mips16_opc (CPUMIPSState *env, DisasContext *ctx)
9575
{
9576
    int extend = cpu_lduw_code(env, ctx->pc + 2);
9577
    int op, rx, ry, funct, sa;
9578
    int16_t imm, offset;
9579

    
9580
    ctx->opcode = (ctx->opcode << 16) | extend;
9581
    op = (ctx->opcode >> 11) & 0x1f;
9582
    sa = (ctx->opcode >> 22) & 0x1f;
9583
    funct = (ctx->opcode >> 8) & 0x7;
9584
    rx = xlat((ctx->opcode >> 8) & 0x7);
9585
    ry = xlat((ctx->opcode >> 5) & 0x7);
9586
    offset = imm = (int16_t) (((ctx->opcode >> 16) & 0x1f) << 11
9587
                              | ((ctx->opcode >> 21) & 0x3f) << 5
9588
                              | (ctx->opcode & 0x1f));
9589

    
9590
    /* The extended opcodes cleverly reuse the opcodes from their 16-bit
9591
       counterparts.  */
9592
    switch (op) {
9593
    case M16_OPC_ADDIUSP:
9594
        gen_arith_imm(ctx, OPC_ADDIU, rx, 29, imm);
9595
        break;
9596
    case M16_OPC_ADDIUPC:
9597
        gen_addiupc(ctx, rx, imm, 0, 1);
9598
        break;
9599
    case M16_OPC_B:
9600
        gen_compute_branch(ctx, OPC_BEQ, 4, 0, 0, offset << 1);
9601
        /* No delay slot, so just process as a normal instruction */
9602
        break;
9603
    case M16_OPC_BEQZ:
9604
        gen_compute_branch(ctx, OPC_BEQ, 4, rx, 0, offset << 1);
9605
        /* No delay slot, so just process as a normal instruction */
9606
        break;
9607
    case M16_OPC_BNEQZ:
9608
        gen_compute_branch(ctx, OPC_BNE, 4, rx, 0, offset << 1);
9609
        /* No delay slot, so just process as a normal instruction */
9610
        break;
9611
    case M16_OPC_SHIFT:
9612
        switch (ctx->opcode & 0x3) {
9613
        case 0x0:
9614
            gen_shift_imm(ctx, OPC_SLL, rx, ry, sa);
9615
            break;
9616
        case 0x1:
9617
#if defined(TARGET_MIPS64)
9618
            check_mips_64(ctx);
9619
            gen_shift_imm(ctx, OPC_DSLL, rx, ry, sa);
9620
#else
9621
            generate_exception(ctx, EXCP_RI);
9622
#endif
9623
            break;
9624
        case 0x2:
9625
            gen_shift_imm(ctx, OPC_SRL, rx, ry, sa);
9626
            break;
9627
        case 0x3:
9628
            gen_shift_imm(ctx, OPC_SRA, rx, ry, sa);
9629
            break;
9630
        }
9631
        break;
9632
#if defined(TARGET_MIPS64)
9633
    case M16_OPC_LD:
9634
            check_mips_64(ctx);
9635
        gen_ld(ctx, OPC_LD, ry, rx, offset);
9636
        break;
9637
#endif
9638
    case M16_OPC_RRIA:
9639
        imm = ctx->opcode & 0xf;
9640
        imm = imm | ((ctx->opcode >> 20) & 0x7f) << 4;
9641
        imm = imm | ((ctx->opcode >> 16) & 0xf) << 11;
9642
        imm = (int16_t) (imm << 1) >> 1;
9643
        if ((ctx->opcode >> 4) & 0x1) {
9644
#if defined(TARGET_MIPS64)
9645
            check_mips_64(ctx);
9646
            gen_arith_imm(ctx, OPC_DADDIU, ry, rx, imm);
9647
#else
9648
            generate_exception(ctx, EXCP_RI);
9649
#endif
9650
        } else {
9651
            gen_arith_imm(ctx, OPC_ADDIU, ry, rx, imm);
9652
        }
9653
        break;
9654
    case M16_OPC_ADDIU8:
9655
        gen_arith_imm(ctx, OPC_ADDIU, rx, rx, imm);
9656
        break;
9657
    case M16_OPC_SLTI:
9658
        gen_slt_imm(ctx, OPC_SLTI, 24, rx, imm);
9659
        break;
9660
    case M16_OPC_SLTIU:
9661
        gen_slt_imm(ctx, OPC_SLTIU, 24, rx, imm);
9662
        break;
9663
    case M16_OPC_I8:
9664
        switch (funct) {
9665
        case I8_BTEQZ:
9666
            gen_compute_branch(ctx, OPC_BEQ, 4, 24, 0, offset << 1);
9667
            break;
9668
        case I8_BTNEZ:
9669
            gen_compute_branch(ctx, OPC_BNE, 4, 24, 0, offset << 1);
9670
            break;
9671
        case I8_SWRASP:
9672
            gen_st(ctx, OPC_SW, 31, 29, imm);
9673
            break;
9674
        case I8_ADJSP:
9675
            gen_arith_imm(ctx, OPC_ADDIU, 29, 29, imm);
9676
            break;
9677
        case I8_SVRS:
9678
            {
9679
                int xsregs = (ctx->opcode >> 24) & 0x7;
9680
                int aregs = (ctx->opcode >> 16) & 0xf;
9681
                int do_ra = (ctx->opcode >> 6) & 0x1;
9682
                int do_s0 = (ctx->opcode >> 5) & 0x1;
9683
                int do_s1 = (ctx->opcode >> 4) & 0x1;
9684
                int framesize = (((ctx->opcode >> 20) & 0xf) << 4
9685
                                 | (ctx->opcode & 0xf)) << 3;
9686

    
9687
                if (ctx->opcode & (1 << 7)) {
9688
                    gen_mips16_save(ctx, xsregs, aregs,
9689
                                    do_ra, do_s0, do_s1,
9690
                                    framesize);
9691
                } else {
9692
                    gen_mips16_restore(ctx, xsregs, aregs,
9693
                                       do_ra, do_s0, do_s1,
9694
                                       framesize);
9695
                }
9696
            }
9697
            break;
9698
        default:
9699
            generate_exception(ctx, EXCP_RI);
9700
            break;
9701
        }
9702
        break;
9703
    case M16_OPC_LI:
9704
        tcg_gen_movi_tl(cpu_gpr[rx], (uint16_t) imm);
9705
        break;
9706
    case M16_OPC_CMPI:
9707
        tcg_gen_xori_tl(cpu_gpr[24], cpu_gpr[rx], (uint16_t) imm);
9708
        break;
9709
#if defined(TARGET_MIPS64)
9710
    case M16_OPC_SD:
9711
        gen_st(ctx, OPC_SD, ry, rx, offset);
9712
        break;
9713
#endif
9714
    case M16_OPC_LB:
9715
        gen_ld(ctx, OPC_LB, ry, rx, offset);
9716
        break;
9717
    case M16_OPC_LH:
9718
        gen_ld(ctx, OPC_LH, ry, rx, offset);
9719
        break;
9720
    case M16_OPC_LWSP:
9721
        gen_ld(ctx, OPC_LW, rx, 29, offset);
9722
        break;
9723
    case M16_OPC_LW:
9724
        gen_ld(ctx, OPC_LW, ry, rx, offset);
9725
        break;
9726
    case M16_OPC_LBU:
9727
        gen_ld(ctx, OPC_LBU, ry, rx, offset);
9728
        break;
9729
    case M16_OPC_LHU:
9730
        gen_ld(ctx, OPC_LHU, ry, rx, offset);
9731
        break;
9732
    case M16_OPC_LWPC:
9733
        gen_ld(ctx, OPC_LWPC, rx, 0, offset);
9734
        break;
9735
#if defined(TARGET_MIPS64)
9736
    case M16_OPC_LWU:
9737
        gen_ld(ctx, OPC_LWU, ry, rx, offset);
9738
        break;
9739
#endif
9740
    case M16_OPC_SB:
9741
        gen_st(ctx, OPC_SB, ry, rx, offset);
9742
        break;
9743
    case M16_OPC_SH:
9744
        gen_st(ctx, OPC_SH, ry, rx, offset);
9745
        break;
9746
    case M16_OPC_SWSP:
9747
        gen_st(ctx, OPC_SW, rx, 29, offset);
9748
        break;
9749
    case M16_OPC_SW:
9750
        gen_st(ctx, OPC_SW, ry, rx, offset);
9751
        break;
9752
#if defined(TARGET_MIPS64)
9753
    case M16_OPC_I64:
9754
        decode_i64_mips16(ctx, ry, funct, offset, 1);
9755
        break;
9756
#endif
9757
    default:
9758
        generate_exception(ctx, EXCP_RI);
9759
        break;
9760
    }
9761

    
9762
    return 4;
9763
}
9764

    
9765
static int decode_mips16_opc (CPUMIPSState *env, DisasContext *ctx)
9766
{
9767
    int rx, ry;
9768
    int sa;
9769
    int op, cnvt_op, op1, offset;
9770
    int funct;
9771
    int n_bytes;
9772

    
9773
    op = (ctx->opcode >> 11) & 0x1f;
9774
    sa = (ctx->opcode >> 2) & 0x7;
9775
    sa = sa == 0 ? 8 : sa;
9776
    rx = xlat((ctx->opcode >> 8) & 0x7);
9777
    cnvt_op = (ctx->opcode >> 5) & 0x7;
9778
    ry = xlat((ctx->opcode >> 5) & 0x7);
9779
    op1 = offset = ctx->opcode & 0x1f;
9780

    
9781
    n_bytes = 2;
9782

    
9783
    switch (op) {
9784
    case M16_OPC_ADDIUSP:
9785
        {
9786
            int16_t imm = ((uint8_t) ctx->opcode) << 2;
9787

    
9788
            gen_arith_imm(ctx, OPC_ADDIU, rx, 29, imm);
9789
        }
9790
        break;
9791
    case M16_OPC_ADDIUPC:
9792
        gen_addiupc(ctx, rx, ((uint8_t) ctx->opcode) << 2, 0, 0);
9793
        break;
9794
    case M16_OPC_B:
9795
        offset = (ctx->opcode & 0x7ff) << 1;
9796
        offset = (int16_t)(offset << 4) >> 4;
9797
        gen_compute_branch(ctx, OPC_BEQ, 2, 0, 0, offset);
9798
        /* No delay slot, so just process as a normal instruction */
9799
        break;
9800
    case M16_OPC_JAL:
9801
        offset = cpu_lduw_code(env, ctx->pc + 2);
9802
        offset = (((ctx->opcode & 0x1f) << 21)
9803
                  | ((ctx->opcode >> 5) & 0x1f) << 16
9804
                  | offset) << 2;
9805
        op = ((ctx->opcode >> 10) & 0x1) ? OPC_JALXS : OPC_JALS;
9806
        gen_compute_branch(ctx, op, 4, rx, ry, offset);
9807
        n_bytes = 4;
9808
        break;
9809
    case M16_OPC_BEQZ:
9810
        gen_compute_branch(ctx, OPC_BEQ, 2, rx, 0, ((int8_t)ctx->opcode) << 1);
9811
        /* No delay slot, so just process as a normal instruction */
9812
        break;
9813
    case M16_OPC_BNEQZ:
9814
        gen_compute_branch(ctx, OPC_BNE, 2, rx, 0, ((int8_t)ctx->opcode) << 1);
9815
        /* No delay slot, so just process as a normal instruction */
9816
        break;
9817
    case M16_OPC_SHIFT:
9818
        switch (ctx->opcode & 0x3) {
9819
        case 0x0:
9820
            gen_shift_imm(ctx, OPC_SLL, rx, ry, sa);
9821
            break;
9822
        case 0x1:
9823
#if defined(TARGET_MIPS64)
9824
            check_mips_64(ctx);
9825
            gen_shift_imm(ctx, OPC_DSLL, rx, ry, sa);
9826
#else
9827
            generate_exception(ctx, EXCP_RI);
9828
#endif
9829
            break;
9830
        case 0x2:
9831
            gen_shift_imm(ctx, OPC_SRL, rx, ry, sa);
9832
            break;
9833
        case 0x3:
9834
            gen_shift_imm(ctx, OPC_SRA, rx, ry, sa);
9835
            break;
9836
        }
9837
        break;
9838
#if defined(TARGET_MIPS64)
9839
    case M16_OPC_LD:
9840
        check_mips_64(ctx);
9841
        gen_ld(ctx, OPC_LD, ry, rx, offset << 3);
9842
        break;
9843
#endif
9844
    case M16_OPC_RRIA:
9845
        {
9846
            int16_t imm = (int8_t)((ctx->opcode & 0xf) << 4) >> 4;
9847

    
9848
            if ((ctx->opcode >> 4) & 1) {
9849
#if defined(TARGET_MIPS64)
9850
                check_mips_64(ctx);
9851
                gen_arith_imm(ctx, OPC_DADDIU, ry, rx, imm);
9852
#else
9853
                generate_exception(ctx, EXCP_RI);
9854
#endif
9855
            } else {
9856
                gen_arith_imm(ctx, OPC_ADDIU, ry, rx, imm);
9857
            }
9858
        }
9859
        break;
9860
    case M16_OPC_ADDIU8:
9861
        {
9862
            int16_t imm = (int8_t) ctx->opcode;
9863

    
9864
            gen_arith_imm(ctx, OPC_ADDIU, rx, rx, imm);
9865
        }
9866
        break;
9867
    case M16_OPC_SLTI:
9868
        {
9869
            int16_t imm = (uint8_t) ctx->opcode;
9870
            gen_slt_imm(ctx, OPC_SLTI, 24, rx, imm);
9871
        }
9872
        break;
9873
    case M16_OPC_SLTIU:
9874
        {
9875
            int16_t imm = (uint8_t) ctx->opcode;
9876
            gen_slt_imm(ctx, OPC_SLTIU, 24, rx, imm);
9877
        }
9878
        break;
9879
    case M16_OPC_I8:
9880
        {
9881
            int reg32;
9882

    
9883
            funct = (ctx->opcode >> 8) & 0x7;
9884
            switch (funct) {
9885
            case I8_BTEQZ:
9886
                gen_compute_branch(ctx, OPC_BEQ, 2, 24, 0,
9887
                                   ((int8_t)ctx->opcode) << 1);
9888
                break;
9889
            case I8_BTNEZ:
9890
                gen_compute_branch(ctx, OPC_BNE, 2, 24, 0,
9891
                                   ((int8_t)ctx->opcode) << 1);
9892
                break;
9893
            case I8_SWRASP:
9894
                gen_st(ctx, OPC_SW, 31, 29, (ctx->opcode & 0xff) << 2);
9895
                break;
9896
            case I8_ADJSP:
9897
                gen_arith_imm(ctx, OPC_ADDIU, 29, 29,
9898
                              ((int8_t)ctx->opcode) << 3);
9899
                break;
9900
            case I8_SVRS:
9901
                {
9902
                    int do_ra = ctx->opcode & (1 << 6);
9903
                    int do_s0 = ctx->opcode & (1 << 5);
9904
                    int do_s1 = ctx->opcode & (1 << 4);
9905
                    int framesize = ctx->opcode & 0xf;
9906

    
9907
                    if (framesize == 0) {
9908
                        framesize = 128;
9909
                    } else {
9910
                        framesize = framesize << 3;
9911
                    }
9912

    
9913
                    if (ctx->opcode & (1 << 7)) {
9914
                        gen_mips16_save(ctx, 0, 0,
9915
                                        do_ra, do_s0, do_s1, framesize);
9916
                    } else {
9917
                        gen_mips16_restore(ctx, 0, 0,
9918
                                           do_ra, do_s0, do_s1, framesize);
9919
                    }
9920
                }
9921
                break;
9922
            case I8_MOV32R:
9923
                {
9924
                    int rz = xlat(ctx->opcode & 0x7);
9925

    
9926
                    reg32 = (((ctx->opcode >> 3) & 0x3) << 3) |
9927
                        ((ctx->opcode >> 5) & 0x7);
9928
                    gen_arith(ctx, OPC_ADDU, reg32, rz, 0);
9929
                }
9930
                break;
9931
            case I8_MOVR32:
9932
                reg32 = ctx->opcode & 0x1f;
9933
                gen_arith(ctx, OPC_ADDU, ry, reg32, 0);
9934
                break;
9935
            default:
9936
                generate_exception(ctx, EXCP_RI);
9937
                break;
9938
            }
9939
        }
9940
        break;
9941
    case M16_OPC_LI:
9942
        {
9943
            int16_t imm = (uint8_t) ctx->opcode;
9944

    
9945
            gen_arith_imm(ctx, OPC_ADDIU, rx, 0, imm);
9946
        }
9947
        break;
9948
    case M16_OPC_CMPI:
9949
        {
9950
            int16_t imm = (uint8_t) ctx->opcode;
9951
            gen_logic_imm(ctx, OPC_XORI, 24, rx, imm);
9952
        }
9953
        break;
9954
#if defined(TARGET_MIPS64)
9955
    case M16_OPC_SD:
9956
        check_mips_64(ctx);
9957
        gen_st(ctx, OPC_SD, ry, rx, offset << 3);
9958
        break;
9959
#endif
9960
    case M16_OPC_LB:
9961
        gen_ld(ctx, OPC_LB, ry, rx, offset);
9962
        break;
9963
    case M16_OPC_LH:
9964
        gen_ld(ctx, OPC_LH, ry, rx, offset << 1);
9965
        break;
9966
    case M16_OPC_LWSP:
9967
        gen_ld(ctx, OPC_LW, rx, 29, ((uint8_t)ctx->opcode) << 2);
9968
        break;
9969
    case M16_OPC_LW:
9970
        gen_ld(ctx, OPC_LW, ry, rx, offset << 2);
9971
        break;
9972
    case M16_OPC_LBU:
9973
        gen_ld(ctx, OPC_LBU, ry, rx, offset);
9974
        break;
9975
    case M16_OPC_LHU:
9976
        gen_ld(ctx, OPC_LHU, ry, rx, offset << 1);
9977
        break;
9978
    case M16_OPC_LWPC:
9979
        gen_ld(ctx, OPC_LWPC, rx, 0, ((uint8_t)ctx->opcode) << 2);
9980
        break;
9981
#if defined (TARGET_MIPS64)
9982
    case M16_OPC_LWU:
9983
        check_mips_64(ctx);
9984
        gen_ld(ctx, OPC_LWU, ry, rx, offset << 2);
9985
        break;
9986
#endif
9987
    case M16_OPC_SB:
9988
        gen_st(ctx, OPC_SB, ry, rx, offset);
9989
        break;
9990
    case M16_OPC_SH:
9991
        gen_st(ctx, OPC_SH, ry, rx, offset << 1);
9992
        break;
9993
    case M16_OPC_SWSP:
9994
        gen_st(ctx, OPC_SW, rx, 29, ((uint8_t)ctx->opcode) << 2);
9995
        break;
9996
    case M16_OPC_SW:
9997
        gen_st(ctx, OPC_SW, ry, rx, offset << 2);
9998
        break;
9999
    case M16_OPC_RRR:
10000
        {
10001
            int rz = xlat((ctx->opcode >> 2) & 0x7);
10002
            int mips32_op;
10003

    
10004
            switch (ctx->opcode & 0x3) {
10005
            case RRR_ADDU:
10006
                mips32_op = OPC_ADDU;
10007
                break;
10008
            case RRR_SUBU:
10009
                mips32_op = OPC_SUBU;
10010
                break;
10011
#if defined(TARGET_MIPS64)
10012
            case RRR_DADDU:
10013
                mips32_op = OPC_DADDU;
10014
                check_mips_64(ctx);
10015
                break;
10016
            case RRR_DSUBU:
10017
                mips32_op = OPC_DSUBU;
10018
                check_mips_64(ctx);
10019
                break;
10020
#endif
10021
            default:
10022
                generate_exception(ctx, EXCP_RI);
10023
                goto done;
10024
            }
10025

    
10026
            gen_arith(ctx, mips32_op, rz, rx, ry);
10027
        done:
10028
            ;
10029
        }
10030
        break;
10031
    case M16_OPC_RR:
10032
        switch (op1) {
10033
        case RR_JR:
10034
            {
10035
                int nd = (ctx->opcode >> 7) & 0x1;
10036
                int link = (ctx->opcode >> 6) & 0x1;
10037
                int ra = (ctx->opcode >> 5) & 0x1;
10038

    
10039
                if (link) {
10040
                    op = nd ? OPC_JALRC : OPC_JALRS;
10041
                } else {
10042
                    op = OPC_JR;
10043
                }
10044

    
10045
                gen_compute_branch(ctx, op, 2, ra ? 31 : rx, 31, 0);
10046
            }
10047
            break;
10048
        case RR_SDBBP:
10049
            /* XXX: not clear which exception should be raised
10050
             *      when in debug mode...
10051
             */
10052
            check_insn(ctx, ISA_MIPS32);
10053
            if (!(ctx->hflags & MIPS_HFLAG_DM)) {
10054
                generate_exception(ctx, EXCP_DBp);
10055
            } else {
10056
                generate_exception(ctx, EXCP_DBp);
10057
            }
10058
            break;
10059
        case RR_SLT:
10060
            gen_slt(ctx, OPC_SLT, 24, rx, ry);
10061
            break;
10062
        case RR_SLTU:
10063
            gen_slt(ctx, OPC_SLTU, 24, rx, ry);
10064
            break;
10065
        case RR_BREAK:
10066
            generate_exception(ctx, EXCP_BREAK);
10067
            break;
10068
        case RR_SLLV:
10069
            gen_shift(ctx, OPC_SLLV, ry, rx, ry);
10070
            break;
10071
        case RR_SRLV:
10072
            gen_shift(ctx, OPC_SRLV, ry, rx, ry);
10073
            break;
10074
        case RR_SRAV:
10075
            gen_shift(ctx, OPC_SRAV, ry, rx, ry);
10076
            break;
10077
#if defined (TARGET_MIPS64)
10078
        case RR_DSRL:
10079
            check_mips_64(ctx);
10080
            gen_shift_imm(ctx, OPC_DSRL, ry, ry, sa);
10081
            break;
10082
#endif
10083
        case RR_CMP:
10084
            gen_logic(ctx, OPC_XOR, 24, rx, ry);
10085
            break;
10086
        case RR_NEG:
10087
            gen_arith(ctx, OPC_SUBU, rx, 0, ry);
10088
            break;
10089
        case RR_AND:
10090
            gen_logic(ctx, OPC_AND, rx, rx, ry);
10091
            break;
10092
        case RR_OR:
10093
            gen_logic(ctx, OPC_OR, rx, rx, ry);
10094
            break;
10095
        case RR_XOR:
10096
            gen_logic(ctx, OPC_XOR, rx, rx, ry);
10097
            break;
10098
        case RR_NOT:
10099
            gen_logic(ctx, OPC_NOR, rx, ry, 0);
10100
            break;
10101
        case RR_MFHI:
10102
            gen_HILO(ctx, OPC_MFHI, 0, rx);
10103
            break;
10104
        case RR_CNVT:
10105
            switch (cnvt_op) {
10106
            case RR_RY_CNVT_ZEB:
10107
                tcg_gen_ext8u_tl(cpu_gpr[rx], cpu_gpr[rx]);
10108
                break;
10109
            case RR_RY_CNVT_ZEH:
10110
                tcg_gen_ext16u_tl(cpu_gpr[rx], cpu_gpr[rx]);
10111
                break;
10112
            case RR_RY_CNVT_SEB:
10113
                tcg_gen_ext8s_tl(cpu_gpr[rx], cpu_gpr[rx]);
10114
                break;
10115
            case RR_RY_CNVT_SEH:
10116
                tcg_gen_ext16s_tl(cpu_gpr[rx], cpu_gpr[rx]);
10117
                break;
10118
#if defined (TARGET_MIPS64)
10119
            case RR_RY_CNVT_ZEW:
10120
                check_mips_64(ctx);
10121
                tcg_gen_ext32u_tl(cpu_gpr[rx], cpu_gpr[rx]);
10122
                break;
10123
            case RR_RY_CNVT_SEW:
10124
                check_mips_64(ctx);
10125
                tcg_gen_ext32s_tl(cpu_gpr[rx], cpu_gpr[rx]);
10126
                break;
10127
#endif
10128
            default:
10129
                generate_exception(ctx, EXCP_RI);
10130
                break;
10131
            }
10132
            break;
10133
        case RR_MFLO:
10134
            gen_HILO(ctx, OPC_MFLO, 0, rx);
10135
            break;
10136
#if defined (TARGET_MIPS64)
10137
        case RR_DSRA:
10138
            check_mips_64(ctx);
10139
            gen_shift_imm(ctx, OPC_DSRA, ry, ry, sa);
10140
            break;
10141
        case RR_DSLLV:
10142
            check_mips_64(ctx);
10143
            gen_shift(ctx, OPC_DSLLV, ry, rx, ry);
10144
            break;
10145
        case RR_DSRLV:
10146
            check_mips_64(ctx);
10147
            gen_shift(ctx, OPC_DSRLV, ry, rx, ry);
10148
            break;
10149
        case RR_DSRAV:
10150
            check_mips_64(ctx);
10151
            gen_shift(ctx, OPC_DSRAV, ry, rx, ry);
10152
            break;
10153
#endif
10154
        case RR_MULT:
10155
            gen_muldiv(ctx, OPC_MULT, 0, rx, ry);
10156
            break;
10157
        case RR_MULTU:
10158
            gen_muldiv(ctx, OPC_MULTU, 0, rx, ry);
10159
            break;
10160
        case RR_DIV:
10161
            gen_muldiv(ctx, OPC_DIV, 0, rx, ry);
10162
            break;
10163
        case RR_DIVU:
10164
            gen_muldiv(ctx, OPC_DIVU, 0, rx, ry);
10165
            break;
10166
#if defined (TARGET_MIPS64)
10167
        case RR_DMULT:
10168
            check_mips_64(ctx);
10169
            gen_muldiv(ctx, OPC_DMULT, 0, rx, ry);
10170
            break;
10171
        case RR_DMULTU:
10172
            check_mips_64(ctx);
10173
            gen_muldiv(ctx, OPC_DMULTU, 0, rx, ry);
10174
            break;
10175
        case RR_DDIV:
10176
            check_mips_64(ctx);
10177
            gen_muldiv(ctx, OPC_DDIV, 0, rx, ry);
10178
            break;
10179
        case RR_DDIVU:
10180
            check_mips_64(ctx);
10181
            gen_muldiv(ctx, OPC_DDIVU, 0, rx, ry);
10182
            break;
10183
#endif
10184
        default:
10185
            generate_exception(ctx, EXCP_RI);
10186
            break;
10187
        }
10188
        break;
10189
    case M16_OPC_EXTEND:
10190
        decode_extended_mips16_opc(env, ctx);
10191
        n_bytes = 4;
10192
        break;
10193
#if defined(TARGET_MIPS64)
10194
    case M16_OPC_I64:
10195
        funct = (ctx->opcode >> 8) & 0x7;
10196
        decode_i64_mips16(ctx, ry, funct, offset, 0);
10197
        break;
10198
#endif
10199
    default:
10200
        generate_exception(ctx, EXCP_RI);
10201
        break;
10202
    }
10203

    
10204
    return n_bytes;
10205
}
10206

    
10207
/* microMIPS extension to MIPS32/MIPS64 */
10208

    
10209
/*
10210
 * microMIPS32/microMIPS64 major opcodes
10211
 *
10212
 * 1. MIPS Architecture for Programmers Volume II-B:
10213
 *      The microMIPS32 Instruction Set (Revision 3.05)
10214
 *
10215
 *    Table 6.2 microMIPS32 Encoding of Major Opcode Field
10216
 *
10217
 * 2. MIPS Architecture For Programmers Volume II-A:
10218
 *      The MIPS64 Instruction Set (Revision 3.51)
10219
 */
10220

    
10221
enum {
10222
    POOL32A = 0x00,
10223
    POOL16A = 0x01,
10224
    LBU16 = 0x02,
10225
    MOVE16 = 0x03,
10226
    ADDI32 = 0x04,
10227
    LBU32 = 0x05,
10228
    SB32 = 0x06,
10229
    LB32 = 0x07,
10230

    
10231
    POOL32B = 0x08,
10232
    POOL16B = 0x09,
10233
    LHU16 = 0x0a,
10234
    ANDI16 = 0x0b,
10235
    ADDIU32 = 0x0c,
10236
    LHU32 = 0x0d,
10237
    SH32 = 0x0e,
10238
    LH32 = 0x0f,
10239

    
10240
    POOL32I = 0x10,
10241
    POOL16C = 0x11,
10242
    LWSP16 = 0x12,
10243
    POOL16D = 0x13,
10244
    ORI32 = 0x14,
10245
    POOL32F = 0x15,
10246
    POOL32S = 0x16,  /* MIPS64 */
10247
    DADDIU32 = 0x17, /* MIPS64 */
10248

    
10249
    /* 0x1f is reserved */
10250
    POOL32C = 0x18,
10251
    LWGP16 = 0x19,
10252
    LW16 = 0x1a,
10253
    POOL16E = 0x1b,
10254
    XORI32 = 0x1c,
10255
    JALS32 = 0x1d,
10256
    ADDIUPC = 0x1e,
10257

    
10258
    /* 0x20 is reserved */
10259
    RES_20 = 0x20,
10260
    POOL16F = 0x21,
10261
    SB16 = 0x22,
10262
    BEQZ16 = 0x23,
10263
    SLTI32 = 0x24,
10264
    BEQ32 = 0x25,
10265
    SWC132 = 0x26,
10266
    LWC132 = 0x27,
10267

    
10268
    /* 0x28 and 0x29 are reserved */
10269
    RES_28 = 0x28,
10270
    RES_29 = 0x29,
10271
    SH16 = 0x2a,
10272
    BNEZ16 = 0x2b,
10273
    SLTIU32 = 0x2c,
10274
    BNE32 = 0x2d,
10275
    SDC132 = 0x2e,
10276
    LDC132 = 0x2f,
10277

    
10278
    /* 0x30 and 0x31 are reserved */
10279
    RES_30 = 0x30,
10280
    RES_31 = 0x31,
10281
    SWSP16 = 0x32,
10282
    B16 = 0x33,
10283
    ANDI32 = 0x34,
10284
    J32 = 0x35,
10285
    SD32 = 0x36, /* MIPS64 */
10286
    LD32 = 0x37, /* MIPS64 */
10287

    
10288
    /* 0x38 and 0x39 are reserved */
10289
    RES_38 = 0x38,
10290
    RES_39 = 0x39,
10291
    SW16 = 0x3a,
10292
    LI16 = 0x3b,
10293
    JALX32 = 0x3c,
10294
    JAL32 = 0x3d,
10295
    SW32 = 0x3e,
10296
    LW32 = 0x3f
10297
};
10298

    
10299
/* POOL32A encoding of minor opcode field */
10300

    
10301
enum {
10302
    /* These opcodes are distinguished only by bits 9..6; those bits are
10303
     * what are recorded below. */
10304
    SLL32 = 0x0,
10305
    SRL32 = 0x1,
10306
    SRA = 0x2,
10307
    ROTR = 0x3,
10308

    
10309
    SLLV = 0x0,
10310
    SRLV = 0x1,
10311
    SRAV = 0x2,
10312
    ROTRV = 0x3,
10313
    ADD = 0x4,
10314
    ADDU32 = 0x5,
10315
    SUB = 0x6,
10316
    SUBU32 = 0x7,
10317
    MUL = 0x8,
10318
    AND = 0x9,
10319
    OR32 = 0xa,
10320
    NOR = 0xb,
10321
    XOR32 = 0xc,
10322
    SLT = 0xd,
10323
    SLTU = 0xe,
10324

    
10325
    MOVN = 0x0,
10326
    MOVZ = 0x1,
10327
    LWXS = 0x4,
10328

    
10329
    /* The following can be distinguished by their lower 6 bits. */
10330
    INS = 0x0c,
10331
    EXT = 0x2c,
10332
    POOL32AXF = 0x3c
10333
};
10334

    
10335
/* POOL32AXF encoding of minor opcode field extension */
10336

    
10337
/*
10338
 * 1. MIPS Architecture for Programmers Volume II-B:
10339
 *      The microMIPS32 Instruction Set (Revision 3.05)
10340
 *
10341
 *    Table 6.5 POOL32Axf Encoding of Minor Opcode Extension Field
10342
 *
10343
 * 2. MIPS Architecture for Programmers VolumeIV-e:
10344
 *      The MIPS DSP Application-Specific Extension
10345
 *        to the microMIPS32 Architecture (Revision 2.34)
10346
 *
10347
 *    Table 5.5 POOL32Axf Encoding of Minor Opcode Extension Field
10348
 */
10349

    
10350
enum {
10351
    /* bits 11..6 */
10352
    TEQ = 0x00,
10353
    TGE = 0x08,
10354
    TGEU = 0x10,
10355
    TLT = 0x20,
10356
    TLTU = 0x28,
10357
    TNE = 0x30,
10358

    
10359
    MFC0 = 0x03,
10360
    MTC0 = 0x0b,
10361

    
10362
    /* begin of microMIPS32 DSP */
10363

    
10364
    /* bits 13..12 for 0x01 */
10365
    MFHI_ACC = 0x0,
10366
    MFLO_ACC = 0x1,
10367
    MTHI_ACC = 0x2,
10368
    MTLO_ACC = 0x3,
10369

    
10370
    /* bits 13..12 for 0x2a */
10371
    MADD_ACC = 0x0,
10372
    MADDU_ACC = 0x1,
10373
    MSUB_ACC = 0x2,
10374
    MSUBU_ACC = 0x3,
10375

    
10376
    /* bits 13..12 for 0x32 */
10377
    MULT_ACC = 0x0,
10378
    MULTU_ACC = 0x1,
10379

    
10380
    /* end of microMIPS32 DSP */
10381

    
10382
    /* bits 15..12 for 0x2c */
10383
    SEB = 0x2,
10384
    SEH = 0x3,
10385
    CLO = 0x4,
10386
    CLZ = 0x5,
10387
    RDHWR = 0x6,
10388
    WSBH = 0x7,
10389
    MULT = 0x8,
10390
    MULTU = 0x9,
10391
    DIV = 0xa,
10392
    DIVU = 0xb,
10393
    MADD = 0xc,
10394
    MADDU = 0xd,
10395
    MSUB = 0xe,
10396
    MSUBU = 0xf,
10397

    
10398
    /* bits 15..12 for 0x34 */
10399
    MFC2 = 0x4,
10400
    MTC2 = 0x5,
10401
    MFHC2 = 0x8,
10402
    MTHC2 = 0x9,
10403
    CFC2 = 0xc,
10404
    CTC2 = 0xd,
10405

    
10406
    /* bits 15..12 for 0x3c */
10407
    JALR = 0x0,
10408
    JR = 0x0,                   /* alias */
10409
    JALR_HB = 0x1,
10410
    JALRS = 0x4,
10411
    JALRS_HB = 0x5,
10412

    
10413
    /* bits 15..12 for 0x05 */
10414
    RDPGPR = 0xe,
10415
    WRPGPR = 0xf,
10416

    
10417
    /* bits 15..12 for 0x0d */
10418
    TLBP = 0x0,
10419
    TLBR = 0x1,
10420
    TLBWI = 0x2,
10421
    TLBWR = 0x3,
10422
    WAIT = 0x9,
10423
    IRET = 0xd,
10424
    DERET = 0xe,
10425
    ERET = 0xf,
10426

    
10427
    /* bits 15..12 for 0x15 */
10428
    DMT = 0x0,
10429
    DVPE = 0x1,
10430
    EMT = 0x2,
10431
    EVPE = 0x3,
10432

    
10433
    /* bits 15..12 for 0x1d */
10434
    DI = 0x4,
10435
    EI = 0x5,
10436

    
10437
    /* bits 15..12 for 0x2d */
10438
    SYNC = 0x6,
10439
    SYSCALL = 0x8,
10440
    SDBBP = 0xd,
10441

    
10442
    /* bits 15..12 for 0x35 */
10443
    MFHI32 = 0x0,
10444
    MFLO32 = 0x1,
10445
    MTHI32 = 0x2,
10446
    MTLO32 = 0x3,
10447
};
10448

    
10449
/* POOL32B encoding of minor opcode field (bits 15..12) */
10450

    
10451
enum {
10452
    LWC2 = 0x0,
10453
    LWP = 0x1,
10454
    LDP = 0x4,
10455
    LWM32 = 0x5,
10456
    CACHE = 0x6,
10457
    LDM = 0x7,
10458
    SWC2 = 0x8,
10459
    SWP = 0x9,
10460
    SDP = 0xc,
10461
    SWM32 = 0xd,
10462
    SDM = 0xf
10463
};
10464

    
10465
/* POOL32C encoding of minor opcode field (bits 15..12) */
10466

    
10467
enum {
10468
    LWL = 0x0,
10469
    SWL = 0x8,
10470
    LWR = 0x1,
10471
    SWR = 0x9,
10472
    PREF = 0x2,
10473
    /* 0xa is reserved */
10474
    LL = 0x3,
10475
    SC = 0xb,
10476
    LDL = 0x4,
10477
    SDL = 0xc,
10478
    LDR = 0x5,
10479
    SDR = 0xd,
10480
    /* 0x6 is reserved */
10481
    LWU = 0xe,
10482
    LLD = 0x7,
10483
    SCD = 0xf
10484
};
10485

    
10486
/* POOL32F encoding of minor opcode field (bits 5..0) */
10487

    
10488
enum {
10489
    /* These are the bit 7..6 values */
10490
    ADD_FMT = 0x0,
10491
    MOVN_FMT = 0x0,
10492

    
10493
    SUB_FMT = 0x1,
10494
    MOVZ_FMT = 0x1,
10495

    
10496
    MUL_FMT = 0x2,
10497

    
10498
    DIV_FMT = 0x3,
10499

    
10500
    /* These are the bit 8..6 values */
10501
    RSQRT2_FMT = 0x0,
10502
    MOVF_FMT = 0x0,
10503

    
10504
    LWXC1 = 0x1,
10505
    MOVT_FMT = 0x1,
10506

    
10507
    PLL_PS = 0x2,
10508
    SWXC1 = 0x2,
10509

    
10510
    PLU_PS = 0x3,
10511
    LDXC1 = 0x3,
10512

    
10513
    PUL_PS = 0x4,
10514
    SDXC1 = 0x4,
10515
    RECIP2_FMT = 0x4,
10516

    
10517
    PUU_PS = 0x5,
10518
    LUXC1 = 0x5,
10519

    
10520
    CVT_PS_S = 0x6,
10521
    SUXC1 = 0x6,
10522
    ADDR_PS = 0x6,
10523
    PREFX = 0x6,
10524

    
10525
    MULR_PS = 0x7,
10526

    
10527
    MADD_S = 0x01,
10528
    MADD_D = 0x09,
10529
    MADD_PS = 0x11,
10530
    ALNV_PS = 0x19,
10531
    MSUB_S = 0x21,
10532
    MSUB_D = 0x29,
10533
    MSUB_PS = 0x31,
10534

    
10535
    NMADD_S = 0x02,
10536
    NMADD_D = 0x0a,
10537
    NMADD_PS = 0x12,
10538
    NMSUB_S = 0x22,
10539
    NMSUB_D = 0x2a,
10540
    NMSUB_PS = 0x32,
10541

    
10542
    POOL32FXF = 0x3b,
10543

    
10544
    CABS_COND_FMT = 0x1c,              /* MIPS3D */
10545
    C_COND_FMT = 0x3c
10546
};
10547

    
10548
/* POOL32Fxf encoding of minor opcode extension field */
10549

    
10550
enum {
10551
    CVT_L = 0x04,
10552
    RSQRT_FMT = 0x08,
10553
    FLOOR_L = 0x0c,
10554
    CVT_PW_PS = 0x1c,
10555
    CVT_W = 0x24,
10556
    SQRT_FMT = 0x28,
10557
    FLOOR_W = 0x2c,
10558
    CVT_PS_PW = 0x3c,
10559
    CFC1 = 0x40,
10560
    RECIP_FMT = 0x48,
10561
    CEIL_L = 0x4c,
10562
    CTC1 = 0x60,
10563
    CEIL_W = 0x6c,
10564
    MFC1 = 0x80,
10565
    CVT_S_PL = 0x84,
10566
    TRUNC_L = 0x8c,
10567
    MTC1 = 0xa0,
10568
    CVT_S_PU = 0xa4,
10569
    TRUNC_W = 0xac,
10570
    MFHC1 = 0xc0,
10571
    ROUND_L = 0xcc,
10572
    MTHC1 = 0xe0,
10573
    ROUND_W = 0xec,
10574

    
10575
    MOV_FMT = 0x01,
10576
    MOVF = 0x05,
10577
    ABS_FMT = 0x0d,
10578
    RSQRT1_FMT = 0x1d,
10579
    MOVT = 0x25,
10580
    NEG_FMT = 0x2d,
10581
    CVT_D = 0x4d,
10582
    RECIP1_FMT = 0x5d,
10583
    CVT_S = 0x6d
10584
};
10585

    
10586
/* POOL32I encoding of minor opcode field (bits 25..21) */
10587

    
10588
enum {
10589
    BLTZ = 0x00,
10590
    BLTZAL = 0x01,
10591
    BGEZ = 0x02,
10592
    BGEZAL = 0x03,
10593
    BLEZ = 0x04,
10594
    BNEZC = 0x05,
10595
    BGTZ = 0x06,
10596
    BEQZC = 0x07,
10597
    TLTI = 0x08,
10598
    TGEI = 0x09,
10599
    TLTIU = 0x0a,
10600
    TGEIU = 0x0b,
10601
    TNEI = 0x0c,
10602
    LUI = 0x0d,
10603
    TEQI = 0x0e,
10604
    SYNCI = 0x10,
10605
    BLTZALS = 0x11,
10606
    BGEZALS = 0x13,
10607
    BC2F = 0x14,
10608
    BC2T = 0x15,
10609
    BPOSGE64 = 0x1a,
10610
    BPOSGE32 = 0x1b,
10611
    /* These overlap and are distinguished by bit16 of the instruction */
10612
    BC1F = 0x1c,
10613
    BC1T = 0x1d,
10614
    BC1ANY2F = 0x1c,
10615
    BC1ANY2T = 0x1d,
10616
    BC1ANY4F = 0x1e,
10617
    BC1ANY4T = 0x1f
10618
};
10619

    
10620
/* POOL16A encoding of minor opcode field */
10621

    
10622
enum {
10623
    ADDU16 = 0x0,
10624
    SUBU16 = 0x1
10625
};
10626

    
10627
/* POOL16B encoding of minor opcode field */
10628

    
10629
enum {
10630
    SLL16 = 0x0,
10631
    SRL16 = 0x1
10632
};
10633

    
10634
/* POOL16C encoding of minor opcode field */
10635

    
10636
enum {
10637
    NOT16 = 0x00,
10638
    XOR16 = 0x04,
10639
    AND16 = 0x08,
10640
    OR16 = 0x0c,
10641
    LWM16 = 0x10,
10642
    SWM16 = 0x14,
10643
    JR16 = 0x18,
10644
    JRC16 = 0x1a,
10645
    JALR16 = 0x1c,
10646
    JALR16S = 0x1e,
10647
    MFHI16 = 0x20,
10648
    MFLO16 = 0x24,
10649
    BREAK16 = 0x28,
10650
    SDBBP16 = 0x2c,
10651
    JRADDIUSP = 0x30
10652
};
10653

    
10654
/* POOL16D encoding of minor opcode field */
10655

    
10656
enum {
10657
    ADDIUS5 = 0x0,
10658
    ADDIUSP = 0x1
10659
};
10660

    
10661
/* POOL16E encoding of minor opcode field */
10662

    
10663
enum {
10664
    ADDIUR2 = 0x0,
10665
    ADDIUR1SP = 0x1
10666
};
10667

    
10668
static int mmreg (int r)
10669
{
10670
    static const int map[] = { 16, 17, 2, 3, 4, 5, 6, 7 };
10671

    
10672
    return map[r];
10673
}
10674

    
10675
/* Used for 16-bit store instructions.  */
10676
static int mmreg2 (int r)
10677
{
10678
    static const int map[] = { 0, 17, 2, 3, 4, 5, 6, 7 };
10679

    
10680
    return map[r];
10681
}
10682

    
10683
#define uMIPS_RD(op) ((op >> 7) & 0x7)
10684
#define uMIPS_RS(op) ((op >> 4) & 0x7)
10685
#define uMIPS_RS2(op) uMIPS_RS(op)
10686
#define uMIPS_RS1(op) ((op >> 1) & 0x7)
10687
#define uMIPS_RD5(op) ((op >> 5) & 0x1f)
10688
#define uMIPS_RS5(op) (op & 0x1f)
10689

    
10690
/* Signed immediate */
10691
#define SIMM(op, start, width)                                          \
10692
    ((int32_t)(((op >> start) & ((~0U) >> (32-width)))                 \
10693
               << (32-width))                                           \
10694
     >> (32-width))
10695
/* Zero-extended immediate */
10696
#define ZIMM(op, start, width) ((op >> start) & ((~0U) >> (32-width)))
10697

    
10698
static void gen_addiur1sp(DisasContext *ctx)
10699
{
10700
    int rd = mmreg(uMIPS_RD(ctx->opcode));
10701

    
10702
    gen_arith_imm(ctx, OPC_ADDIU, rd, 29, ((ctx->opcode >> 1) & 0x3f) << 2);
10703
}
10704

    
10705
static void gen_addiur2(DisasContext *ctx)
10706
{
10707
    static const int decoded_imm[] = { 1, 4, 8, 12, 16, 20, 24, -1 };
10708
    int rd = mmreg(uMIPS_RD(ctx->opcode));
10709
    int rs = mmreg(uMIPS_RS(ctx->opcode));
10710

    
10711
    gen_arith_imm(ctx, OPC_ADDIU, rd, rs, decoded_imm[ZIMM(ctx->opcode, 1, 3)]);
10712
}
10713

    
10714
static void gen_addiusp(DisasContext *ctx)
10715
{
10716
    int encoded = ZIMM(ctx->opcode, 1, 9);
10717
    int decoded;
10718

    
10719
    if (encoded <= 1) {
10720
        decoded = 256 + encoded;
10721
    } else if (encoded <= 255) {
10722
        decoded = encoded;
10723
    } else if (encoded <= 509) {
10724
        decoded = encoded - 512;
10725
    } else {
10726
        decoded = encoded - 768;
10727
    }
10728

    
10729
    gen_arith_imm(ctx, OPC_ADDIU, 29, 29, decoded << 2);
10730
}
10731

    
10732
static void gen_addius5(DisasContext *ctx)
10733
{
10734
    int imm = SIMM(ctx->opcode, 1, 4);
10735
    int rd = (ctx->opcode >> 5) & 0x1f;
10736

    
10737
    gen_arith_imm(ctx, OPC_ADDIU, rd, rd, imm);
10738
}
10739

    
10740
static void gen_andi16(DisasContext *ctx)
10741
{
10742
    static const int decoded_imm[] = { 128, 1, 2, 3, 4, 7, 8, 15, 16,
10743
                                 31, 32, 63, 64, 255, 32768, 65535 };
10744
    int rd = mmreg(uMIPS_RD(ctx->opcode));
10745
    int rs = mmreg(uMIPS_RS(ctx->opcode));
10746
    int encoded = ZIMM(ctx->opcode, 0, 4);
10747

    
10748
    gen_logic_imm(ctx, OPC_ANDI, rd, rs, decoded_imm[encoded]);
10749
}
10750

    
10751
static void gen_ldst_multiple (DisasContext *ctx, uint32_t opc, int reglist,
10752
                               int base, int16_t offset)
10753
{
10754
    const char *opn = "ldst_multiple";
10755
    TCGv t0, t1;
10756
    TCGv_i32 t2;
10757

    
10758
    if (ctx->hflags & MIPS_HFLAG_BMASK) {
10759
        generate_exception(ctx, EXCP_RI);
10760
        return;
10761
    }
10762

    
10763
    t0 = tcg_temp_new();
10764

    
10765
    gen_base_offset_addr(ctx, t0, base, offset);
10766

    
10767
    t1 = tcg_const_tl(reglist);
10768
    t2 = tcg_const_i32(ctx->mem_idx);
10769

    
10770
    save_cpu_state(ctx, 1);
10771
    switch (opc) {
10772
    case LWM32:
10773
        gen_helper_lwm(cpu_env, t0, t1, t2);
10774
        opn = "lwm";
10775
        break;
10776
    case SWM32:
10777
        gen_helper_swm(cpu_env, t0, t1, t2);
10778
        opn = "swm";
10779
        break;
10780
#ifdef TARGET_MIPS64
10781
    case LDM:
10782
        gen_helper_ldm(cpu_env, t0, t1, t2);
10783
        opn = "ldm";
10784
        break;
10785
    case SDM:
10786
        gen_helper_sdm(cpu_env, t0, t1, t2);
10787
        opn = "sdm";
10788
        break;
10789
#endif
10790
    }
10791
    (void)opn;
10792
    MIPS_DEBUG("%s, %x, %d(%s)", opn, reglist, offset, regnames[base]);
10793
    tcg_temp_free(t0);
10794
    tcg_temp_free(t1);
10795
    tcg_temp_free_i32(t2);
10796
}
10797

    
10798

    
10799
static void gen_pool16c_insn(DisasContext *ctx)
10800
{
10801
    int rd = mmreg((ctx->opcode >> 3) & 0x7);
10802
    int rs = mmreg(ctx->opcode & 0x7);
10803
    int opc;
10804

    
10805
    switch (((ctx->opcode) >> 4) & 0x3f) {
10806
    case NOT16 + 0:
10807
    case NOT16 + 1:
10808
    case NOT16 + 2:
10809
    case NOT16 + 3:
10810
        gen_logic(ctx, OPC_NOR, rd, rs, 0);
10811
        break;
10812
    case XOR16 + 0:
10813
    case XOR16 + 1:
10814
    case XOR16 + 2:
10815
    case XOR16 + 3:
10816
        gen_logic(ctx, OPC_XOR, rd, rd, rs);
10817
        break;
10818
    case AND16 + 0:
10819
    case AND16 + 1:
10820
    case AND16 + 2:
10821
    case AND16 + 3:
10822
        gen_logic(ctx, OPC_AND, rd, rd, rs);
10823
        break;
10824
    case OR16 + 0:
10825
    case OR16 + 1:
10826
    case OR16 + 2:
10827
    case OR16 + 3:
10828
        gen_logic(ctx, OPC_OR, rd, rd, rs);
10829
        break;
10830
    case LWM16 + 0:
10831
    case LWM16 + 1:
10832
    case LWM16 + 2:
10833
    case LWM16 + 3:
10834
        {
10835
            static const int lwm_convert[] = { 0x11, 0x12, 0x13, 0x14 };
10836
            int offset = ZIMM(ctx->opcode, 0, 4);
10837

    
10838
            gen_ldst_multiple(ctx, LWM32, lwm_convert[(ctx->opcode >> 4) & 0x3],
10839
                              29, offset << 2);
10840
        }
10841
        break;
10842
    case SWM16 + 0:
10843
    case SWM16 + 1:
10844
    case SWM16 + 2:
10845
    case SWM16 + 3:
10846
        {
10847
            static const int swm_convert[] = { 0x11, 0x12, 0x13, 0x14 };
10848
            int offset = ZIMM(ctx->opcode, 0, 4);
10849

    
10850
            gen_ldst_multiple(ctx, SWM32, swm_convert[(ctx->opcode >> 4) & 0x3],
10851
                              29, offset << 2);
10852
        }
10853
        break;
10854
    case JR16 + 0:
10855
    case JR16 + 1:
10856
        {
10857
            int reg = ctx->opcode & 0x1f;
10858

    
10859
            gen_compute_branch(ctx, OPC_JR, 2, reg, 0, 0);
10860
        }
10861
        break;
10862
    case JRC16 + 0:
10863
    case JRC16 + 1:
10864
        {
10865
            int reg = ctx->opcode & 0x1f;
10866

    
10867
            gen_compute_branch(ctx, OPC_JR, 2, reg, 0, 0);
10868
            /* Let normal delay slot handling in our caller take us
10869
               to the branch target.  */
10870
        }
10871
        break;
10872
    case JALR16 + 0:
10873
    case JALR16 + 1:
10874
        opc = OPC_JALR;
10875
        goto do_jalr;
10876
    case JALR16S + 0:
10877
    case JALR16S + 1:
10878
        opc = OPC_JALRS;
10879
    do_jalr:
10880
        {
10881
            int reg = ctx->opcode & 0x1f;
10882

    
10883
            gen_compute_branch(ctx, opc, 2, reg, 31, 0);
10884
        }
10885
        break;
10886
    case MFHI16 + 0:
10887
    case MFHI16 + 1:
10888
        gen_HILO(ctx, OPC_MFHI, 0, uMIPS_RS5(ctx->opcode));
10889
        break;
10890
    case MFLO16 + 0:
10891
    case MFLO16 + 1:
10892
        gen_HILO(ctx, OPC_MFLO, 0, uMIPS_RS5(ctx->opcode));
10893
        break;
10894
    case BREAK16:
10895
        generate_exception(ctx, EXCP_BREAK);
10896
        break;
10897
    case SDBBP16:
10898
        /* XXX: not clear which exception should be raised
10899
         *      when in debug mode...
10900
         */
10901
        check_insn(ctx, ISA_MIPS32);
10902
        if (!(ctx->hflags & MIPS_HFLAG_DM)) {
10903
            generate_exception(ctx, EXCP_DBp);
10904
        } else {
10905
            generate_exception(ctx, EXCP_DBp);
10906
        }
10907
        break;
10908
    case JRADDIUSP + 0:
10909
    case JRADDIUSP + 1:
10910
        {
10911
            int imm = ZIMM(ctx->opcode, 0, 5);
10912

    
10913
            gen_compute_branch(ctx, OPC_JR, 2, 31, 0, 0);
10914
            gen_arith_imm(ctx, OPC_ADDIU, 29, 29, imm << 2);
10915
            /* Let normal delay slot handling in our caller take us
10916
               to the branch target.  */
10917
        }
10918
        break;
10919
    default:
10920
        generate_exception(ctx, EXCP_RI);
10921
        break;
10922
    }
10923
}
10924

    
10925
static void gen_ldxs (DisasContext *ctx, int base, int index, int rd)
10926
{
10927
    TCGv t0 = tcg_temp_new();
10928
    TCGv t1 = tcg_temp_new();
10929

    
10930
    gen_load_gpr(t0, base);
10931

    
10932
    if (index != 0) {
10933
        gen_load_gpr(t1, index);
10934
        tcg_gen_shli_tl(t1, t1, 2);
10935
        gen_op_addr_add(ctx, t0, t1, t0);
10936
    }
10937

    
10938
    tcg_gen_qemu_ld32s(t1, t0, ctx->mem_idx);
10939
    gen_store_gpr(t1, rd);
10940

    
10941
    tcg_temp_free(t0);
10942
    tcg_temp_free(t1);
10943
}
10944

    
10945
static void gen_ldst_pair (DisasContext *ctx, uint32_t opc, int rd,
10946
                           int base, int16_t offset)
10947
{
10948
    const char *opn = "ldst_pair";
10949
    TCGv t0, t1;
10950

    
10951
    if (ctx->hflags & MIPS_HFLAG_BMASK || rd == 31) {
10952
        generate_exception(ctx, EXCP_RI);
10953
        return;
10954
    }
10955

    
10956
    t0 = tcg_temp_new();
10957
    t1 = tcg_temp_new();
10958

    
10959
    gen_base_offset_addr(ctx, t0, base, offset);
10960

    
10961
    switch (opc) {
10962
    case LWP:
10963
        if (rd == base) {
10964
            generate_exception(ctx, EXCP_RI);
10965
            return;
10966
        }
10967
        tcg_gen_qemu_ld32s(t1, t0, ctx->mem_idx);
10968
        gen_store_gpr(t1, rd);
10969
        tcg_gen_movi_tl(t1, 4);
10970
        gen_op_addr_add(ctx, t0, t0, t1);
10971
        tcg_gen_qemu_ld32s(t1, t0, ctx->mem_idx);
10972
        gen_store_gpr(t1, rd+1);
10973
        opn = "lwp";
10974
        break;
10975
    case SWP:
10976
        gen_load_gpr(t1, rd);
10977
        tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);
10978
        tcg_gen_movi_tl(t1, 4);
10979
        gen_op_addr_add(ctx, t0, t0, t1);
10980
        gen_load_gpr(t1, rd+1);
10981
        tcg_gen_qemu_st32(t1, t0, ctx->mem_idx);
10982
        opn = "swp";
10983
        break;
10984
#ifdef TARGET_MIPS64
10985
    case LDP:
10986
        if (rd == base) {
10987
            generate_exception(ctx, EXCP_RI);
10988
            return;
10989
        }
10990
        tcg_gen_qemu_ld64(t1, t0, ctx->mem_idx);
10991
        gen_store_gpr(t1, rd);
10992
        tcg_gen_movi_tl(t1, 8);
10993
        gen_op_addr_add(ctx, t0, t0, t1);
10994
        tcg_gen_qemu_ld64(t1, t0, ctx->mem_idx);
10995
        gen_store_gpr(t1, rd+1);
10996
        opn = "ldp";
10997
        break;
10998
    case SDP:
10999
        gen_load_gpr(t1, rd);
11000
        tcg_gen_qemu_st64(t1, t0, ctx->mem_idx);
11001
        tcg_gen_movi_tl(t1, 8);
11002
        gen_op_addr_add(ctx, t0, t0, t1);
11003
        gen_load_gpr(t1, rd+1);
11004
        tcg_gen_qemu_st64(t1, t0, ctx->mem_idx);
11005
        opn = "sdp";
11006
        break;
11007
#endif
11008
    }
11009
    (void)opn; /* avoid a compiler warning */
11010
    MIPS_DEBUG("%s, %s, %d(%s)", opn, regnames[rd], offset, regnames[base]);
11011
    tcg_temp_free(t0);
11012
    tcg_temp_free(t1);
11013
}
11014

    
11015
static void gen_pool32axf (CPUMIPSState *env, DisasContext *ctx, int rt, int rs)
11016
{
11017
    int extension = (ctx->opcode >> 6) & 0x3f;
11018
    int minor = (ctx->opcode >> 12) & 0xf;
11019
    uint32_t mips32_op;
11020

    
11021
    switch (extension) {
11022
    case TEQ:
11023
        mips32_op = OPC_TEQ;
11024
        goto do_trap;
11025
    case TGE:
11026
        mips32_op = OPC_TGE;
11027
        goto do_trap;
11028
    case TGEU:
11029
        mips32_op = OPC_TGEU;
11030
        goto do_trap;
11031
    case TLT:
11032
        mips32_op = OPC_TLT;
11033
        goto do_trap;
11034
    case TLTU:
11035
        mips32_op = OPC_TLTU;
11036
        goto do_trap;
11037
    case TNE:
11038
        mips32_op = OPC_TNE;
11039
    do_trap:
11040
        gen_trap(ctx, mips32_op, rs, rt, -1);
11041
        break;
11042
#ifndef CONFIG_USER_ONLY
11043
    case MFC0:
11044
    case MFC0 + 32:
11045
        check_cp0_enabled(ctx);
11046
        if (rt == 0) {
11047
            /* Treat as NOP. */
11048
            break;
11049
        }
11050
        gen_mfc0(ctx, cpu_gpr[rt], rs, (ctx->opcode >> 11) & 0x7);
11051
        break;
11052
    case MTC0:
11053
    case MTC0 + 32:
11054
        check_cp0_enabled(ctx);
11055
        {
11056
            TCGv t0 = tcg_temp_new();
11057

    
11058
            gen_load_gpr(t0, rt);
11059
            gen_mtc0(ctx, t0, rs, (ctx->opcode >> 11) & 0x7);
11060
            tcg_temp_free(t0);
11061
        }
11062
        break;
11063
#endif
11064
    case 0x2a:
11065
        switch (minor & 3) {
11066
        case MADD_ACC:
11067
            gen_muldiv(ctx, OPC_MADD, (ctx->opcode >> 14) & 3, rs, rt);
11068
            break;
11069
        case MADDU_ACC:
11070
            gen_muldiv(ctx, OPC_MADDU, (ctx->opcode >> 14) & 3, rs, rt);
11071
            break;
11072
        case MSUB_ACC:
11073
            gen_muldiv(ctx, OPC_MSUB, (ctx->opcode >> 14) & 3, rs, rt);
11074
            break;
11075
        case MSUBU_ACC:
11076
            gen_muldiv(ctx, OPC_MSUBU, (ctx->opcode >> 14) & 3, rs, rt);
11077
            break;
11078
        default:
11079
            goto pool32axf_invalid;
11080
        }
11081
        break;
11082
    case 0x32:
11083
        switch (minor & 3) {
11084
        case MULT_ACC:
11085
            gen_muldiv(ctx, OPC_MULT, (ctx->opcode >> 14) & 3, rs, rt);
11086
            break;
11087
        case MULTU_ACC:
11088
            gen_muldiv(ctx, OPC_MULTU, (ctx->opcode >> 14) & 3, rs, rt);
11089
            break;
11090
        default:
11091
            goto pool32axf_invalid;
11092
        }
11093
        break;
11094
    case 0x2c:
11095
        switch (minor) {
11096
        case SEB:
11097
            gen_bshfl(ctx, OPC_SEB, rs, rt);
11098
            break;
11099
        case SEH:
11100
            gen_bshfl(ctx, OPC_SEH, rs, rt);
11101
            break;
11102
        case CLO:
11103
            mips32_op = OPC_CLO;
11104
            goto do_cl;
11105
        case CLZ:
11106
            mips32_op = OPC_CLZ;
11107
        do_cl:
11108
            check_insn(ctx, ISA_MIPS32);
11109
            gen_cl(ctx, mips32_op, rt, rs);
11110
            break;
11111
        case RDHWR:
11112
            gen_rdhwr(ctx, rt, rs);
11113
            break;
11114
        case WSBH:
11115
            gen_bshfl(ctx, OPC_WSBH, rs, rt);
11116
            break;
11117
        case MULT:
11118
            mips32_op = OPC_MULT;
11119
            goto do_mul;
11120
        case MULTU:
11121
            mips32_op = OPC_MULTU;
11122
            goto do_mul;
11123
        case DIV:
11124
            mips32_op = OPC_DIV;
11125
            goto do_div;
11126
        case DIVU:
11127
            mips32_op = OPC_DIVU;
11128
            goto do_div;
11129
        do_div:
11130
            check_insn(ctx, ISA_MIPS32);
11131
            gen_muldiv(ctx, mips32_op, 0, rs, rt);
11132
            break;
11133
        case MADD:
11134
            mips32_op = OPC_MADD;
11135
            goto do_mul;
11136
        case MADDU:
11137
            mips32_op = OPC_MADDU;
11138
            goto do_mul;
11139
        case MSUB:
11140
            mips32_op = OPC_MSUB;
11141
            goto do_mul;
11142
        case MSUBU:
11143
            mips32_op = OPC_MSUBU;
11144
        do_mul:
11145
            check_insn(ctx, ISA_MIPS32);
11146
            gen_muldiv(ctx, mips32_op, 0, rs, rt);
11147
            break;
11148
        default:
11149
            goto pool32axf_invalid;
11150
        }
11151
        break;
11152
    case 0x34:
11153
        switch (minor) {
11154
        case MFC2:
11155
        case MTC2:
11156
        case MFHC2:
11157
        case MTHC2:
11158
        case CFC2:
11159
        case CTC2:
11160
            generate_exception_err(ctx, EXCP_CpU, 2);
11161
            break;
11162
        default:
11163
            goto pool32axf_invalid;
11164
        }
11165
        break;
11166
    case 0x3c:
11167
        switch (minor) {
11168
        case JALR:
11169
        case JALR_HB:
11170
            gen_compute_branch (ctx, OPC_JALR, 4, rs, rt, 0);
11171
            break;
11172
        case JALRS:
11173
        case JALRS_HB:
11174
            gen_compute_branch (ctx, OPC_JALRS, 4, rs, rt, 0);
11175
            break;
11176
        default:
11177
            goto pool32axf_invalid;
11178
        }
11179
        break;
11180
    case 0x05:
11181
        switch (minor) {
11182
        case RDPGPR:
11183
            check_cp0_enabled(ctx);
11184
            check_insn(ctx, ISA_MIPS32R2);
11185
            gen_load_srsgpr(rt, rs);
11186
            break;
11187
        case WRPGPR:
11188
            check_cp0_enabled(ctx);
11189
            check_insn(ctx, ISA_MIPS32R2);
11190
            gen_store_srsgpr(rt, rs);
11191
            break;
11192
        default:
11193
            goto pool32axf_invalid;
11194
        }
11195
        break;
11196
#ifndef CONFIG_USER_ONLY
11197
    case 0x0d:
11198
        switch (minor) {
11199
        case TLBP:
11200
            mips32_op = OPC_TLBP;
11201
            goto do_cp0;
11202
        case TLBR:
11203
            mips32_op = OPC_TLBR;
11204
            goto do_cp0;
11205
        case TLBWI:
11206
            mips32_op = OPC_TLBWI;
11207
            goto do_cp0;
11208
        case TLBWR:
11209
            mips32_op = OPC_TLBWR;
11210
            goto do_cp0;
11211
        case WAIT:
11212
            mips32_op = OPC_WAIT;
11213
            goto do_cp0;
11214
        case DERET:
11215
            mips32_op = OPC_DERET;
11216
            goto do_cp0;
11217
        case ERET:
11218
            mips32_op = OPC_ERET;
11219
        do_cp0:
11220
            gen_cp0(env, ctx, mips32_op, rt, rs);
11221
            break;
11222
        default:
11223
            goto pool32axf_invalid;
11224
        }
11225
        break;
11226
    case 0x1d:
11227
        switch (minor) {
11228
        case DI:
11229
            check_cp0_enabled(ctx);
11230
            {
11231
                TCGv t0 = tcg_temp_new();
11232

    
11233
                save_cpu_state(ctx, 1);
11234
                gen_helper_di(t0, cpu_env);
11235
                gen_store_gpr(t0, rs);
11236
                /* Stop translation as we may have switched the execution mode */
11237
                ctx->bstate = BS_STOP;
11238
                tcg_temp_free(t0);
11239
            }
11240
            break;
11241
        case EI:
11242
            check_cp0_enabled(ctx);
11243
            {
11244
                TCGv t0 = tcg_temp_new();
11245

    
11246
                save_cpu_state(ctx, 1);
11247
                gen_helper_ei(t0, cpu_env);
11248
                gen_store_gpr(t0, rs);
11249
                /* Stop translation as we may have switched the execution mode */
11250
                ctx->bstate = BS_STOP;
11251
                tcg_temp_free(t0);
11252
            }
11253
            break;
11254
        default:
11255
            goto pool32axf_invalid;
11256
        }
11257
        break;
11258
#endif
11259
    case 0x2d:
11260
        switch (minor) {
11261
        case SYNC:
11262
            /* NOP */
11263
            break;
11264
        case SYSCALL:
11265
            generate_exception(ctx, EXCP_SYSCALL);
11266
            ctx->bstate = BS_STOP;
11267
            break;
11268
        case SDBBP:
11269
            check_insn(ctx, ISA_MIPS32);
11270
            if (!(ctx->hflags & MIPS_HFLAG_DM)) {
11271
                generate_exception(ctx, EXCP_DBp);
11272
            } else {
11273
                generate_exception(ctx, EXCP_DBp);
11274
            }
11275
            break;
11276
        default:
11277
            goto pool32axf_invalid;
11278
        }
11279
        break;
11280
    case 0x01:
11281
        switch (minor & 3) {
11282
        case MFHI_ACC:
11283
            gen_HILO(ctx, OPC_MFHI, minor >> 2, rs);
11284
            break;
11285
        case MFLO_ACC:
11286
            gen_HILO(ctx, OPC_MFLO, minor >> 2, rs);
11287
            break;
11288
        case MTHI_ACC:
11289
            gen_HILO(ctx, OPC_MTHI, minor >> 2, rs);
11290
            break;
11291
        case MTLO_ACC:
11292
            gen_HILO(ctx, OPC_MTLO, minor >> 2, rs);
11293
            break;
11294
        default:
11295
            goto pool32axf_invalid;
11296
        }
11297
        break;
11298
    case 0x35:
11299
        switch (minor) {
11300
        case MFHI32:
11301
            gen_HILO(ctx, OPC_MFHI, 0, rs);
11302
            break;
11303
        case MFLO32:
11304
            gen_HILO(ctx, OPC_MFLO, 0, rs);
11305
            break;
11306
        case MTHI32:
11307
            gen_HILO(ctx, OPC_MTHI, 0, rs);
11308
            break;
11309
        case MTLO32:
11310
            gen_HILO(ctx, OPC_MTLO, 0, rs);
11311
            break;
11312
        default:
11313
            goto pool32axf_invalid;
11314
        }
11315
        break;
11316
    default:
11317
    pool32axf_invalid:
11318
        MIPS_INVAL("pool32axf");
11319
        generate_exception(ctx, EXCP_RI);
11320
        break;
11321
    }
11322
}
11323

    
11324
/* Values for microMIPS fmt field.  Variable-width, depending on which
11325
   formats the instruction supports.  */
11326

    
11327
enum {
11328
    FMT_SD_S = 0,
11329
    FMT_SD_D = 1,
11330

    
11331
    FMT_SDPS_S = 0,
11332
    FMT_SDPS_D = 1,
11333
    FMT_SDPS_PS = 2,
11334

    
11335
    FMT_SWL_S = 0,
11336
    FMT_SWL_W = 1,
11337
    FMT_SWL_L = 2,
11338

    
11339
    FMT_DWL_D = 0,
11340
    FMT_DWL_W = 1,
11341
    FMT_DWL_L = 2
11342
};
11343

    
11344
static void gen_pool32fxf(DisasContext *ctx, int rt, int rs)
11345
{
11346
    int extension = (ctx->opcode >> 6) & 0x3ff;
11347
    uint32_t mips32_op;
11348

    
11349
#define FLOAT_1BIT_FMT(opc, fmt) (fmt << 8) | opc
11350
#define FLOAT_2BIT_FMT(opc, fmt) (fmt << 7) | opc
11351
#define COND_FLOAT_MOV(opc, cond) (cond << 7) | opc
11352

    
11353
    switch (extension) {
11354
    case FLOAT_1BIT_FMT(CFC1, 0):
11355
        mips32_op = OPC_CFC1;
11356
        goto do_cp1;
11357
    case FLOAT_1BIT_FMT(CTC1, 0):
11358
        mips32_op = OPC_CTC1;
11359
        goto do_cp1;
11360
    case FLOAT_1BIT_FMT(MFC1, 0):
11361
        mips32_op = OPC_MFC1;
11362
        goto do_cp1;
11363
    case FLOAT_1BIT_FMT(MTC1, 0):
11364
        mips32_op = OPC_MTC1;
11365
        goto do_cp1;
11366
    case FLOAT_1BIT_FMT(MFHC1, 0):
11367
        mips32_op = OPC_MFHC1;
11368
        goto do_cp1;
11369
    case FLOAT_1BIT_FMT(MTHC1, 0):
11370
        mips32_op = OPC_MTHC1;
11371
    do_cp1:
11372
        gen_cp1(ctx, mips32_op, rt, rs);
11373
        break;
11374

    
11375
        /* Reciprocal square root */
11376
    case FLOAT_1BIT_FMT(RSQRT_FMT, FMT_SD_S):
11377
        mips32_op = OPC_RSQRT_S;
11378
        goto do_unaryfp;
11379
    case FLOAT_1BIT_FMT(RSQRT_FMT, FMT_SD_D):
11380
        mips32_op = OPC_RSQRT_D;
11381
        goto do_unaryfp;
11382

    
11383
        /* Square root */
11384
    case FLOAT_1BIT_FMT(SQRT_FMT, FMT_SD_S):
11385
        mips32_op = OPC_SQRT_S;
11386
        goto do_unaryfp;
11387
    case FLOAT_1BIT_FMT(SQRT_FMT, FMT_SD_D):
11388
        mips32_op = OPC_SQRT_D;
11389
        goto do_unaryfp;
11390

    
11391
        /* Reciprocal */
11392
    case FLOAT_1BIT_FMT(RECIP_FMT, FMT_SD_S):
11393
        mips32_op = OPC_RECIP_S;
11394
        goto do_unaryfp;
11395
    case FLOAT_1BIT_FMT(RECIP_FMT, FMT_SD_D):
11396
        mips32_op = OPC_RECIP_D;
11397
        goto do_unaryfp;
11398

    
11399
        /* Floor */
11400
    case FLOAT_1BIT_FMT(FLOOR_L, FMT_SD_S):
11401
        mips32_op = OPC_FLOOR_L_S;
11402
        goto do_unaryfp;
11403
    case FLOAT_1BIT_FMT(FLOOR_L, FMT_SD_D):
11404
        mips32_op = OPC_FLOOR_L_D;
11405
        goto do_unaryfp;
11406
    case FLOAT_1BIT_FMT(FLOOR_W, FMT_SD_S):
11407
        mips32_op = OPC_FLOOR_W_S;
11408
        goto do_unaryfp;
11409
    case FLOAT_1BIT_FMT(FLOOR_W, FMT_SD_D):
11410
        mips32_op = OPC_FLOOR_W_D;
11411
        goto do_unaryfp;
11412

    
11413
        /* Ceiling */
11414
    case FLOAT_1BIT_FMT(CEIL_L, FMT_SD_S):
11415
        mips32_op = OPC_CEIL_L_S;
11416
        goto do_unaryfp;
11417
    case FLOAT_1BIT_FMT(CEIL_L, FMT_SD_D):
11418
        mips32_op = OPC_CEIL_L_D;
11419
        goto do_unaryfp;
11420
    case FLOAT_1BIT_FMT(CEIL_W, FMT_SD_S):
11421
        mips32_op = OPC_CEIL_W_S;
11422
        goto do_unaryfp;
11423
    case FLOAT_1BIT_FMT(CEIL_W, FMT_SD_D):
11424
        mips32_op = OPC_CEIL_W_D;
11425
        goto do_unaryfp;
11426

    
11427
        /* Truncation */
11428
    case FLOAT_1BIT_FMT(TRUNC_L, FMT_SD_S):
11429
        mips32_op = OPC_TRUNC_L_S;
11430
        goto do_unaryfp;
11431
    case FLOAT_1BIT_FMT(TRUNC_L, FMT_SD_D):
11432
        mips32_op = OPC_TRUNC_L_D;
11433
        goto do_unaryfp;
11434
    case FLOAT_1BIT_FMT(TRUNC_W, FMT_SD_S):
11435
        mips32_op = OPC_TRUNC_W_S;
11436
        goto do_unaryfp;
11437
    case FLOAT_1BIT_FMT(TRUNC_W, FMT_SD_D):
11438
        mips32_op = OPC_TRUNC_W_D;
11439
        goto do_unaryfp;
11440

    
11441
        /* Round */
11442
    case FLOAT_1BIT_FMT(ROUND_L, FMT_SD_S):
11443
        mips32_op = OPC_ROUND_L_S;
11444
        goto do_unaryfp;
11445
    case FLOAT_1BIT_FMT(ROUND_L, FMT_SD_D):
11446
        mips32_op = OPC_ROUND_L_D;
11447
        goto do_unaryfp;
11448
    case FLOAT_1BIT_FMT(ROUND_W, FMT_SD_S):
11449
        mips32_op = OPC_ROUND_W_S;
11450
        goto do_unaryfp;
11451
    case FLOAT_1BIT_FMT(ROUND_W, FMT_SD_D):
11452
        mips32_op = OPC_ROUND_W_D;
11453
        goto do_unaryfp;
11454

    
11455
        /* Integer to floating-point conversion */
11456
    case FLOAT_1BIT_FMT(CVT_L, FMT_SD_S):
11457
        mips32_op = OPC_CVT_L_S;
11458
        goto do_unaryfp;
11459
    case FLOAT_1BIT_FMT(CVT_L, FMT_SD_D):
11460
        mips32_op = OPC_CVT_L_D;
11461
        goto do_unaryfp;
11462
    case FLOAT_1BIT_FMT(CVT_W, FMT_SD_S):
11463
        mips32_op = OPC_CVT_W_S;
11464
        goto do_unaryfp;
11465
    case FLOAT_1BIT_FMT(CVT_W, FMT_SD_D):
11466
        mips32_op = OPC_CVT_W_D;
11467
        goto do_unaryfp;
11468

    
11469
        /* Paired-foo conversions */
11470
    case FLOAT_1BIT_FMT(CVT_S_PL, 0):
11471
        mips32_op = OPC_CVT_S_PL;
11472
        goto do_unaryfp;
11473
    case FLOAT_1BIT_FMT(CVT_S_PU, 0):
11474
        mips32_op = OPC_CVT_S_PU;
11475
        goto do_unaryfp;
11476
    case FLOAT_1BIT_FMT(CVT_PW_PS, 0):
11477
        mips32_op = OPC_CVT_PW_PS;
11478
        goto do_unaryfp;
11479
    case FLOAT_1BIT_FMT(CVT_PS_PW, 0):
11480
        mips32_op = OPC_CVT_PS_PW;
11481
        goto do_unaryfp;
11482

    
11483
        /* Floating-point moves */
11484
    case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_S):
11485
        mips32_op = OPC_MOV_S;
11486
        goto do_unaryfp;
11487
    case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_D):
11488
        mips32_op = OPC_MOV_D;
11489
        goto do_unaryfp;
11490
    case FLOAT_2BIT_FMT(MOV_FMT, FMT_SDPS_PS):
11491
        mips32_op = OPC_MOV_PS;
11492
        goto do_unaryfp;
11493

    
11494
        /* Absolute value */
11495
    case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_S):
11496
        mips32_op = OPC_ABS_S;
11497
        goto do_unaryfp;
11498
    case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_D):
11499
        mips32_op = OPC_ABS_D;
11500
        goto do_unaryfp;
11501
    case FLOAT_2BIT_FMT(ABS_FMT, FMT_SDPS_PS):
11502
        mips32_op = OPC_ABS_PS;
11503
        goto do_unaryfp;
11504

    
11505
        /* Negation */
11506
    case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_S):
11507
        mips32_op = OPC_NEG_S;
11508
        goto do_unaryfp;
11509
    case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_D):
11510
        mips32_op = OPC_NEG_D;
11511
        goto do_unaryfp;
11512
    case FLOAT_2BIT_FMT(NEG_FMT, FMT_SDPS_PS):
11513
        mips32_op = OPC_NEG_PS;
11514
        goto do_unaryfp;
11515

    
11516
        /* Reciprocal square root step */
11517
    case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_S):
11518
        mips32_op = OPC_RSQRT1_S;
11519
        goto do_unaryfp;
11520
    case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_D):
11521
        mips32_op = OPC_RSQRT1_D;
11522
        goto do_unaryfp;
11523
    case FLOAT_2BIT_FMT(RSQRT1_FMT, FMT_SDPS_PS):
11524
        mips32_op = OPC_RSQRT1_PS;
11525
        goto do_unaryfp;
11526

    
11527
        /* Reciprocal step */
11528
    case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_S):
11529
        mips32_op = OPC_RECIP1_S;
11530
        goto do_unaryfp;
11531
    case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_D):
11532
        mips32_op = OPC_RECIP1_S;
11533
        goto do_unaryfp;
11534
    case FLOAT_2BIT_FMT(RECIP1_FMT, FMT_SDPS_PS):
11535
        mips32_op = OPC_RECIP1_PS;
11536
        goto do_unaryfp;
11537

    
11538
        /* Conversions from double */
11539
    case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_S):
11540
        mips32_op = OPC_CVT_D_S;
11541
        goto do_unaryfp;
11542
    case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_W):
11543
        mips32_op = OPC_CVT_D_W;
11544
        goto do_unaryfp;
11545
    case FLOAT_2BIT_FMT(CVT_D, FMT_SWL_L):
11546
        mips32_op = OPC_CVT_D_L;
11547
        goto do_unaryfp;
11548

    
11549
        /* Conversions from single */
11550
    case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_D):
11551
        mips32_op = OPC_CVT_S_D;
11552
        goto do_unaryfp;
11553
    case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_W):
11554
        mips32_op = OPC_CVT_S_W;
11555
        goto do_unaryfp;
11556
    case FLOAT_2BIT_FMT(CVT_S, FMT_DWL_L):
11557
        mips32_op = OPC_CVT_S_L;
11558
    do_unaryfp:
11559
        gen_farith(ctx, mips32_op, -1, rs, rt, 0);
11560
        break;
11561

    
11562
        /* Conditional moves on floating-point codes */
11563
    case COND_FLOAT_MOV(MOVT, 0):
11564
    case COND_FLOAT_MOV(MOVT, 1):
11565
    case COND_FLOAT_MOV(MOVT, 2):
11566
    case COND_FLOAT_MOV(MOVT, 3):
11567
    case COND_FLOAT_MOV(MOVT, 4):
11568
    case COND_FLOAT_MOV(MOVT, 5):
11569
    case COND_FLOAT_MOV(MOVT, 6):
11570
    case COND_FLOAT_MOV(MOVT, 7):
11571
        gen_movci(ctx, rt, rs, (ctx->opcode >> 13) & 0x7, 1);
11572
        break;
11573
    case COND_FLOAT_MOV(MOVF, 0):
11574
    case COND_FLOAT_MOV(MOVF, 1):
11575
    case COND_FLOAT_MOV(MOVF, 2):
11576
    case COND_FLOAT_MOV(MOVF, 3):
11577
    case COND_FLOAT_MOV(MOVF, 4):
11578
    case COND_FLOAT_MOV(MOVF, 5):
11579
    case COND_FLOAT_MOV(MOVF, 6):
11580
    case COND_FLOAT_MOV(MOVF, 7):
11581
        gen_movci(ctx, rt, rs, (ctx->opcode >> 13) & 0x7, 0);
11582
        break;
11583
    default:
11584
        MIPS_INVAL("pool32fxf");
11585
        generate_exception(ctx, EXCP_RI);
11586
        break;
11587
    }
11588
}
11589

    
11590
static void decode_micromips32_opc (CPUMIPSState *env, DisasContext *ctx,
11591
                                    uint16_t insn_hw1)
11592
{
11593
    int32_t offset;
11594
    uint16_t insn;
11595
    int rt, rs, rd, rr;
11596
    int16_t imm;
11597
    uint32_t op, minor, mips32_op;
11598
    uint32_t cond, fmt, cc;
11599

    
11600
    insn = cpu_lduw_code(env, ctx->pc + 2);
11601
    ctx->opcode = (ctx->opcode << 16) | insn;
11602

    
11603
    rt = (ctx->opcode >> 21) & 0x1f;
11604
    rs = (ctx->opcode >> 16) & 0x1f;
11605
    rd = (ctx->opcode >> 11) & 0x1f;
11606
    rr = (ctx->opcode >> 6) & 0x1f;
11607
    imm = (int16_t) ctx->opcode;
11608

    
11609
    op = (ctx->opcode >> 26) & 0x3f;
11610
    switch (op) {
11611
    case POOL32A:
11612
        minor = ctx->opcode & 0x3f;
11613
        switch (minor) {
11614
        case 0x00:
11615
            minor = (ctx->opcode >> 6) & 0xf;
11616
            switch (minor) {
11617
            case SLL32:
11618
                mips32_op = OPC_SLL;
11619
                goto do_shifti;
11620
            case SRA:
11621
                mips32_op = OPC_SRA;
11622
                goto do_shifti;
11623
            case SRL32:
11624
                mips32_op = OPC_SRL;
11625
                goto do_shifti;
11626
            case ROTR:
11627
                mips32_op = OPC_ROTR;
11628
            do_shifti:
11629
                gen_shift_imm(ctx, mips32_op, rt, rs, rd);
11630
                break;
11631
            default:
11632
                goto pool32a_invalid;
11633
            }
11634
            break;
11635
        case 0x10:
11636
            minor = (ctx->opcode >> 6) & 0xf;
11637
            switch (minor) {
11638
                /* Arithmetic */
11639
            case ADD:
11640
                mips32_op = OPC_ADD;
11641
                goto do_arith;
11642
            case ADDU32:
11643
                mips32_op = OPC_ADDU;
11644
                goto do_arith;
11645
            case SUB:
11646
                mips32_op = OPC_SUB;
11647
                goto do_arith;
11648
            case SUBU32:
11649
                mips32_op = OPC_SUBU;
11650
                goto do_arith;
11651
            case MUL:
11652
                mips32_op = OPC_MUL;
11653
            do_arith:
11654
                gen_arith(ctx, mips32_op, rd, rs, rt);
11655
                break;
11656
                /* Shifts */
11657
            case SLLV:
11658
                mips32_op = OPC_SLLV;
11659
                goto do_shift;
11660
            case SRLV:
11661
                mips32_op = OPC_SRLV;
11662
                goto do_shift;
11663
            case SRAV:
11664
                mips32_op = OPC_SRAV;
11665
                goto do_shift;
11666
            case ROTRV:
11667
                mips32_op = OPC_ROTRV;
11668
            do_shift:
11669
                gen_shift(ctx, mips32_op, rd, rs, rt);
11670
                break;
11671
                /* Logical operations */
11672
            case AND:
11673
                mips32_op = OPC_AND;
11674
                goto do_logic;
11675
            case OR32:
11676
                mips32_op = OPC_OR;
11677
                goto do_logic;
11678
            case NOR:
11679
                mips32_op = OPC_NOR;
11680
                goto do_logic;
11681
            case XOR32:
11682
                mips32_op = OPC_XOR;
11683
            do_logic:
11684
                gen_logic(ctx, mips32_op, rd, rs, rt);
11685
                break;
11686
                /* Set less than */
11687
            case SLT:
11688
                mips32_op = OPC_SLT;
11689
                goto do_slt;
11690
            case SLTU:
11691
                mips32_op = OPC_SLTU;
11692
            do_slt:
11693
                gen_slt(ctx, mips32_op, rd, rs, rt);
11694
                break;
11695
            default:
11696
                goto pool32a_invalid;
11697
            }
11698
            break;
11699
        case 0x18:
11700
            minor = (ctx->opcode >> 6) & 0xf;
11701
            switch (minor) {
11702
                /* Conditional moves */
11703
            case MOVN:
11704
                mips32_op = OPC_MOVN;
11705
                goto do_cmov;
11706
            case MOVZ:
11707
                mips32_op = OPC_MOVZ;
11708
            do_cmov:
11709
                gen_cond_move(ctx, mips32_op, rd, rs, rt);
11710
                break;
11711
            case LWXS:
11712
                gen_ldxs(ctx, rs, rt, rd);
11713
                break;
11714
            default:
11715
                goto pool32a_invalid;
11716
            }
11717
            break;
11718
        case INS:
11719
            gen_bitops(ctx, OPC_INS, rt, rs, rr, rd);
11720
            return;
11721
        case EXT:
11722
            gen_bitops(ctx, OPC_EXT, rt, rs, rr, rd);
11723
            return;
11724
        case POOL32AXF:
11725
            gen_pool32axf(env, ctx, rt, rs);
11726
            break;
11727
        case 0x07:
11728
            generate_exception(ctx, EXCP_BREAK);
11729
            break;
11730
        default:
11731
        pool32a_invalid:
11732
                MIPS_INVAL("pool32a");
11733
                generate_exception(ctx, EXCP_RI);
11734
                break;
11735
        }
11736
        break;
11737
    case POOL32B:
11738
        minor = (ctx->opcode >> 12) & 0xf;
11739
        switch (minor) {
11740
        case CACHE:
11741
            check_cp0_enabled(ctx);
11742
            /* Treat as no-op. */
11743
            break;
11744
        case LWC2:
11745
        case SWC2:
11746
            /* COP2: Not implemented. */
11747
            generate_exception_err(ctx, EXCP_CpU, 2);
11748
            break;
11749
        case LWP:
11750
        case SWP:
11751
#ifdef TARGET_MIPS64
11752
        case LDP:
11753
        case SDP:
11754
#endif
11755
            gen_ldst_pair(ctx, minor, rt, rs, SIMM(ctx->opcode, 0, 12));
11756
            break;
11757
        case LWM32:
11758
        case SWM32:
11759
#ifdef TARGET_MIPS64
11760
        case LDM:
11761
        case SDM:
11762
#endif
11763
            gen_ldst_multiple(ctx, minor, rt, rs, SIMM(ctx->opcode, 0, 12));
11764
            break;
11765
        default:
11766
            MIPS_INVAL("pool32b");
11767
            generate_exception(ctx, EXCP_RI);
11768
            break;
11769
        }
11770
        break;
11771
    case POOL32F:
11772
        if (env->CP0_Config1 & (1 << CP0C1_FP)) {
11773
            minor = ctx->opcode & 0x3f;
11774
            check_cp1_enabled(ctx);
11775
            switch (minor) {
11776
            case ALNV_PS:
11777
                mips32_op = OPC_ALNV_PS;
11778
                goto do_madd;
11779
            case MADD_S:
11780
                mips32_op = OPC_MADD_S;
11781
                goto do_madd;
11782
            case MADD_D:
11783
                mips32_op = OPC_MADD_D;
11784
                goto do_madd;
11785
            case MADD_PS:
11786
                mips32_op = OPC_MADD_PS;
11787
                goto do_madd;
11788
            case MSUB_S:
11789
                mips32_op = OPC_MSUB_S;
11790
                goto do_madd;
11791
            case MSUB_D:
11792
                mips32_op = OPC_MSUB_D;
11793
                goto do_madd;
11794
            case MSUB_PS:
11795
                mips32_op = OPC_MSUB_PS;
11796
                goto do_madd;
11797
            case NMADD_S:
11798
                mips32_op = OPC_NMADD_S;
11799
                goto do_madd;
11800
            case NMADD_D:
11801
                mips32_op = OPC_NMADD_D;
11802
                goto do_madd;
11803
            case NMADD_PS:
11804
                mips32_op = OPC_NMADD_PS;
11805
                goto do_madd;
11806
            case NMSUB_S:
11807
                mips32_op = OPC_NMSUB_S;
11808
                goto do_madd;
11809
            case NMSUB_D:
11810
                mips32_op = OPC_NMSUB_D;
11811
                goto do_madd;
11812
            case NMSUB_PS:
11813
                mips32_op = OPC_NMSUB_PS;
11814
            do_madd:
11815
                gen_flt3_arith(ctx, mips32_op, rd, rr, rs, rt);
11816
                break;
11817
            case CABS_COND_FMT:
11818
                cond = (ctx->opcode >> 6) & 0xf;
11819
                cc = (ctx->opcode >> 13) & 0x7;
11820
                fmt = (ctx->opcode >> 10) & 0x3;
11821
                switch (fmt) {
11822
                case 0x0:
11823
                    gen_cmpabs_s(ctx, cond, rt, rs, cc);
11824
                    break;
11825
                case 0x1:
11826
                    gen_cmpabs_d(ctx, cond, rt, rs, cc);
11827
                    break;
11828
                case 0x2:
11829
                    gen_cmpabs_ps(ctx, cond, rt, rs, cc);
11830
                    break;
11831
                default:
11832
                    goto pool32f_invalid;
11833
                }
11834
                break;
11835
            case C_COND_FMT:
11836
                cond = (ctx->opcode >> 6) & 0xf;
11837
                cc = (ctx->opcode >> 13) & 0x7;
11838
                fmt = (ctx->opcode >> 10) & 0x3;
11839
                switch (fmt) {
11840
                case 0x0:
11841
                    gen_cmp_s(ctx, cond, rt, rs, cc);
11842
                    break;
11843
                case 0x1:
11844
                    gen_cmp_d(ctx, cond, rt, rs, cc);
11845
                    break;
11846
                case 0x2:
11847
                    gen_cmp_ps(ctx, cond, rt, rs, cc);
11848
                    break;
11849
                default:
11850
                    goto pool32f_invalid;
11851
                }
11852
                break;
11853
            case POOL32FXF:
11854
                gen_pool32fxf(ctx, rt, rs);
11855
                break;
11856
            case 0x00:
11857
                /* PLL foo */
11858
                switch ((ctx->opcode >> 6) & 0x7) {
11859
                case PLL_PS:
11860
                    mips32_op = OPC_PLL_PS;
11861
                    goto do_ps;
11862
                case PLU_PS:
11863
                    mips32_op = OPC_PLU_PS;
11864
                    goto do_ps;
11865
                case PUL_PS:
11866
                    mips32_op = OPC_PUL_PS;
11867
                    goto do_ps;
11868
                case PUU_PS:
11869
                    mips32_op = OPC_PUU_PS;
11870
                    goto do_ps;
11871
                case CVT_PS_S:
11872
                    mips32_op = OPC_CVT_PS_S;
11873
                do_ps:
11874
                    gen_farith(ctx, mips32_op, rt, rs, rd, 0);
11875
                    break;
11876
                default:
11877
                    goto pool32f_invalid;
11878
                }
11879
                break;
11880
            case 0x08:
11881
                /* [LS][WDU]XC1 */
11882
                switch ((ctx->opcode >> 6) & 0x7) {
11883
                case LWXC1:
11884
                    mips32_op = OPC_LWXC1;
11885
                    goto do_ldst_cp1;
11886
                case SWXC1:
11887
                    mips32_op = OPC_SWXC1;
11888
                    goto do_ldst_cp1;
11889
                case LDXC1:
11890
                    mips32_op = OPC_LDXC1;
11891
                    goto do_ldst_cp1;
11892
                case SDXC1:
11893
                    mips32_op = OPC_SDXC1;
11894
                    goto do_ldst_cp1;
11895
                case LUXC1:
11896
                    mips32_op = OPC_LUXC1;
11897
                    goto do_ldst_cp1;
11898
                case SUXC1:
11899
                    mips32_op = OPC_SUXC1;
11900
                do_ldst_cp1:
11901
                    gen_flt3_ldst(ctx, mips32_op, rd, rd, rt, rs);
11902
                    break;
11903
                default:
11904
                    goto pool32f_invalid;
11905
                }
11906
                break;
11907
            case 0x18:
11908
                /* 3D insns */
11909
                fmt = (ctx->opcode >> 9) & 0x3;
11910
                switch ((ctx->opcode >> 6) & 0x7) {
11911
                case RSQRT2_FMT:
11912
                    switch (fmt) {
11913
                    case FMT_SDPS_S:
11914
                        mips32_op = OPC_RSQRT2_S;
11915
                        goto do_3d;
11916
                    case FMT_SDPS_D:
11917
                        mips32_op = OPC_RSQRT2_D;
11918
                        goto do_3d;
11919
                    case FMT_SDPS_PS:
11920
                        mips32_op = OPC_RSQRT2_PS;
11921
                        goto do_3d;
11922
                    default:
11923
                        goto pool32f_invalid;
11924
                    }
11925
                    break;
11926
                case RECIP2_FMT:
11927
                    switch (fmt) {
11928
                    case FMT_SDPS_S:
11929
                        mips32_op = OPC_RECIP2_S;
11930
                        goto do_3d;
11931
                    case FMT_SDPS_D:
11932
                        mips32_op = OPC_RECIP2_D;
11933
                        goto do_3d;
11934
                    case FMT_SDPS_PS:
11935
                        mips32_op = OPC_RECIP2_PS;
11936
                        goto do_3d;
11937
                    default:
11938
                        goto pool32f_invalid;
11939
                    }
11940
                    break;
11941
                case ADDR_PS:
11942
                    mips32_op = OPC_ADDR_PS;
11943
                    goto do_3d;
11944
                case MULR_PS:
11945
                    mips32_op = OPC_MULR_PS;
11946
                do_3d:
11947
                    gen_farith(ctx, mips32_op, rt, rs, rd, 0);
11948
                    break;
11949
                default:
11950
                    goto pool32f_invalid;
11951
                }
11952
                break;
11953
            case 0x20:
11954
                /* MOV[FT].fmt and PREFX */
11955
                cc = (ctx->opcode >> 13) & 0x7;
11956
                fmt = (ctx->opcode >> 9) & 0x3;
11957
                switch ((ctx->opcode >> 6) & 0x7) {
11958
                case MOVF_FMT:
11959
                    switch (fmt) {
11960
                    case FMT_SDPS_S:
11961
                        gen_movcf_s(rs, rt, cc, 0);
11962
                        break;
11963
                    case FMT_SDPS_D:
11964
                        gen_movcf_d(ctx, rs, rt, cc, 0);
11965
                        break;
11966
                    case FMT_SDPS_PS:
11967
                        gen_movcf_ps(rs, rt, cc, 0);
11968
                        break;
11969
                    default:
11970
                        goto pool32f_invalid;
11971
                    }
11972
                    break;
11973
                case MOVT_FMT:
11974
                    switch (fmt) {
11975
                    case FMT_SDPS_S:
11976
                        gen_movcf_s(rs, rt, cc, 1);
11977
                        break;
11978
                    case FMT_SDPS_D:
11979
                        gen_movcf_d(ctx, rs, rt, cc, 1);
11980
                        break;
11981
                    case FMT_SDPS_PS:
11982
                        gen_movcf_ps(rs, rt, cc, 1);
11983
                        break;
11984
                    default:
11985
                        goto pool32f_invalid;
11986
                    }
11987
                    break;
11988
                case PREFX:
11989
                    break;
11990
                default:
11991
                    goto pool32f_invalid;
11992
                }
11993
                break;
11994
#define FINSN_3ARG_SDPS(prfx)                           \
11995
                switch ((ctx->opcode >> 8) & 0x3) {     \
11996
                case FMT_SDPS_S:                        \
11997
                    mips32_op = OPC_##prfx##_S;         \
11998
                    goto do_fpop;                       \
11999
                case FMT_SDPS_D:                        \
12000
                    mips32_op = OPC_##prfx##_D;         \
12001
                    goto do_fpop;                       \
12002
                case FMT_SDPS_PS:                       \
12003
                    mips32_op = OPC_##prfx##_PS;        \
12004
                    goto do_fpop;                       \
12005
                default:                                \
12006
                    goto pool32f_invalid;               \
12007
                }
12008
            case 0x30:
12009
                /* regular FP ops */
12010
                switch ((ctx->opcode >> 6) & 0x3) {
12011
                case ADD_FMT:
12012
                    FINSN_3ARG_SDPS(ADD);
12013
                    break;
12014
                case SUB_FMT:
12015
                    FINSN_3ARG_SDPS(SUB);
12016
                    break;
12017
                case MUL_FMT:
12018
                    FINSN_3ARG_SDPS(MUL);
12019
                    break;
12020
                case DIV_FMT:
12021
                    fmt = (ctx->opcode >> 8) & 0x3;
12022
                    if (fmt == 1) {
12023
                        mips32_op = OPC_DIV_D;
12024
                    } else if (fmt == 0) {
12025
                        mips32_op = OPC_DIV_S;
12026
                    } else {
12027
                        goto pool32f_invalid;
12028
                    }
12029
                    goto do_fpop;
12030
                default:
12031
                    goto pool32f_invalid;
12032
                }
12033
                break;
12034
            case 0x38:
12035
                /* cmovs */
12036
                switch ((ctx->opcode >> 6) & 0x3) {
12037
                case MOVN_FMT:
12038
                    FINSN_3ARG_SDPS(MOVN);
12039
                    break;
12040
                case MOVZ_FMT:
12041
                    FINSN_3ARG_SDPS(MOVZ);
12042
                    break;
12043
                default:
12044
                    goto pool32f_invalid;
12045
                }
12046
                break;
12047
            do_fpop:
12048
                gen_farith(ctx, mips32_op, rt, rs, rd, 0);
12049
                break;
12050
            default:
12051
            pool32f_invalid:
12052
                MIPS_INVAL("pool32f");
12053
                generate_exception(ctx, EXCP_RI);
12054
                break;
12055
            }
12056
        } else {
12057
            generate_exception_err(ctx, EXCP_CpU, 1);
12058
        }
12059
        break;
12060
    case POOL32I:
12061
        minor = (ctx->opcode >> 21) & 0x1f;
12062
        switch (minor) {
12063
        case BLTZ:
12064
            mips32_op = OPC_BLTZ;
12065
            goto do_branch;
12066
        case BLTZAL:
12067
            mips32_op = OPC_BLTZAL;
12068
            goto do_branch;
12069
        case BLTZALS:
12070
            mips32_op = OPC_BLTZALS;
12071
            goto do_branch;
12072
        case BGEZ:
12073
            mips32_op = OPC_BGEZ;
12074
            goto do_branch;
12075
        case BGEZAL:
12076
            mips32_op = OPC_BGEZAL;
12077
            goto do_branch;
12078
        case BGEZALS:
12079
            mips32_op = OPC_BGEZALS;
12080
            goto do_branch;
12081
        case BLEZ:
12082
            mips32_op = OPC_BLEZ;
12083
            goto do_branch;
12084
        case BGTZ:
12085
            mips32_op = OPC_BGTZ;
12086
        do_branch:
12087
            gen_compute_branch(ctx, mips32_op, 4, rs, -1, imm << 1);
12088
            break;
12089

    
12090
            /* Traps */
12091
        case TLTI:
12092
            mips32_op = OPC_TLTI;
12093
            goto do_trapi;
12094
        case TGEI:
12095
            mips32_op = OPC_TGEI;
12096
            goto do_trapi;
12097
        case TLTIU:
12098
            mips32_op = OPC_TLTIU;
12099
            goto do_trapi;
12100
        case TGEIU:
12101
            mips32_op = OPC_TGEIU;
12102
            goto do_trapi;
12103
        case TNEI:
12104
            mips32_op = OPC_TNEI;
12105
            goto do_trapi;
12106
        case TEQI:
12107
            mips32_op = OPC_TEQI;
12108
        do_trapi:
12109
            gen_trap(ctx, mips32_op, rs, -1, imm);
12110
            break;
12111

    
12112
        case BNEZC:
12113
        case BEQZC:
12114
            gen_compute_branch(ctx, minor == BNEZC ? OPC_BNE : OPC_BEQ,
12115
                               4, rs, 0, imm << 1);
12116
            /* Compact branches don't have a delay slot, so just let
12117
               the normal delay slot handling take us to the branch
12118
               target. */
12119
            break;
12120
        case LUI:
12121
            gen_logic_imm(ctx, OPC_LUI, rs, -1, imm);
12122
            break;
12123
        case SYNCI:
12124
            break;
12125
        case BC2F:
12126
        case BC2T:
12127
            /* COP2: Not implemented. */
12128
            generate_exception_err(ctx, EXCP_CpU, 2);
12129
            break;
12130
        case BC1F:
12131
            mips32_op = (ctx->opcode & (1 << 16)) ? OPC_BC1FANY2 : OPC_BC1F;
12132
            goto do_cp1branch;
12133
        case BC1T:
12134
            mips32_op = (ctx->opcode & (1 << 16)) ? OPC_BC1TANY2 : OPC_BC1T;
12135
            goto do_cp1branch;
12136
        case BC1ANY4F:
12137
            mips32_op = OPC_BC1FANY4;
12138
            goto do_cp1mips3d;
12139
        case BC1ANY4T:
12140
            mips32_op = OPC_BC1TANY4;
12141
        do_cp1mips3d:
12142
            check_cop1x(ctx);
12143
            check_insn(ctx, ASE_MIPS3D);
12144
            /* Fall through */
12145
        do_cp1branch:
12146
            gen_compute_branch1(ctx, mips32_op,
12147
                                (ctx->opcode >> 18) & 0x7, imm << 1);
12148
            break;
12149
        case BPOSGE64:
12150
        case BPOSGE32:
12151
            /* MIPS DSP: not implemented */
12152
            /* Fall through */
12153
        default:
12154
            MIPS_INVAL("pool32i");
12155
            generate_exception(ctx, EXCP_RI);
12156
            break;
12157
        }
12158
        break;
12159
    case POOL32C:
12160
        minor = (ctx->opcode >> 12) & 0xf;
12161
        switch (minor) {
12162
        case LWL:
12163
            mips32_op = OPC_LWL;
12164
            goto do_ld_lr;
12165
        case SWL:
12166
            mips32_op = OPC_SWL;
12167
            goto do_st_lr;
12168
        case LWR:
12169
            mips32_op = OPC_LWR;
12170
            goto do_ld_lr;
12171
        case SWR:
12172
            mips32_op = OPC_SWR;
12173
            goto do_st_lr;
12174
#if defined(TARGET_MIPS64)
12175
        case LDL:
12176
            mips32_op = OPC_LDL;
12177
            goto do_ld_lr;
12178
        case SDL:
12179
            mips32_op = OPC_SDL;
12180
            goto do_st_lr;
12181
        case LDR:
12182
            mips32_op = OPC_LDR;
12183
            goto do_ld_lr;
12184
        case SDR:
12185
            mips32_op = OPC_SDR;
12186
            goto do_st_lr;
12187
        case LWU:
12188
            mips32_op = OPC_LWU;
12189
            goto do_ld_lr;
12190
        case LLD:
12191
            mips32_op = OPC_LLD;
12192
            goto do_ld_lr;
12193
#endif
12194
        case LL:
12195
            mips32_op = OPC_LL;
12196
            goto do_ld_lr;
12197
        do_ld_lr:
12198
            gen_ld(ctx, mips32_op, rt, rs, SIMM(ctx->opcode, 0, 12));
12199
            break;
12200
        do_st_lr:
12201
            gen_st(ctx, mips32_op, rt, rs, SIMM(ctx->opcode, 0, 12));
12202
            break;
12203
        case SC:
12204
            gen_st_cond(ctx, OPC_SC, rt, rs, SIMM(ctx->opcode, 0, 12));
12205
            break;
12206
#if defined(TARGET_MIPS64)
12207
        case SCD:
12208
            gen_st_cond(ctx, OPC_SCD, rt, rs, SIMM(ctx->opcode, 0, 12));
12209
            break;
12210
#endif
12211
        case PREF:
12212
            /* Treat as no-op */
12213
            break;
12214
        default:
12215
            MIPS_INVAL("pool32c");
12216
            generate_exception(ctx, EXCP_RI);
12217
            break;
12218
        }
12219
        break;
12220
    case ADDI32:
12221
        mips32_op = OPC_ADDI;
12222
        goto do_addi;
12223
    case ADDIU32:
12224
        mips32_op = OPC_ADDIU;
12225
    do_addi:
12226
        gen_arith_imm(ctx, mips32_op, rt, rs, imm);
12227
        break;
12228

    
12229
        /* Logical operations */
12230
    case ORI32:
12231
        mips32_op = OPC_ORI;
12232
        goto do_logici;
12233
    case XORI32:
12234
        mips32_op = OPC_XORI;
12235
        goto do_logici;
12236
    case ANDI32:
12237
        mips32_op = OPC_ANDI;
12238
    do_logici:
12239
        gen_logic_imm(ctx, mips32_op, rt, rs, imm);
12240
        break;
12241

    
12242
        /* Set less than immediate */
12243
    case SLTI32:
12244
        mips32_op = OPC_SLTI;
12245
        goto do_slti;
12246
    case SLTIU32:
12247
        mips32_op = OPC_SLTIU;
12248
    do_slti:
12249
        gen_slt_imm(ctx, mips32_op, rt, rs, imm);
12250
        break;
12251
    case JALX32:
12252
        offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
12253
        gen_compute_branch(ctx, OPC_JALX, 4, rt, rs, offset);
12254
        break;
12255
    case JALS32:
12256
        offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 1;
12257
        gen_compute_branch(ctx, OPC_JALS, 4, rt, rs, offset);
12258
        break;
12259
    case BEQ32:
12260
        gen_compute_branch(ctx, OPC_BEQ, 4, rt, rs, imm << 1);
12261
        break;
12262
    case BNE32:
12263
        gen_compute_branch(ctx, OPC_BNE, 4, rt, rs, imm << 1);
12264
        break;
12265
    case J32:
12266
        gen_compute_branch(ctx, OPC_J, 4, rt, rs,
12267
                           (int32_t)(ctx->opcode & 0x3FFFFFF) << 1);
12268
        break;
12269
    case JAL32:
12270
        gen_compute_branch(ctx, OPC_JAL, 4, rt, rs,
12271
                           (int32_t)(ctx->opcode & 0x3FFFFFF) << 1);
12272
        break;
12273
        /* Floating point (COP1) */
12274
    case LWC132:
12275
        mips32_op = OPC_LWC1;
12276
        goto do_cop1;
12277
    case LDC132:
12278
        mips32_op = OPC_LDC1;
12279
        goto do_cop1;
12280
    case SWC132:
12281
        mips32_op = OPC_SWC1;
12282
        goto do_cop1;
12283
    case SDC132:
12284
        mips32_op = OPC_SDC1;
12285
    do_cop1:
12286
        gen_cop1_ldst(env, ctx, mips32_op, rt, rs, imm);
12287
        break;
12288
    case ADDIUPC:
12289
        {
12290
            int reg = mmreg(ZIMM(ctx->opcode, 23, 3));
12291
            int offset = SIMM(ctx->opcode, 0, 23) << 2;
12292

    
12293
            gen_addiupc(ctx, reg, offset, 0, 0);
12294
        }
12295
        break;
12296
        /* Loads and stores */
12297
    case LB32:
12298
        mips32_op = OPC_LB;
12299
        goto do_ld;
12300
    case LBU32:
12301
        mips32_op = OPC_LBU;
12302
        goto do_ld;
12303
    case LH32:
12304
        mips32_op = OPC_LH;
12305
        goto do_ld;
12306
    case LHU32:
12307
        mips32_op = OPC_LHU;
12308
        goto do_ld;
12309
    case LW32:
12310
        mips32_op = OPC_LW;
12311
        goto do_ld;
12312
#ifdef TARGET_MIPS64
12313
    case LD32:
12314
        mips32_op = OPC_LD;
12315
        goto do_ld;
12316
    case SD32:
12317
        mips32_op = OPC_SD;
12318
        goto do_st;
12319
#endif
12320
    case SB32:
12321
        mips32_op = OPC_SB;
12322
        goto do_st;
12323
    case SH32:
12324
        mips32_op = OPC_SH;
12325
        goto do_st;
12326
    case SW32:
12327
        mips32_op = OPC_SW;
12328
        goto do_st;
12329
    do_ld:
12330
        gen_ld(ctx, mips32_op, rt, rs, imm);
12331
        break;
12332
    do_st:
12333
        gen_st(ctx, mips32_op, rt, rs, imm);
12334
        break;
12335
    default:
12336
        generate_exception(ctx, EXCP_RI);
12337
        break;
12338
    }
12339
}
12340

    
12341
static int decode_micromips_opc (CPUMIPSState *env, DisasContext *ctx)
12342
{
12343
    uint32_t op;
12344

    
12345
    /* make sure instructions are on a halfword boundary */
12346
    if (ctx->pc & 0x1) {
12347
        env->CP0_BadVAddr = ctx->pc;
12348
        generate_exception(ctx, EXCP_AdEL);
12349
        ctx->bstate = BS_STOP;
12350
        return 2;
12351
    }
12352

    
12353
    op = (ctx->opcode >> 10) & 0x3f;
12354
    /* Enforce properly-sized instructions in a delay slot */
12355
    if (ctx->hflags & MIPS_HFLAG_BMASK) {
12356
        int bits = ctx->hflags & MIPS_HFLAG_BMASK_EXT;
12357

    
12358
        switch (op) {
12359
        case POOL32A:
12360
        case POOL32B:
12361
        case POOL32I:
12362
        case POOL32C:
12363
        case ADDI32:
12364
        case ADDIU32:
12365
        case ORI32:
12366
        case XORI32:
12367
        case SLTI32:
12368
        case SLTIU32:
12369
        case ANDI32:
12370
        case JALX32:
12371
        case LBU32:
12372
        case LHU32:
12373
        case POOL32F:
12374
        case JALS32:
12375
        case BEQ32:
12376
        case BNE32:
12377
        case J32:
12378
        case JAL32:
12379
        case SB32:
12380
        case SH32:
12381
        case POOL32S:
12382
        case ADDIUPC:
12383
        case SWC132:
12384
        case SDC132:
12385
        case SD32:
12386
        case SW32:
12387
        case LB32:
12388
        case LH32:
12389
        case DADDIU32:
12390
        case LWC132:
12391
        case LDC132:
12392
        case LD32:
12393
        case LW32:
12394
            if (bits & MIPS_HFLAG_BDS16) {
12395
                generate_exception(ctx, EXCP_RI);
12396
                /* Just stop translation; the user is confused.  */
12397
                ctx->bstate = BS_STOP;
12398
                return 2;
12399
            }
12400
            break;
12401
        case POOL16A:
12402
        case POOL16B:
12403
        case POOL16C:
12404
        case LWGP16:
12405
        case POOL16F:
12406
        case LBU16:
12407
        case LHU16:
12408
        case LWSP16:
12409
        case LW16:
12410
        case SB16:
12411
        case SH16:
12412
        case SWSP16:
12413
        case SW16:
12414
        case MOVE16:
12415
        case ANDI16:
12416
        case POOL16D:
12417
        case POOL16E:
12418
        case BEQZ16:
12419
        case BNEZ16:
12420
        case B16:
12421
        case LI16:
12422
            if (bits & MIPS_HFLAG_BDS32) {
12423
                generate_exception(ctx, EXCP_RI);
12424
                /* Just stop translation; the user is confused.  */
12425
                ctx->bstate = BS_STOP;
12426
                return 2;
12427
            }
12428
            break;
12429
        default:
12430
            break;
12431
        }
12432
    }
12433
    switch (op) {
12434
    case POOL16A:
12435
        {
12436
            int rd = mmreg(uMIPS_RD(ctx->opcode));
12437
            int rs1 = mmreg(uMIPS_RS1(ctx->opcode));
12438
            int rs2 = mmreg(uMIPS_RS2(ctx->opcode));
12439
            uint32_t opc = 0;
12440

    
12441
            switch (ctx->opcode & 0x1) {
12442
            case ADDU16:
12443
                opc = OPC_ADDU;
12444
                break;
12445
            case SUBU16:
12446
                opc = OPC_SUBU;
12447
                break;
12448
            }
12449

    
12450
            gen_arith(ctx, opc, rd, rs1, rs2);
12451
        }
12452
        break;
12453
    case POOL16B:
12454
        {
12455
            int rd = mmreg(uMIPS_RD(ctx->opcode));
12456
            int rs = mmreg(uMIPS_RS(ctx->opcode));
12457
            int amount = (ctx->opcode >> 1) & 0x7;
12458
            uint32_t opc = 0;
12459
            amount = amount == 0 ? 8 : amount;
12460

    
12461
            switch (ctx->opcode & 0x1) {
12462
            case SLL16:
12463
                opc = OPC_SLL;
12464
                break;
12465
            case SRL16:
12466
                opc = OPC_SRL;
12467
                break;
12468
            }
12469

    
12470
            gen_shift_imm(ctx, opc, rd, rs, amount);
12471
        }
12472
        break;
12473
    case POOL16C:
12474
        gen_pool16c_insn(ctx);
12475
        break;
12476
    case LWGP16:
12477
        {
12478
            int rd = mmreg(uMIPS_RD(ctx->opcode));
12479
            int rb = 28;            /* GP */
12480
            int16_t offset = SIMM(ctx->opcode, 0, 7) << 2;
12481

    
12482
            gen_ld(ctx, OPC_LW, rd, rb, offset);
12483
        }
12484
        break;
12485
    case POOL16F:
12486
        if (ctx->opcode & 1) {
12487
            generate_exception(ctx, EXCP_RI);
12488
        } else {
12489
            /* MOVEP */
12490
            int enc_dest = uMIPS_RD(ctx->opcode);
12491
            int enc_rt = uMIPS_RS2(ctx->opcode);
12492
            int enc_rs = uMIPS_RS1(ctx->opcode);
12493
            int rd, rs, re, rt;
12494
            static const int rd_enc[] = { 5, 5, 6, 4, 4, 4, 4, 4 };
12495
            static const int re_enc[] = { 6, 7, 7, 21, 22, 5, 6, 7 };
12496
            static const int rs_rt_enc[] = { 0, 17, 2, 3, 16, 18, 19, 20 };
12497

    
12498
            rd = rd_enc[enc_dest];
12499
            re = re_enc[enc_dest];
12500
            rs = rs_rt_enc[enc_rs];
12501
            rt = rs_rt_enc[enc_rt];
12502

    
12503
            gen_arith_imm(ctx, OPC_ADDIU, rd, rs, 0);
12504
            gen_arith_imm(ctx, OPC_ADDIU, re, rt, 0);
12505
        }
12506
        break;
12507
    case LBU16:
12508
        {
12509
            int rd = mmreg(uMIPS_RD(ctx->opcode));
12510
            int rb = mmreg(uMIPS_RS(ctx->opcode));
12511
            int16_t offset = ZIMM(ctx->opcode, 0, 4);
12512
            offset = (offset == 0xf ? -1 : offset);
12513

    
12514
            gen_ld(ctx, OPC_LBU, rd, rb, offset);
12515
        }
12516
        break;
12517
    case LHU16:
12518
        {
12519
            int rd = mmreg(uMIPS_RD(ctx->opcode));
12520
            int rb = mmreg(uMIPS_RS(ctx->opcode));
12521
            int16_t offset = ZIMM(ctx->opcode, 0, 4) << 1;
12522

    
12523
            gen_ld(ctx, OPC_LHU, rd, rb, offset);
12524
        }
12525
        break;
12526
    case LWSP16:
12527
        {
12528
            int rd = (ctx->opcode >> 5) & 0x1f;
12529
            int rb = 29;            /* SP */
12530
            int16_t offset = ZIMM(ctx->opcode, 0, 5) << 2;
12531

    
12532
            gen_ld(ctx, OPC_LW, rd, rb, offset);
12533
        }
12534
        break;
12535
    case LW16:
12536
        {
12537
            int rd = mmreg(uMIPS_RD(ctx->opcode));
12538
            int rb = mmreg(uMIPS_RS(ctx->opcode));
12539
            int16_t offset = ZIMM(ctx->opcode, 0, 4) << 2;
12540

    
12541
            gen_ld(ctx, OPC_LW, rd, rb, offset);
12542
        }
12543
        break;
12544
    case SB16:
12545
        {
12546
            int rd = mmreg2(uMIPS_RD(ctx->opcode));
12547
            int rb = mmreg(uMIPS_RS(ctx->opcode));
12548
            int16_t offset = ZIMM(ctx->opcode, 0, 4);
12549

    
12550
            gen_st(ctx, OPC_SB, rd, rb, offset);
12551
        }
12552
        break;
12553
    case SH16:
12554
        {
12555
            int rd = mmreg2(uMIPS_RD(ctx->opcode));
12556
            int rb = mmreg(uMIPS_RS(ctx->opcode));
12557
            int16_t offset = ZIMM(ctx->opcode, 0, 4) << 1;
12558

    
12559
            gen_st(ctx, OPC_SH, rd, rb, offset);
12560
        }
12561
        break;
12562
    case SWSP16:
12563
        {
12564
            int rd = (ctx->opcode >> 5) & 0x1f;
12565
            int rb = 29;            /* SP */
12566
            int16_t offset = ZIMM(ctx->opcode, 0, 5) << 2;
12567

    
12568
            gen_st(ctx, OPC_SW, rd, rb, offset);
12569
        }
12570
        break;
12571
    case SW16:
12572
        {
12573
            int rd = mmreg2(uMIPS_RD(ctx->opcode));
12574
            int rb = mmreg(uMIPS_RS(ctx->opcode));
12575
            int16_t offset = ZIMM(ctx->opcode, 0, 4) << 2;
12576

    
12577
            gen_st(ctx, OPC_SW, rd, rb, offset);
12578
        }
12579
        break;
12580
    case MOVE16:
12581
        {
12582
            int rd = uMIPS_RD5(ctx->opcode);
12583
            int rs = uMIPS_RS5(ctx->opcode);
12584

    
12585
            gen_arith_imm(ctx, OPC_ADDIU, rd, rs, 0);
12586
        }
12587
        break;
12588
    case ANDI16:
12589
        gen_andi16(ctx);
12590
        break;
12591
    case POOL16D:
12592
        switch (ctx->opcode & 0x1) {
12593
        case ADDIUS5:
12594
            gen_addius5(ctx);
12595
            break;
12596
        case ADDIUSP:
12597
            gen_addiusp(ctx);
12598
            break;
12599
        }
12600
        break;
12601
    case POOL16E:
12602
        switch (ctx->opcode & 0x1) {
12603
        case ADDIUR2:
12604
            gen_addiur2(ctx);
12605
            break;
12606
        case ADDIUR1SP:
12607
            gen_addiur1sp(ctx);
12608
            break;
12609
        }
12610
        break;
12611
    case B16:
12612
        gen_compute_branch(ctx, OPC_BEQ, 2, 0, 0,
12613
                           SIMM(ctx->opcode, 0, 10) << 1);
12614
        break;
12615
    case BNEZ16:
12616
    case BEQZ16:
12617
        gen_compute_branch(ctx, op == BNEZ16 ? OPC_BNE : OPC_BEQ, 2,
12618
                           mmreg(uMIPS_RD(ctx->opcode)),
12619
                           0, SIMM(ctx->opcode, 0, 7) << 1);
12620
        break;
12621
    case LI16:
12622
        {
12623
            int reg = mmreg(uMIPS_RD(ctx->opcode));
12624
            int imm = ZIMM(ctx->opcode, 0, 7);
12625

    
12626
            imm = (imm == 0x7f ? -1 : imm);
12627
            tcg_gen_movi_tl(cpu_gpr[reg], imm);
12628
        }
12629
        break;
12630
    case RES_20:
12631
    case RES_28:
12632
    case RES_29:
12633
    case RES_30:
12634
    case RES_31:
12635
    case RES_38:
12636
    case RES_39:
12637
        generate_exception(ctx, EXCP_RI);
12638
        break;
12639
    default:
12640
        decode_micromips32_opc (env, ctx, op);
12641
        return 4;
12642
    }
12643

    
12644
    return 2;
12645
}
12646

    
12647
/* SmartMIPS extension to MIPS32 */
12648

    
12649
#if defined(TARGET_MIPS64)
12650

    
12651
/* MDMX extension to MIPS64 */
12652

    
12653
#endif
12654

    
12655
/* MIPSDSP functions. */
12656
static void gen_mipsdsp_ld(DisasContext *ctx, uint32_t opc,
12657
                           int rd, int base, int offset)
12658
{
12659
    const char *opn = "ldx";
12660
    TCGv t0;
12661

    
12662
    check_dsp(ctx);
12663
    t0 = tcg_temp_new();
12664

    
12665
    if (base == 0) {
12666
        gen_load_gpr(t0, offset);
12667
    } else if (offset == 0) {
12668
        gen_load_gpr(t0, base);
12669
    } else {
12670
        gen_op_addr_add(ctx, t0, cpu_gpr[base], cpu_gpr[offset]);
12671
    }
12672

    
12673
    switch (opc) {
12674
    case OPC_LBUX:
12675
        tcg_gen_qemu_ld8u(t0, t0, ctx->mem_idx);
12676
        gen_store_gpr(t0, rd);
12677
        opn = "lbux";
12678
        break;
12679
    case OPC_LHX:
12680
        tcg_gen_qemu_ld16s(t0, t0, ctx->mem_idx);
12681
        gen_store_gpr(t0, rd);
12682
        opn = "lhx";
12683
        break;
12684
    case OPC_LWX:
12685
        tcg_gen_qemu_ld32s(t0, t0, ctx->mem_idx);
12686
        gen_store_gpr(t0, rd);
12687
        opn = "lwx";
12688
        break;
12689
#if defined(TARGET_MIPS64)
12690
    case OPC_LDX:
12691
        tcg_gen_qemu_ld64(t0, t0, ctx->mem_idx);
12692
        gen_store_gpr(t0, rd);
12693
        opn = "ldx";
12694
        break;
12695
#endif
12696
    }
12697
    (void)opn; /* avoid a compiler warning */
12698
    MIPS_DEBUG("%s %s, %s(%s)", opn,
12699
               regnames[rd], regnames[offset], regnames[base]);
12700
    tcg_temp_free(t0);
12701
}
12702

    
12703
static void gen_mipsdsp_arith(DisasContext *ctx, uint32_t op1, uint32_t op2,
12704
                              int ret, int v1, int v2)
12705
{
12706
    const char *opn = "mipsdsp arith";
12707
    TCGv v1_t;
12708
    TCGv v2_t;
12709

    
12710
    if (ret == 0) {
12711
        /* Treat as NOP. */
12712
        MIPS_DEBUG("NOP");
12713
        return;
12714
    }
12715

    
12716
    v1_t = tcg_temp_new();
12717
    v2_t = tcg_temp_new();
12718

    
12719
    gen_load_gpr(v1_t, v1);
12720
    gen_load_gpr(v2_t, v2);
12721

    
12722
    switch (op1) {
12723
    /* OPC_MULT_G_2E is equal OPC_ADDUH_QB_DSP */
12724
    case OPC_MULT_G_2E:
12725
        check_dspr2(ctx);
12726
        switch (op2) {
12727
        case OPC_ADDUH_QB:
12728
            gen_helper_adduh_qb(cpu_gpr[ret], v1_t, v2_t);
12729
            break;
12730
        case OPC_ADDUH_R_QB:
12731
            gen_helper_adduh_r_qb(cpu_gpr[ret], v1_t, v2_t);
12732
            break;
12733
        case OPC_ADDQH_PH:
12734
            gen_helper_addqh_ph(cpu_gpr[ret], v1_t, v2_t);
12735
            break;
12736
        case OPC_ADDQH_R_PH:
12737
            gen_helper_addqh_r_ph(cpu_gpr[ret], v1_t, v2_t);
12738
            break;
12739
        case OPC_ADDQH_W:
12740
            gen_helper_addqh_w(cpu_gpr[ret], v1_t, v2_t);
12741
            break;
12742
        case OPC_ADDQH_R_W:
12743
            gen_helper_addqh_r_w(cpu_gpr[ret], v1_t, v2_t);
12744
            break;
12745
        case OPC_SUBUH_QB:
12746
            gen_helper_subuh_qb(cpu_gpr[ret], v1_t, v2_t);
12747
            break;
12748
        case OPC_SUBUH_R_QB:
12749
            gen_helper_subuh_r_qb(cpu_gpr[ret], v1_t, v2_t);
12750
            break;
12751
        case OPC_SUBQH_PH:
12752
            gen_helper_subqh_ph(cpu_gpr[ret], v1_t, v2_t);
12753
            break;
12754
        case OPC_SUBQH_R_PH:
12755
            gen_helper_subqh_r_ph(cpu_gpr[ret], v1_t, v2_t);
12756
            break;
12757
        case OPC_SUBQH_W:
12758
            gen_helper_subqh_w(cpu_gpr[ret], v1_t, v2_t);
12759
            break;
12760
        case OPC_SUBQH_R_W:
12761
            gen_helper_subqh_r_w(cpu_gpr[ret], v1_t, v2_t);
12762
            break;
12763
        }
12764
        break;
12765
    case OPC_ABSQ_S_PH_DSP:
12766
        switch (op2) {
12767
        case OPC_ABSQ_S_QB:
12768
            check_dspr2(ctx);
12769
            gen_helper_absq_s_qb(cpu_gpr[ret], v2_t, cpu_env);
12770
            break;
12771
        case OPC_ABSQ_S_PH:
12772
            check_dsp(ctx);
12773
            gen_helper_absq_s_ph(cpu_gpr[ret], v2_t, cpu_env);
12774
            break;
12775
        case OPC_ABSQ_S_W:
12776
            check_dsp(ctx);
12777
            gen_helper_absq_s_w(cpu_gpr[ret], v2_t, cpu_env);
12778
            break;
12779
        case OPC_PRECEQ_W_PHL:
12780
            check_dsp(ctx);
12781
            tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0xFFFF0000);
12782
            tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
12783
            break;
12784
        case OPC_PRECEQ_W_PHR:
12785
            check_dsp(ctx);
12786
            tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0x0000FFFF);
12787
            tcg_gen_shli_tl(cpu_gpr[ret], cpu_gpr[ret], 16);
12788
            tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
12789
            break;
12790
        case OPC_PRECEQU_PH_QBL:
12791
            check_dsp(ctx);
12792
            gen_helper_precequ_ph_qbl(cpu_gpr[ret], v2_t);
12793
            break;
12794
        case OPC_PRECEQU_PH_QBR:
12795
            check_dsp(ctx);
12796
            gen_helper_precequ_ph_qbr(cpu_gpr[ret], v2_t);
12797
            break;
12798
        case OPC_PRECEQU_PH_QBLA:
12799
            check_dsp(ctx);
12800
            gen_helper_precequ_ph_qbla(cpu_gpr[ret], v2_t);
12801
            break;
12802
        case OPC_PRECEQU_PH_QBRA:
12803
            check_dsp(ctx);
12804
            gen_helper_precequ_ph_qbra(cpu_gpr[ret], v2_t);
12805
            break;
12806
        case OPC_PRECEU_PH_QBL:
12807
            check_dsp(ctx);
12808
            gen_helper_preceu_ph_qbl(cpu_gpr[ret], v2_t);
12809
            break;
12810
        case OPC_PRECEU_PH_QBR:
12811
            check_dsp(ctx);
12812
            gen_helper_preceu_ph_qbr(cpu_gpr[ret], v2_t);
12813
            break;
12814
        case OPC_PRECEU_PH_QBLA:
12815
            check_dsp(ctx);
12816
            gen_helper_preceu_ph_qbla(cpu_gpr[ret], v2_t);
12817
            break;
12818
        case OPC_PRECEU_PH_QBRA:
12819
            check_dsp(ctx);
12820
            gen_helper_preceu_ph_qbra(cpu_gpr[ret], v2_t);
12821
            break;
12822
        }
12823
        break;
12824
    case OPC_ADDU_QB_DSP:
12825
        switch (op2) {
12826
        case OPC_ADDQ_PH:
12827
            check_dsp(ctx);
12828
            gen_helper_addq_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12829
            break;
12830
        case OPC_ADDQ_S_PH:
12831
            check_dsp(ctx);
12832
            gen_helper_addq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12833
            break;
12834
        case OPC_ADDQ_S_W:
12835
            check_dsp(ctx);
12836
            gen_helper_addq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12837
            break;
12838
        case OPC_ADDU_QB:
12839
            check_dsp(ctx);
12840
            gen_helper_addu_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12841
            break;
12842
        case OPC_ADDU_S_QB:
12843
            check_dsp(ctx);
12844
            gen_helper_addu_s_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12845
            break;
12846
        case OPC_ADDU_PH:
12847
            check_dspr2(ctx);
12848
            gen_helper_addu_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12849
            break;
12850
        case OPC_ADDU_S_PH:
12851
            check_dspr2(ctx);
12852
            gen_helper_addu_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12853
            break;
12854
        case OPC_SUBQ_PH:
12855
            check_dsp(ctx);
12856
            gen_helper_subq_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12857
            break;
12858
        case OPC_SUBQ_S_PH:
12859
            check_dsp(ctx);
12860
            gen_helper_subq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12861
            break;
12862
        case OPC_SUBQ_S_W:
12863
            check_dsp(ctx);
12864
            gen_helper_subq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12865
            break;
12866
        case OPC_SUBU_QB:
12867
            check_dsp(ctx);
12868
            gen_helper_subu_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12869
            break;
12870
        case OPC_SUBU_S_QB:
12871
            check_dsp(ctx);
12872
            gen_helper_subu_s_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12873
            break;
12874
        case OPC_SUBU_PH:
12875
            check_dspr2(ctx);
12876
            gen_helper_subu_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12877
            break;
12878
        case OPC_SUBU_S_PH:
12879
            check_dspr2(ctx);
12880
            gen_helper_subu_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12881
            break;
12882
        case OPC_ADDSC:
12883
            check_dsp(ctx);
12884
            gen_helper_addsc(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12885
            break;
12886
        case OPC_ADDWC:
12887
            check_dsp(ctx);
12888
            gen_helper_addwc(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12889
            break;
12890
        case OPC_MODSUB:
12891
            check_dsp(ctx);
12892
            gen_helper_modsub(cpu_gpr[ret], v1_t, v2_t);
12893
            break;
12894
        case OPC_RADDU_W_QB:
12895
            check_dsp(ctx);
12896
            gen_helper_raddu_w_qb(cpu_gpr[ret], v1_t);
12897
            break;
12898
        }
12899
        break;
12900
    case OPC_CMPU_EQ_QB_DSP:
12901
        switch (op2) {
12902
        case OPC_PRECR_QB_PH:
12903
            check_dspr2(ctx);
12904
            gen_helper_precr_qb_ph(cpu_gpr[ret], v1_t, v2_t);
12905
            break;
12906
        case OPC_PRECRQ_QB_PH:
12907
            check_dsp(ctx);
12908
            gen_helper_precrq_qb_ph(cpu_gpr[ret], v1_t, v2_t);
12909
            break;
12910
        case OPC_PRECR_SRA_PH_W:
12911
            check_dspr2(ctx);
12912
            {
12913
                TCGv_i32 sa_t = tcg_const_i32(v2);
12914
                gen_helper_precr_sra_ph_w(cpu_gpr[ret], sa_t, v1_t,
12915
                                          cpu_gpr[ret]);
12916
                tcg_temp_free_i32(sa_t);
12917
                break;
12918
            }
12919
        case OPC_PRECR_SRA_R_PH_W:
12920
            check_dspr2(ctx);
12921
            {
12922
                TCGv_i32 sa_t = tcg_const_i32(v2);
12923
                gen_helper_precr_sra_r_ph_w(cpu_gpr[ret], sa_t, v1_t,
12924
                                            cpu_gpr[ret]);
12925
                tcg_temp_free_i32(sa_t);
12926
                break;
12927
            }
12928
        case OPC_PRECRQ_PH_W:
12929
            check_dsp(ctx);
12930
            gen_helper_precrq_ph_w(cpu_gpr[ret], v1_t, v2_t);
12931
            break;
12932
        case OPC_PRECRQ_RS_PH_W:
12933
            check_dsp(ctx);
12934
            gen_helper_precrq_rs_ph_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12935
            break;
12936
        case OPC_PRECRQU_S_QB_PH:
12937
            check_dsp(ctx);
12938
            gen_helper_precrqu_s_qb_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
12939
            break;
12940
        }
12941
        break;
12942
#ifdef TARGET_MIPS64
12943
    case OPC_ABSQ_S_QH_DSP:
12944
        switch (op2) {
12945
        case OPC_PRECEQ_L_PWL:
12946
            check_dsp(ctx);
12947
            tcg_gen_andi_tl(cpu_gpr[ret], v2_t, 0xFFFFFFFF00000000ull);
12948
            break;
12949
        case OPC_PRECEQ_L_PWR:
12950
            check_dsp(ctx);
12951
            tcg_gen_shli_tl(cpu_gpr[ret], v2_t, 32);
12952
            break;
12953
        case OPC_PRECEQ_PW_QHL:
12954
            check_dsp(ctx);
12955
            gen_helper_preceq_pw_qhl(cpu_gpr[ret], v2_t);
12956
            break;
12957
        case OPC_PRECEQ_PW_QHR:
12958
            check_dsp(ctx);
12959
            gen_helper_preceq_pw_qhr(cpu_gpr[ret], v2_t);
12960
            break;
12961
        case OPC_PRECEQ_PW_QHLA:
12962
            check_dsp(ctx);
12963
            gen_helper_preceq_pw_qhla(cpu_gpr[ret], v2_t);
12964
            break;
12965
        case OPC_PRECEQ_PW_QHRA:
12966
            check_dsp(ctx);
12967
            gen_helper_preceq_pw_qhra(cpu_gpr[ret], v2_t);
12968
            break;
12969
        case OPC_PRECEQU_QH_OBL:
12970
            check_dsp(ctx);
12971
            gen_helper_precequ_qh_obl(cpu_gpr[ret], v2_t);
12972
            break;
12973
        case OPC_PRECEQU_QH_OBR:
12974
            check_dsp(ctx);
12975
            gen_helper_precequ_qh_obr(cpu_gpr[ret], v2_t);
12976
            break;
12977
        case OPC_PRECEQU_QH_OBLA:
12978
            check_dsp(ctx);
12979
            gen_helper_precequ_qh_obla(cpu_gpr[ret], v2_t);
12980
            break;
12981
        case OPC_PRECEQU_QH_OBRA:
12982
            check_dsp(ctx);
12983
            gen_helper_precequ_qh_obra(cpu_gpr[ret], v2_t);
12984
            break;
12985
        case OPC_PRECEU_QH_OBL:
12986
            check_dsp(ctx);
12987
            gen_helper_preceu_qh_obl(cpu_gpr[ret], v2_t);
12988
            break;
12989
        case OPC_PRECEU_QH_OBR:
12990
            check_dsp(ctx);
12991
            gen_helper_preceu_qh_obr(cpu_gpr[ret], v2_t);
12992
            break;
12993
        case OPC_PRECEU_QH_OBLA:
12994
            check_dsp(ctx);
12995
            gen_helper_preceu_qh_obla(cpu_gpr[ret], v2_t);
12996
            break;
12997
        case OPC_PRECEU_QH_OBRA:
12998
            check_dsp(ctx);
12999
            gen_helper_preceu_qh_obra(cpu_gpr[ret], v2_t);
13000
            break;
13001
        case OPC_ABSQ_S_OB:
13002
            check_dspr2(ctx);
13003
            gen_helper_absq_s_ob(cpu_gpr[ret], v2_t, cpu_env);
13004
            break;
13005
        case OPC_ABSQ_S_PW:
13006
            check_dsp(ctx);
13007
            gen_helper_absq_s_pw(cpu_gpr[ret], v2_t, cpu_env);
13008
            break;
13009
        case OPC_ABSQ_S_QH:
13010
            check_dsp(ctx);
13011
            gen_helper_absq_s_qh(cpu_gpr[ret], v2_t, cpu_env);
13012
            break;
13013
        }
13014
        break;
13015
    case OPC_ADDU_OB_DSP:
13016
        switch (op2) {
13017
        case OPC_RADDU_L_OB:
13018
            check_dsp(ctx);
13019
            gen_helper_raddu_l_ob(cpu_gpr[ret], v1_t);
13020
            break;
13021
        case OPC_SUBQ_PW:
13022
            check_dsp(ctx);
13023
            gen_helper_subq_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13024
            break;
13025
        case OPC_SUBQ_S_PW:
13026
            check_dsp(ctx);
13027
            gen_helper_subq_s_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13028
            break;
13029
        case OPC_SUBQ_QH:
13030
            check_dsp(ctx);
13031
            gen_helper_subq_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13032
            break;
13033
        case OPC_SUBQ_S_QH:
13034
            check_dsp(ctx);
13035
            gen_helper_subq_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13036
            break;
13037
        case OPC_SUBU_OB:
13038
            check_dsp(ctx);
13039
            gen_helper_subu_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13040
            break;
13041
        case OPC_SUBU_S_OB:
13042
            check_dsp(ctx);
13043
            gen_helper_subu_s_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13044
            break;
13045
        case OPC_SUBU_QH:
13046
            check_dspr2(ctx);
13047
            gen_helper_subu_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13048
            break;
13049
        case OPC_SUBU_S_QH:
13050
            check_dspr2(ctx);
13051
            gen_helper_subu_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13052
            break;
13053
        case OPC_SUBUH_OB:
13054
            check_dspr2(ctx);
13055
            gen_helper_subuh_ob(cpu_gpr[ret], v1_t, v2_t);
13056
            break;
13057
        case OPC_SUBUH_R_OB:
13058
            check_dspr2(ctx);
13059
            gen_helper_subuh_r_ob(cpu_gpr[ret], v1_t, v2_t);
13060
            break;
13061
        case OPC_ADDQ_PW:
13062
            check_dsp(ctx);
13063
            gen_helper_addq_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13064
            break;
13065
        case OPC_ADDQ_S_PW:
13066
            check_dsp(ctx);
13067
            gen_helper_addq_s_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13068
            break;
13069
        case OPC_ADDQ_QH:
13070
            check_dsp(ctx);
13071
            gen_helper_addq_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13072
            break;
13073
        case OPC_ADDQ_S_QH:
13074
            check_dsp(ctx);
13075
            gen_helper_addq_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13076
            break;
13077
        case OPC_ADDU_OB:
13078
            check_dsp(ctx);
13079
            gen_helper_addu_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13080
            break;
13081
        case OPC_ADDU_S_OB:
13082
            check_dsp(ctx);
13083
            gen_helper_addu_s_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13084
            break;
13085
        case OPC_ADDU_QH:
13086
            check_dspr2(ctx);
13087
            gen_helper_addu_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13088
            break;
13089
        case OPC_ADDU_S_QH:
13090
            check_dspr2(ctx);
13091
            gen_helper_addu_s_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13092
            break;
13093
        case OPC_ADDUH_OB:
13094
            check_dspr2(ctx);
13095
            gen_helper_adduh_ob(cpu_gpr[ret], v1_t, v2_t);
13096
            break;
13097
        case OPC_ADDUH_R_OB:
13098
            check_dspr2(ctx);
13099
            gen_helper_adduh_r_ob(cpu_gpr[ret], v1_t, v2_t);
13100
            break;
13101
        }
13102
        break;
13103
    case OPC_CMPU_EQ_OB_DSP:
13104
        switch (op2) {
13105
        case OPC_PRECR_OB_QH:
13106
            check_dspr2(ctx);
13107
            gen_helper_precr_ob_qh(cpu_gpr[ret], v1_t, v2_t);
13108
            break;
13109
        case OPC_PRECR_SRA_QH_PW:
13110
            check_dspr2(ctx);
13111
            {
13112
                TCGv_i32 ret_t = tcg_const_i32(ret);
13113
                gen_helper_precr_sra_qh_pw(v2_t, v1_t, v2_t, ret_t);
13114
                tcg_temp_free_i32(ret_t);
13115
                break;
13116
            }
13117
        case OPC_PRECR_SRA_R_QH_PW:
13118
            check_dspr2(ctx);
13119
            {
13120
                TCGv_i32 sa_v = tcg_const_i32(ret);
13121
                gen_helper_precr_sra_r_qh_pw(v2_t, v1_t, v2_t, sa_v);
13122
                tcg_temp_free_i32(sa_v);
13123
                break;
13124
            }
13125
        case OPC_PRECRQ_OB_QH:
13126
            check_dsp(ctx);
13127
            gen_helper_precrq_ob_qh(cpu_gpr[ret], v1_t, v2_t);
13128
            break;
13129
        case OPC_PRECRQ_PW_L:
13130
            check_dsp(ctx);
13131
            gen_helper_precrq_pw_l(cpu_gpr[ret], v1_t, v2_t);
13132
            break;
13133
        case OPC_PRECRQ_QH_PW:
13134
            check_dsp(ctx);
13135
            gen_helper_precrq_qh_pw(cpu_gpr[ret], v1_t, v2_t);
13136
            break;
13137
        case OPC_PRECRQ_RS_QH_PW:
13138
            check_dsp(ctx);
13139
            gen_helper_precrq_rs_qh_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13140
            break;
13141
        case OPC_PRECRQU_S_OB_QH:
13142
            check_dsp(ctx);
13143
            gen_helper_precrqu_s_ob_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13144
            break;
13145
        }
13146
        break;
13147
#endif
13148
    }
13149

    
13150
    tcg_temp_free(v1_t);
13151
    tcg_temp_free(v2_t);
13152

    
13153
    (void)opn; /* avoid a compiler warning */
13154
    MIPS_DEBUG("%s", opn);
13155
}
13156

    
13157
static void gen_mipsdsp_shift(DisasContext *ctx, uint32_t opc,
13158
                              int ret, int v1, int v2)
13159
{
13160
    uint32_t op2;
13161
    const char *opn = "mipsdsp shift";
13162
    TCGv t0;
13163
    TCGv v1_t;
13164
    TCGv v2_t;
13165

    
13166
    if (ret == 0) {
13167
        /* Treat as NOP. */
13168
        MIPS_DEBUG("NOP");
13169
        return;
13170
    }
13171

    
13172
    t0 = tcg_temp_new();
13173
    v1_t = tcg_temp_new();
13174
    v2_t = tcg_temp_new();
13175

    
13176
    tcg_gen_movi_tl(t0, v1);
13177
    gen_load_gpr(v1_t, v1);
13178
    gen_load_gpr(v2_t, v2);
13179

    
13180
    switch (opc) {
13181
    case OPC_SHLL_QB_DSP:
13182
        {
13183
            op2 = MASK_SHLL_QB(ctx->opcode);
13184
            switch (op2) {
13185
            case OPC_SHLL_QB:
13186
                check_dsp(ctx);
13187
                gen_helper_shll_qb(cpu_gpr[ret], t0, v2_t, cpu_env);
13188
                break;
13189
            case OPC_SHLLV_QB:
13190
                check_dsp(ctx);
13191
                gen_helper_shll_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13192
                break;
13193
            case OPC_SHLL_PH:
13194
                check_dsp(ctx);
13195
                gen_helper_shll_ph(cpu_gpr[ret], t0, v2_t, cpu_env);
13196
                break;
13197
            case OPC_SHLLV_PH:
13198
                check_dsp(ctx);
13199
                gen_helper_shll_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13200
                break;
13201
            case OPC_SHLL_S_PH:
13202
                check_dsp(ctx);
13203
                gen_helper_shll_s_ph(cpu_gpr[ret], t0, v2_t, cpu_env);
13204
                break;
13205
            case OPC_SHLLV_S_PH:
13206
                check_dsp(ctx);
13207
                gen_helper_shll_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13208
                break;
13209
            case OPC_SHLL_S_W:
13210
                check_dsp(ctx);
13211
                gen_helper_shll_s_w(cpu_gpr[ret], t0, v2_t, cpu_env);
13212
                break;
13213
            case OPC_SHLLV_S_W:
13214
                check_dsp(ctx);
13215
                gen_helper_shll_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13216
                break;
13217
            case OPC_SHRL_QB:
13218
                check_dsp(ctx);
13219
                gen_helper_shrl_qb(cpu_gpr[ret], t0, v2_t);
13220
                break;
13221
            case OPC_SHRLV_QB:
13222
                check_dsp(ctx);
13223
                gen_helper_shrl_qb(cpu_gpr[ret], v1_t, v2_t);
13224
                break;
13225
            case OPC_SHRL_PH:
13226
                check_dspr2(ctx);
13227
                gen_helper_shrl_ph(cpu_gpr[ret], t0, v2_t);
13228
                break;
13229
            case OPC_SHRLV_PH:
13230
                check_dspr2(ctx);
13231
                gen_helper_shrl_ph(cpu_gpr[ret], v1_t, v2_t);
13232
                break;
13233
            case OPC_SHRA_QB:
13234
                check_dspr2(ctx);
13235
                gen_helper_shra_qb(cpu_gpr[ret], t0, v2_t);
13236
                break;
13237
            case OPC_SHRA_R_QB:
13238
                check_dspr2(ctx);
13239
                gen_helper_shra_r_qb(cpu_gpr[ret], t0, v2_t);
13240
                break;
13241
            case OPC_SHRAV_QB:
13242
                check_dspr2(ctx);
13243
                gen_helper_shra_qb(cpu_gpr[ret], v1_t, v2_t);
13244
                break;
13245
            case OPC_SHRAV_R_QB:
13246
                check_dspr2(ctx);
13247
                gen_helper_shra_r_qb(cpu_gpr[ret], v1_t, v2_t);
13248
                break;
13249
            case OPC_SHRA_PH:
13250
                check_dsp(ctx);
13251
                gen_helper_shra_ph(cpu_gpr[ret], t0, v2_t);
13252
                break;
13253
            case OPC_SHRA_R_PH:
13254
                check_dsp(ctx);
13255
                gen_helper_shra_r_ph(cpu_gpr[ret], t0, v2_t);
13256
                break;
13257
            case OPC_SHRAV_PH:
13258
                check_dsp(ctx);
13259
                gen_helper_shra_ph(cpu_gpr[ret], v1_t, v2_t);
13260
                break;
13261
            case OPC_SHRAV_R_PH:
13262
                check_dsp(ctx);
13263
                gen_helper_shra_r_ph(cpu_gpr[ret], v1_t, v2_t);
13264
                break;
13265
            case OPC_SHRA_R_W:
13266
                check_dsp(ctx);
13267
                gen_helper_shra_r_w(cpu_gpr[ret], t0, v2_t);
13268
                break;
13269
            case OPC_SHRAV_R_W:
13270
                check_dsp(ctx);
13271
                gen_helper_shra_r_w(cpu_gpr[ret], v1_t, v2_t);
13272
                break;
13273
            default:            /* Invalid */
13274
                MIPS_INVAL("MASK SHLL.QB");
13275
                generate_exception(ctx, EXCP_RI);
13276
                break;
13277
            }
13278
            break;
13279
        }
13280
#ifdef TARGET_MIPS64
13281
    case OPC_SHLL_OB_DSP:
13282
        op2 = MASK_SHLL_OB(ctx->opcode);
13283
        switch (op2) {
13284
        case OPC_SHLL_PW:
13285
            check_dsp(ctx);
13286
            gen_helper_shll_pw(cpu_gpr[ret], v2_t, t0, cpu_env);
13287
            break;
13288
        case OPC_SHLLV_PW:
13289
            check_dsp(ctx);
13290
            gen_helper_shll_pw(cpu_gpr[ret], v2_t, v1_t, cpu_env);
13291
            break;
13292
        case OPC_SHLL_S_PW:
13293
            check_dsp(ctx);
13294
            gen_helper_shll_s_pw(cpu_gpr[ret], v2_t, t0, cpu_env);
13295
            break;
13296
        case OPC_SHLLV_S_PW:
13297
            check_dsp(ctx);
13298
            gen_helper_shll_s_pw(cpu_gpr[ret], v2_t, v1_t, cpu_env);
13299
            break;
13300
        case OPC_SHLL_OB:
13301
            check_dsp(ctx);
13302
            gen_helper_shll_ob(cpu_gpr[ret], v2_t, t0, cpu_env);
13303
            break;
13304
        case OPC_SHLLV_OB:
13305
            check_dsp(ctx);
13306
            gen_helper_shll_ob(cpu_gpr[ret], v2_t, v1_t, cpu_env);
13307
            break;
13308
        case OPC_SHLL_QH:
13309
            check_dsp(ctx);
13310
            gen_helper_shll_qh(cpu_gpr[ret], v2_t, t0, cpu_env);
13311
            break;
13312
        case OPC_SHLLV_QH:
13313
            check_dsp(ctx);
13314
            gen_helper_shll_qh(cpu_gpr[ret], v2_t, v1_t, cpu_env);
13315
            break;
13316
        case OPC_SHLL_S_QH:
13317
            check_dsp(ctx);
13318
            gen_helper_shll_s_qh(cpu_gpr[ret], v2_t, t0, cpu_env);
13319
            break;
13320
        case OPC_SHLLV_S_QH:
13321
            check_dsp(ctx);
13322
            gen_helper_shll_s_qh(cpu_gpr[ret], v2_t, v1_t, cpu_env);
13323
            break;
13324
        case OPC_SHRA_OB:
13325
            check_dspr2(ctx);
13326
            gen_helper_shra_ob(cpu_gpr[ret], v2_t, t0);
13327
            break;
13328
        case OPC_SHRAV_OB:
13329
            check_dspr2(ctx);
13330
            gen_helper_shra_ob(cpu_gpr[ret], v2_t, v1_t);
13331
            break;
13332
        case OPC_SHRA_R_OB:
13333
            check_dspr2(ctx);
13334
            gen_helper_shra_r_ob(cpu_gpr[ret], v2_t, t0);
13335
            break;
13336
        case OPC_SHRAV_R_OB:
13337
            check_dspr2(ctx);
13338
            gen_helper_shra_r_ob(cpu_gpr[ret], v2_t, v1_t);
13339
            break;
13340
        case OPC_SHRA_PW:
13341
            check_dsp(ctx);
13342
            gen_helper_shra_pw(cpu_gpr[ret], v2_t, t0);
13343
            break;
13344
        case OPC_SHRAV_PW:
13345
            check_dsp(ctx);
13346
            gen_helper_shra_pw(cpu_gpr[ret], v2_t, v1_t);
13347
            break;
13348
        case OPC_SHRA_R_PW:
13349
            check_dsp(ctx);
13350
            gen_helper_shra_r_pw(cpu_gpr[ret], v2_t, t0);
13351
            break;
13352
        case OPC_SHRAV_R_PW:
13353
            check_dsp(ctx);
13354
            gen_helper_shra_r_pw(cpu_gpr[ret], v2_t, v1_t);
13355
            break;
13356
        case OPC_SHRA_QH:
13357
            check_dsp(ctx);
13358
            gen_helper_shra_qh(cpu_gpr[ret], v2_t, t0);
13359
            break;
13360
        case OPC_SHRAV_QH:
13361
            check_dsp(ctx);
13362
            gen_helper_shra_qh(cpu_gpr[ret], v2_t, v1_t);
13363
            break;
13364
        case OPC_SHRA_R_QH:
13365
            check_dsp(ctx);
13366
            gen_helper_shra_r_qh(cpu_gpr[ret], v2_t, t0);
13367
            break;
13368
        case OPC_SHRAV_R_QH:
13369
            check_dsp(ctx);
13370
            gen_helper_shra_r_qh(cpu_gpr[ret], v2_t, v1_t);
13371
            break;
13372
        case OPC_SHRL_OB:
13373
            check_dsp(ctx);
13374
            gen_helper_shrl_ob(cpu_gpr[ret], v2_t, t0);
13375
            break;
13376
        case OPC_SHRLV_OB:
13377
            check_dsp(ctx);
13378
            gen_helper_shrl_ob(cpu_gpr[ret], v2_t, v1_t);
13379
            break;
13380
        case OPC_SHRL_QH:
13381
            check_dspr2(ctx);
13382
            gen_helper_shrl_qh(cpu_gpr[ret], v2_t, t0);
13383
            break;
13384
        case OPC_SHRLV_QH:
13385
            check_dspr2(ctx);
13386
            gen_helper_shrl_qh(cpu_gpr[ret], v2_t, v1_t);
13387
            break;
13388
        default:            /* Invalid */
13389
            MIPS_INVAL("MASK SHLL.OB");
13390
            generate_exception(ctx, EXCP_RI);
13391
            break;
13392
        }
13393
        break;
13394
#endif
13395
    }
13396

    
13397
    tcg_temp_free(t0);
13398
    tcg_temp_free(v1_t);
13399
    tcg_temp_free(v2_t);
13400
    (void)opn; /* avoid a compiler warning */
13401
    MIPS_DEBUG("%s", opn);
13402
}
13403

    
13404
static void gen_mipsdsp_multiply(DisasContext *ctx, uint32_t op1, uint32_t op2,
13405
                                 int ret, int v1, int v2, int check_ret)
13406
{
13407
    const char *opn = "mipsdsp multiply";
13408
    TCGv_i32 t0;
13409
    TCGv v1_t;
13410
    TCGv v2_t;
13411

    
13412
    if ((ret == 0) && (check_ret == 1)) {
13413
        /* Treat as NOP. */
13414
        MIPS_DEBUG("NOP");
13415
        return;
13416
    }
13417

    
13418
    t0 = tcg_temp_new_i32();
13419
    v1_t = tcg_temp_new();
13420
    v2_t = tcg_temp_new();
13421

    
13422
    tcg_gen_movi_i32(t0, ret);
13423
    gen_load_gpr(v1_t, v1);
13424
    gen_load_gpr(v2_t, v2);
13425

    
13426
    switch (op1) {
13427
    /* OPC_MULT_G_2E, OPC_ADDUH_QB_DSP, OPC_MUL_PH_DSP have
13428
     * the same mask and op1. */
13429
    case OPC_MULT_G_2E:
13430
        check_dspr2(ctx);
13431
        switch (op2) {
13432
        case  OPC_MUL_PH:
13433
            gen_helper_mul_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13434
            break;
13435
        case  OPC_MUL_S_PH:
13436
            gen_helper_mul_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13437
            break;
13438
        case OPC_MULQ_S_W:
13439
            gen_helper_mulq_s_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13440
            break;
13441
        case OPC_MULQ_RS_W:
13442
            gen_helper_mulq_rs_w(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13443
            break;
13444
        }
13445
        break;
13446
    case OPC_DPA_W_PH_DSP:
13447
        switch (op2) {
13448
        case OPC_DPAU_H_QBL:
13449
            check_dsp(ctx);
13450
            gen_helper_dpau_h_qbl(t0, v1_t, v2_t, cpu_env);
13451
            break;
13452
        case OPC_DPAU_H_QBR:
13453
            check_dsp(ctx);
13454
            gen_helper_dpau_h_qbr(t0, v1_t, v2_t, cpu_env);
13455
            break;
13456
        case OPC_DPSU_H_QBL:
13457
            check_dsp(ctx);
13458
            gen_helper_dpsu_h_qbl(t0, v1_t, v2_t, cpu_env);
13459
            break;
13460
        case OPC_DPSU_H_QBR:
13461
            check_dsp(ctx);
13462
            gen_helper_dpsu_h_qbr(t0, v1_t, v2_t, cpu_env);
13463
            break;
13464
        case OPC_DPA_W_PH:
13465
            check_dspr2(ctx);
13466
            gen_helper_dpa_w_ph(t0, v1_t, v2_t, cpu_env);
13467
            break;
13468
        case OPC_DPAX_W_PH:
13469
            check_dspr2(ctx);
13470
            gen_helper_dpax_w_ph(t0, v1_t, v2_t, cpu_env);
13471
            break;
13472
        case OPC_DPAQ_S_W_PH:
13473
            check_dsp(ctx);
13474
            gen_helper_dpaq_s_w_ph(t0, v1_t, v2_t, cpu_env);
13475
            break;
13476
        case OPC_DPAQX_S_W_PH:
13477
            check_dspr2(ctx);
13478
            gen_helper_dpaqx_s_w_ph(t0, v1_t, v2_t, cpu_env);
13479
            break;
13480
        case OPC_DPAQX_SA_W_PH:
13481
            check_dspr2(ctx);
13482
            gen_helper_dpaqx_sa_w_ph(t0, v1_t, v2_t, cpu_env);
13483
            break;
13484
        case OPC_DPS_W_PH:
13485
            check_dspr2(ctx);
13486
            gen_helper_dps_w_ph(t0, v1_t, v2_t, cpu_env);
13487
            break;
13488
        case OPC_DPSX_W_PH:
13489
            check_dspr2(ctx);
13490
            gen_helper_dpsx_w_ph(t0, v1_t, v2_t, cpu_env);
13491
            break;
13492
        case OPC_DPSQ_S_W_PH:
13493
            check_dsp(ctx);
13494
            gen_helper_dpsq_s_w_ph(t0, v1_t, v2_t, cpu_env);
13495
            break;
13496
        case OPC_DPSQX_S_W_PH:
13497
            check_dspr2(ctx);
13498
            gen_helper_dpsqx_s_w_ph(t0, v1_t, v2_t, cpu_env);
13499
            break;
13500
        case OPC_DPSQX_SA_W_PH:
13501
            check_dspr2(ctx);
13502
            gen_helper_dpsqx_sa_w_ph(t0, v1_t, v2_t, cpu_env);
13503
            break;
13504
        case OPC_MULSAQ_S_W_PH:
13505
            check_dsp(ctx);
13506
            gen_helper_mulsaq_s_w_ph(t0, v1_t, v2_t, cpu_env);
13507
            break;
13508
        case OPC_DPAQ_SA_L_W:
13509
            check_dsp(ctx);
13510
            gen_helper_dpaq_sa_l_w(t0, v1_t, v2_t, cpu_env);
13511
            break;
13512
        case OPC_DPSQ_SA_L_W:
13513
            check_dsp(ctx);
13514
            gen_helper_dpsq_sa_l_w(t0, v1_t, v2_t, cpu_env);
13515
            break;
13516
        case OPC_MAQ_S_W_PHL:
13517
            check_dsp(ctx);
13518
            gen_helper_maq_s_w_phl(t0, v1_t, v2_t, cpu_env);
13519
            break;
13520
        case OPC_MAQ_S_W_PHR:
13521
            check_dsp(ctx);
13522
            gen_helper_maq_s_w_phr(t0, v1_t, v2_t, cpu_env);
13523
            break;
13524
        case OPC_MAQ_SA_W_PHL:
13525
            check_dsp(ctx);
13526
            gen_helper_maq_sa_w_phl(t0, v1_t, v2_t, cpu_env);
13527
            break;
13528
        case OPC_MAQ_SA_W_PHR:
13529
            check_dsp(ctx);
13530
            gen_helper_maq_sa_w_phr(t0, v1_t, v2_t, cpu_env);
13531
            break;
13532
        case OPC_MULSA_W_PH:
13533
            check_dspr2(ctx);
13534
            gen_helper_mulsa_w_ph(t0, v1_t, v2_t, cpu_env);
13535
            break;
13536
        }
13537
        break;
13538
#ifdef TARGET_MIPS64
13539
    case OPC_DPAQ_W_QH_DSP:
13540
        {
13541
            int ac = ret & 0x03;
13542
            tcg_gen_movi_i32(t0, ac);
13543

    
13544
            switch (op2) {
13545
            case OPC_DMADD:
13546
                check_dsp(ctx);
13547
                gen_helper_dmadd(v1_t, v2_t, t0, cpu_env);
13548
                break;
13549
            case OPC_DMADDU:
13550
                check_dsp(ctx);
13551
                gen_helper_dmaddu(v1_t, v2_t, t0, cpu_env);
13552
                break;
13553
            case OPC_DMSUB:
13554
                check_dsp(ctx);
13555
                gen_helper_dmsub(v1_t, v2_t, t0, cpu_env);
13556
                break;
13557
            case OPC_DMSUBU:
13558
                check_dsp(ctx);
13559
                gen_helper_dmsubu(v1_t, v2_t, t0, cpu_env);
13560
                break;
13561
            case OPC_DPA_W_QH:
13562
                check_dspr2(ctx);
13563
                gen_helper_dpa_w_qh(v1_t, v2_t, t0, cpu_env);
13564
                break;
13565
            case OPC_DPAQ_S_W_QH:
13566
                check_dsp(ctx);
13567
                gen_helper_dpaq_s_w_qh(v1_t, v2_t, t0, cpu_env);
13568
                break;
13569
            case OPC_DPAQ_SA_L_PW:
13570
                check_dsp(ctx);
13571
                gen_helper_dpaq_sa_l_pw(v1_t, v2_t, t0, cpu_env);
13572
                break;
13573
            case OPC_DPAU_H_OBL:
13574
                check_dsp(ctx);
13575
                gen_helper_dpau_h_obl(v1_t, v2_t, t0, cpu_env);
13576
                break;
13577
            case OPC_DPAU_H_OBR:
13578
                check_dsp(ctx);
13579
                gen_helper_dpau_h_obr(v1_t, v2_t, t0, cpu_env);
13580
                break;
13581
            case OPC_DPS_W_QH:
13582
                check_dspr2(ctx);
13583
                gen_helper_dps_w_qh(v1_t, v2_t, t0, cpu_env);
13584
                break;
13585
            case OPC_DPSQ_S_W_QH:
13586
                check_dsp(ctx);
13587
                gen_helper_dpsq_s_w_qh(v1_t, v2_t, t0, cpu_env);
13588
                break;
13589
            case OPC_DPSQ_SA_L_PW:
13590
                check_dsp(ctx);
13591
                gen_helper_dpsq_sa_l_pw(v1_t, v2_t, t0, cpu_env);
13592
                break;
13593
            case OPC_DPSU_H_OBL:
13594
                check_dsp(ctx);
13595
                gen_helper_dpsu_h_obl(v1_t, v2_t, t0, cpu_env);
13596
                break;
13597
            case OPC_DPSU_H_OBR:
13598
                check_dsp(ctx);
13599
                gen_helper_dpsu_h_obr(v1_t, v2_t, t0, cpu_env);
13600
                break;
13601
            case OPC_MAQ_S_L_PWL:
13602
                check_dsp(ctx);
13603
                gen_helper_maq_s_l_pwl(v1_t, v2_t, t0, cpu_env);
13604
                break;
13605
            case OPC_MAQ_S_L_PWR:
13606
                check_dsp(ctx);
13607
                gen_helper_maq_s_l_pwr(v1_t, v2_t, t0, cpu_env);
13608
                break;
13609
            case OPC_MAQ_S_W_QHLL:
13610
                check_dsp(ctx);
13611
                gen_helper_maq_s_w_qhll(v1_t, v2_t, t0, cpu_env);
13612
                break;
13613
            case OPC_MAQ_SA_W_QHLL:
13614
                check_dsp(ctx);
13615
                gen_helper_maq_sa_w_qhll(v1_t, v2_t, t0, cpu_env);
13616
                break;
13617
            case OPC_MAQ_S_W_QHLR:
13618
                check_dsp(ctx);
13619
                gen_helper_maq_s_w_qhlr(v1_t, v2_t, t0, cpu_env);
13620
                break;
13621
            case OPC_MAQ_SA_W_QHLR:
13622
                check_dsp(ctx);
13623
                gen_helper_maq_sa_w_qhlr(v1_t, v2_t, t0, cpu_env);
13624
                break;
13625
            case OPC_MAQ_S_W_QHRL:
13626
                check_dsp(ctx);
13627
                gen_helper_maq_s_w_qhrl(v1_t, v2_t, t0, cpu_env);
13628
                break;
13629
            case OPC_MAQ_SA_W_QHRL:
13630
                check_dsp(ctx);
13631
                gen_helper_maq_sa_w_qhrl(v1_t, v2_t, t0, cpu_env);
13632
                break;
13633
            case OPC_MAQ_S_W_QHRR:
13634
                check_dsp(ctx);
13635
                gen_helper_maq_s_w_qhrr(v1_t, v2_t, t0, cpu_env);
13636
                break;
13637
            case OPC_MAQ_SA_W_QHRR:
13638
                check_dsp(ctx);
13639
                gen_helper_maq_sa_w_qhrr(v1_t, v2_t, t0, cpu_env);
13640
                break;
13641
            case OPC_MULSAQ_S_L_PW:
13642
                check_dsp(ctx);
13643
                gen_helper_mulsaq_s_l_pw(v1_t, v2_t, t0, cpu_env);
13644
                break;
13645
            case OPC_MULSAQ_S_W_QH:
13646
                check_dsp(ctx);
13647
                gen_helper_mulsaq_s_w_qh(v1_t, v2_t, t0, cpu_env);
13648
                break;
13649
            }
13650
        }
13651
        break;
13652
#endif
13653
    case OPC_ADDU_QB_DSP:
13654
        switch (op2) {
13655
        case OPC_MULEU_S_PH_QBL:
13656
            check_dsp(ctx);
13657
            gen_helper_muleu_s_ph_qbl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13658
            break;
13659
        case OPC_MULEU_S_PH_QBR:
13660
            check_dsp(ctx);
13661
            gen_helper_muleu_s_ph_qbr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13662
            break;
13663
        case OPC_MULQ_RS_PH:
13664
            check_dsp(ctx);
13665
            gen_helper_mulq_rs_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13666
            break;
13667
        case OPC_MULEQ_S_W_PHL:
13668
            check_dsp(ctx);
13669
            gen_helper_muleq_s_w_phl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13670
            break;
13671
        case OPC_MULEQ_S_W_PHR:
13672
            check_dsp(ctx);
13673
            gen_helper_muleq_s_w_phr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13674
            break;
13675
        case OPC_MULQ_S_PH:
13676
            check_dspr2(ctx);
13677
            gen_helper_mulq_s_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13678
            break;
13679
        }
13680
        break;
13681
#ifdef TARGET_MIPS64
13682
    case OPC_ADDU_OB_DSP:
13683
        switch (op2) {
13684
        case OPC_MULEQ_S_PW_QHL:
13685
            check_dsp(ctx);
13686
            gen_helper_muleq_s_pw_qhl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13687
            break;
13688
        case OPC_MULEQ_S_PW_QHR:
13689
            check_dsp(ctx);
13690
            gen_helper_muleq_s_pw_qhr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13691
            break;
13692
        case OPC_MULEU_S_QH_OBL:
13693
            check_dsp(ctx);
13694
            gen_helper_muleu_s_qh_obl(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13695
            break;
13696
        case OPC_MULEU_S_QH_OBR:
13697
            check_dsp(ctx);
13698
            gen_helper_muleu_s_qh_obr(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13699
            break;
13700
        case OPC_MULQ_RS_QH:
13701
            check_dsp(ctx);
13702
            gen_helper_mulq_rs_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13703
            break;
13704
        }
13705
        break;
13706
#endif
13707
    }
13708

    
13709
    tcg_temp_free_i32(t0);
13710
    tcg_temp_free(v1_t);
13711
    tcg_temp_free(v2_t);
13712

    
13713
    (void)opn; /* avoid a compiler warning */
13714
    MIPS_DEBUG("%s", opn);
13715

    
13716
}
13717

    
13718
static void gen_mipsdsp_bitinsn(DisasContext *ctx, uint32_t op1, uint32_t op2,
13719
                                int ret, int val)
13720
{
13721
    const char *opn = "mipsdsp Bit/ Manipulation";
13722
    int16_t imm;
13723
    TCGv t0;
13724
    TCGv val_t;
13725

    
13726
    if (ret == 0) {
13727
        /* Treat as NOP. */
13728
        MIPS_DEBUG("NOP");
13729
        return;
13730
    }
13731

    
13732
    t0 = tcg_temp_new();
13733
    val_t = tcg_temp_new();
13734
    gen_load_gpr(val_t, val);
13735

    
13736
    switch (op1) {
13737
    case OPC_ABSQ_S_PH_DSP:
13738
        switch (op2) {
13739
        case OPC_BITREV:
13740
            check_dsp(ctx);
13741
            gen_helper_bitrev(cpu_gpr[ret], val_t);
13742
            break;
13743
        case OPC_REPL_QB:
13744
            check_dsp(ctx);
13745
            {
13746
                target_long result;
13747
                imm = (ctx->opcode >> 16) & 0xFF;
13748
                result = (uint32_t)imm << 24 |
13749
                         (uint32_t)imm << 16 |
13750
                         (uint32_t)imm << 8  |
13751
                         (uint32_t)imm;
13752
                result = (int32_t)result;
13753
                tcg_gen_movi_tl(cpu_gpr[ret], result);
13754
            }
13755
            break;
13756
        case OPC_REPLV_QB:
13757
            check_dsp(ctx);
13758
            tcg_gen_ext8u_tl(cpu_gpr[ret], val_t);
13759
            tcg_gen_shli_tl(t0, cpu_gpr[ret], 8);
13760
            tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13761
            tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
13762
            tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13763
            tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
13764
            break;
13765
        case OPC_REPL_PH:
13766
            check_dsp(ctx);
13767
            {
13768
                imm = (ctx->opcode >> 16) & 0x03FF;
13769
                imm = (int16_t)(imm << 6) >> 6;
13770
                tcg_gen_movi_tl(cpu_gpr[ret], \
13771
                                (target_long)((int32_t)imm << 16 | \
13772
                                (uint16_t)imm));
13773
            }
13774
            break;
13775
        case OPC_REPLV_PH:
13776
            check_dsp(ctx);
13777
            tcg_gen_ext16u_tl(cpu_gpr[ret], val_t);
13778
            tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
13779
            tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13780
            tcg_gen_ext32s_tl(cpu_gpr[ret], cpu_gpr[ret]);
13781
            break;
13782
        }
13783
        break;
13784
#ifdef TARGET_MIPS64
13785
    case OPC_ABSQ_S_QH_DSP:
13786
        switch (op2) {
13787
        case OPC_REPL_OB:
13788
            check_dsp(ctx);
13789
            {
13790
                target_long temp;
13791

    
13792
                imm = (ctx->opcode >> 16) & 0xFF;
13793
                temp = ((uint64_t)imm << 8) | (uint64_t)imm;
13794
                temp = (temp << 16) | temp;
13795
                temp = (temp << 32) | temp;
13796
                tcg_gen_movi_tl(cpu_gpr[ret], temp);
13797
                break;
13798
            }
13799
        case OPC_REPL_PW:
13800
            check_dsp(ctx);
13801
            {
13802
                target_long temp;
13803

    
13804
                imm = (ctx->opcode >> 16) & 0x03FF;
13805
                imm = (int16_t)(imm << 6) >> 6;
13806
                temp = ((target_long)imm << 32) \
13807
                       | ((target_long)imm & 0xFFFFFFFF);
13808
                tcg_gen_movi_tl(cpu_gpr[ret], temp);
13809
                break;
13810
            }
13811
        case OPC_REPL_QH:
13812
            check_dsp(ctx);
13813
            {
13814
                target_long temp;
13815

    
13816
                imm = (ctx->opcode >> 16) & 0x03FF;
13817
                imm = (int16_t)(imm << 6) >> 6;
13818

    
13819
                temp = ((uint64_t)(uint16_t)imm << 48) |
13820
                       ((uint64_t)(uint16_t)imm << 32) |
13821
                       ((uint64_t)(uint16_t)imm << 16) |
13822
                       (uint64_t)(uint16_t)imm;
13823
                tcg_gen_movi_tl(cpu_gpr[ret], temp);
13824
                break;
13825
            }
13826
        case OPC_REPLV_OB:
13827
            check_dsp(ctx);
13828
            tcg_gen_ext8u_tl(cpu_gpr[ret], val_t);
13829
            tcg_gen_shli_tl(t0, cpu_gpr[ret], 8);
13830
            tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13831
            tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
13832
            tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13833
            tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
13834
            tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13835
            break;
13836
        case OPC_REPLV_PW:
13837
            check_dsp(ctx);
13838
            tcg_gen_ext32u_i64(cpu_gpr[ret], val_t);
13839
            tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
13840
            tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13841
            break;
13842
        case OPC_REPLV_QH:
13843
            check_dsp(ctx);
13844
            tcg_gen_ext16u_tl(cpu_gpr[ret], val_t);
13845
            tcg_gen_shli_tl(t0, cpu_gpr[ret], 16);
13846
            tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13847
            tcg_gen_shli_tl(t0, cpu_gpr[ret], 32);
13848
            tcg_gen_or_tl(cpu_gpr[ret], cpu_gpr[ret], t0);
13849
            break;
13850
        }
13851
        break;
13852
#endif
13853
    }
13854
    tcg_temp_free(t0);
13855
    tcg_temp_free(val_t);
13856

    
13857
    (void)opn; /* avoid a compiler warning */
13858
    MIPS_DEBUG("%s", opn);
13859
}
13860

    
13861
static void gen_mipsdsp_add_cmp_pick(DisasContext *ctx,
13862
                                     uint32_t op1, uint32_t op2,
13863
                                     int ret, int v1, int v2, int check_ret)
13864
{
13865
    const char *opn = "mipsdsp add compare pick";
13866
    TCGv t1;
13867
    TCGv v1_t;
13868
    TCGv v2_t;
13869

    
13870
    if ((ret == 0) && (check_ret == 1)) {
13871
        /* Treat as NOP. */
13872
        MIPS_DEBUG("NOP");
13873
        return;
13874
    }
13875

    
13876
    t1 = tcg_temp_new();
13877
    v1_t = tcg_temp_new();
13878
    v2_t = tcg_temp_new();
13879

    
13880
    gen_load_gpr(v1_t, v1);
13881
    gen_load_gpr(v2_t, v2);
13882

    
13883
    switch (op1) {
13884
    case OPC_CMPU_EQ_QB_DSP:
13885
        switch (op2) {
13886
        case OPC_CMPU_EQ_QB:
13887
            check_dsp(ctx);
13888
            gen_helper_cmpu_eq_qb(v1_t, v2_t, cpu_env);
13889
            break;
13890
        case OPC_CMPU_LT_QB:
13891
            check_dsp(ctx);
13892
            gen_helper_cmpu_lt_qb(v1_t, v2_t, cpu_env);
13893
            break;
13894
        case OPC_CMPU_LE_QB:
13895
            check_dsp(ctx);
13896
            gen_helper_cmpu_le_qb(v1_t, v2_t, cpu_env);
13897
            break;
13898
        case OPC_CMPGU_EQ_QB:
13899
            check_dsp(ctx);
13900
            gen_helper_cmpgu_eq_qb(cpu_gpr[ret], v1_t, v2_t);
13901
            break;
13902
        case OPC_CMPGU_LT_QB:
13903
            check_dsp(ctx);
13904
            gen_helper_cmpgu_lt_qb(cpu_gpr[ret], v1_t, v2_t);
13905
            break;
13906
        case OPC_CMPGU_LE_QB:
13907
            check_dsp(ctx);
13908
            gen_helper_cmpgu_le_qb(cpu_gpr[ret], v1_t, v2_t);
13909
            break;
13910
        case OPC_CMPGDU_EQ_QB:
13911
            check_dspr2(ctx);
13912
            gen_helper_cmpgu_eq_qb(t1, v1_t, v2_t);
13913
            tcg_gen_mov_tl(cpu_gpr[ret], t1);
13914
            tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
13915
            tcg_gen_shli_tl(t1, t1, 24);
13916
            tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
13917
            break;
13918
        case OPC_CMPGDU_LT_QB:
13919
            check_dspr2(ctx);
13920
            gen_helper_cmpgu_lt_qb(t1, v1_t, v2_t);
13921
            tcg_gen_mov_tl(cpu_gpr[ret], t1);
13922
            tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
13923
            tcg_gen_shli_tl(t1, t1, 24);
13924
            tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
13925
            break;
13926
        case OPC_CMPGDU_LE_QB:
13927
            check_dspr2(ctx);
13928
            gen_helper_cmpgu_le_qb(t1, v1_t, v2_t);
13929
            tcg_gen_mov_tl(cpu_gpr[ret], t1);
13930
            tcg_gen_andi_tl(cpu_dspctrl, cpu_dspctrl, 0xF0FFFFFF);
13931
            tcg_gen_shli_tl(t1, t1, 24);
13932
            tcg_gen_or_tl(cpu_dspctrl, cpu_dspctrl, t1);
13933
            break;
13934
        case OPC_CMP_EQ_PH:
13935
            check_dsp(ctx);
13936
            gen_helper_cmp_eq_ph(v1_t, v2_t, cpu_env);
13937
            break;
13938
        case OPC_CMP_LT_PH:
13939
            check_dsp(ctx);
13940
            gen_helper_cmp_lt_ph(v1_t, v2_t, cpu_env);
13941
            break;
13942
        case OPC_CMP_LE_PH:
13943
            check_dsp(ctx);
13944
            gen_helper_cmp_le_ph(v1_t, v2_t, cpu_env);
13945
            break;
13946
        case OPC_PICK_QB:
13947
            check_dsp(ctx);
13948
            gen_helper_pick_qb(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13949
            break;
13950
        case OPC_PICK_PH:
13951
            check_dsp(ctx);
13952
            gen_helper_pick_ph(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13953
            break;
13954
        case OPC_PACKRL_PH:
13955
            check_dsp(ctx);
13956
            gen_helper_packrl_ph(cpu_gpr[ret], v1_t, v2_t);
13957
            break;
13958
        }
13959
        break;
13960
#ifdef TARGET_MIPS64
13961
    case OPC_CMPU_EQ_OB_DSP:
13962
        switch (op2) {
13963
        case OPC_CMP_EQ_PW:
13964
            check_dsp(ctx);
13965
            gen_helper_cmp_eq_pw(v1_t, v2_t, cpu_env);
13966
            break;
13967
        case OPC_CMP_LT_PW:
13968
            check_dsp(ctx);
13969
            gen_helper_cmp_lt_pw(v1_t, v2_t, cpu_env);
13970
            break;
13971
        case OPC_CMP_LE_PW:
13972
            check_dsp(ctx);
13973
            gen_helper_cmp_le_pw(v1_t, v2_t, cpu_env);
13974
            break;
13975
        case OPC_CMP_EQ_QH:
13976
            check_dsp(ctx);
13977
            gen_helper_cmp_eq_qh(v1_t, v2_t, cpu_env);
13978
            break;
13979
        case OPC_CMP_LT_QH:
13980
            check_dsp(ctx);
13981
            gen_helper_cmp_lt_qh(v1_t, v2_t, cpu_env);
13982
            break;
13983
        case OPC_CMP_LE_QH:
13984
            check_dsp(ctx);
13985
            gen_helper_cmp_le_qh(v1_t, v2_t, cpu_env);
13986
            break;
13987
        case OPC_CMPGDU_EQ_OB:
13988
            check_dspr2(ctx);
13989
            gen_helper_cmpgdu_eq_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13990
            break;
13991
        case OPC_CMPGDU_LT_OB:
13992
            check_dspr2(ctx);
13993
            gen_helper_cmpgdu_lt_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13994
            break;
13995
        case OPC_CMPGDU_LE_OB:
13996
            check_dspr2(ctx);
13997
            gen_helper_cmpgdu_le_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
13998
            break;
13999
        case OPC_CMPGU_EQ_OB:
14000
            check_dsp(ctx);
14001
            gen_helper_cmpgu_eq_ob(cpu_gpr[ret], v1_t, v2_t);
14002
            break;
14003
        case OPC_CMPGU_LT_OB:
14004
            check_dsp(ctx);
14005
            gen_helper_cmpgu_lt_ob(cpu_gpr[ret], v1_t, v2_t);
14006
            break;
14007
        case OPC_CMPGU_LE_OB:
14008
            check_dsp(ctx);
14009
            gen_helper_cmpgu_le_ob(cpu_gpr[ret], v1_t, v2_t);
14010
            break;
14011
        case OPC_CMPU_EQ_OB:
14012
            check_dsp(ctx);
14013
            gen_helper_cmpu_eq_ob(v1_t, v2_t, cpu_env);
14014
            break;
14015
        case OPC_CMPU_LT_OB:
14016
            check_dsp(ctx);
14017
            gen_helper_cmpu_lt_ob(v1_t, v2_t, cpu_env);
14018
            break;
14019
        case OPC_CMPU_LE_OB:
14020
            check_dsp(ctx);
14021
            gen_helper_cmpu_le_ob(v1_t, v2_t, cpu_env);
14022
            break;
14023
        case OPC_PACKRL_PW:
14024
            check_dsp(ctx);
14025
            gen_helper_packrl_pw(cpu_gpr[ret], v1_t, v2_t);
14026
            break;
14027
        case OPC_PICK_OB:
14028
            check_dsp(ctx);
14029
            gen_helper_pick_ob(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14030
            break;
14031
        case OPC_PICK_PW:
14032
            check_dsp(ctx);
14033
            gen_helper_pick_pw(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14034
            break;
14035
        case OPC_PICK_QH:
14036
            check_dsp(ctx);
14037
            gen_helper_pick_qh(cpu_gpr[ret], v1_t, v2_t, cpu_env);
14038
            break;
14039
        }
14040
        break;
14041
#endif
14042
    }
14043

    
14044
    tcg_temp_free(t1);
14045
    tcg_temp_free(v1_t);
14046
    tcg_temp_free(v2_t);
14047

    
14048
    (void)opn; /* avoid a compiler warning */
14049
    MIPS_DEBUG("%s", opn);
14050
}
14051

    
14052
static void gen_mipsdsp_append(CPUMIPSState *env, DisasContext *ctx,
14053
                               uint32_t op1, int rt, int rs, int sa)
14054
{
14055
    const char *opn = "mipsdsp append/dappend";
14056
    TCGv t0;
14057

    
14058
    check_dspr2(ctx);
14059

    
14060
    if (rt == 0) {
14061
        /* Treat as NOP. */
14062
        MIPS_DEBUG("NOP");
14063
        return;
14064
    }
14065

    
14066
    t0 = tcg_temp_new();
14067
    gen_load_gpr(t0, rs);
14068

    
14069
    switch (op1) {
14070
    case OPC_APPEND_DSP:
14071
        switch (MASK_APPEND(ctx->opcode)) {
14072
        case OPC_APPEND:
14073
            if (sa != 0) {
14074
                tcg_gen_deposit_tl(cpu_gpr[rt], t0, cpu_gpr[rt], sa, 32 - sa);
14075
            }
14076
            tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
14077
            break;
14078
        case OPC_PREPEND:
14079
            if (sa != 0) {
14080
                tcg_gen_ext32u_tl(cpu_gpr[rt], cpu_gpr[rt]);
14081
                tcg_gen_shri_tl(cpu_gpr[rt], cpu_gpr[rt], sa);
14082
                tcg_gen_shli_tl(t0, t0, 32 - sa);
14083
                tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
14084
            }
14085
            tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
14086
            break;
14087
        case OPC_BALIGN:
14088
            sa &= 3;
14089
            if (sa != 0 && sa != 2) {
14090
                tcg_gen_shli_tl(cpu_gpr[rt], cpu_gpr[rt], 8 * sa);
14091
                tcg_gen_ext32u_tl(t0, t0);
14092
                tcg_gen_shri_tl(t0, t0, 8 * (4 - sa));
14093
                tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
14094
            }
14095
            tcg_gen_ext32s_tl(cpu_gpr[rt], cpu_gpr[rt]);
14096
            break;
14097
        default:            /* Invalid */
14098
            MIPS_INVAL("MASK APPEND");
14099
            generate_exception(ctx, EXCP_RI);
14100
            break;
14101
        }
14102
        break;
14103
#ifdef TARGET_MIPS64
14104
    case OPC_DAPPEND_DSP:
14105
        switch (MASK_DAPPEND(ctx->opcode)) {
14106
        case OPC_DAPPEND:
14107
            if (sa != 0) {
14108
                tcg_gen_deposit_tl(cpu_gpr[rt], t0, cpu_gpr[rt], sa, 64 - sa);
14109
            }
14110
            break;
14111
        case OPC_PREPENDD:
14112
            tcg_gen_shri_tl(cpu_gpr[rt], cpu_gpr[rt], 0x20 | sa);
14113
            tcg_gen_shli_tl(t0, t0, 64 - (0x20 | sa));
14114
            tcg_gen_or_tl(cpu_gpr[rt], t0, t0);
14115
            break;
14116
        case OPC_PREPENDW:
14117
            if (sa != 0) {
14118
                tcg_gen_shri_tl(cpu_gpr[rt], cpu_gpr[rt], sa);
14119
                tcg_gen_shli_tl(t0, t0, 64 - sa);
14120
                tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
14121
            }
14122
            break;
14123
        case OPC_DBALIGN:
14124
            sa &= 7;
14125
            if (sa != 0 && sa != 2 && sa != 4) {
14126
                tcg_gen_shli_tl(cpu_gpr[rt], cpu_gpr[rt], 8 * sa);
14127
                tcg_gen_shri_tl(t0, t0, 8 * (8 - sa));
14128
                tcg_gen_or_tl(cpu_gpr[rt], cpu_gpr[rt], t0);
14129
            }
14130
            break;
14131
        default:            /* Invalid */
14132
            MIPS_INVAL("MASK DAPPEND");
14133
            generate_exception(ctx, EXCP_RI);
14134
            break;
14135
        }
14136
        break;
14137
#endif
14138
    }
14139
    tcg_temp_free(t0);
14140
    (void)opn; /* avoid a compiler warning */
14141
    MIPS_DEBUG("%s", opn);
14142
}
14143

    
14144
static void gen_mipsdsp_accinsn(DisasContext *ctx, uint32_t op1, uint32_t op2,
14145
                                int ret, int v1, int v2, int check_ret)
14146

    
14147
{
14148
    const char *opn = "mipsdsp accumulator";
14149
    TCGv t0;
14150
    TCGv t1;
14151
    TCGv v1_t;
14152
    TCGv v2_t;
14153
    int16_t imm;
14154

    
14155
    if ((ret == 0) && (check_ret == 1)) {
14156
        /* Treat as NOP. */
14157
        MIPS_DEBUG("NOP");
14158
        return;
14159
    }
14160

    
14161
    t0 = tcg_temp_new();
14162
    t1 = tcg_temp_new();
14163
    v1_t = tcg_temp_new();
14164
    v2_t = tcg_temp_new();
14165

    
14166
    gen_load_gpr(v1_t, v1);
14167
    gen_load_gpr(v2_t, v2);
14168

    
14169
    switch (op1) {
14170
    case OPC_EXTR_W_DSP:
14171
        check_dsp(ctx);
14172
        switch (op2) {
14173
        case OPC_EXTR_W:
14174
            tcg_gen_movi_tl(t0, v2);
14175
            tcg_gen_movi_tl(t1, v1);
14176
            gen_helper_extr_w(cpu_gpr[ret], t0, t1, cpu_env);
14177
            break;
14178
        case OPC_EXTR_R_W:
14179
            tcg_gen_movi_tl(t0, v2);
14180
            tcg_gen_movi_tl(t1, v1);
14181
            gen_helper_extr_r_w(cpu_gpr[ret], t0, t1, cpu_env);
14182
            break;
14183
        case OPC_EXTR_RS_W:
14184
            tcg_gen_movi_tl(t0, v2);
14185
            tcg_gen_movi_tl(t1, v1);
14186
            gen_helper_extr_rs_w(cpu_gpr[ret], t0, t1, cpu_env);
14187
            break;
14188
        case OPC_EXTR_S_H:
14189
            tcg_gen_movi_tl(t0, v2);
14190
            tcg_gen_movi_tl(t1, v1);
14191
            gen_helper_extr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
14192
            break;
14193
        case OPC_EXTRV_S_H:
14194
            tcg_gen_movi_tl(t0, v2);
14195
            gen_helper_extr_s_h(cpu_gpr[ret], t0, v1_t, cpu_env);
14196
            break;
14197
        case OPC_EXTRV_W:
14198
            tcg_gen_movi_tl(t0, v2);
14199
            gen_helper_extr_w(cpu_gpr[ret], t0, v1_t, cpu_env);
14200
            break;
14201
        case OPC_EXTRV_R_W:
14202
            tcg_gen_movi_tl(t0, v2);
14203
            gen_helper_extr_r_w(cpu_gpr[ret], t0, v1_t, cpu_env);
14204
            break;
14205
        case OPC_EXTRV_RS_W:
14206
            tcg_gen_movi_tl(t0, v2);
14207
            gen_helper_extr_rs_w(cpu_gpr[ret], t0, v1_t, cpu_env);
14208
            break;
14209
        case OPC_EXTP:
14210
            tcg_gen_movi_tl(t0, v2);
14211
            tcg_gen_movi_tl(t1, v1);
14212
            gen_helper_extp(cpu_gpr[ret], t0, t1, cpu_env);
14213
            break;
14214
        case OPC_EXTPV:
14215
            tcg_gen_movi_tl(t0, v2);
14216
            gen_helper_extp(cpu_gpr[ret], t0, v1_t, cpu_env);
14217
            break;
14218
        case OPC_EXTPDP:
14219
            tcg_gen_movi_tl(t0, v2);
14220
            tcg_gen_movi_tl(t1, v1);
14221
            gen_helper_extpdp(cpu_gpr[ret], t0, t1, cpu_env);
14222
            break;
14223
        case OPC_EXTPDPV:
14224
            tcg_gen_movi_tl(t0, v2);
14225
            gen_helper_extpdp(cpu_gpr[ret], t0, v1_t, cpu_env);
14226
            break;
14227
        case OPC_SHILO:
14228
            imm = (ctx->opcode >> 20) & 0x3F;
14229
            tcg_gen_movi_tl(t0, ret);
14230
            tcg_gen_movi_tl(t1, imm);
14231
            gen_helper_shilo(t0, t1, cpu_env);
14232
            break;
14233
        case OPC_SHILOV:
14234
            tcg_gen_movi_tl(t0, ret);
14235
            gen_helper_shilo(t0, v1_t, cpu_env);
14236
            break;
14237
        case OPC_MTHLIP:
14238
            tcg_gen_movi_tl(t0, ret);
14239
            gen_helper_mthlip(t0, v1_t, cpu_env);
14240
            break;
14241
        case OPC_WRDSP:
14242
            imm = (ctx->opcode >> 11) & 0x3FF;
14243
            tcg_gen_movi_tl(t0, imm);
14244
            gen_helper_wrdsp(v1_t, t0, cpu_env);
14245
            break;
14246
        case OPC_RDDSP:
14247
            imm = (ctx->opcode >> 16) & 0x03FF;
14248
            tcg_gen_movi_tl(t0, imm);
14249
            gen_helper_rddsp(cpu_gpr[ret], t0, cpu_env);
14250
            break;
14251
        }
14252
        break;
14253
#ifdef TARGET_MIPS64
14254
    case OPC_DEXTR_W_DSP:
14255
        check_dsp(ctx);
14256
        switch (op2) {
14257
        case OPC_DMTHLIP:
14258
            tcg_gen_movi_tl(t0, ret);
14259
            gen_helper_dmthlip(v1_t, t0, cpu_env);
14260
            break;
14261
        case OPC_DSHILO:
14262
            {
14263
                int shift = (ctx->opcode >> 19) & 0x7F;
14264
                int ac = (ctx->opcode >> 11) & 0x03;
14265
                tcg_gen_movi_tl(t0, shift);
14266
                tcg_gen_movi_tl(t1, ac);
14267
                gen_helper_dshilo(t0, t1, cpu_env);
14268
                break;
14269
            }
14270
        case OPC_DSHILOV:
14271
            {
14272
                int ac = (ctx->opcode >> 11) & 0x03;
14273
                tcg_gen_movi_tl(t0, ac);
14274
                gen_helper_dshilo(v1_t, t0, cpu_env);
14275
                break;
14276
            }
14277
        case OPC_DEXTP:
14278
            tcg_gen_movi_tl(t0, v2);
14279
            tcg_gen_movi_tl(t1, v1);
14280

    
14281
            gen_helper_dextp(cpu_gpr[ret], t0, t1, cpu_env);
14282
            break;
14283
        case OPC_DEXTPV:
14284
            tcg_gen_movi_tl(t0, v2);
14285
            gen_helper_dextp(cpu_gpr[ret], t0, v1_t, cpu_env);
14286
            break;
14287
        case OPC_DEXTPDP:
14288
            tcg_gen_movi_tl(t0, v2);
14289
            tcg_gen_movi_tl(t1, v1);
14290
            gen_helper_dextpdp(cpu_gpr[ret], t0, t1, cpu_env);
14291
            break;
14292
        case OPC_DEXTPDPV:
14293
            tcg_gen_movi_tl(t0, v2);
14294
            gen_helper_dextpdp(cpu_gpr[ret], t0, v1_t, cpu_env);
14295
            break;
14296
        case OPC_DEXTR_L:
14297
            tcg_gen_movi_tl(t0, v2);
14298
            tcg_gen_movi_tl(t1, v1);
14299
            gen_helper_dextr_l(cpu_gpr[ret], t0, t1, cpu_env);
14300
            break;
14301
        case OPC_DEXTR_R_L:
14302
            tcg_gen_movi_tl(t0, v2);
14303
            tcg_gen_movi_tl(t1, v1);
14304
            gen_helper_dextr_r_l(cpu_gpr[ret], t0, t1, cpu_env);
14305
            break;
14306
        case OPC_DEXTR_RS_L:
14307
            tcg_gen_movi_tl(t0, v2);
14308
            tcg_gen_movi_tl(t1, v1);
14309
            gen_helper_dextr_rs_l(cpu_gpr[ret], t0, t1, cpu_env);
14310
            break;
14311
        case OPC_DEXTR_W:
14312
            tcg_gen_movi_tl(t0, v2);
14313
            tcg_gen_movi_tl(t1, v1);
14314
            gen_helper_dextr_w(cpu_gpr[ret], t0, t1, cpu_env);
14315
            break;
14316
        case OPC_DEXTR_R_W:
14317
            tcg_gen_movi_tl(t0, v2);
14318
            tcg_gen_movi_tl(t1, v1);
14319
            gen_helper_dextr_r_w(cpu_gpr[ret], t0, t1, cpu_env);
14320
            break;
14321
        case OPC_DEXTR_RS_W:
14322
            tcg_gen_movi_tl(t0, v2);
14323
            tcg_gen_movi_tl(t1, v1);
14324
            gen_helper_dextr_rs_w(cpu_gpr[ret], t0, t1, cpu_env);
14325
            break;
14326
        case OPC_DEXTR_S_H:
14327
            tcg_gen_movi_tl(t0, v2);
14328
            tcg_gen_movi_tl(t1, v1);
14329
            gen_helper_dextr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
14330
            break;
14331
        case OPC_DEXTRV_S_H:
14332
            tcg_gen_movi_tl(t0, v2);
14333
            tcg_gen_movi_tl(t1, v1);
14334
            gen_helper_dextr_s_h(cpu_gpr[ret], t0, t1, cpu_env);
14335
            break;
14336
        case OPC_DEXTRV_L:
14337
            tcg_gen_movi_tl(t0, v2);
14338
            gen_helper_dextr_l(cpu_gpr[ret], t0, v1_t, cpu_env);
14339
            break;
14340
        case OPC_DEXTRV_R_L:
14341
            tcg_gen_movi_tl(t0, v2);
14342
            gen_helper_dextr_r_l(cpu_gpr[ret], t0, v1_t, cpu_env);
14343
            break;
14344
        case OPC_DEXTRV_RS_L:
14345
            tcg_gen_movi_tl(t0, v2);
14346
            gen_helper_dextr_rs_l(cpu_gpr[ret], t0, v1_t, cpu_env);
14347
            break;
14348
        case OPC_DEXTRV_W:
14349
            tcg_gen_movi_tl(t0, v2);
14350
            gen_helper_dextr_w(cpu_gpr[ret], t0, v1_t, cpu_env);
14351
            break;
14352
        case OPC_DEXTRV_R_W:
14353
            tcg_gen_movi_tl(t0, v2);
14354
            gen_helper_dextr_r_w(cpu_gpr[ret], t0, v1_t, cpu_env);
14355
            break;
14356
        case OPC_DEXTRV_RS_W:
14357
            tcg_gen_movi_tl(t0, v2);
14358
            gen_helper_dextr_rs_w(cpu_gpr[ret], t0, v1_t, cpu_env);
14359
            break;
14360
        }
14361
        break;
14362
#endif
14363
    }
14364

    
14365
    tcg_temp_free(t0);
14366
    tcg_temp_free(t1);
14367
    tcg_temp_free(v1_t);
14368
    tcg_temp_free(v2_t);
14369

    
14370
    (void)opn; /* avoid a compiler warning */
14371
    MIPS_DEBUG("%s", opn);
14372
}
14373

    
14374
/* End MIPSDSP functions. */
14375

    
14376
static void decode_opc (CPUMIPSState *env, DisasContext *ctx)
14377
{
14378
    int32_t offset;
14379
    int rs, rt, rd, sa;
14380
    uint32_t op, op1, op2;
14381
    int16_t imm;
14382

    
14383
    /* make sure instructions are on a word boundary */
14384
    if (ctx->pc & 0x3) {
14385
        env->CP0_BadVAddr = ctx->pc;
14386
        generate_exception(ctx, EXCP_AdEL);
14387
        return;
14388
    }
14389

    
14390
    /* Handle blikely not taken case */
14391
    if ((ctx->hflags & MIPS_HFLAG_BMASK_BASE) == MIPS_HFLAG_BL) {
14392
        int l1 = gen_new_label();
14393

    
14394
        MIPS_DEBUG("blikely condition (" TARGET_FMT_lx ")", ctx->pc + 4);
14395
        tcg_gen_brcondi_tl(TCG_COND_NE, bcond, 0, l1);
14396
        tcg_gen_movi_i32(hflags, ctx->hflags & ~MIPS_HFLAG_BMASK);
14397
        gen_goto_tb(ctx, 1, ctx->pc + 4);
14398
        gen_set_label(l1);
14399
    }
14400

    
14401
    if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP | CPU_LOG_TB_OP_OPT))) {
14402
        tcg_gen_debug_insn_start(ctx->pc);
14403
    }
14404

    
14405
    op = MASK_OP_MAJOR(ctx->opcode);
14406
    rs = (ctx->opcode >> 21) & 0x1f;
14407
    rt = (ctx->opcode >> 16) & 0x1f;
14408
    rd = (ctx->opcode >> 11) & 0x1f;
14409
    sa = (ctx->opcode >> 6) & 0x1f;
14410
    imm = (int16_t)ctx->opcode;
14411
    switch (op) {
14412
    case OPC_SPECIAL:
14413
        op1 = MASK_SPECIAL(ctx->opcode);
14414
        switch (op1) {
14415
        case OPC_SLL:          /* Shift with immediate */
14416
        case OPC_SRA:
14417
            gen_shift_imm(ctx, op1, rd, rt, sa);
14418
            break;
14419
        case OPC_SRL:
14420
            switch ((ctx->opcode >> 21) & 0x1f) {
14421
            case 1:
14422
                /* rotr is decoded as srl on non-R2 CPUs */
14423
                if (ctx->insn_flags & ISA_MIPS32R2) {
14424
                    op1 = OPC_ROTR;
14425
                }
14426
                /* Fallthrough */
14427
            case 0:
14428
                gen_shift_imm(ctx, op1, rd, rt, sa);
14429
                break;
14430
            default:
14431
                generate_exception(ctx, EXCP_RI);
14432
                break;
14433
            }
14434
            break;
14435
        case OPC_MOVN:         /* Conditional move */
14436
        case OPC_MOVZ:
14437
            check_insn(ctx, ISA_MIPS4 | ISA_MIPS32 |
14438
                                 INSN_LOONGSON2E | INSN_LOONGSON2F);
14439
            gen_cond_move(ctx, op1, rd, rs, rt);
14440
            break;
14441
        case OPC_ADD ... OPC_SUBU:
14442
            gen_arith(ctx, op1, rd, rs, rt);
14443
            break;
14444
        case OPC_SLLV:         /* Shifts */
14445
        case OPC_SRAV:
14446
            gen_shift(ctx, op1, rd, rs, rt);
14447
            break;
14448
        case OPC_SRLV:
14449
            switch ((ctx->opcode >> 6) & 0x1f) {
14450
            case 1:
14451
                /* rotrv is decoded as srlv on non-R2 CPUs */
14452
                if (ctx->insn_flags & ISA_MIPS32R2) {
14453
                    op1 = OPC_ROTRV;
14454
                }
14455
                /* Fallthrough */
14456
            case 0:
14457
                gen_shift(ctx, op1, rd, rs, rt);
14458
                break;
14459
            default:
14460
                generate_exception(ctx, EXCP_RI);
14461
                break;
14462
            }
14463
            break;
14464
        case OPC_SLT:          /* Set on less than */
14465
        case OPC_SLTU:
14466
            gen_slt(ctx, op1, rd, rs, rt);
14467
            break;
14468
        case OPC_AND:          /* Logic*/
14469
        case OPC_OR:
14470
        case OPC_NOR:
14471
        case OPC_XOR:
14472
            gen_logic(ctx, op1, rd, rs, rt);
14473
            break;
14474
        case OPC_MULT:
14475
        case OPC_MULTU:
14476
            if (sa) {
14477
                check_insn(ctx, INSN_VR54XX);
14478
                op1 = MASK_MUL_VR54XX(ctx->opcode);
14479
                gen_mul_vr54xx(ctx, op1, rd, rs, rt);
14480
            } else {
14481
                gen_muldiv(ctx, op1, rd & 3, rs, rt);
14482
            }
14483
            break;
14484
        case OPC_DIV:
14485
        case OPC_DIVU:
14486
            gen_muldiv(ctx, op1, 0, rs, rt);
14487
            break;
14488
        case OPC_JR ... OPC_JALR:
14489
            gen_compute_branch(ctx, op1, 4, rs, rd, sa);
14490
            break;
14491
        case OPC_TGE ... OPC_TEQ: /* Traps */
14492
        case OPC_TNE:
14493
            gen_trap(ctx, op1, rs, rt, -1);
14494
            break;
14495
        case OPC_MFHI:          /* Move from HI/LO */
14496
        case OPC_MFLO:
14497
            gen_HILO(ctx, op1, rs & 3, rd);
14498
            break;
14499
        case OPC_MTHI:
14500
        case OPC_MTLO:          /* Move to HI/LO */
14501
            gen_HILO(ctx, op1, rd & 3, rs);
14502
            break;
14503
        case OPC_PMON:          /* Pmon entry point, also R4010 selsl */
14504
#ifdef MIPS_STRICT_STANDARD
14505
            MIPS_INVAL("PMON / selsl");
14506
            generate_exception(ctx, EXCP_RI);
14507
#else
14508
            gen_helper_0e0i(pmon, sa);
14509
#endif
14510
            break;
14511
        case OPC_SYSCALL:
14512
            generate_exception(ctx, EXCP_SYSCALL);
14513
            ctx->bstate = BS_STOP;
14514
            break;
14515
        case OPC_BREAK:
14516
            generate_exception(ctx, EXCP_BREAK);
14517
            break;
14518
        case OPC_SPIM:
14519
#ifdef MIPS_STRICT_STANDARD
14520
            MIPS_INVAL("SPIM");
14521
            generate_exception(ctx, EXCP_RI);
14522
#else
14523
           /* Implemented as RI exception for now. */
14524
            MIPS_INVAL("spim (unofficial)");
14525
            generate_exception(ctx, EXCP_RI);
14526
#endif
14527
            break;
14528
        case OPC_SYNC:
14529
            /* Treat as NOP. */
14530
            break;
14531

    
14532
        case OPC_MOVCI:
14533
            check_insn(ctx, ISA_MIPS4 | ISA_MIPS32);
14534
            if (env->CP0_Config1 & (1 << CP0C1_FP)) {
14535
                check_cp1_enabled(ctx);
14536
                gen_movci(ctx, rd, rs, (ctx->opcode >> 18) & 0x7,
14537
                          (ctx->opcode >> 16) & 1);
14538
            } else {
14539
                generate_exception_err(ctx, EXCP_CpU, 1);
14540
            }
14541
            break;
14542

    
14543
#if defined(TARGET_MIPS64)
14544
       /* MIPS64 specific opcodes */
14545
        case OPC_DSLL:
14546
        case OPC_DSRA:
14547
        case OPC_DSLL32:
14548
        case OPC_DSRA32:
14549
            check_insn(ctx, ISA_MIPS3);
14550
            check_mips_64(ctx);
14551
            gen_shift_imm(ctx, op1, rd, rt, sa);
14552
            break;
14553
        case OPC_DSRL:
14554
            switch ((ctx->opcode >> 21) & 0x1f) {
14555
            case 1:
14556
                /* drotr is decoded as dsrl on non-R2 CPUs */
14557
                if (ctx->insn_flags & ISA_MIPS32R2) {
14558
                    op1 = OPC_DROTR;
14559
                }
14560
                /* Fallthrough */
14561
            case 0:
14562
                check_insn(ctx, ISA_MIPS3);
14563
                check_mips_64(ctx);
14564
                gen_shift_imm(ctx, op1, rd, rt, sa);
14565
                break;
14566
            default:
14567
                generate_exception(ctx, EXCP_RI);
14568
                break;
14569
            }
14570
            break;
14571
        case OPC_DSRL32:
14572
            switch ((ctx->opcode >> 21) & 0x1f) {
14573
            case 1:
14574
                /* drotr32 is decoded as dsrl32 on non-R2 CPUs */
14575
                if (ctx->insn_flags & ISA_MIPS32R2) {
14576
                    op1 = OPC_DROTR32;
14577
                }
14578
                /* Fallthrough */
14579
            case 0:
14580
                check_insn(ctx, ISA_MIPS3);
14581
                check_mips_64(ctx);
14582
                gen_shift_imm(ctx, op1, rd, rt, sa);
14583
                break;
14584
            default:
14585
                generate_exception(ctx, EXCP_RI);
14586
                break;
14587
            }
14588
            break;
14589
        case OPC_DADD ... OPC_DSUBU:
14590
            check_insn(ctx, ISA_MIPS3);
14591
            check_mips_64(ctx);
14592
            gen_arith(ctx, op1, rd, rs, rt);
14593
            break;
14594
        case OPC_DSLLV:
14595
        case OPC_DSRAV:
14596
            check_insn(ctx, ISA_MIPS3);
14597
            check_mips_64(ctx);
14598
            gen_shift(ctx, op1, rd, rs, rt);
14599
            break;
14600
        case OPC_DSRLV:
14601
            switch ((ctx->opcode >> 6) & 0x1f) {
14602
            case 1:
14603
                /* drotrv is decoded as dsrlv on non-R2 CPUs */
14604
                if (ctx->insn_flags & ISA_MIPS32R2) {
14605
                    op1 = OPC_DROTRV;
14606
                }
14607
                /* Fallthrough */
14608
            case 0:
14609
                check_insn(ctx, ISA_MIPS3);
14610
                check_mips_64(ctx);
14611
                gen_shift(ctx, op1, rd, rs, rt);
14612
                break;
14613
            default:
14614
                generate_exception(ctx, EXCP_RI);
14615
                break;
14616
            }
14617
            break;
14618
        case OPC_DMULT ... OPC_DDIVU:
14619
            check_insn(ctx, ISA_MIPS3);
14620
            check_mips_64(ctx);
14621
            gen_muldiv(ctx, op1, 0, rs, rt);
14622
            break;
14623
#endif
14624
        default:            /* Invalid */
14625
            MIPS_INVAL("special");
14626
            generate_exception(ctx, EXCP_RI);
14627
            break;
14628
        }
14629
        break;
14630
    case OPC_SPECIAL2:
14631
        op1 = MASK_SPECIAL2(ctx->opcode);
14632
        switch (op1) {
14633
        case OPC_MADD ... OPC_MADDU: /* Multiply and add/sub */
14634
        case OPC_MSUB ... OPC_MSUBU:
14635
            check_insn(ctx, ISA_MIPS32);
14636
            gen_muldiv(ctx, op1, rd & 3, rs, rt);
14637
            break;
14638
        case OPC_MUL:
14639
            gen_arith(ctx, op1, rd, rs, rt);
14640
            break;
14641
        case OPC_CLO:
14642
        case OPC_CLZ:
14643
            check_insn(ctx, ISA_MIPS32);
14644
            gen_cl(ctx, op1, rd, rs);
14645
            break;
14646
        case OPC_SDBBP:
14647
            /* XXX: not clear which exception should be raised
14648
             *      when in debug mode...
14649
             */
14650
            check_insn(ctx, ISA_MIPS32);
14651
            if (!(ctx->hflags & MIPS_HFLAG_DM)) {
14652
                generate_exception(ctx, EXCP_DBp);
14653
            } else {
14654
                generate_exception(ctx, EXCP_DBp);
14655
            }
14656
            /* Treat as NOP. */
14657
            break;
14658
        case OPC_DIV_G_2F:
14659
        case OPC_DIVU_G_2F:
14660
        case OPC_MULT_G_2F:
14661
        case OPC_MULTU_G_2F:
14662
        case OPC_MOD_G_2F:
14663
        case OPC_MODU_G_2F:
14664
            check_insn(ctx, INSN_LOONGSON2F);
14665
            gen_loongson_integer(ctx, op1, rd, rs, rt);
14666
            break;
14667
#if defined(TARGET_MIPS64)
14668
        case OPC_DCLO:
14669
        case OPC_DCLZ:
14670
            check_insn(ctx, ISA_MIPS64);
14671
            check_mips_64(ctx);
14672
            gen_cl(ctx, op1, rd, rs);
14673
            break;
14674
        case OPC_DMULT_G_2F:
14675
        case OPC_DMULTU_G_2F:
14676
        case OPC_DDIV_G_2F:
14677
        case OPC_DDIVU_G_2F:
14678
        case OPC_DMOD_G_2F:
14679
        case OPC_DMODU_G_2F:
14680
            check_insn(ctx, INSN_LOONGSON2F);
14681
            gen_loongson_integer(ctx, op1, rd, rs, rt);
14682
            break;
14683
#endif
14684
        default:            /* Invalid */
14685
            MIPS_INVAL("special2");
14686
            generate_exception(ctx, EXCP_RI);
14687
            break;
14688
        }
14689
        break;
14690
    case OPC_SPECIAL3:
14691
        op1 = MASK_SPECIAL3(ctx->opcode);
14692
        switch (op1) {
14693
        case OPC_EXT:
14694
        case OPC_INS:
14695
            check_insn(ctx, ISA_MIPS32R2);
14696
            gen_bitops(ctx, op1, rt, rs, sa, rd);
14697
            break;
14698
        case OPC_BSHFL:
14699
            check_insn(ctx, ISA_MIPS32R2);
14700
            op2 = MASK_BSHFL(ctx->opcode);
14701
            gen_bshfl(ctx, op2, rt, rd);
14702
            break;
14703
        case OPC_RDHWR:
14704
            gen_rdhwr(ctx, rt, rd);
14705
            break;
14706
        case OPC_FORK:
14707
            check_insn(ctx, ASE_MT);
14708
            {
14709
                TCGv t0 = tcg_temp_new();
14710
                TCGv t1 = tcg_temp_new();
14711

    
14712
                gen_load_gpr(t0, rt);
14713
                gen_load_gpr(t1, rs);
14714
                gen_helper_fork(t0, t1);
14715
                tcg_temp_free(t0);
14716
                tcg_temp_free(t1);
14717
            }
14718
            break;
14719
        case OPC_YIELD:
14720
            check_insn(ctx, ASE_MT);
14721
            {
14722
                TCGv t0 = tcg_temp_new();
14723

    
14724
                save_cpu_state(ctx, 1);
14725
                gen_load_gpr(t0, rs);
14726
                gen_helper_yield(t0, cpu_env, t0);
14727
                gen_store_gpr(t0, rd);
14728
                tcg_temp_free(t0);
14729
            }
14730
            break;
14731
        case OPC_DIV_G_2E ... OPC_DIVU_G_2E:
14732
        case OPC_MOD_G_2E ... OPC_MODU_G_2E:
14733
        case OPC_MULT_G_2E ... OPC_MULTU_G_2E:
14734
        /* OPC_MULT_G_2E, OPC_ADDUH_QB_DSP, OPC_MUL_PH_DSP have
14735
         * the same mask and op1. */
14736
            if ((ctx->insn_flags & ASE_DSPR2) && (op1 == OPC_MULT_G_2E)) {
14737
                op2 = MASK_ADDUH_QB(ctx->opcode);
14738
                switch (op2) {
14739
                case OPC_ADDUH_QB:
14740
                case OPC_ADDUH_R_QB:
14741
                case OPC_ADDQH_PH:
14742
                case OPC_ADDQH_R_PH:
14743
                case OPC_ADDQH_W:
14744
                case OPC_ADDQH_R_W:
14745
                case OPC_SUBUH_QB:
14746
                case OPC_SUBUH_R_QB:
14747
                case OPC_SUBQH_PH:
14748
                case OPC_SUBQH_R_PH:
14749
                case OPC_SUBQH_W:
14750
                case OPC_SUBQH_R_W:
14751
                    gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
14752
                    break;
14753
                case OPC_MUL_PH:
14754
                case OPC_MUL_S_PH:
14755
                case OPC_MULQ_S_W:
14756
                case OPC_MULQ_RS_W:
14757
                    gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
14758
                    break;
14759
                default:
14760
                    MIPS_INVAL("MASK ADDUH.QB");
14761
                    generate_exception(ctx, EXCP_RI);
14762
                    break;
14763
                }
14764
            } else if (ctx->insn_flags & INSN_LOONGSON2E) {
14765
                gen_loongson_integer(ctx, op1, rd, rs, rt);
14766
            } else {
14767
                generate_exception(ctx, EXCP_RI);
14768
            }
14769
            break;
14770
        case OPC_LX_DSP:
14771
            op2 = MASK_LX(ctx->opcode);
14772
            switch (op2) {
14773
#if defined(TARGET_MIPS64)
14774
            case OPC_LDX:
14775
#endif
14776
            case OPC_LBUX:
14777
            case OPC_LHX:
14778
            case OPC_LWX:
14779
                gen_mipsdsp_ld(ctx, op2, rd, rs, rt);
14780
                break;
14781
            default:            /* Invalid */
14782
                MIPS_INVAL("MASK LX");
14783
                generate_exception(ctx, EXCP_RI);
14784
                break;
14785
            }
14786
            break;
14787
        case OPC_ABSQ_S_PH_DSP:
14788
            op2 = MASK_ABSQ_S_PH(ctx->opcode);
14789
            switch (op2) {
14790
            case OPC_ABSQ_S_QB:
14791
            case OPC_ABSQ_S_PH:
14792
            case OPC_ABSQ_S_W:
14793
            case OPC_PRECEQ_W_PHL:
14794
            case OPC_PRECEQ_W_PHR:
14795
            case OPC_PRECEQU_PH_QBL:
14796
            case OPC_PRECEQU_PH_QBR:
14797
            case OPC_PRECEQU_PH_QBLA:
14798
            case OPC_PRECEQU_PH_QBRA:
14799
            case OPC_PRECEU_PH_QBL:
14800
            case OPC_PRECEU_PH_QBR:
14801
            case OPC_PRECEU_PH_QBLA:
14802
            case OPC_PRECEU_PH_QBRA:
14803
                gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
14804
                break;
14805
            case OPC_BITREV:
14806
            case OPC_REPL_QB:
14807
            case OPC_REPLV_QB:
14808
            case OPC_REPL_PH:
14809
            case OPC_REPLV_PH:
14810
                gen_mipsdsp_bitinsn(ctx, op1, op2, rd, rt);
14811
                break;
14812
            default:
14813
                MIPS_INVAL("MASK ABSQ_S.PH");
14814
                generate_exception(ctx, EXCP_RI);
14815
                break;
14816
            }
14817
            break;
14818
        case OPC_ADDU_QB_DSP:
14819
            op2 = MASK_ADDU_QB(ctx->opcode);
14820
            switch (op2) {
14821
            case OPC_ADDQ_PH:
14822
            case OPC_ADDQ_S_PH:
14823
            case OPC_ADDQ_S_W:
14824
            case OPC_ADDU_QB:
14825
            case OPC_ADDU_S_QB:
14826
            case OPC_ADDU_PH:
14827
            case OPC_ADDU_S_PH:
14828
            case OPC_SUBQ_PH:
14829
            case OPC_SUBQ_S_PH:
14830
            case OPC_SUBQ_S_W:
14831
            case OPC_SUBU_QB:
14832
            case OPC_SUBU_S_QB:
14833
            case OPC_SUBU_PH:
14834
            case OPC_SUBU_S_PH:
14835
            case OPC_ADDSC:
14836
            case OPC_ADDWC:
14837
            case OPC_MODSUB:
14838
            case OPC_RADDU_W_QB:
14839
                gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
14840
                break;
14841
            case OPC_MULEU_S_PH_QBL:
14842
            case OPC_MULEU_S_PH_QBR:
14843
            case OPC_MULQ_RS_PH:
14844
            case OPC_MULEQ_S_W_PHL:
14845
            case OPC_MULEQ_S_W_PHR:
14846
            case OPC_MULQ_S_PH:
14847
                gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
14848
                break;
14849
            default:            /* Invalid */
14850
                MIPS_INVAL("MASK ADDU.QB");
14851
                generate_exception(ctx, EXCP_RI);
14852
                break;
14853

    
14854
            }
14855
            break;
14856
        case OPC_CMPU_EQ_QB_DSP:
14857
            op2 = MASK_CMPU_EQ_QB(ctx->opcode);
14858
            switch (op2) {
14859
            case OPC_PRECR_SRA_PH_W:
14860
            case OPC_PRECR_SRA_R_PH_W:
14861
                gen_mipsdsp_arith(ctx, op1, op2, rt, rs, rd);
14862
                break;
14863
            case OPC_PRECR_QB_PH:
14864
            case OPC_PRECRQ_QB_PH:
14865
            case OPC_PRECRQ_PH_W:
14866
            case OPC_PRECRQ_RS_PH_W:
14867
            case OPC_PRECRQU_S_QB_PH:
14868
                gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
14869
                break;
14870
            case OPC_CMPU_EQ_QB:
14871
            case OPC_CMPU_LT_QB:
14872
            case OPC_CMPU_LE_QB:
14873
            case OPC_CMP_EQ_PH:
14874
            case OPC_CMP_LT_PH:
14875
            case OPC_CMP_LE_PH:
14876
                gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 0);
14877
                break;
14878
            case OPC_CMPGU_EQ_QB:
14879
            case OPC_CMPGU_LT_QB:
14880
            case OPC_CMPGU_LE_QB:
14881
            case OPC_CMPGDU_EQ_QB:
14882
            case OPC_CMPGDU_LT_QB:
14883
            case OPC_CMPGDU_LE_QB:
14884
            case OPC_PICK_QB:
14885
            case OPC_PICK_PH:
14886
            case OPC_PACKRL_PH:
14887
                gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 1);
14888
                break;
14889
            default:            /* Invalid */
14890
                MIPS_INVAL("MASK CMPU.EQ.QB");
14891
                generate_exception(ctx, EXCP_RI);
14892
                break;
14893
            }
14894
            break;
14895
        case OPC_SHLL_QB_DSP:
14896
            gen_mipsdsp_shift(ctx, op1, rd, rs, rt);
14897
            break;
14898
        case OPC_DPA_W_PH_DSP:
14899
            op2 = MASK_DPA_W_PH(ctx->opcode);
14900
            switch (op2) {
14901
            case OPC_DPAU_H_QBL:
14902
            case OPC_DPAU_H_QBR:
14903
            case OPC_DPSU_H_QBL:
14904
            case OPC_DPSU_H_QBR:
14905
            case OPC_DPA_W_PH:
14906
            case OPC_DPAX_W_PH:
14907
            case OPC_DPAQ_S_W_PH:
14908
            case OPC_DPAQX_S_W_PH:
14909
            case OPC_DPAQX_SA_W_PH:
14910
            case OPC_DPS_W_PH:
14911
            case OPC_DPSX_W_PH:
14912
            case OPC_DPSQ_S_W_PH:
14913
            case OPC_DPSQX_S_W_PH:
14914
            case OPC_DPSQX_SA_W_PH:
14915
            case OPC_MULSAQ_S_W_PH:
14916
            case OPC_DPAQ_SA_L_W:
14917
            case OPC_DPSQ_SA_L_W:
14918
            case OPC_MAQ_S_W_PHL:
14919
            case OPC_MAQ_S_W_PHR:
14920
            case OPC_MAQ_SA_W_PHL:
14921
            case OPC_MAQ_SA_W_PHR:
14922
            case OPC_MULSA_W_PH:
14923
                gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
14924
                break;
14925
            default:            /* Invalid */
14926
                MIPS_INVAL("MASK DPAW.PH");
14927
                generate_exception(ctx, EXCP_RI);
14928
                break;
14929
            }
14930
            break;
14931
        case OPC_INSV_DSP:
14932
            op2 = MASK_INSV(ctx->opcode);
14933
            switch (op2) {
14934
            case OPC_INSV:
14935
                check_dsp(ctx);
14936
                {
14937
                    TCGv t0, t1;
14938

    
14939
                    if (rt == 0) {
14940
                        MIPS_DEBUG("NOP");
14941
                        break;
14942
                    }
14943

    
14944
                    t0 = tcg_temp_new();
14945
                    t1 = tcg_temp_new();
14946

    
14947
                    gen_load_gpr(t0, rt);
14948
                    gen_load_gpr(t1, rs);
14949

    
14950
                    gen_helper_insv(cpu_gpr[rt], cpu_env, t1, t0);
14951

    
14952
                    tcg_temp_free(t0);
14953
                    tcg_temp_free(t1);
14954
                    break;
14955
                }
14956
            default:            /* Invalid */
14957
                MIPS_INVAL("MASK INSV");
14958
                generate_exception(ctx, EXCP_RI);
14959
                break;
14960
            }
14961
            break;
14962
        case OPC_APPEND_DSP:
14963
            gen_mipsdsp_append(env, ctx, op1, rt, rs, rd);
14964
            break;
14965
        case OPC_EXTR_W_DSP:
14966
            op2 = MASK_EXTR_W(ctx->opcode);
14967
            switch (op2) {
14968
            case OPC_EXTR_W:
14969
            case OPC_EXTR_R_W:
14970
            case OPC_EXTR_RS_W:
14971
            case OPC_EXTR_S_H:
14972
            case OPC_EXTRV_S_H:
14973
            case OPC_EXTRV_W:
14974
            case OPC_EXTRV_R_W:
14975
            case OPC_EXTRV_RS_W:
14976
            case OPC_EXTP:
14977
            case OPC_EXTPV:
14978
            case OPC_EXTPDP:
14979
            case OPC_EXTPDPV:
14980
                gen_mipsdsp_accinsn(ctx, op1, op2, rt, rs, rd, 1);
14981
                break;
14982
            case OPC_RDDSP:
14983
                gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 1);
14984
                break;
14985
            case OPC_SHILO:
14986
            case OPC_SHILOV:
14987
            case OPC_MTHLIP:
14988
            case OPC_WRDSP:
14989
                gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 0);
14990
                break;
14991
            default:            /* Invalid */
14992
                MIPS_INVAL("MASK EXTR.W");
14993
                generate_exception(ctx, EXCP_RI);
14994
                break;
14995
            }
14996
            break;
14997
#if defined(TARGET_MIPS64)
14998
        case OPC_DEXTM ... OPC_DEXT:
14999
        case OPC_DINSM ... OPC_DINS:
15000
            check_insn(ctx, ISA_MIPS64R2);
15001
            check_mips_64(ctx);
15002
            gen_bitops(ctx, op1, rt, rs, sa, rd);
15003
            break;
15004
        case OPC_DBSHFL:
15005
            check_insn(ctx, ISA_MIPS64R2);
15006
            check_mips_64(ctx);
15007
            op2 = MASK_DBSHFL(ctx->opcode);
15008
            gen_bshfl(ctx, op2, rt, rd);
15009
            break;
15010
        case OPC_DDIV_G_2E ... OPC_DDIVU_G_2E:
15011
        case OPC_DMULT_G_2E ... OPC_DMULTU_G_2E:
15012
        case OPC_DMOD_G_2E ... OPC_DMODU_G_2E:
15013
            check_insn(ctx, INSN_LOONGSON2E);
15014
            gen_loongson_integer(ctx, op1, rd, rs, rt);
15015
            break;
15016
        case OPC_ABSQ_S_QH_DSP:
15017
            op2 = MASK_ABSQ_S_QH(ctx->opcode);
15018
            switch (op2) {
15019
            case OPC_PRECEQ_L_PWL:
15020
            case OPC_PRECEQ_L_PWR:
15021
            case OPC_PRECEQ_PW_QHL:
15022
            case OPC_PRECEQ_PW_QHR:
15023
            case OPC_PRECEQ_PW_QHLA:
15024
            case OPC_PRECEQ_PW_QHRA:
15025
            case OPC_PRECEQU_QH_OBL:
15026
            case OPC_PRECEQU_QH_OBR:
15027
            case OPC_PRECEQU_QH_OBLA:
15028
            case OPC_PRECEQU_QH_OBRA:
15029
            case OPC_PRECEU_QH_OBL:
15030
            case OPC_PRECEU_QH_OBR:
15031
            case OPC_PRECEU_QH_OBLA:
15032
            case OPC_PRECEU_QH_OBRA:
15033
            case OPC_ABSQ_S_OB:
15034
            case OPC_ABSQ_S_PW:
15035
            case OPC_ABSQ_S_QH:
15036
                gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
15037
                break;
15038
            case OPC_REPL_OB:
15039
            case OPC_REPL_PW:
15040
            case OPC_REPL_QH:
15041
            case OPC_REPLV_OB:
15042
            case OPC_REPLV_PW:
15043
            case OPC_REPLV_QH:
15044
                gen_mipsdsp_bitinsn(ctx, op1, op2, rd, rt);
15045
                break;
15046
            default:            /* Invalid */
15047
                MIPS_INVAL("MASK ABSQ_S.QH");
15048
                generate_exception(ctx, EXCP_RI);
15049
                break;
15050
            }
15051
            break;
15052
        case OPC_ADDU_OB_DSP:
15053
            op2 = MASK_ADDU_OB(ctx->opcode);
15054
            switch (op2) {
15055
            case OPC_RADDU_L_OB:
15056
            case OPC_SUBQ_PW:
15057
            case OPC_SUBQ_S_PW:
15058
            case OPC_SUBQ_QH:
15059
            case OPC_SUBQ_S_QH:
15060
            case OPC_SUBU_OB:
15061
            case OPC_SUBU_S_OB:
15062
            case OPC_SUBU_QH:
15063
            case OPC_SUBU_S_QH:
15064
            case OPC_SUBUH_OB:
15065
            case OPC_SUBUH_R_OB:
15066
            case OPC_ADDQ_PW:
15067
            case OPC_ADDQ_S_PW:
15068
            case OPC_ADDQ_QH:
15069
            case OPC_ADDQ_S_QH:
15070
            case OPC_ADDU_OB:
15071
            case OPC_ADDU_S_OB:
15072
            case OPC_ADDU_QH:
15073
            case OPC_ADDU_S_QH:
15074
            case OPC_ADDUH_OB:
15075
            case OPC_ADDUH_R_OB:
15076
                gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
15077
                break;
15078
            case OPC_MULEQ_S_PW_QHL:
15079
            case OPC_MULEQ_S_PW_QHR:
15080
            case OPC_MULEU_S_QH_OBL:
15081
            case OPC_MULEU_S_QH_OBR:
15082
            case OPC_MULQ_RS_QH:
15083
                gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 1);
15084
                break;
15085
            default:            /* Invalid */
15086
                MIPS_INVAL("MASK ADDU.OB");
15087
                generate_exception(ctx, EXCP_RI);
15088
                break;
15089
            }
15090
            break;
15091
        case OPC_CMPU_EQ_OB_DSP:
15092
            op2 = MASK_CMPU_EQ_OB(ctx->opcode);
15093
            switch (op2) {
15094
            case OPC_PRECR_SRA_QH_PW:
15095
            case OPC_PRECR_SRA_R_QH_PW:
15096
                /* Return value is rt. */
15097
                gen_mipsdsp_arith(ctx, op1, op2, rt, rs, rd);
15098
                break;
15099
            case OPC_PRECR_OB_QH:
15100
            case OPC_PRECRQ_OB_QH:
15101
            case OPC_PRECRQ_PW_L:
15102
            case OPC_PRECRQ_QH_PW:
15103
            case OPC_PRECRQ_RS_QH_PW:
15104
            case OPC_PRECRQU_S_OB_QH:
15105
                gen_mipsdsp_arith(ctx, op1, op2, rd, rs, rt);
15106
                break;
15107
            case OPC_CMPU_EQ_OB:
15108
            case OPC_CMPU_LT_OB:
15109
            case OPC_CMPU_LE_OB:
15110
            case OPC_CMP_EQ_QH:
15111
            case OPC_CMP_LT_QH:
15112
            case OPC_CMP_LE_QH:
15113
            case OPC_CMP_EQ_PW:
15114
            case OPC_CMP_LT_PW:
15115
            case OPC_CMP_LE_PW:
15116
                gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 0);
15117
                break;
15118
            case OPC_CMPGDU_EQ_OB:
15119
            case OPC_CMPGDU_LT_OB:
15120
            case OPC_CMPGDU_LE_OB:
15121
            case OPC_CMPGU_EQ_OB:
15122
            case OPC_CMPGU_LT_OB:
15123
            case OPC_CMPGU_LE_OB:
15124
            case OPC_PACKRL_PW:
15125
            case OPC_PICK_OB:
15126
            case OPC_PICK_PW:
15127
            case OPC_PICK_QH:
15128
                gen_mipsdsp_add_cmp_pick(ctx, op1, op2, rd, rs, rt, 1);
15129
                break;
15130
            default:            /* Invalid */
15131
                MIPS_INVAL("MASK CMPU_EQ.OB");
15132
                generate_exception(ctx, EXCP_RI);
15133
                break;
15134
            }
15135
            break;
15136
        case OPC_DAPPEND_DSP:
15137
            gen_mipsdsp_append(env, ctx, op1, rt, rs, rd);
15138
            break;
15139
        case OPC_DEXTR_W_DSP:
15140
            op2 = MASK_DEXTR_W(ctx->opcode);
15141
            switch (op2) {
15142
            case OPC_DEXTP:
15143
            case OPC_DEXTPDP:
15144
            case OPC_DEXTPDPV:
15145
            case OPC_DEXTPV:
15146
            case OPC_DEXTR_L:
15147
            case OPC_DEXTR_R_L:
15148
            case OPC_DEXTR_RS_L:
15149
            case OPC_DEXTR_W:
15150
            case OPC_DEXTR_R_W:
15151
            case OPC_DEXTR_RS_W:
15152
            case OPC_DEXTR_S_H:
15153
            case OPC_DEXTRV_L:
15154
            case OPC_DEXTRV_R_L:
15155
            case OPC_DEXTRV_RS_L:
15156
            case OPC_DEXTRV_S_H:
15157
            case OPC_DEXTRV_W:
15158
            case OPC_DEXTRV_R_W:
15159
            case OPC_DEXTRV_RS_W:
15160
                gen_mipsdsp_accinsn(ctx, op1, op2, rt, rs, rd, 1);
15161
                break;
15162
            case OPC_DMTHLIP:
15163
            case OPC_DSHILO:
15164
            case OPC_DSHILOV:
15165
                gen_mipsdsp_accinsn(ctx, op1, op2, rd, rs, rt, 0);
15166
                break;
15167
            default:            /* Invalid */
15168
                MIPS_INVAL("MASK EXTR.W");
15169
                generate_exception(ctx, EXCP_RI);
15170
                break;
15171
            }
15172
            break;
15173
        case OPC_DPAQ_W_QH_DSP:
15174
            op2 = MASK_DPAQ_W_QH(ctx->opcode);
15175
            switch (op2) {
15176
            case OPC_DPAU_H_OBL:
15177
            case OPC_DPAU_H_OBR:
15178
            case OPC_DPSU_H_OBL:
15179
            case OPC_DPSU_H_OBR:
15180
            case OPC_DPA_W_QH:
15181
            case OPC_DPAQ_S_W_QH:
15182
            case OPC_DPS_W_QH:
15183
            case OPC_DPSQ_S_W_QH:
15184
            case OPC_MULSAQ_S_W_QH:
15185
            case OPC_DPAQ_SA_L_PW:
15186
            case OPC_DPSQ_SA_L_PW:
15187
            case OPC_MULSAQ_S_L_PW:
15188
                gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
15189
                break;
15190
            case OPC_MAQ_S_W_QHLL:
15191
            case OPC_MAQ_S_W_QHLR:
15192
            case OPC_MAQ_S_W_QHRL:
15193
            case OPC_MAQ_S_W_QHRR:
15194
            case OPC_MAQ_SA_W_QHLL:
15195
            case OPC_MAQ_SA_W_QHLR:
15196
            case OPC_MAQ_SA_W_QHRL:
15197
            case OPC_MAQ_SA_W_QHRR:
15198
            case OPC_MAQ_S_L_PWL:
15199
            case OPC_MAQ_S_L_PWR:
15200
            case OPC_DMADD:
15201
            case OPC_DMADDU:
15202
            case OPC_DMSUB:
15203
            case OPC_DMSUBU:
15204
                gen_mipsdsp_multiply(ctx, op1, op2, rd, rs, rt, 0);
15205
                break;
15206
            default:            /* Invalid */
15207
                MIPS_INVAL("MASK DPAQ.W.QH");
15208
                generate_exception(ctx, EXCP_RI);
15209
                break;
15210
            }
15211
            break;
15212
        case OPC_DINSV_DSP:
15213
            op2 = MASK_INSV(ctx->opcode);
15214
            switch (op2) {
15215
            case OPC_DINSV:
15216
                {
15217
                    TCGv t0, t1;
15218

    
15219
                    if (rt == 0) {
15220
                        MIPS_DEBUG("NOP");
15221
                        break;
15222
                    }
15223
                    check_dsp(ctx);
15224

    
15225
                    t0 = tcg_temp_new();
15226
                    t1 = tcg_temp_new();
15227

    
15228
                    gen_load_gpr(t0, rt);
15229
                    gen_load_gpr(t1, rs);
15230

    
15231
                    gen_helper_dinsv(cpu_gpr[rt], cpu_env, t1, t0);
15232
                    break;
15233
                }
15234
            default:            /* Invalid */
15235
                MIPS_INVAL("MASK DINSV");
15236
                generate_exception(ctx, EXCP_RI);
15237
                break;
15238
            }
15239
            break;
15240
        case OPC_SHLL_OB_DSP:
15241
            gen_mipsdsp_shift(ctx, op1, rd, rs, rt);
15242
            break;
15243
#endif
15244
        default:            /* Invalid */
15245
            MIPS_INVAL("special3");
15246
            generate_exception(ctx, EXCP_RI);
15247
            break;
15248
        }
15249
        break;
15250
    case OPC_REGIMM:
15251
        op1 = MASK_REGIMM(ctx->opcode);
15252
        switch (op1) {
15253
        case OPC_BLTZ ... OPC_BGEZL: /* REGIMM branches */
15254
        case OPC_BLTZAL ... OPC_BGEZALL:
15255
            gen_compute_branch(ctx, op1, 4, rs, -1, imm << 2);
15256
            break;
15257
        case OPC_TGEI ... OPC_TEQI: /* REGIMM traps */
15258
        case OPC_TNEI:
15259
            gen_trap(ctx, op1, rs, -1, imm);
15260
            break;
15261
        case OPC_SYNCI:
15262
            check_insn(ctx, ISA_MIPS32R2);
15263
            /* Treat as NOP. */
15264
            break;
15265
        case OPC_BPOSGE32:    /* MIPS DSP branch */
15266
#if defined(TARGET_MIPS64)
15267
        case OPC_BPOSGE64:
15268
#endif
15269
            check_dsp(ctx);
15270
            gen_compute_branch(ctx, op1, 4, -1, -2, (int32_t)imm << 2);
15271
            break;
15272
        default:            /* Invalid */
15273
            MIPS_INVAL("regimm");
15274
            generate_exception(ctx, EXCP_RI);
15275
            break;
15276
        }
15277
        break;
15278
    case OPC_CP0:
15279
        check_cp0_enabled(ctx);
15280
        op1 = MASK_CP0(ctx->opcode);
15281
        switch (op1) {
15282
        case OPC_MFC0:
15283
        case OPC_MTC0:
15284
        case OPC_MFTR:
15285
        case OPC_MTTR:
15286
#if defined(TARGET_MIPS64)
15287
        case OPC_DMFC0:
15288
        case OPC_DMTC0:
15289
#endif
15290
#ifndef CONFIG_USER_ONLY
15291
            gen_cp0(env, ctx, op1, rt, rd);
15292
#endif /* !CONFIG_USER_ONLY */
15293
            break;
15294
        case OPC_C0_FIRST ... OPC_C0_LAST:
15295
#ifndef CONFIG_USER_ONLY
15296
            gen_cp0(env, ctx, MASK_C0(ctx->opcode), rt, rd);
15297
#endif /* !CONFIG_USER_ONLY */
15298
            break;
15299
        case OPC_MFMC0:
15300
#ifndef CONFIG_USER_ONLY
15301
            {
15302
                TCGv t0 = tcg_temp_new();
15303

    
15304
                op2 = MASK_MFMC0(ctx->opcode);
15305
                switch (op2) {
15306
                case OPC_DMT:
15307
                    check_insn(ctx, ASE_MT);
15308
                    gen_helper_dmt(t0);
15309
                    gen_store_gpr(t0, rt);
15310
                    break;
15311
                case OPC_EMT:
15312
                    check_insn(ctx, ASE_MT);
15313
                    gen_helper_emt(t0);
15314
                    gen_store_gpr(t0, rt);
15315
                    break;
15316
                case OPC_DVPE:
15317
                    check_insn(ctx, ASE_MT);
15318
                    gen_helper_dvpe(t0, cpu_env);
15319
                    gen_store_gpr(t0, rt);
15320
                    break;
15321
                case OPC_EVPE:
15322
                    check_insn(ctx, ASE_MT);
15323
                    gen_helper_evpe(t0, cpu_env);
15324
                    gen_store_gpr(t0, rt);
15325
                    break;
15326
                case OPC_DI:
15327
                    check_insn(ctx, ISA_MIPS32R2);
15328
                    save_cpu_state(ctx, 1);
15329
                    gen_helper_di(t0, cpu_env);
15330
                    gen_store_gpr(t0, rt);
15331
                    /* Stop translation as we may have switched the execution mode */
15332
                    ctx->bstate = BS_STOP;
15333
                    break;
15334
                case OPC_EI:
15335
                    check_insn(ctx, ISA_MIPS32R2);
15336
                    save_cpu_state(ctx, 1);
15337
                    gen_helper_ei(t0, cpu_env);
15338
                    gen_store_gpr(t0, rt);
15339
                    /* Stop translation as we may have switched the execution mode */
15340
                    ctx->bstate = BS_STOP;
15341
                    break;
15342
                default:            /* Invalid */
15343
                    MIPS_INVAL("mfmc0");
15344
                    generate_exception(ctx, EXCP_RI);
15345
                    break;
15346
                }
15347
                tcg_temp_free(t0);
15348
            }
15349
#endif /* !CONFIG_USER_ONLY */
15350
            break;
15351
        case OPC_RDPGPR:
15352
            check_insn(ctx, ISA_MIPS32R2);
15353
            gen_load_srsgpr(rt, rd);
15354
            break;
15355
        case OPC_WRPGPR:
15356
            check_insn(ctx, ISA_MIPS32R2);
15357
            gen_store_srsgpr(rt, rd);
15358
            break;
15359
        default:
15360
            MIPS_INVAL("cp0");
15361
            generate_exception(ctx, EXCP_RI);
15362
            break;
15363
        }
15364
        break;
15365
    case OPC_ADDI: /* Arithmetic with immediate opcode */
15366
    case OPC_ADDIU:
15367
         gen_arith_imm(ctx, op, rt, rs, imm);
15368
         break;
15369
    case OPC_SLTI: /* Set on less than with immediate opcode */
15370
    case OPC_SLTIU:
15371
         gen_slt_imm(ctx, op, rt, rs, imm);
15372
         break;
15373
    case OPC_ANDI: /* Arithmetic with immediate opcode */
15374
    case OPC_LUI:
15375
    case OPC_ORI:
15376
    case OPC_XORI:
15377
         gen_logic_imm(ctx, op, rt, rs, imm);
15378
         break;
15379
    case OPC_J ... OPC_JAL: /* Jump */
15380
         offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
15381
         gen_compute_branch(ctx, op, 4, rs, rt, offset);
15382
         break;
15383
    case OPC_BEQ ... OPC_BGTZ: /* Branch */
15384
    case OPC_BEQL ... OPC_BGTZL:
15385
         gen_compute_branch(ctx, op, 4, rs, rt, imm << 2);
15386
         break;
15387
    case OPC_LB ... OPC_LWR: /* Load and stores */
15388
    case OPC_LL:
15389
         gen_ld(ctx, op, rt, rs, imm);
15390
         break;
15391
    case OPC_SB ... OPC_SW:
15392
    case OPC_SWR:
15393
         gen_st(ctx, op, rt, rs, imm);
15394
         break;
15395
    case OPC_SC:
15396
         gen_st_cond(ctx, op, rt, rs, imm);
15397
         break;
15398
    case OPC_CACHE:
15399
        check_cp0_enabled(ctx);
15400
        check_insn(ctx, ISA_MIPS3 | ISA_MIPS32);
15401
        /* Treat as NOP. */
15402
        break;
15403
    case OPC_PREF:
15404
        check_insn(ctx, ISA_MIPS4 | ISA_MIPS32);
15405
        /* Treat as NOP. */
15406
        break;
15407

    
15408
    /* Floating point (COP1). */
15409
    case OPC_LWC1:
15410
    case OPC_LDC1:
15411
    case OPC_SWC1:
15412
    case OPC_SDC1:
15413
        gen_cop1_ldst(env, ctx, op, rt, rs, imm);
15414
        break;
15415

    
15416
    case OPC_CP1:
15417
        if (env->CP0_Config1 & (1 << CP0C1_FP)) {
15418
            check_cp1_enabled(ctx);
15419
            op1 = MASK_CP1(ctx->opcode);
15420
            switch (op1) {
15421
            case OPC_MFHC1:
15422
            case OPC_MTHC1:
15423
                check_insn(ctx, ISA_MIPS32R2);
15424
            case OPC_MFC1:
15425
            case OPC_CFC1:
15426
            case OPC_MTC1:
15427
            case OPC_CTC1:
15428
                gen_cp1(ctx, op1, rt, rd);
15429
                break;
15430
#if defined(TARGET_MIPS64)
15431
            case OPC_DMFC1:
15432
            case OPC_DMTC1:
15433
                check_insn(ctx, ISA_MIPS3);
15434
                gen_cp1(ctx, op1, rt, rd);
15435
                break;
15436
#endif
15437
            case OPC_BC1ANY2:
15438
            case OPC_BC1ANY4:
15439
                check_cop1x(ctx);
15440
                check_insn(ctx, ASE_MIPS3D);
15441
                /* fall through */
15442
            case OPC_BC1:
15443
                gen_compute_branch1(ctx, MASK_BC1(ctx->opcode),
15444
                                    (rt >> 2) & 0x7, imm << 2);
15445
                break;
15446
            case OPC_S_FMT:
15447
            case OPC_D_FMT:
15448
            case OPC_W_FMT:
15449
            case OPC_L_FMT:
15450
            case OPC_PS_FMT:
15451
                gen_farith(ctx, ctx->opcode & FOP(0x3f, 0x1f), rt, rd, sa,
15452
                           (imm >> 8) & 0x7);
15453
                break;
15454
            default:
15455
                MIPS_INVAL("cp1");
15456
                generate_exception (ctx, EXCP_RI);
15457
                break;
15458
            }
15459
        } else {
15460
            generate_exception_err(ctx, EXCP_CpU, 1);
15461
        }
15462
        break;
15463

    
15464
    /* COP2.  */
15465
    case OPC_LWC2:
15466
    case OPC_LDC2:
15467
    case OPC_SWC2:
15468
    case OPC_SDC2:
15469
        /* COP2: Not implemented. */
15470
        generate_exception_err(ctx, EXCP_CpU, 2);
15471
        break;
15472
    case OPC_CP2:
15473
        check_insn(ctx, INSN_LOONGSON2F);
15474
        /* Note that these instructions use different fields.  */
15475
        gen_loongson_multimedia(ctx, sa, rd, rt);
15476
        break;
15477

    
15478
    case OPC_CP3:
15479
        if (env->CP0_Config1 & (1 << CP0C1_FP)) {
15480
            check_cp1_enabled(ctx);
15481
            op1 = MASK_CP3(ctx->opcode);
15482
            switch (op1) {
15483
            case OPC_LWXC1:
15484
            case OPC_LDXC1:
15485
            case OPC_LUXC1:
15486
            case OPC_SWXC1:
15487
            case OPC_SDXC1:
15488
            case OPC_SUXC1:
15489
                gen_flt3_ldst(ctx, op1, sa, rd, rs, rt);
15490
                break;
15491
            case OPC_PREFX:
15492
                /* Treat as NOP. */
15493
                break;
15494
            case OPC_ALNV_PS:
15495
            case OPC_MADD_S:
15496
            case OPC_MADD_D:
15497
            case OPC_MADD_PS:
15498
            case OPC_MSUB_S:
15499
            case OPC_MSUB_D:
15500
            case OPC_MSUB_PS:
15501
            case OPC_NMADD_S:
15502
            case OPC_NMADD_D:
15503
            case OPC_NMADD_PS:
15504
            case OPC_NMSUB_S:
15505
            case OPC_NMSUB_D:
15506
            case OPC_NMSUB_PS:
15507
                gen_flt3_arith(ctx, op1, sa, rs, rd, rt);
15508
                break;
15509
            default:
15510
                MIPS_INVAL("cp3");
15511
                generate_exception (ctx, EXCP_RI);
15512
                break;
15513
            }
15514
        } else {
15515
            generate_exception_err(ctx, EXCP_CpU, 1);
15516
        }
15517
        break;
15518

    
15519
#if defined(TARGET_MIPS64)
15520
    /* MIPS64 opcodes */
15521
    case OPC_LWU:
15522
    case OPC_LDL ... OPC_LDR:
15523
    case OPC_LLD:
15524
    case OPC_LD:
15525
        check_insn(ctx, ISA_MIPS3);
15526
        check_mips_64(ctx);
15527
        gen_ld(ctx, op, rt, rs, imm);
15528
        break;
15529
    case OPC_SDL ... OPC_SDR:
15530
    case OPC_SD:
15531
        check_insn(ctx, ISA_MIPS3);
15532
        check_mips_64(ctx);
15533
        gen_st(ctx, op, rt, rs, imm);
15534
        break;
15535
    case OPC_SCD:
15536
        check_insn(ctx, ISA_MIPS3);
15537
        check_mips_64(ctx);
15538
        gen_st_cond(ctx, op, rt, rs, imm);
15539
        break;
15540
    case OPC_DADDI:
15541
    case OPC_DADDIU:
15542
        check_insn(ctx, ISA_MIPS3);
15543
        check_mips_64(ctx);
15544
        gen_arith_imm(ctx, op, rt, rs, imm);
15545
        break;
15546
#endif
15547
    case OPC_JALX:
15548
        check_insn(ctx, ASE_MIPS16 | ASE_MICROMIPS);
15549
        offset = (int32_t)(ctx->opcode & 0x3FFFFFF) << 2;
15550
        gen_compute_branch(ctx, op, 4, rs, rt, offset);
15551
        break;
15552
    case OPC_MDMX:
15553
        check_insn(ctx, ASE_MDMX);
15554
        /* MDMX: Not implemented. */
15555
    default:            /* Invalid */
15556
        MIPS_INVAL("major opcode");
15557
        generate_exception(ctx, EXCP_RI);
15558
        break;
15559
    }
15560
}
15561

    
15562
static inline void
15563
gen_intermediate_code_internal(MIPSCPU *cpu, TranslationBlock *tb,
15564
                               bool search_pc)
15565
{
15566
    CPUState *cs = CPU(cpu);
15567
    CPUMIPSState *env = &cpu->env;
15568
    DisasContext ctx;
15569
    target_ulong pc_start;
15570
    uint16_t *gen_opc_end;
15571
    CPUBreakpoint *bp;
15572
    int j, lj = -1;
15573
    int num_insns;
15574
    int max_insns;
15575
    int insn_bytes;
15576
    int is_delay;
15577

    
15578
    if (search_pc)
15579
        qemu_log("search pc %d\n", search_pc);
15580

    
15581
    pc_start = tb->pc;
15582
    gen_opc_end = tcg_ctx.gen_opc_buf + OPC_MAX_SIZE;
15583
    ctx.pc = pc_start;
15584
    ctx.saved_pc = -1;
15585
    ctx.singlestep_enabled = cs->singlestep_enabled;
15586
    ctx.insn_flags = env->insn_flags;
15587
    ctx.tb = tb;
15588
    ctx.bstate = BS_NONE;
15589
    /* Restore delay slot state from the tb context.  */
15590
    ctx.hflags = (uint32_t)tb->flags; /* FIXME: maybe use 64 bits here? */
15591
    restore_cpu_state(env, &ctx);
15592
#ifdef CONFIG_USER_ONLY
15593
        ctx.mem_idx = MIPS_HFLAG_UM;
15594
#else
15595
        ctx.mem_idx = ctx.hflags & MIPS_HFLAG_KSU;
15596
#endif
15597
    num_insns = 0;
15598
    max_insns = tb->cflags & CF_COUNT_MASK;
15599
    if (max_insns == 0)
15600
        max_insns = CF_COUNT_MASK;
15601
    LOG_DISAS("\ntb %p idx %d hflags %04x\n", tb, ctx.mem_idx, ctx.hflags);
15602
    gen_tb_start();
15603
    while (ctx.bstate == BS_NONE) {
15604
        if (unlikely(!QTAILQ_EMPTY(&env->breakpoints))) {
15605
            QTAILQ_FOREACH(bp, &env->breakpoints, entry) {
15606
                if (bp->pc == ctx.pc) {
15607
                    save_cpu_state(&ctx, 1);
15608
                    ctx.bstate = BS_BRANCH;
15609
                    gen_helper_0e0i(raise_exception, EXCP_DEBUG);
15610
                    /* Include the breakpoint location or the tb won't
15611
                     * be flushed when it must be.  */
15612
                    ctx.pc += 4;
15613
                    goto done_generating;
15614
                }
15615
            }
15616
        }
15617

    
15618
        if (search_pc) {
15619
            j = tcg_ctx.gen_opc_ptr - tcg_ctx.gen_opc_buf;
15620
            if (lj < j) {
15621
                lj++;
15622
                while (lj < j)
15623
                    tcg_ctx.gen_opc_instr_start[lj++] = 0;
15624
            }
15625
            tcg_ctx.gen_opc_pc[lj] = ctx.pc;
15626
            gen_opc_hflags[lj] = ctx.hflags & MIPS_HFLAG_BMASK;
15627
            gen_opc_btarget[lj] = ctx.btarget;
15628
            tcg_ctx.gen_opc_instr_start[lj] = 1;
15629
            tcg_ctx.gen_opc_icount[lj] = num_insns;
15630
        }
15631
        if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO))
15632
            gen_io_start();
15633

    
15634
        is_delay = ctx.hflags & MIPS_HFLAG_BMASK;
15635
        if (!(ctx.hflags & MIPS_HFLAG_M16)) {
15636
            ctx.opcode = cpu_ldl_code(env, ctx.pc);
15637
            insn_bytes = 4;
15638
            decode_opc(env, &ctx);
15639
        } else if (ctx.insn_flags & ASE_MICROMIPS) {
15640
            ctx.opcode = cpu_lduw_code(env, ctx.pc);
15641
            insn_bytes = decode_micromips_opc(env, &ctx);
15642
        } else if (ctx.insn_flags & ASE_MIPS16) {
15643
            ctx.opcode = cpu_lduw_code(env, ctx.pc);
15644
            insn_bytes = decode_mips16_opc(env, &ctx);
15645
        } else {
15646
            generate_exception(&ctx, EXCP_RI);
15647
            ctx.bstate = BS_STOP;
15648
            break;
15649
        }
15650
        if (is_delay) {
15651
            handle_delay_slot(&ctx, insn_bytes);
15652
        }
15653
        ctx.pc += insn_bytes;
15654

    
15655
        num_insns++;
15656

    
15657
        /* Execute a branch and its delay slot as a single instruction.
15658
           This is what GDB expects and is consistent with what the
15659
           hardware does (e.g. if a delay slot instruction faults, the
15660
           reported PC is the PC of the branch).  */
15661
        if (cs->singlestep_enabled && (ctx.hflags & MIPS_HFLAG_BMASK) == 0) {
15662
            break;
15663
        }
15664

    
15665
        if ((ctx.pc & (TARGET_PAGE_SIZE - 1)) == 0)
15666
            break;
15667

    
15668
        if (tcg_ctx.gen_opc_ptr >= gen_opc_end) {
15669
            break;
15670
        }
15671

    
15672
        if (num_insns >= max_insns)
15673
            break;
15674

    
15675
        if (singlestep)
15676
            break;
15677
    }
15678
    if (tb->cflags & CF_LAST_IO) {
15679
        gen_io_end();
15680
    }
15681
    if (cs->singlestep_enabled && ctx.bstate != BS_BRANCH) {
15682
        save_cpu_state(&ctx, ctx.bstate == BS_NONE);
15683
        gen_helper_0e0i(raise_exception, EXCP_DEBUG);
15684
    } else {
15685
        switch (ctx.bstate) {
15686
        case BS_STOP:
15687
            gen_goto_tb(&ctx, 0, ctx.pc);
15688
            break;
15689
        case BS_NONE:
15690
            save_cpu_state(&ctx, 0);
15691
            gen_goto_tb(&ctx, 0, ctx.pc);
15692
            break;
15693
        case BS_EXCP:
15694
            tcg_gen_exit_tb(0);
15695
            break;
15696
        case BS_BRANCH:
15697
        default:
15698
            break;
15699
        }
15700
    }
15701
done_generating:
15702
    gen_tb_end(tb, num_insns);
15703
    *tcg_ctx.gen_opc_ptr = INDEX_op_end;
15704
    if (search_pc) {
15705
        j = tcg_ctx.gen_opc_ptr - tcg_ctx.gen_opc_buf;
15706
        lj++;
15707
        while (lj <= j)
15708
            tcg_ctx.gen_opc_instr_start[lj++] = 0;
15709
    } else {
15710
        tb->size = ctx.pc - pc_start;
15711
        tb->icount = num_insns;
15712
    }
15713
#ifdef DEBUG_DISAS
15714
    LOG_DISAS("\n");
15715
    if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)) {
15716
        qemu_log("IN: %s\n", lookup_symbol(pc_start));
15717
        log_target_disas(env, pc_start, ctx.pc - pc_start, 0);
15718
        qemu_log("\n");
15719
    }
15720
#endif
15721
}
15722

    
15723
void gen_intermediate_code (CPUMIPSState *env, struct TranslationBlock *tb)
15724
{
15725
    gen_intermediate_code_internal(mips_env_get_cpu(env), tb, false);
15726
}
15727

    
15728
void gen_intermediate_code_pc (CPUMIPSState *env, struct TranslationBlock *tb)
15729
{
15730
    gen_intermediate_code_internal(mips_env_get_cpu(env), tb, true);
15731
}
15732

    
15733
static void fpu_dump_state(CPUMIPSState *env, FILE *f, fprintf_function fpu_fprintf,
15734
                           int flags)
15735
{
15736
    int i;
15737
    int is_fpu64 = !!(env->hflags & MIPS_HFLAG_F64);
15738

    
15739
#define printfpr(fp)                                                    \
15740
    do {                                                                \
15741
        if (is_fpu64)                                                   \
15742
            fpu_fprintf(f, "w:%08x d:%016" PRIx64                       \
15743
                        " fd:%13g fs:%13g psu: %13g\n",                 \
15744
                        (fp)->w[FP_ENDIAN_IDX], (fp)->d,                \
15745
                        (double)(fp)->fd,                               \
15746
                        (double)(fp)->fs[FP_ENDIAN_IDX],                \
15747
                        (double)(fp)->fs[!FP_ENDIAN_IDX]);              \
15748
        else {                                                          \
15749
            fpr_t tmp;                                                  \
15750
            tmp.w[FP_ENDIAN_IDX] = (fp)->w[FP_ENDIAN_IDX];              \
15751
            tmp.w[!FP_ENDIAN_IDX] = ((fp) + 1)->w[FP_ENDIAN_IDX];       \
15752
            fpu_fprintf(f, "w:%08x d:%016" PRIx64                       \
15753
                        " fd:%13g fs:%13g psu:%13g\n",                  \
15754
                        tmp.w[FP_ENDIAN_IDX], tmp.d,                    \
15755
                        (double)tmp.fd,                                 \
15756
                        (double)tmp.fs[FP_ENDIAN_IDX],                  \
15757
                        (double)tmp.fs[!FP_ENDIAN_IDX]);                \
15758
        }                                                               \
15759
    } while(0)
15760

    
15761

    
15762
    fpu_fprintf(f, "CP1 FCR0 0x%08x  FCR31 0x%08x  SR.FR %d  fp_status 0x%02x\n",
15763
                env->active_fpu.fcr0, env->active_fpu.fcr31, is_fpu64,
15764
                get_float_exception_flags(&env->active_fpu.fp_status));
15765
    for (i = 0; i < 32; (is_fpu64) ? i++ : (i += 2)) {
15766
        fpu_fprintf(f, "%3s: ", fregnames[i]);
15767
        printfpr(&env->active_fpu.fpr[i]);
15768
    }
15769

    
15770
#undef printfpr
15771
}
15772

    
15773
#if defined(TARGET_MIPS64) && defined(MIPS_DEBUG_SIGN_EXTENSIONS)
15774
/* Debug help: The architecture requires 32bit code to maintain proper
15775
   sign-extended values on 64bit machines.  */
15776

    
15777
#define SIGN_EXT_P(val) ((((val) & ~0x7fffffff) == 0) || (((val) & ~0x7fffffff) == ~0x7fffffff))
15778

    
15779
static void
15780
cpu_mips_check_sign_extensions (CPUMIPSState *env, FILE *f,
15781
                                fprintf_function cpu_fprintf,
15782
                                int flags)
15783
{
15784
    int i;
15785

    
15786
    if (!SIGN_EXT_P(env->active_tc.PC))
15787
        cpu_fprintf(f, "BROKEN: pc=0x" TARGET_FMT_lx "\n", env->active_tc.PC);
15788
    if (!SIGN_EXT_P(env->active_tc.HI[0]))
15789
        cpu_fprintf(f, "BROKEN: HI=0x" TARGET_FMT_lx "\n", env->active_tc.HI[0]);
15790
    if (!SIGN_EXT_P(env->active_tc.LO[0]))
15791
        cpu_fprintf(f, "BROKEN: LO=0x" TARGET_FMT_lx "\n", env->active_tc.LO[0]);
15792
    if (!SIGN_EXT_P(env->btarget))
15793
        cpu_fprintf(f, "BROKEN: btarget=0x" TARGET_FMT_lx "\n", env->btarget);
15794

    
15795
    for (i = 0; i < 32; i++) {
15796
        if (!SIGN_EXT_P(env->active_tc.gpr[i]))
15797
            cpu_fprintf(f, "BROKEN: %s=0x" TARGET_FMT_lx "\n", regnames[i], env->active_tc.gpr[i]);
15798
    }
15799

    
15800
    if (!SIGN_EXT_P(env->CP0_EPC))
15801
        cpu_fprintf(f, "BROKEN: EPC=0x" TARGET_FMT_lx "\n", env->CP0_EPC);
15802
    if (!SIGN_EXT_P(env->lladdr))
15803
        cpu_fprintf(f, "BROKEN: LLAddr=0x" TARGET_FMT_lx "\n", env->lladdr);
15804
}
15805
#endif
15806

    
15807
void mips_cpu_dump_state(CPUState *cs, FILE *f, fprintf_function cpu_fprintf,
15808
                         int flags)
15809
{
15810
    MIPSCPU *cpu = MIPS_CPU(cs);
15811
    CPUMIPSState *env = &cpu->env;
15812
    int i;
15813

    
15814
    cpu_fprintf(f, "pc=0x" TARGET_FMT_lx " HI=0x" TARGET_FMT_lx
15815
                " LO=0x" TARGET_FMT_lx " ds %04x "
15816
                TARGET_FMT_lx " " TARGET_FMT_ld "\n",
15817
                env->active_tc.PC, env->active_tc.HI[0], env->active_tc.LO[0],
15818
                env->hflags, env->btarget, env->bcond);
15819
    for (i = 0; i < 32; i++) {
15820
        if ((i & 3) == 0)
15821
            cpu_fprintf(f, "GPR%02d:", i);
15822
        cpu_fprintf(f, " %s " TARGET_FMT_lx, regnames[i], env->active_tc.gpr[i]);
15823
        if ((i & 3) == 3)
15824
            cpu_fprintf(f, "\n");
15825
    }
15826

    
15827
    cpu_fprintf(f, "CP0 Status  0x%08x Cause   0x%08x EPC    0x" TARGET_FMT_lx "\n",
15828
                env->CP0_Status, env->CP0_Cause, env->CP0_EPC);
15829
    cpu_fprintf(f, "    Config0 0x%08x Config1 0x%08x LLAddr 0x" TARGET_FMT_lx "\n",
15830
                env->CP0_Config0, env->CP0_Config1, env->lladdr);
15831
    if (env->hflags & MIPS_HFLAG_FPU)
15832
        fpu_dump_state(env, f, cpu_fprintf, flags);
15833
#if defined(TARGET_MIPS64) && defined(MIPS_DEBUG_SIGN_EXTENSIONS)
15834
    cpu_mips_check_sign_extensions(env, f, cpu_fprintf, flags);
15835
#endif
15836
}
15837

    
15838
void mips_tcg_init(void)
15839
{
15840
    int i;
15841
    static int inited;
15842

    
15843
    /* Initialize various static tables. */
15844
    if (inited)
15845
        return;
15846

    
15847
    cpu_env = tcg_global_reg_new_ptr(TCG_AREG0, "env");
15848
    TCGV_UNUSED(cpu_gpr[0]);
15849
    for (i = 1; i < 32; i++)
15850
        cpu_gpr[i] = tcg_global_mem_new(TCG_AREG0,
15851
                                        offsetof(CPUMIPSState, active_tc.gpr[i]),
15852
                                        regnames[i]);
15853

    
15854
    for (i = 0; i < 32; i++) {
15855
        int off = offsetof(CPUMIPSState, active_fpu.fpr[i]);
15856
        fpu_f64[i] = tcg_global_mem_new_i64(TCG_AREG0, off, fregnames[i]);
15857
    }
15858

    
15859
    cpu_PC = tcg_global_mem_new(TCG_AREG0,
15860
                                offsetof(CPUMIPSState, active_tc.PC), "PC");
15861
    for (i = 0; i < MIPS_DSP_ACC; i++) {
15862
        cpu_HI[i] = tcg_global_mem_new(TCG_AREG0,
15863
                                       offsetof(CPUMIPSState, active_tc.HI[i]),
15864
                                       regnames_HI[i]);
15865
        cpu_LO[i] = tcg_global_mem_new(TCG_AREG0,
15866
                                       offsetof(CPUMIPSState, active_tc.LO[i]),
15867
                                       regnames_LO[i]);
15868
        cpu_ACX[i] = tcg_global_mem_new(TCG_AREG0,
15869
                                        offsetof(CPUMIPSState, active_tc.ACX[i]),
15870
                                        regnames_ACX[i]);
15871
    }
15872
    cpu_dspctrl = tcg_global_mem_new(TCG_AREG0,
15873
                                     offsetof(CPUMIPSState, active_tc.DSPControl),
15874
                                     "DSPControl");
15875
    bcond = tcg_global_mem_new(TCG_AREG0,
15876
                               offsetof(CPUMIPSState, bcond), "bcond");
15877
    btarget = tcg_global_mem_new(TCG_AREG0,
15878
                                 offsetof(CPUMIPSState, btarget), "btarget");
15879
    hflags = tcg_global_mem_new_i32(TCG_AREG0,
15880
                                    offsetof(CPUMIPSState, hflags), "hflags");
15881

    
15882
    fpu_fcr0 = tcg_global_mem_new_i32(TCG_AREG0,
15883
                                      offsetof(CPUMIPSState, active_fpu.fcr0),
15884
                                      "fcr0");
15885
    fpu_fcr31 = tcg_global_mem_new_i32(TCG_AREG0,
15886
                                       offsetof(CPUMIPSState, active_fpu.fcr31),
15887
                                       "fcr31");
15888

    
15889
    /* register helpers */
15890
#define GEN_HELPER 2
15891
#include "helper.h"
15892

    
15893
    inited = 1;
15894
}
15895

    
15896
#include "translate_init.c"
15897

    
15898
MIPSCPU *cpu_mips_init(const char *cpu_model)
15899
{
15900
    MIPSCPU *cpu;
15901
    CPUMIPSState *env;
15902
    const mips_def_t *def;
15903

    
15904
    def = cpu_mips_find_by_name(cpu_model);
15905
    if (!def)
15906
        return NULL;
15907
    cpu = MIPS_CPU(object_new(TYPE_MIPS_CPU));
15908
    env = &cpu->env;
15909
    env->cpu_model = def;
15910
    env->cpu_model_str = cpu_model;
15911

    
15912
#ifndef CONFIG_USER_ONLY
15913
    mmu_init(env, def);
15914
#endif
15915
    fpu_init(env, def);
15916
    mvp_init(env, def);
15917

    
15918
    object_property_set_bool(OBJECT(cpu), true, "realized", NULL);
15919

    
15920
    return cpu;
15921
}
15922

    
15923
void cpu_state_reset(CPUMIPSState *env)
15924
{
15925
#ifndef CONFIG_USER_ONLY
15926
    MIPSCPU *cpu = mips_env_get_cpu(env);
15927
    CPUState *cs = CPU(cpu);
15928
#endif
15929

    
15930
    /* Reset registers to their default values */
15931
    env->CP0_PRid = env->cpu_model->CP0_PRid;
15932
    env->CP0_Config0 = env->cpu_model->CP0_Config0;
15933
#ifdef TARGET_WORDS_BIGENDIAN
15934
    env->CP0_Config0 |= (1 << CP0C0_BE);
15935
#endif
15936
    env->CP0_Config1 = env->cpu_model->CP0_Config1;
15937
    env->CP0_Config2 = env->cpu_model->CP0_Config2;
15938
    env->CP0_Config3 = env->cpu_model->CP0_Config3;
15939
    env->CP0_Config6 = env->cpu_model->CP0_Config6;
15940
    env->CP0_Config7 = env->cpu_model->CP0_Config7;
15941
    env->CP0_LLAddr_rw_bitmask = env->cpu_model->CP0_LLAddr_rw_bitmask
15942
                                 << env->cpu_model->CP0_LLAddr_shift;
15943
    env->CP0_LLAddr_shift = env->cpu_model->CP0_LLAddr_shift;
15944
    env->SYNCI_Step = env->cpu_model->SYNCI_Step;
15945
    env->CCRes = env->cpu_model->CCRes;
15946
    env->CP0_Status_rw_bitmask = env->cpu_model->CP0_Status_rw_bitmask;
15947
    env->CP0_TCStatus_rw_bitmask = env->cpu_model->CP0_TCStatus_rw_bitmask;
15948
    env->CP0_SRSCtl = env->cpu_model->CP0_SRSCtl;
15949
    env->current_tc = 0;
15950
    env->SEGBITS = env->cpu_model->SEGBITS;
15951
    env->SEGMask = (target_ulong)((1ULL << env->cpu_model->SEGBITS) - 1);
15952
#if defined(TARGET_MIPS64)
15953
    if (env->cpu_model->insn_flags & ISA_MIPS3) {
15954
        env->SEGMask |= 3ULL << 62;
15955
    }
15956
#endif
15957
    env->PABITS = env->cpu_model->PABITS;
15958
    env->PAMask = (target_ulong)((1ULL << env->cpu_model->PABITS) - 1);
15959
    env->CP0_SRSConf0_rw_bitmask = env->cpu_model->CP0_SRSConf0_rw_bitmask;
15960
    env->CP0_SRSConf0 = env->cpu_model->CP0_SRSConf0;
15961
    env->CP0_SRSConf1_rw_bitmask = env->cpu_model->CP0_SRSConf1_rw_bitmask;
15962
    env->CP0_SRSConf1 = env->cpu_model->CP0_SRSConf1;
15963
    env->CP0_SRSConf2_rw_bitmask = env->cpu_model->CP0_SRSConf2_rw_bitmask;
15964
    env->CP0_SRSConf2 = env->cpu_model->CP0_SRSConf2;
15965
    env->CP0_SRSConf3_rw_bitmask = env->cpu_model->CP0_SRSConf3_rw_bitmask;
15966
    env->CP0_SRSConf3 = env->cpu_model->CP0_SRSConf3;
15967
    env->CP0_SRSConf4_rw_bitmask = env->cpu_model->CP0_SRSConf4_rw_bitmask;
15968
    env->CP0_SRSConf4 = env->cpu_model->CP0_SRSConf4;
15969
    env->active_fpu.fcr0 = env->cpu_model->CP1_fcr0;
15970
    env->insn_flags = env->cpu_model->insn_flags;
15971

    
15972
#if defined(CONFIG_USER_ONLY)
15973
    env->CP0_Status = (MIPS_HFLAG_UM << CP0St_KSU);
15974
# ifdef TARGET_MIPS64
15975
    /* Enable 64-bit register mode.  */
15976
    env->CP0_Status |= (1 << CP0St_PX);
15977
# endif
15978
# ifdef TARGET_ABI_MIPSN64
15979
    /* Enable 64-bit address mode.  */
15980
    env->CP0_Status |= (1 << CP0St_UX);
15981
# endif
15982
    /* Enable access to the CPUNum, SYNCI_Step, CC, and CCRes RDHWR
15983
       hardware registers.  */
15984
    env->CP0_HWREna |= 0x0000000F;
15985
    if (env->CP0_Config1 & (1 << CP0C1_FP)) {
15986
        env->CP0_Status |= (1 << CP0St_CU1);
15987
    }
15988
    if (env->CP0_Config3 & (1 << CP0C3_DSPP)) {
15989
        env->CP0_Status |= (1 << CP0St_MX);
15990
    }
15991
    /* Enable 64-bit FPU if the target cpu supports it.  */
15992
    if (env->active_fpu.fcr0 & (1 << FCR0_F64)) {
15993
        env->CP0_Status |= (1 << CP0St_FR);
15994
    }
15995
#else
15996
    if (env->hflags & MIPS_HFLAG_BMASK) {
15997
        /* If the exception was raised from a delay slot,
15998
           come back to the jump.  */
15999
        env->CP0_ErrorEPC = env->active_tc.PC - 4;
16000
    } else {
16001
        env->CP0_ErrorEPC = env->active_tc.PC;
16002
    }
16003
    env->active_tc.PC = (int32_t)0xBFC00000;
16004
    env->CP0_Random = env->tlb->nb_tlb - 1;
16005
    env->tlb->tlb_in_use = env->tlb->nb_tlb;
16006
    env->CP0_Wired = 0;
16007
    env->CP0_EBase = 0x80000000 | (cs->cpu_index & 0x3FF);
16008
    env->CP0_Status = (1 << CP0St_BEV) | (1 << CP0St_ERL);
16009
    /* vectored interrupts not implemented, timer on int 7,
16010
       no performance counters. */
16011
    env->CP0_IntCtl = 0xe0000000;
16012
    {
16013
        int i;
16014

    
16015
        for (i = 0; i < 7; i++) {
16016
            env->CP0_WatchLo[i] = 0;
16017
            env->CP0_WatchHi[i] = 0x80000000;
16018
        }
16019
        env->CP0_WatchLo[7] = 0;
16020
        env->CP0_WatchHi[7] = 0;
16021
    }
16022
    /* Count register increments in debug mode, EJTAG version 1 */
16023
    env->CP0_Debug = (1 << CP0DB_CNT) | (0x1 << CP0DB_VER);
16024

    
16025
    if (env->CP0_Config3 & (1 << CP0C3_MT)) {
16026
        int i;
16027

    
16028
        /* Only TC0 on VPE 0 starts as active.  */
16029
        for (i = 0; i < ARRAY_SIZE(env->tcs); i++) {
16030
            env->tcs[i].CP0_TCBind = cs->cpu_index << CP0TCBd_CurVPE;
16031
            env->tcs[i].CP0_TCHalt = 1;
16032
        }
16033
        env->active_tc.CP0_TCHalt = 1;
16034
        cs->halted = 1;
16035

    
16036
        if (cs->cpu_index == 0) {
16037
            /* VPE0 starts up enabled.  */
16038
            env->mvp->CP0_MVPControl |= (1 << CP0MVPCo_EVP);
16039
            env->CP0_VPEConf0 |= (1 << CP0VPEC0_MVP) | (1 << CP0VPEC0_VPA);
16040

    
16041
            /* TC0 starts up unhalted.  */
16042
            cs->halted = 0;
16043
            env->active_tc.CP0_TCHalt = 0;
16044
            env->tcs[0].CP0_TCHalt = 0;
16045
            /* With thread 0 active.  */
16046
            env->active_tc.CP0_TCStatus = (1 << CP0TCSt_A);
16047
            env->tcs[0].CP0_TCStatus = (1 << CP0TCSt_A);
16048
        }
16049
    }
16050
#endif
16051
    compute_hflags(env);
16052
    env->exception_index = EXCP_NONE;
16053
}
16054

    
16055
void restore_state_to_opc(CPUMIPSState *env, TranslationBlock *tb, int pc_pos)
16056
{
16057
    env->active_tc.PC = tcg_ctx.gen_opc_pc[pc_pos];
16058
    env->hflags &= ~MIPS_HFLAG_BMASK;
16059
    env->hflags |= gen_opc_hflags[pc_pos];
16060
    switch (env->hflags & MIPS_HFLAG_BMASK_BASE) {
16061
    case MIPS_HFLAG_BR:
16062
        break;
16063
    case MIPS_HFLAG_BC:
16064
    case MIPS_HFLAG_BL:
16065
    case MIPS_HFLAG_B:
16066
        env->btarget = gen_opc_btarget[pc_pos];
16067
        break;
16068
    }
16069
}