qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH] Less magic constants


From: Thiemo Seufer
Subject: [Qemu-devel] [PATCH] Less magic constants
Date: Tue, 28 Feb 2006 16:14:04 +0000
User-agent: Mutt/1.5.11+cvs20060126

Hello All,

this patch attempt to reduce the number of magic constants used in
the MIPS support code, and also adds 64bit and MIPS32 R2 instruction
definitions.


Thiemo


Index: qemu-work/target-mips/translate.c
===================================================================
--- qemu-work.orig/target-mips/translate.c      2006-02-20 15:58:38.000000000 
+0000
+++ qemu-work/target-mips/translate.c   2006-02-20 17:40:14.000000000 +0000
@@ -49,14 +49,7 @@
 
 #include "gen-op.h"
 
-/* MIPS opcodes */
-#define EXT_SPECIAL  0x100
-#define EXT_SPECIAL2 0x200
-#define EXT_REGIMM   0x300
-#define EXT_CP0      0x400
-#define EXT_CP1      0x500
-#define EXT_CP2      0x600
-#define EXT_CP3      0x700
+/* MIPS major opcodes */
 
 enum {
     /* indirect opcode tables */
@@ -67,6 +60,7 @@
     OPC_CP2      = 0x12,
     OPC_CP3      = 0x13,
     OPC_SPECIAL2 = 0x1C,
+    OPC_SPECIAL3 = 0x1F,
     /* arithmetic with immediate */
     OPC_ADDI     = 0x08,
     OPC_ADDIU    = 0x09,
@@ -76,6 +70,8 @@
     OPC_ORI      = 0x0D,
     OPC_XORI     = 0x0E,
     OPC_LUI      = 0x0F,
+    OPC_DADDI    = 0x18,
+    OPC_DADDIU   = 0x19,
     /* Jump and branches */
     OPC_J        = 0x02,
     OPC_JAL      = 0x03,
@@ -89,6 +85,8 @@
     OPC_BGTZL    = 0x17,
     OPC_JALX     = 0x1D,  /* MIPS 16 only */
     /* Load and stores */
+    OPC_LDL      = 0x1A,
+    OPC_LDR      = 0x1B,
     OPC_LB       = 0x20,
     OPC_LH       = 0x21,
     OPC_LWL      = 0x22,
@@ -96,13 +94,20 @@
     OPC_LBU      = 0x24,
     OPC_LHU      = 0x25,
     OPC_LWR      = 0x26,
+    OPC_LWU      = 0x27,
     OPC_SB       = 0x28,
     OPC_SH       = 0x29,
     OPC_SWL      = 0x2A,
     OPC_SW       = 0x2B,
+    OPC_SDL      = 0x2C,
+    OPC_SDR      = 0x2D,
     OPC_SWR      = 0x2E,
     OPC_LL       = 0x30,
+    OPC_LLD      = 0x34,
+    OPC_LD       = 0x37,
     OPC_SC       = 0x38,
+    OPC_SCD      = 0x3C,
+    OPC_SD       = 0x3F,
     /* Floating point load/store */
     OPC_LWC1     = 0x31,
     OPC_LWC2     = 0x32,
@@ -112,27 +117,54 @@
     OPC_SWC2     = 0x3A,
     OPC_SDC1     = 0x3D,
     OPC_SDC2     = 0x3E,
+    /* MDMX ASE specific */
+    OPC_MDMX     = 0x1E,
     /* Cache and prefetch */
     OPC_CACHE    = 0x2F,
     OPC_PREF     = 0x33,
+    /* Reserved major opcode */
+    OPC_MAJOR3B_RESERVED = 0x3B,
 };
 
+#define EXT_SPECIAL  (OPC_SPECIAL << 26)
+#define EXT_BREGIMM  (OPC_BREGIMM << 26)
+#define EXT_CP0      (OPC_CP0 << 26)
+#define EXT_CP1      (OPC_CP1 << 26)
+#define EXT_CP2      (OPC_CP2 << 26)
+#define EXT_CP3      (OPC_CP3 << 26)
+#define EXT_SPECIAL2 (OPC_SPECIAL2 << 26)
+#define EXT_SPECIAL3 (OPC_SPECIAL3 << 26)
+
 /* MIPS special opcodes */
 enum {
     /* Shifts */
     OPC_SLL      = 0x00 | EXT_SPECIAL,
     /* NOP is SLL r0, r0, 0   */
     /* SSNOP is SLL r0, r0, 1 */
+    /* EHB is SLL r0, r0, 3 */
     OPC_SRL      = 0x02 | EXT_SPECIAL,
     OPC_SRA      = 0x03 | EXT_SPECIAL,
     OPC_SLLV     = 0x04 | EXT_SPECIAL,
     OPC_SRLV     = 0x06 | EXT_SPECIAL,
     OPC_SRAV     = 0x07 | EXT_SPECIAL,
+    OPC_DSLLV    = 0x14 | EXT_SPECIAL,
+    OPC_DSRLV    = 0x16 | EXT_SPECIAL,
+    OPC_DSRAV    = 0x17 | EXT_SPECIAL,
+    OPC_DSLL     = 0x38 | EXT_SPECIAL,
+    OPC_DSRL     = 0x3A | EXT_SPECIAL,
+    OPC_DSRA     = 0x3B | EXT_SPECIAL,
+    OPC_DSLL32   = 0x3C | EXT_SPECIAL,
+    OPC_DSRL32   = 0x3E | EXT_SPECIAL,
+    OPC_DSRA32   = 0x3F | EXT_SPECIAL,
     /* Multiplication / division */
     OPC_MULT     = 0x18 | EXT_SPECIAL,
     OPC_MULTU    = 0x19 | EXT_SPECIAL,
     OPC_DIV      = 0x1A | EXT_SPECIAL,
     OPC_DIVU     = 0x1B | EXT_SPECIAL,
+    OPC_DMULT    = 0x1C | EXT_SPECIAL,
+    OPC_DMULTU   = 0x1D | EXT_SPECIAL,
+    OPC_DDIV     = 0x1E | EXT_SPECIAL,
+    OPC_DDIVU    = 0x1F | EXT_SPECIAL,
     /* 2 registers arithmetic / logic */
     OPC_ADD      = 0x20 | EXT_SPECIAL,
     OPC_ADDU     = 0x21 | EXT_SPECIAL,
@@ -144,9 +176,13 @@
     OPC_NOR      = 0x27 | EXT_SPECIAL,
     OPC_SLT      = 0x2A | EXT_SPECIAL,
     OPC_SLTU     = 0x2B | EXT_SPECIAL,
+    OPC_DADD     = 0x2C | EXT_SPECIAL,
+    OPC_DADDU    = 0x2D | EXT_SPECIAL,
+    OPC_DSUB     = 0x2E | EXT_SPECIAL,
+    OPC_DSUBU    = 0x2F | EXT_SPECIAL,
     /* Jumps */
-    OPC_JR       = 0x08 | EXT_SPECIAL,
-    OPC_JALR     = 0x09 | EXT_SPECIAL,
+    OPC_JR       = 0x08 | EXT_SPECIAL, /* Also JR.HB */
+    OPC_JALR     = 0x09 | EXT_SPECIAL, /* Also JALR.HB */
     /* Traps */
     OPC_TGE      = 0x30 | EXT_SPECIAL,
     OPC_TGEU     = 0x31 | EXT_SPECIAL,
@@ -166,14 +202,43 @@
     OPC_MOVCI    = 0x01 | EXT_SPECIAL,
 
     /* Special */
-    OPC_PMON     = 0x05 | EXT_SPECIAL,
+    OPC_PMON     = 0x05 | EXT_SPECIAL, /* inofficial */
     OPC_SYSCALL  = 0x0C | EXT_SPECIAL,
     OPC_BREAK    = 0x0D | EXT_SPECIAL,
+    OPC_SPIM     = 0x0E | EXT_SPECIAL, /* inofficial */
     OPC_SYNC     = 0x0F | EXT_SPECIAL,
+
+    OPC_SPECIAL15_RESERVED = 0x15 | EXT_SPECIAL,
+    OPC_SPECIAL28_RESERVED = 0x28 | EXT_SPECIAL,
+    OPC_SPECIAL29_RESERVED = 0x29 | EXT_SPECIAL,
+    OPC_SPECIAL35_RESERVED = 0x35 | EXT_SPECIAL,
+    OPC_SPECIAL37_RESERVED = 0x37 | EXT_SPECIAL,
+    OPC_SPECIAL39_RESERVED = 0x39 | EXT_SPECIAL,
+    OPC_SPECIAL3D_RESERVED = 0x3D | EXT_SPECIAL,
+};
+
+/* REGIMM (rt field) opcodes */
+enum {
+    OPC_BLTZ     = (0x00 << 16) | EXT_BREGIMM,
+    OPC_BLTZL    = (0x02 << 16) | EXT_BREGIMM,
+    OPC_BGEZ     = (0x01 << 16) | EXT_BREGIMM,
+    OPC_BGEZL    = (0x03 << 16) | EXT_BREGIMM,
+    OPC_BLTZAL   = (0x10 << 16) | EXT_BREGIMM,
+    OPC_BLTZALL  = (0x12 << 16) | EXT_BREGIMM,
+    OPC_BGEZAL   = (0x11 << 16) | EXT_BREGIMM,
+    OPC_BGEZALL  = (0x13 << 16) | EXT_BREGIMM,
+    OPC_TGEI     = (0x08 << 16) | EXT_BREGIMM,
+    OPC_TGEIU    = (0x09 << 16) | EXT_BREGIMM,
+    OPC_TLTI     = (0x0A << 16) | EXT_BREGIMM,
+    OPC_TLTIU    = (0x0B << 16) | EXT_BREGIMM,
+    OPC_TEQI     = (0x0C << 16) | EXT_BREGIMM,
+    OPC_TNEI     = (0x0E << 16) | EXT_BREGIMM,
+    OPC_SYNCI    = (0x1F << 16) | EXT_BREGIMM,
 };
 
+/* Special2 opcodes */
 enum {
-    /* Mutiply & xxx operations */
+    /* Multiply & xxx operations */
     OPC_MADD     = 0x00 | EXT_SPECIAL2,
     OPC_MADDU    = 0x01 | EXT_SPECIAL2,
     OPC_MUL      = 0x02 | EXT_SPECIAL2,
@@ -182,42 +247,66 @@
     /* Misc */
     OPC_CLZ      = 0x20 | EXT_SPECIAL2,
     OPC_CLO      = 0x21 | EXT_SPECIAL2,
+    OPC_DCLZ     = 0x24 | EXT_SPECIAL2,
+    OPC_DCLO     = 0x25 | EXT_SPECIAL2,
     /* Special */
     OPC_SDBBP    = 0x3F | EXT_SPECIAL2,
 };
 
-/* Branch REGIMM */
+/* Special3 opcodes */
+enum {
+    OPC_EXT      = 0x00 | EXT_SPECIAL3,
+    OPC_DEXTM    = 0x01 | EXT_SPECIAL3,
+    OPC_DEXTU    = 0x02 | EXT_SPECIAL3,
+    OPC_DEXT     = 0x03 | EXT_SPECIAL3,
+    OPC_INS      = 0x04 | EXT_SPECIAL3,
+    OPC_DINSM    = 0x05 | EXT_SPECIAL3,
+    OPC_DINSU    = 0x06 | EXT_SPECIAL3,
+    OPC_DINS     = 0x07 | EXT_SPECIAL3,
+    OPC_BSHFL    = 0x20 | EXT_SPECIAL3,
+    OPC_DBSHFL   = 0x24 | EXT_SPECIAL3,
+    OPC_RDHWR    = 0x3B | EXT_SPECIAL3,
+};
+
+/* Coprocessor 0 (rs field) */
+enum {
+    OPC_MFC0     = (0x00 << 21) | EXT_CP0,
+    OPC_DMFC0    = (0x01 << 21) | EXT_CP0,
+    OPC_MTC0     = (0x04 << 21) | EXT_CP0,
+    OPC_DMTC0    = (0x05 << 21) | EXT_CP0,
+    OPC_RDPGPR   = (0x0A << 21) | EXT_CP0,
+    OPC_MFMC0    = (0x0B << 21) | EXT_CP0,
+    OPC_WRPGPR   = (0x0E << 21) | EXT_CP0,
+    OPC_C0       = (0x10 << 21) | EXT_CP0,
+    OPC_C0_FIRST = (0x10 << 21) | EXT_CP0,
+    OPC_C0_LAST  = (0x1F << 21) | EXT_CP0,
+};
+
+/* Coprocessor 0 (with rs=C0) */
 enum {
-    OPC_BLTZ     = 0x00 | EXT_REGIMM,
-    OPC_BLTZL    = 0x02 | EXT_REGIMM,
-    OPC_BGEZ     = 0x01 | EXT_REGIMM,
-    OPC_BGEZL    = 0x03 | EXT_REGIMM,
-    OPC_BLTZAL   = 0x10 | EXT_REGIMM,
-    OPC_BLTZALL  = 0x12 | EXT_REGIMM,
-    OPC_BGEZAL   = 0x11 | EXT_REGIMM,
-    OPC_BGEZALL  = 0x13 | EXT_REGIMM,
-    OPC_TGEI     = 0x08 | EXT_REGIMM,
-    OPC_TGEIU    = 0x09 | EXT_REGIMM,
-    OPC_TLTI     = 0x0A | EXT_REGIMM,
-    OPC_TLTIU    = 0x0B | EXT_REGIMM,
-    OPC_TEQI     = 0x0C | EXT_REGIMM,
-    OPC_TNEI     = 0x0E | EXT_REGIMM,
+    OPC_TLBR     = 0x01 | OPC_C0,
+    OPC_TLBWI    = 0x02 | OPC_C0,
+    OPC_TLBWR    = 0x06 | OPC_C0,
+    OPC_TLBP     = 0x08 | OPC_C0,
+    OPC_RFE      = 0x10 | OPC_C0,
+    OPC_ERET     = 0x18 | OPC_C0,
+    OPC_DERET    = 0x1F | OPC_C0,
+    OPC_WAIT     = 0x20 | OPC_C0,
 };
 
+/* Coprocessor 1 (rs field) */
 enum {
-    /* Coprocessor 0 (MMU) */
-    OPC_MFC0     = 0x00 | EXT_CP0,
-    OPC_MTC0     = 0x04 | EXT_CP0,
-    OPC_TLBR     = 0x01 | EXT_CP0,
-    OPC_TLBWI    = 0x02 | EXT_CP0,
-    OPC_TLBWR    = 0x06 | EXT_CP0,
-    OPC_TLBP     = 0x08 | EXT_CP0,
-    OPC_ERET     = 0x18 | EXT_CP0,
-    OPC_DERET    = 0x1F | EXT_CP0,
-    OPC_WAIT     = 0x20 | EXT_CP0,
+    OPC_MFC1     = (0x00 << 21) | EXT_CP1,
+    OPC_DMFC1    = (0x01 << 21) | EXT_CP1,
+    OPC_CFC1     = (0x02 << 21) | EXT_CP1,
+    OPC_MFHCI    = (0x03 << 21) | EXT_CP1,
+    OPC_MTC1     = (0x04 << 21) | EXT_CP1,
+    OPC_DMTC1    = (0x05 << 21) | EXT_CP1,
+    OPC_CTC1     = (0x06 << 21) | EXT_CP1,
+    OPC_MTHCI    = (0x07 << 21) | EXT_CP1,
 };
 
-const unsigned char *regnames[] =
+const char *regnames[] =
     { "r0", "at", "v0", "v1", "a0", "a1", "a2", "a3",
       "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
       "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
@@ -399,10 +488,10 @@
 OP_ST_TABLE(c);
 
 /* Load and store */
-static void gen_ldst (DisasContext *ctx, uint16_t opc, int rt,
+static void gen_ldst (DisasContext *ctx, uint32_t opc, int rt,
                       int base, int16_t offset)
 {
-    const unsigned char *opn = "unk";
+    const char *opn = "unk";
 
     if (base == 0) {
         GEN_LOAD_IMM_TN(T0, offset);
@@ -553,11 +642,11 @@
 }
 
 /* Arithmetic with immediate operand */
-static void gen_arith_imm (DisasContext *ctx, uint16_t opc, int rt,
+static void gen_arith_imm (DisasContext *ctx, uint32_t opc, int rt,
                            int rs, int16_t imm)
 {
     uint32_t uimm;
-    const unsigned char *opn = "unk";
+    const char *opn = "unk";
 
     if (rt == 0 && opc != OPC_ADDI) {
         /* if no destination, treat it as a NOP 
@@ -634,10 +723,10 @@
 }
 
 /* Arithmetic */
-static void gen_arith (DisasContext *ctx, uint16_t opc,
+static void gen_arith (DisasContext *ctx, uint32_t opc,
                        int rd, int rs, int rt)
 {
-    const unsigned char *opn = "unk";
+    const char *opn = "unk";
 
     if (rd == 0 && opc != OPC_ADD && opc != OPC_SUB) {
         /* if no destination, treat it as a NOP 
@@ -727,9 +816,9 @@
 }
 
 /* Arithmetic on HI/LO registers */
-static void gen_HILO (DisasContext *ctx, uint16_t opc, int reg)
+static void gen_HILO (DisasContext *ctx, uint32_t opc, int reg)
 {
-    const unsigned char *opn = "unk";
+    const char *opn = "unk";
 
     if (reg == 0 && (opc == OPC_MFHI || opc == OPC_MFLO)) {
         /* Treat as a NOP */
@@ -766,10 +855,10 @@
     MIPS_DEBUG("%s %s", opn, regnames[reg]);
 }
 
-static void gen_muldiv (DisasContext *ctx, uint16_t opc,
+static void gen_muldiv (DisasContext *ctx, uint32_t opc,
                         int rs, int rt)
 {
-    const unsigned char *opn = "unk";
+    const char *opn = "unk";
 
     GEN_LOAD_REG_TN(T0, rs);
     GEN_LOAD_REG_TN(T1, rt);
@@ -815,10 +904,10 @@
     MIPS_DEBUG("%s %s %s", opn, regnames[rs], regnames[rt]);
 }
 
-static void gen_cl (DisasContext *ctx, uint16_t opc,
+static void gen_cl (DisasContext *ctx, uint32_t opc,
                     int rd, int rs)
 {
-    const unsigned char *opn = "unk";
+    const char *opn = "unk";
     if (rd == 0) {
         /* Treat as a NOP */
         MIPS_DEBUG("NOP");
@@ -847,7 +936,7 @@
 }
 
 /* Traps */
-static void gen_trap (DisasContext *ctx, uint16_t opc,
+static void gen_trap (DisasContext *ctx, uint32_t opc,
                       int rs, int rt, int16_t imm)
 {
     int cond;
@@ -964,7 +1053,7 @@
 }
 
 /* Branches (before delay slot) */
-static void gen_compute_branch (DisasContext *ctx, uint16_t opc,
+static void gen_compute_branch (DisasContext *ctx, uint32_t opc,
                                 int rs, int rt, int32_t offset)
 {
     target_ulong btarget;
@@ -1188,7 +1277,7 @@
 /* CP0 (MMU and control) */
 static void gen_mfc0 (DisasContext *ctx, int reg, int sel)
 {
-    const unsigned char *rn;
+    const char *rn;
 
     if (sel != 0 && reg != 16 && reg != 28) {
         rn = "invalid";
@@ -1338,12 +1427,9 @@
 
 static void gen_mtc0 (DisasContext *ctx, int reg, int sel)
 {
-    const unsigned char *rn;
-    uint32_t val, old, mask;
+    const char *rn;
 
     if (sel != 0 && reg != 16 && reg != 28) {
-        val = -1;
-        old = -1;
         rn = "invalid";
         goto die;
     }
@@ -1475,9 +1561,9 @@
     ctx->bstate = BS_EXCP;
 }
 
-static void gen_cp0 (DisasContext *ctx, uint16_t opc, int rt, int rd)
+static void gen_cp0 (DisasContext *ctx, uint32_t opc, int rt, int rd)
 {
-    const unsigned char *opn = "unk";
+    const char *opn = "unk";
 
     if (!(ctx->CP0_Status & (1 << CP0St_CU0)) &&
         !(ctx->hflags & MIPS_HFLAG_UM) &&
@@ -1572,7 +1658,7 @@
 /* SmartMIPS extension to MIPS32 */
 
 #ifdef TARGET_MIPS64
-static void gen_arith64 (DisasContext *ctx, uint16_t opc)
+static void gen_arith64 (DisasContext *ctx, uint32_t opc)
 {
     if (func == 0x02 && rd == 0) {
         /* NOP */
@@ -1617,7 +1703,7 @@
 {
     int32_t offset;
     int rs, rt, rd, sa;
-    uint16_t op, op1;
+    uint32_t op, op1;
     int16_t imm;
 
     if ((ctx->hflags & MIPS_HFLAG_BMASK) == MIPS_HFLAG_BL) {
@@ -1632,54 +1718,57 @@
     sa = ((ctx->opcode >> 6) & 0x1F);
     imm = (int16_t)ctx->opcode;
     switch (op) {
-    case 0x00:          /* Special opcode */
-        op1 = ctx->opcode & 0x3F;
+    case OPC_SPECIAL:
+        op1 = (ctx->opcode & 0x3F) | EXT_SPECIAL;
         switch (op1) {
-        case 0x00:          /* Arithmetic with immediate */
-        case 0x02 ... 0x03:
-            gen_arith_imm(ctx, op1 | EXT_SPECIAL, rd, rt, sa);
-            break;
-        case 0x04:          /* Arithmetic */
-        case 0x06 ... 0x07:
-        case 0x0A ... 0x0B:
-        case 0x20 ... 0x27:
-        case 0x2A ... 0x2B:
-            gen_arith(ctx, op1 | EXT_SPECIAL, rd, rs, rt);
+        case OPC_SLL:          /* Arithmetic with immediate */
+        case OPC_SRL ... OPC_SRA:
+            gen_arith_imm(ctx, op1, rd, rt, sa);
+            break;
+        case OPC_SLLV:         /* Arithmetic */
+        case OPC_SRLV ... OPC_SRAV:
+        case OPC_MOVZ ... OPC_MOVN:
+        case OPC_ADD ... OPC_NOR:
+        case OPC_SLT ... OPC_SLTU:
+            gen_arith(ctx, op1, rd, rs, rt);
             break;
-        case 0x18 ... 0x1B: /* MULT / DIV */
-            gen_muldiv(ctx, op1 | EXT_SPECIAL, rs, rt);
+        case OPC_MULT ... OPC_DIVU:
+            gen_muldiv(ctx, op1, rs, rt);
             break;
-        case 0x08 ... 0x09: /* Jumps */
-            gen_compute_branch(ctx, op1 | EXT_SPECIAL, rs, rd, sa);
+        case OPC_JR ... OPC_JALR:
+            gen_compute_branch(ctx, op1, rs, rd, sa);
             return;
-        case 0x30 ... 0x34: /* Traps */
-        case 0x36:
-            gen_trap(ctx, op1 | EXT_SPECIAL, rs, rt, -1);
-            break;
-        case 0x10:          /* Move from HI/LO */
-        case 0x12:
-            gen_HILO(ctx, op1 | EXT_SPECIAL, rd);
-            break;
-        case 0x11:
-        case 0x13:          /* Move to HI/LO */
-            gen_HILO(ctx, op1 | EXT_SPECIAL, rs);
+        case OPC_TGE ... OPC_TEQ: /* Traps */
+        case OPC_TNE:
+            gen_trap(ctx, op1, rs, rt, -1);
+            break;
+        case OPC_MFHI:          /* Move from HI/LO */
+        case OPC_MFLO:
+            gen_HILO(ctx, op1, rd);
+            break;
+        case OPC_MTHI:
+        case OPC_MTLO:          /* Move to HI/LO */
+            gen_HILO(ctx, op1, rs);
             break;
-        case 0x0C:          /* SYSCALL */
+        case OPC_PMON:          /* Pmon entry point */
+            gen_op_pmon((ctx->opcode >> 6) & 0x1F);
+            break;
+        case OPC_SYSCALL:
             generate_exception(ctx, EXCP_SYSCALL);
             ctx->bstate = BS_EXCP;
             break;
-        case 0x0D:          /* BREAK */
+        case OPC_BREAK:
             generate_exception(ctx, EXCP_BREAK);
             ctx->bstate = BS_EXCP;
             break;
-        case 0x0F:          /* SYNC */
-            /* Treat as a noop */
+        case OPC_SPIM:        /* SPIM ? */
+           /* implemented as RI exception for now */
             break;
-        case 0x05:          /* Pmon entry point */
-            gen_op_pmon((ctx->opcode >> 6) & 0x1F);
+        case OPC_SYNC:
+            /* Treat as a noop */
             break;
 
-        case 0x01:          /* MOVCI */
+        case OPC_MOVCI:
 #if defined (MIPS_HAS_MOVCI)
             /* XXX */
 #else
@@ -1690,14 +1779,14 @@
             break;
 
 #if defined (TARGET_MIPS64)
-        case 0x14: /* MIPS64 specific opcodes */
-        case 0x16:
-        case 0x17:
-        case 0x1C ... 0x1F:
-        case 0x2C ... 0x2F:
-        case 0x37:
-        case 0x39 ... 0x3B:
-        case 0x3E ... 0x3F:
+        case OPC_DSLLV: /* MIPS64 specific opcodes */
+        case OPC_DSRLV ... OPC_DSRAV:
+        case OPC_DMULT ... OPC_DDIVU:
+        case OPC_DADD ... OPC_DSUBU:
+        case OPC_DSLL:
+        case OPC_DSRL ... OPC_DSRA:
+        case OPC_DSLL32:
+        case OPC_DSRL32 ... OPC_DSRA32:
 #endif
         default:            /* Invalid */
             MIPS_INVAL("special");
@@ -1706,23 +1795,23 @@
             break;
         }
         break;
-    case 0x1C:          /* Special2 opcode */
-        op1 = ctx->opcode & 0x3F;
+    case OPC_SPECIAL2:
+        op1 = (ctx->opcode & 0x3F) | EXT_SPECIAL2;
         switch (op1) {
 #if defined (MIPS_USES_R4K_EXT)
         /* Those instructions are not part of MIPS32 core */
-        case 0x00 ... 0x01: /* Multiply and add/sub */
-        case 0x04 ... 0x05:
-            gen_muldiv(ctx, op1 | EXT_SPECIAL2, rs, rt);
+        case OPC_MADD ... OPC_MADDU: /* Multiply and add/sub */
+        case OPC_MSUB ... OPC_MSUBU:
+            gen_muldiv(ctx, op1, rs, rt);
             break;
-        case 0x02:          /* MUL */
-            gen_arith(ctx, op1 | EXT_SPECIAL2, rd, rs, rt);
+        case OPC_MUL:
+            gen_arith(ctx, op1, rd, rs, rt);
             break;
-        case 0x20 ... 0x21: /* CLO / CLZ */
-            gen_cl(ctx, op1 | EXT_SPECIAL2, rd, rs);
+        case OPC_CLZ ... OPC_CLO:
+            gen_cl(ctx, op1, rd, rs);
             break;
 #endif
-        case 0x3F:          /* SDBBP */
+        case OPC_SDBBP:
             /* XXX: not clear which exception should be raised
              *      when in debug mode...
              */
@@ -1742,16 +1831,16 @@
             break;
         }
         break;
-    case 0x01:          /* B REGIMM opcode */
-        op1 = ((ctx->opcode >> 16) & 0x1F);
+    case OPC_BREGIMM:
+        op1 = (ctx->opcode & 0x001F0000) | EXT_BREGIMM;
         switch (op1) {
-        case 0x00 ... 0x03: /* REGIMM branches */
-        case 0x10 ... 0x13:
-            gen_compute_branch(ctx, op1 | EXT_REGIMM, rs, -1, imm << 2);
+        case OPC_BLTZ ... OPC_BGEZL: /* REGIMM branches */
+        case OPC_BLTZAL ... OPC_BGEZALL:
+            gen_compute_branch(ctx, op1, rs, -1, imm << 2);
             return;
-        case 0x08 ... 0x0C: /* Traps */
-        case 0x0E:
-            gen_trap(ctx, op1 | EXT_REGIMM, rs, -1, imm);
+        case OPC_TGEI ... OPC_TEQI: /* REGIMM traps */
+        case OPC_TNEI:
+            gen_trap(ctx, op1, rs, -1, imm);
             break;
         default:            /* Invalid */
             MIPS_INVAL("REGIMM");
@@ -1760,50 +1849,61 @@
             break;
         }
         break;
-    case 0x10:          /* CP0 opcode */
-        op1 = ((ctx->opcode >> 21) & 0x1F);
+    case OPC_CP0:
+        op1 = (ctx->opcode & 0x03E00000) | EXT_CP0;
         switch (op1) {
-        case 0x00:
-        case 0x04:
-            gen_cp0(ctx, op1 | EXT_CP0, rt, rd);
-            break;
-        default:
-            gen_cp0(ctx, (ctx->opcode & 0x3F) | EXT_CP0, rt, rd);
+       case OPC_MFC0:
+       case OPC_MTC0:
+            gen_cp0(ctx, op1, rt, rd);
+            break;
+       case OPC_C0_FIRST ... OPC_C0_LAST:
+            gen_cp0(ctx, (ctx->opcode & 0x3F) | OPC_C0, rt, rd);
+            break;
+#ifdef MIPS_HAS_MIPS64
+       case OPC_DMFC0:
+       case OPC_DMTC0:
+#endif
+       case OPC_RDPGPR:
+       case OPC_MFMC0:
+       case OPC_WRPGPR:
+       default:
+            generate_exception(ctx, EXCP_RI);
+            ctx->bstate = BS_EXCP;
             break;
-        }
+       }
         break;
-    case 0x08 ... 0x0F: /* Arithmetic with immediate opcode */
+    case OPC_ADDI ... OPC_LUI: /* Arithmetic with immediate opcode */
         gen_arith_imm(ctx, op, rt, rs, imm);
         break;
-    case 0x02 ... 0x03: /* Jump */
+    case OPC_J ... OPC_JAL: /* Jump */
         offset = (int32_t)(ctx->opcode & 0x03FFFFFF) << 2;
         gen_compute_branch(ctx, op, rs, rt, offset);
         return;
-    case 0x04 ... 0x07: /* Branch */
-    case 0x14 ... 0x17:
+    case OPC_BEQ ... OPC_BGTZ: /* Branch */
+    case OPC_BEQL ... OPC_BGTZL:
         gen_compute_branch(ctx, op, rs, rt, imm << 2);
         return;
-    case 0x20 ... 0x26: /* Load and stores */
-    case 0x28 ... 0x2E:
-    case 0x30:
-    case 0x38:
+    case OPC_LB ... OPC_LWR: /* Load and stores */
+    case OPC_SB ... OPC_SW:
+    case OPC_SWR:
+    case OPC_LL:
+    case OPC_SC:
         gen_ldst(ctx, op, rt, rs, imm);
         break;
-    case 0x2F:          /* Cache operation */
+    case OPC_CACHE:
         /* Treat as a noop */
         break;
-    case 0x33:          /* Prefetch */
+    case OPC_PREF:
         /* Treat as a noop */
         break;
-    case 0x3F: /* HACK */
-        break;
 
     /* Floating point.  */
-    case 0x31: /* LWC1 */
-    case 0x35: /* LDC1 */
-    case 0x39: /* SWC1 */
-    case 0x3D: /* SDC1 */
-    case 0x11:          /* CP1 opcode */
+    case OPC_LWC1:
+    case OPC_LDC1:
+    case OPC_SWC1:
+    case OPC_SDC1:
+    case OPC_CP1:
+    case OPC_CP3:
 #if defined(MIPS_USES_FPU)
         /* XXX: not correct */
 #else
@@ -1813,35 +1913,35 @@
         break;
 
     /* COP2.  */
-    case 0x32: /* LWC2 */
-    case 0x36: /* LDC2 */
-    case 0x3A: /* SWC2 */
-    case 0x3E: /* SDC2 */
-    case 0x12:          /* CP2 opcode */
+    case OPC_LWC2:
+    case OPC_LDC2:
+    case OPC_SWC2:
+    case OPC_SDC2:
+    case OPC_CP2:
         /* Not implemented */
         generate_exception_err(ctx, EXCP_CpU, 2);
         ctx->bstate = BS_EXCP;
         break;
 
-    case 0x13:          /* CP3 opcode */
-        /* Not implemented */
-        generate_exception_err(ctx, EXCP_CpU, 3);
-        ctx->bstate = BS_EXCP;
-        break;
-
 #if defined (TARGET_MIPS64)
-    case 0x18 ... 0x1B:
-    case 0x27:
-    case 0x34:
-    case 0x37:
+    case OPC_LWU:
+    case OPC_DADDI ... OPC_DADDIU:
+    case OPC_LDL ... OPC_LDR:
+    case OPC_SDL ... OPC_SDR:
+    case OPC_LLD:
+    case OPC_LD:
+    case OPC_SCD:
+    case OPC_SD:
         /* MIPS64 opcodes */
 #endif
-#if defined (MIPS_HAS_JALX)
-    case 0x1D:
-        /* JALX: not implemented */
+#ifdef MIPS_HAS_MIPS16
+    case OPC_JALX:
+        /* MIPS16: not implemented */
+#endif
+#ifdef MIPS_HAS_MDMX
+    case OPC_MDMX:
+        /* MDMX: not implemented */
 #endif
-    case 0x1E:
-        /* ASE specific */
     default:            /* Invalid */
         MIPS_INVAL("");
         generate_exception(ctx, EXCP_RI);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]