[opcodes,pk,sim,xcc] flip fields to favor little endian
authorYunsup Lee <yunsup@cs.berkeley.edu>
Tue, 4 Jan 2011 03:12:24 +0000 (19:12 -0800)
committerYunsup Lee <yunsup@cs.berkeley.edu>
Tue, 4 Jan 2011 03:13:39 +0000 (19:13 -0800)
riscv/decode.h
riscv/execute.h

index 189e1845cd5e18e781c3d5484e7a69677eacc413..5348ccc101137b27694c6a0240043f6d1f629c26 100644 (file)
@@ -37,7 +37,7 @@ const int FPRID_BITS = 5;
 const int NFPR = 1 << FPRID_BITS;
 
 const int IMM_BITS = 12;
-const int IMMLO_BITS = 5;
+const int IMMLO_BITS = 7;
 const int TARGET_BITS = 25;
 const int SHAMT_BITS = 6;
 const int FUNCT_BITS = 3;
@@ -84,54 +84,54 @@ const int JUMP_ALIGN_BITS = 1;
 // note: bit fields are in little-endian order
 struct itype_t
 {
-  unsigned rd : GPRID_BITS;
-  unsigned rs1 : GPRID_BITS;
-  signed imm12 : IMM_BITS;
-  unsigned funct : FUNCT_BITS;
   unsigned opcode : OPCODE_BITS;
+  unsigned funct : FUNCT_BITS;
+  signed imm12 : IMM_BITS;
+  unsigned rs1 : GPRID_BITS;
+  unsigned rd : GPRID_BITS;
 };
 
 struct btype_t
 {
+  unsigned opcode : OPCODE_BITS;
+  unsigned funct : FUNCT_BITS;
   unsigned immlo : IMMLO_BITS;
-  unsigned rs1 : GPRID_BITS;
   unsigned rs2 : GPRID_BITS;
+  unsigned rs1 : GPRID_BITS;
   signed immhi : IMM_BITS-IMMLO_BITS;
-  unsigned funct : FUNCT_BITS;
-  unsigned opcode : OPCODE_BITS;
 };
 
 struct jtype_t
 {
-  signed target : TARGET_BITS;
   unsigned jump_opcode : OPCODE_BITS;
+  signed target : TARGET_BITS;
 };
 
 struct rtype_t
 {
-  unsigned rd : GPRID_BITS;
-  unsigned rs1 : GPRID_BITS;
-  unsigned rs2 : GPRID_BITS;
-  unsigned functr : FUNCTR_BITS;
-  unsigned funct : FUNCT_BITS;
   unsigned opcode : OPCODE_BITS;
+  unsigned funct : FUNCT_BITS;
+  unsigned functr : FUNCTR_BITS;
+  unsigned rs2 : GPRID_BITS;
+  unsigned rs1 : GPRID_BITS;
+  unsigned rd : GPRID_BITS;
 };
 
 struct ltype_t
 {
-  unsigned rd : GPRID_BITS;
-  unsigned bigimm : BIGIMM_BITS;
   unsigned opcode : OPCODE_BITS;
+  unsigned bigimm : BIGIMM_BITS;
+  unsigned rd : GPRID_BITS;
 };
 
 struct ftype_t
 {
-  unsigned rd  : FPRID_BITS;
-  unsigned rs1 : FPRID_BITS;
-  unsigned rs2 : FPRID_BITS;
-  unsigned rs3 : FPRID_BITS;
-  unsigned ffunct : FFUNCT_BITS;
   unsigned opcode : OPCODE_BITS;
+  unsigned ffunct : FFUNCT_BITS;
+  unsigned rs3 : FPRID_BITS;
+  unsigned rs2 : FPRID_BITS;
+  unsigned rs1 : FPRID_BITS;
+  unsigned rd  : FPRID_BITS;
 };
 
 union insn_t
@@ -181,8 +181,8 @@ private:
 #define BIGIMM insn.ltype.bigimm
 #define SIMM insn.itype.imm12
 #define BIMM ((signed)insn.btype.immlo | (insn.btype.immhi << IMMLO_BITS))
-#define SHAMT (insn.itype.imm12 & 0x3F)
-#define SHAMTW (insn.itype.imm12 & 0x1F)
+#define SHAMT ((insn.itype.imm12 >> (IMM_BITS-6)) & 0x3F)
+#define SHAMTW ((insn.itype.imm12 >> (IMM_BITS-6)) & 0x1F)
 #define TARGET insn.jtype.target
 #define BRANCH_TARGET (npc + (BIMM << BRANCH_ALIGN_BITS))
 #define JUMP_TARGET (npc + (TARGET << JUMP_ALIGN_BITS))
index 02523fec40e8e97d753db49433fc1611a5cbe390..a7f59845ac520e00f09c5592d58447205d605403 100644 (file)
@@ -1,9 +1,9 @@
 /* Automatically generated by parse-opcodes */
-switch((insn.bits >> 0x19) & 0x7f)
+switch((insn.bits >> 0x0) & 0x7f)
 {
   case 0x0:
   {
-    switch((insn.bits >> 0x16) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x0:
       {
@@ -33,7 +33,7 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x62:
   {
-    switch((insn.bits >> 0x16) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x0:
       {
@@ -59,7 +59,7 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x63:
   {
-    switch((insn.bits >> 0x16) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x0:
       {
@@ -100,7 +100,7 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x68:
   {
-    switch((insn.bits >> 0x16) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x2:
       {
@@ -121,7 +121,7 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x69:
   {
-    switch((insn.bits >> 0x16) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x2:
       {
@@ -142,251 +142,255 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x6a:
   {
-    switch((insn.bits >> 0x16) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x0:
       {
-        if((insn.bits & 0xffff8000) == 0xd40a8000)
+        if((insn.bits & 0x1ffff) == 0x1506a)
         {
           #include "insns/c_eq_s.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xd4028000)
+        if((insn.bits & 0x1ffff) == 0x506a)
         {
           #include "insns/sgninj_s.h"
           break;
         }
-        if((insn.bits & 0xff8ffc00) == 0xd4050000)
+        if((insn.bits & 0x3ff1ff) == 0xa06a)
         {
           #include "insns/cvt_w_s.h"
           break;
         }
-        if((insn.bits & 0xff8ffc00) == 0xd4070000)
+        if((insn.bits & 0x3ff1ff) == 0xe06a)
         {
           #include "insns/cvt_s_w.h"
           break;
         }
-        if((insn.bits & 0xff8f8000) == 0xd4000000)
+        if((insn.bits & 0x1f1ff) == 0x6a)
         {
           #include "insns/add_s.h"
           break;
         }
-        if((insn.bits & 0xff8ffc00) == 0xd4048000)
+        if((insn.bits & 0x3ff1ff) == 0x906a)
         {
           #include "insns/cvtu_l_s.h"
           break;
         }
-        if((insn.bits & 0xffff83e0) == 0xd42c0000)
+        if((insn.bits & 0x7c1ffff) == 0x1846a)
         {
           #include "insns/mff_s.h"
           break;
         }
-        if((insn.bits & 0xfffffc00) == 0xd42e0000)
+        if((insn.bits & 0x3fffff) == 0x1c46a)
         {
           #include "insns/mtf_s.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xd4030000)
+        if((insn.bits & 0x1ffff) == 0x606a)
         {
           #include "insns/sgninjn_s.h"
           break;
         }
-        if((insn.bits & 0xff8ffc00) == 0xd4040000)
+        if((insn.bits & 0x3ff1ff) == 0x806a)
         {
           #include "insns/cvt_l_s.h"
           break;
         }
-        if((insn.bits & 0xff8ffc00) == 0xd4078000)
+        if((insn.bits & 0x3ff1ff) == 0xf06a)
         {
           #include "insns/cvtu_s_w.h"
           break;
         }
-        if((insn.bits & 0xff8ffc00) == 0xd4068000)
+        if((insn.bits & 0x3ff1ff) == 0xd06a)
         {
           #include "insns/cvtu_s_l.h"
           break;
         }
-        if((insn.bits & 0xff8f8000) == 0xd4008000)
+        if((insn.bits & 0x1f1ff) == 0x106a)
         {
           #include "insns/sub_s.h"
           break;
         }
-        if((insn.bits & 0xff8ffc00) == 0xd4020000)
+        if((insn.bits & 0x3ff1ff) == 0x406a)
         {
           #include "insns/sqrt_s.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xd40b0000)
+        if((insn.bits & 0x1ffff) == 0x1606a)
         {
           #include "insns/c_lt_s.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xd4038000)
+        if((insn.bits & 0x1ffff) == 0x706a)
         {
           #include "insns/sgnmul_s.h"
           break;
         }
-        if((insn.bits & 0xff8ffc00) == 0xd4060000)
+        if((insn.bits & 0x3ff1ff) == 0xc06a)
         {
           #include "insns/cvt_s_l.h"
           break;
         }
-        if((insn.bits & 0xff8f8000) == 0xd4018000)
+        if((insn.bits & 0x1f1ff) == 0x306a)
         {
           #include "insns/div_s.h"
           break;
         }
-        if((insn.bits & 0xff8ffc00) == 0xd4098000)
+        if((insn.bits & 0x3ff1ff) == 0x1306a)
         {
           #include "insns/cvt_s_d.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xd40b8000)
+        if((insn.bits & 0x1ffff) == 0x1706a)
         {
           #include "insns/c_le_s.h"
           break;
         }
-        if((insn.bits & 0xff8f8000) == 0xd4010000)
+        if((insn.bits & 0x1f1ff) == 0x206a)
         {
           #include "insns/mul_s.h"
           break;
         }
-        if((insn.bits & 0xff8ffc00) == 0xd4058000)
+        if((insn.bits & 0x3ff1ff) == 0xb06a)
         {
           #include "insns/cvtu_w_s.h"
           break;
         }
         #include "insns/unimp.h"
       }
-      case 0x6:
+      case 0x3:
       {
-        if((insn.bits & 0xff8ffc00) == 0xd5850000)
+        if((insn.bits & 0x3ff1ff) == 0xa1ea)
         {
           #include "insns/cvt_w_d.h"
           break;
         }
-        if((insn.bits & 0xffff83e0) == 0xd5ac0000)
+        if((insn.bits & 0x7c1ffff) == 0x185ea)
         {
           #include "insns/mff_d.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xd5828000)
+        if((insn.bits & 0x1ffff) == 0x51ea)
         {
           #include "insns/sgninj_d.h"
           break;
         }
-        if((insn.bits & 0xff8f8000) == 0xd5818000)
+        if((insn.bits & 0x1f1ff) == 0x31ea)
         {
           #include "insns/div_d.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xd58a8000)
+        if((insn.bits & 0x1ffff) == 0x151ea)
         {
           #include "insns/c_eq_d.h"
           break;
         }
-        if((insn.bits & 0xff8ffc00) == 0xd5868000)
+        if((insn.bits & 0x3ff1ff) == 0xd1ea)
         {
           #include "insns/cvtu_d_l.h"
           break;
         }
-        if((insn.bits & 0xfffffc00) == 0xd5878000)
+        if((insn.bits & 0x3fffff) == 0xf1ea)
         {
           #include "insns/cvtu_d_w.h"
           break;
         }
-        if((insn.bits & 0xff8ffc00) == 0xd5848000)
+        if((insn.bits & 0x3ff1ff) == 0x91ea)
         {
           #include "insns/cvtu_l_d.h"
           break;
         }
-        if((insn.bits & 0xffff83e0) == 0xd5ac8000)
+        if((insn.bits & 0x7c1ffff) == 0x195ea)
         {
           #include "insns/mffl_d.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xd5838000)
+        if((insn.bits & 0x1ffff) == 0x71ea)
         {
           #include "insns/sgnmul_d.h"
           break;
         }
-        if((insn.bits & 0xff8f8000) == 0xd5800000)
+        if((insn.bits & 0x1f1ff) == 0x1ea)
         {
           #include "insns/add_d.h"
           break;
         }
-        if((insn.bits & 0xffff83e0) == 0xd5ad0000)
+        if((insn.bits & 0x7c1ffff) == 0x1a5ea)
         {
           #include "insns/mffh_d.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xd58b8000)
+        if((insn.bits & 0x1ffff) == 0x171ea)
         {
           #include "insns/c_le_d.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xd5830000)
+        if((insn.bits & 0x1ffff) == 0x61ea)
         {
           #include "insns/sgninjn_d.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xd5be0000)
-        {
-          #include "insns/mtflh_d.h"
-          break;
-        }
-        if((insn.bits & 0xff8ffc00) == 0xd5840000)
+        if((insn.bits & 0x3ff1ff) == 0x81ea)
         {
           #include "insns/cvt_l_d.h"
           break;
         }
-        if((insn.bits & 0xff8f8000) == 0xd5808000)
+        if((insn.bits & 0x1f1ff) == 0x11ea)
         {
           #include "insns/sub_d.h"
           break;
         }
-        if((insn.bits & 0xfffffc00) == 0xd5ae0000)
+        if((insn.bits & 0x3fffff) == 0x1c5ea)
         {
           #include "insns/mtf_d.h"
           break;
         }
-        if((insn.bits & 0xff8ffc00) == 0xd5820000)
+        if((insn.bits & 0x3ff1ff) == 0x41ea)
         {
           #include "insns/sqrt_d.h"
           break;
         }
-        if((insn.bits & 0xfffffc00) == 0xd5880000)
+        if((insn.bits & 0x3fffff) == 0x101ea)
         {
           #include "insns/cvt_d_s.h"
           break;
         }
-        if((insn.bits & 0xfffffc00) == 0xd5870000)
+        if((insn.bits & 0x3fffff) == 0xe1ea)
         {
           #include "insns/cvt_d_w.h"
           break;
         }
-        if((insn.bits & 0xff8ffc00) == 0xd5860000)
+        if((insn.bits & 0x3ff1ff) == 0xc1ea)
         {
           #include "insns/cvt_d_l.h"
           break;
         }
-        if((insn.bits & 0xff8f8000) == 0xd5810000)
+        if((insn.bits & 0x1f1ff) == 0x21ea)
         {
           #include "insns/mul_d.h"
           break;
         }
-        if((insn.bits & 0xff8ffc00) == 0xd5858000)
+        if((insn.bits & 0x3ff1ff) == 0xb1ea)
         {
           #include "insns/cvtu_w_d.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xd58b0000)
+        if((insn.bits & 0x1ffff) == 0x161ea)
         {
           #include "insns/c_lt_d.h"
           break;
         }
         #include "insns/unimp.h"
       }
+      case 0x7:
+      {
+        if((insn.bits & 0x1ffff) == 0x1c7ea)
+        {
+          #include "insns/mtflh_d.h"
+          break;
+        }
+        #include "insns/unimp.h"
+      }
       default:
       {
         #include "insns/unimp.h"
@@ -396,16 +400,16 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x6b:
   {
-    switch((insn.bits >> 0x16) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x0:
       {
-        if((insn.bits & 0xffffffe0) == 0xd6008000)
+        if((insn.bits & 0x7ffffff) == 0x46b)
         {
           #include "insns/di.h"
           break;
         }
-        if((insn.bits & 0xffffffe0) == 0xd6000000)
+        if((insn.bits & 0x7ffffff) == 0x6b)
         {
           #include "insns/ei.h"
           break;
@@ -414,12 +418,12 @@ switch((insn.bits >> 0x19) & 0x7f)
       }
       case 0x1:
       {
-        if((insn.bits & 0xffff83e0) == 0xd6400000)
+        if((insn.bits & 0x7c1ffff) == 0xeb)
         {
           #include "insns/mfpcr.h"
           break;
         }
-        if((insn.bits & 0xffff801f) == 0xd6408000)
+        if((insn.bits & 0xf801ffff) == 0x4eb)
         {
           #include "insns/mtpcr.h"
           break;
@@ -428,7 +432,7 @@ switch((insn.bits >> 0x19) & 0x7f)
       }
       case 0x2:
       {
-        if((insn.bits & 0xffffffff) == 0xd6800000)
+        if((insn.bits & 0xffffffff) == 0x16b)
         {
           #include "insns/eret.h"
           break;
@@ -444,14 +448,14 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x6c:
   {
-    switch((insn.bits >> 0x16) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x0:
       {
         #include "insns/madd_s.h"
         break;
       }
-      case 0x6:
+      case 0x3:
       {
         #include "insns/madd_d.h"
         break;
@@ -465,14 +469,14 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x6d:
   {
-    switch((insn.bits >> 0x16) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x0:
       {
         #include "insns/msub_s.h"
         break;
       }
-      case 0x6:
+      case 0x3:
       {
         #include "insns/msub_d.h"
         break;
@@ -486,14 +490,14 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x6e:
   {
-    switch((insn.bits >> 0x16) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x0:
       {
         #include "insns/nmsub_s.h"
         break;
       }
-      case 0x6:
+      case 0x3:
       {
         #include "insns/nmsub_d.h"
         break;
@@ -507,14 +511,14 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x6f:
   {
-    switch((insn.bits >> 0x16) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x0:
       {
         #include "insns/nmadd_s.h"
         break;
       }
-      case 0x6:
+      case 0x3:
       {
         #include "insns/nmadd_d.h"
         break;
@@ -533,7 +537,7 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x74:
   {
-    switch((insn.bits >> 0x16) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x0:
       {
@@ -567,17 +571,17 @@ switch((insn.bits >> 0x19) & 0x7f)
       }
       case 0x7:
       {
-        if((insn.bits & 0xffff0000) == 0xe9c20000)
+        if((insn.bits & 0xffff) == 0xbf4)
         {
           #include "insns/srli.h"
           break;
         }
-        if((insn.bits & 0xffff0000) == 0xe9c30000)
+        if((insn.bits & 0xffff) == 0xff4)
         {
           #include "insns/srai.h"
           break;
         }
-        if((insn.bits & 0xffff0000) == 0xe9c10000)
+        if((insn.bits & 0xffff) == 0x7f4)
         {
           #include "insns/slli.h"
           break;
@@ -593,46 +597,46 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x75:
   {
-    switch((insn.bits >> 0x16) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x0:
       {
-        if((insn.bits & 0xffff8000) == 0xea000000)
+        if((insn.bits & 0x1ffff) == 0x75)
         {
           #include "insns/add.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xea038000)
+        if((insn.bits & 0x1ffff) == 0x1c75)
         {
           #include "insns/nor.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xea018000)
+        if((insn.bits & 0x1ffff) == 0xc75)
         {
           #include "insns/sltu.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xea030000)
+        if((insn.bits & 0x1ffff) == 0x1875)
         {
           #include "insns/xor.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xea008000)
+        if((insn.bits & 0x1ffff) == 0x475)
         {
           #include "insns/sub.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xea028000)
+        if((insn.bits & 0x1ffff) == 0x1475)
         {
           #include "insns/or.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xea010000)
+        if((insn.bits & 0x1ffff) == 0x875)
         {
           #include "insns/slt.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xea020000)
+        if((insn.bits & 0x1ffff) == 0x1075)
         {
           #include "insns/and.h"
           break;
@@ -641,37 +645,37 @@ switch((insn.bits >> 0x19) & 0x7f)
       }
       case 0x1:
       {
-        if((insn.bits & 0xffff8000) == 0xea400000)
+        if((insn.bits & 0x1ffff) == 0xf5)
         {
           #include "insns/mul.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xea420000)
+        if((insn.bits & 0x1ffff) == 0x10f5)
         {
           #include "insns/div.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xea430000)
+        if((insn.bits & 0x1ffff) == 0x18f5)
         {
           #include "insns/rem.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xea410000)
+        if((insn.bits & 0x1ffff) == 0x8f5)
         {
           #include "insns/mulh.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xea438000)
+        if((insn.bits & 0x1ffff) == 0x1cf5)
         {
           #include "insns/remu.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xea418000)
+        if((insn.bits & 0x1ffff) == 0xcf5)
         {
           #include "insns/mulhu.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xea428000)
+        if((insn.bits & 0x1ffff) == 0x14f5)
         {
           #include "insns/divu.h"
           break;
@@ -680,17 +684,17 @@ switch((insn.bits >> 0x19) & 0x7f)
       }
       case 0x7:
       {
-        if((insn.bits & 0xffff8000) == 0xebc30000)
+        if((insn.bits & 0x1ffff) == 0xff5)
         {
           #include "insns/sra.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xebc20000)
+        if((insn.bits & 0x1ffff) == 0xbf5)
         {
           #include "insns/srl.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xebc10000)
+        if((insn.bits & 0x1ffff) == 0x7f5)
         {
           #include "insns/sll.h"
           break;
@@ -706,7 +710,7 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x76:
   {
-    switch((insn.bits >> 0x16) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x0:
       {
@@ -715,17 +719,17 @@ switch((insn.bits >> 0x19) & 0x7f)
       }
       case 0x7:
       {
-        if((insn.bits & 0xffff8000) == 0xedc10000)
+        if((insn.bits & 0x20ffff) == 0x7f6)
         {
           #include "insns/slliw.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xedc20000)
+        if((insn.bits & 0x20ffff) == 0xbf6)
         {
           #include "insns/srliw.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xedc30000)
+        if((insn.bits & 0x20ffff) == 0xff6)
         {
           #include "insns/sraiw.h"
           break;
@@ -741,16 +745,16 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x77:
   {
-    switch((insn.bits >> 0x16) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x0:
       {
-        if((insn.bits & 0xffff8000) == 0xee000000)
+        if((insn.bits & 0x1ffff) == 0x77)
         {
           #include "insns/addw.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xee008000)
+        if((insn.bits & 0x1ffff) == 0x477)
         {
           #include "insns/subw.h"
           break;
@@ -759,37 +763,37 @@ switch((insn.bits >> 0x19) & 0x7f)
       }
       case 0x1:
       {
-        if((insn.bits & 0xffff8000) == 0xee438000)
+        if((insn.bits & 0x1ffff) == 0x1cf7)
         {
           #include "insns/remuw.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xee428000)
+        if((insn.bits & 0x1ffff) == 0x14f7)
         {
           #include "insns/divuw.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xee418000)
+        if((insn.bits & 0x1ffff) == 0xcf7)
         {
           #include "insns/mulhuw.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xee400000)
+        if((insn.bits & 0x1ffff) == 0xf7)
         {
           #include "insns/mulw.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xee430000)
+        if((insn.bits & 0x1ffff) == 0x18f7)
         {
           #include "insns/remw.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xee410000)
+        if((insn.bits & 0x1ffff) == 0x8f7)
         {
           #include "insns/mulhw.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xee420000)
+        if((insn.bits & 0x1ffff) == 0x10f7)
         {
           #include "insns/divw.h"
           break;
@@ -798,17 +802,17 @@ switch((insn.bits >> 0x19) & 0x7f)
       }
       case 0x7:
       {
-        if((insn.bits & 0xffff8000) == 0xefc20000)
+        if((insn.bits & 0x1ffff) == 0xbf7)
         {
           #include "insns/srlw.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xefc30000)
+        if((insn.bits & 0x1ffff) == 0xff7)
         {
           #include "insns/sraw.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xefc10000)
+        if((insn.bits & 0x1ffff) == 0x7f7)
         {
           #include "insns/sllw.h"
           break;
@@ -824,7 +828,7 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x78:
   {
-    switch((insn.bits >> 0x16) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x0:
       {
@@ -863,7 +867,7 @@ switch((insn.bits >> 0x19) & 0x7f)
       }
       case 0x7:
       {
-        if((insn.bits & 0xffc0001f) == 0xf1c00000)
+        if((insn.bits & 0xf80003ff) == 0x3f8)
         {
           #include "insns/synci.h"
           break;
@@ -879,7 +883,7 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x79:
   {
-    switch((insn.bits >> 0x16) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x0:
       {
@@ -910,46 +914,46 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x7a:
   {
-    switch((insn.bits >> 0x16) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x2:
       {
-        if((insn.bits & 0xffff8000) == 0xf4828000)
+        if((insn.bits & 0x1ffff) == 0x157a)
         {
           #include "insns/amow_max.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xf4810000)
+        if((insn.bits & 0x1ffff) == 0x97a)
         {
           #include "insns/amow_and.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xf4820000)
+        if((insn.bits & 0x1ffff) == 0x117a)
         {
           #include "insns/amow_min.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xf4818000)
+        if((insn.bits & 0x1ffff) == 0xd7a)
         {
           #include "insns/amow_or.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xf4830000)
+        if((insn.bits & 0x1ffff) == 0x197a)
         {
           #include "insns/amow_minu.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xf4800000)
+        if((insn.bits & 0x1ffff) == 0x17a)
         {
           #include "insns/amow_add.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xf4808000)
+        if((insn.bits & 0x1ffff) == 0x57a)
         {
           #include "insns/amow_swap.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xf4838000)
+        if((insn.bits & 0x1ffff) == 0x1d7a)
         {
           #include "insns/amow_maxu.h"
           break;
@@ -958,42 +962,42 @@ switch((insn.bits >> 0x19) & 0x7f)
       }
       case 0x3:
       {
-        if((insn.bits & 0xffff8000) == 0xf4c00000)
+        if((insn.bits & 0x1ffff) == 0x1fa)
         {
           #include "insns/amo_add.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xf4c08000)
+        if((insn.bits & 0x1ffff) == 0x5fa)
         {
           #include "insns/amo_swap.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xf4c18000)
+        if((insn.bits & 0x1ffff) == 0xdfa)
         {
           #include "insns/amo_or.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xf4c28000)
+        if((insn.bits & 0x1ffff) == 0x15fa)
         {
           #include "insns/amo_max.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xf4c20000)
+        if((insn.bits & 0x1ffff) == 0x11fa)
         {
           #include "insns/amo_min.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xf4c30000)
+        if((insn.bits & 0x1ffff) == 0x19fa)
         {
           #include "insns/amo_minu.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xf4c10000)
+        if((insn.bits & 0x1ffff) == 0x9fa)
         {
           #include "insns/amo_and.h"
           break;
         }
-        if((insn.bits & 0xffff8000) == 0xf4c38000)
+        if((insn.bits & 0x1ffff) == 0x1dfa)
         {
           #include "insns/amo_maxu.h"
           break;
@@ -1009,11 +1013,11 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x7b:
   {
-    switch((insn.bits >> 0x16) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x0:
       {
-        if((insn.bits & 0xffffffe0) == 0xf6000000)
+        if((insn.bits & 0x7ffffff) == 0x7b)
         {
           #include "insns/rdnpc.h"
           break;
@@ -1022,12 +1026,12 @@ switch((insn.bits >> 0x19) & 0x7f)
       }
       case 0x1:
       {
-        if((insn.bits & 0xffff83e0) == 0xf6400000)
+        if((insn.bits & 0x7c1ffff) == 0xfb)
         {
           #include "insns/mfcr.h"
           break;
         }
-        if((insn.bits & 0xffff801f) == 0xf6408000)
+        if((insn.bits & 0xf801ffff) == 0x4fb)
         {
           #include "insns/mtcr.h"
           break;
@@ -1036,7 +1040,7 @@ switch((insn.bits >> 0x19) & 0x7f)
       }
       case 0x2:
       {
-        if((insn.bits & 0xffffffff) == 0xf6800000)
+        if((insn.bits & 0xffffffff) == 0x17b)
         {
           #include "insns/sync.h"
           break;
@@ -1045,7 +1049,7 @@ switch((insn.bits >> 0x19) & 0x7f)
       }
       case 0x3:
       {
-        if((insn.bits & 0xffc003ff) == 0xf6c00000)
+        if((insn.bits & 0xffc003ff) == 0x1fb)
         {
           #include "insns/syscall.h"
           break;