Revision e37e863f target-mips/cpu.h

b/target-mips/cpu.h
240 240
    EXCP_FLUSH         = 0x109,
241 241
};
242 242

  
243
/* MIPS opcodes */
244
#define EXT_SPECIAL  0x100
245
#define EXT_SPECIAL2 0x200
246
#define EXT_REGIMM   0x300
247
#define EXT_CP0      0x400
248
#define EXT_CP1      0x500
249
#define EXT_CP2      0x600
250
#define EXT_CP3      0x700
251

  
252
enum {
253
    /* indirect opcode tables */
254
    OPC_SPECIAL  = 0x00,
255
    OPC_BREGIMM  = 0x01,
256
    OPC_CP0      = 0x10,
257
    OPC_CP1      = 0x11,
258
    OPC_CP2      = 0x12,
259
    OPC_CP3      = 0x13,
260
    OPC_SPECIAL2 = 0x1C,
261
    /* arithmetic with immediate */
262
    OPC_ADDI     = 0x08,
263
    OPC_ADDIU    = 0x09,
264
    OPC_SLTI     = 0x0A,
265
    OPC_SLTIU    = 0x0B,
266
    OPC_ANDI     = 0x0C,
267
    OPC_ORI      = 0x0D,
268
    OPC_XORI     = 0x0E,
269
    OPC_LUI      = 0x0F,
270
    /* Jump and branches */
271
    OPC_J        = 0x02,
272
    OPC_JAL      = 0x03,
273
    OPC_BEQ      = 0x04,  /* Unconditional if rs = rt = 0 (B) */
274
    OPC_BEQL     = 0x14,
275
    OPC_BNE      = 0x05,
276
    OPC_BNEL     = 0x15,
277
    OPC_BLEZ     = 0x06,
278
    OPC_BLEZL    = 0x16,
279
    OPC_BGTZ     = 0x07,
280
    OPC_BGTZL    = 0x17,
281
    OPC_JALX     = 0x1D,  /* MIPS 16 only */
282
    /* Load and stores */
283
    OPC_LB       = 0x20,
284
    OPC_LH       = 0x21,
285
    OPC_LWL      = 0x22,
286
    OPC_LW       = 0x23,
287
    OPC_LBU      = 0x24,
288
    OPC_LHU      = 0x25,
289
    OPC_LWR      = 0x26,
290
    OPC_SB       = 0x28,
291
    OPC_SH       = 0x29,
292
    OPC_SWL      = 0x2A,
293
    OPC_SW       = 0x2B,
294
    OPC_SWR      = 0x2E,
295
    OPC_LL       = 0x30,
296
    OPC_SC       = 0x38,
297
    /* Floating point load/store */
298
    OPC_LWC1     = 0x31,
299
    OPC_LWC2     = 0x32,
300
    OPC_LDC1     = 0x35,
301
    OPC_LDC2     = 0x36,
302
    OPC_SWC1     = 0x39,
303
    OPC_SWC2     = 0x3A,
304
    OPC_SDC1     = 0x3D,
305
    OPC_SDC2     = 0x3E,
306
    /* Cache and prefetch */
307
    OPC_CACHE    = 0x2F,
308
    OPC_PREF     = 0x33,
309
};
310

  
311
/* MIPS special opcodes */
312
enum {
313
    /* Shifts */
314
    OPC_SLL      = 0x00 | EXT_SPECIAL,
315
    /* NOP is SLL r0, r0, 0   */
316
    /* SSNOP is SLL r0, r0, 1 */
317
    OPC_SRL      = 0x02 | EXT_SPECIAL,
318
    OPC_SRA      = 0x03 | EXT_SPECIAL,
319
    OPC_SLLV     = 0x04 | EXT_SPECIAL,
320
    OPC_SRLV     = 0x06 | EXT_SPECIAL,
321
    OPC_SRAV     = 0x07 | EXT_SPECIAL,
322
    /* Multiplication / division */
323
    OPC_MULT     = 0x18 | EXT_SPECIAL,
324
    OPC_MULTU    = 0x19 | EXT_SPECIAL,
325
    OPC_DIV      = 0x1A | EXT_SPECIAL,
326
    OPC_DIVU     = 0x1B | EXT_SPECIAL,
327
    /* 2 registers arithmetic / logic */
328
    OPC_ADD      = 0x20 | EXT_SPECIAL,
329
    OPC_ADDU     = 0x21 | EXT_SPECIAL,
330
    OPC_SUB      = 0x22 | EXT_SPECIAL,
331
    OPC_SUBU     = 0x23 | EXT_SPECIAL,
332
    OPC_AND      = 0x24 | EXT_SPECIAL,
333
    OPC_OR       = 0x25 | EXT_SPECIAL,
334
    OPC_XOR      = 0x26 | EXT_SPECIAL,
335
    OPC_NOR      = 0x27 | EXT_SPECIAL,
336
    OPC_SLT      = 0x2A | EXT_SPECIAL,
337
    OPC_SLTU     = 0x2B | EXT_SPECIAL,
338
    /* Jumps */
339
    OPC_JR       = 0x08 | EXT_SPECIAL,
340
    OPC_JALR     = 0x09 | EXT_SPECIAL,
341
    /* Traps */
342
    OPC_TGE      = 0x30 | EXT_SPECIAL,
343
    OPC_TGEU     = 0x31 | EXT_SPECIAL,
344
    OPC_TLT      = 0x32 | EXT_SPECIAL,
345
    OPC_TLTU     = 0x33 | EXT_SPECIAL,
346
    OPC_TEQ      = 0x34 | EXT_SPECIAL,
347
    OPC_TNE      = 0x36 | EXT_SPECIAL,
348
    /* HI / LO registers load & stores */
349
    OPC_MFHI     = 0x10 | EXT_SPECIAL,
350
    OPC_MTHI     = 0x11 | EXT_SPECIAL,
351
    OPC_MFLO     = 0x12 | EXT_SPECIAL,
352
    OPC_MTLO     = 0x13 | EXT_SPECIAL,
353
    /* Conditional moves */
354
    OPC_MOVZ     = 0x0A | EXT_SPECIAL,
355
    OPC_MOVN     = 0x0B | EXT_SPECIAL,
356

  
357
    OPC_MOVCI    = 0x01 | EXT_SPECIAL,
358

  
359
    /* Special */
360
    OPC_PMON     = 0x05 | EXT_SPECIAL,
361
    OPC_SYSCALL  = 0x0C | EXT_SPECIAL,
362
    OPC_BREAK    = 0x0D | EXT_SPECIAL,
363
    OPC_SYNC     = 0x0F | EXT_SPECIAL,
364
};
365

  
366
enum {
367
    /* Mutiply & xxx operations */
368
    OPC_MADD     = 0x00 | EXT_SPECIAL2,
369
    OPC_MADDU    = 0x01 | EXT_SPECIAL2,
370
    OPC_MUL      = 0x02 | EXT_SPECIAL2,
371
    OPC_MSUB     = 0x04 | EXT_SPECIAL2,
372
    OPC_MSUBU    = 0x05 | EXT_SPECIAL2,
373
    /* Misc */
374
    OPC_CLZ      = 0x20 | EXT_SPECIAL2,
375
    OPC_CLO      = 0x21 | EXT_SPECIAL2,
376
    /* Special */
377
    OPC_SDBBP    = 0x3F | EXT_SPECIAL2,
378
};
379

  
380
/* Branch REGIMM */
381
enum {
382
    OPC_BLTZ     = 0x00 | EXT_REGIMM,
383
    OPC_BLTZL    = 0x02 | EXT_REGIMM,
384
    OPC_BGEZ     = 0x01 | EXT_REGIMM,
385
    OPC_BGEZL    = 0x03 | EXT_REGIMM,
386
    OPC_BLTZAL   = 0x10 | EXT_REGIMM,
387
    OPC_BLTZALL  = 0x12 | EXT_REGIMM,
388
    OPC_BGEZAL   = 0x11 | EXT_REGIMM,
389
    OPC_BGEZALL  = 0x13 | EXT_REGIMM,
390
    OPC_TGEI     = 0x08 | EXT_REGIMM,
391
    OPC_TGEIU    = 0x09 | EXT_REGIMM,
392
    OPC_TLTI     = 0x0A | EXT_REGIMM,
393
    OPC_TLTIU    = 0x0B | EXT_REGIMM,
394
    OPC_TEQI     = 0x0C | EXT_REGIMM,
395
    OPC_TNEI     = 0x0E | EXT_REGIMM,
396
};
397

  
398
enum {
399
    /* Coprocessor 0 (MMU) */
400
    OPC_MFC0     = 0x00 | EXT_CP0,
401
    OPC_MTC0     = 0x04 | EXT_CP0,
402
    OPC_TLBR     = 0x01 | EXT_CP0,
403
    OPC_TLBWI    = 0x02 | EXT_CP0,
404
    OPC_TLBWR    = 0x06 | EXT_CP0,
405
    OPC_TLBP     = 0x08 | EXT_CP0,
406
    OPC_ERET     = 0x18 | EXT_CP0,
407
    OPC_DERET    = 0x1F | EXT_CP0,
408
    OPC_WAIT     = 0x20 | EXT_CP0,
409
};
410

  
411 243
int cpu_mips_exec(CPUMIPSState *s);
412 244
CPUMIPSState *cpu_mips_init(void);
413 245
uint32_t cpu_mips_get_clock (void);

Also available in: Unified diff