[opcodes] generate latex and verilog correctly
[riscv-isa-sim.git] / riscv / execute.h
index 554962d148f3826fbd69de38e91e7584af4c1a4c..be90e6fbe1e574173986272b9a78ec9ff3e82334 100644 (file)
@@ -3,7 +3,7 @@ switch((insn.bits >> 0x19) & 0x7f)
 {
   case 0x0:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x16) & 0x7)
     {
       case 0x0:
       {
@@ -28,247 +28,454 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x61:
   {
-    #include "insns/j.h"
+    #include "insns/jal.h"
     break;
   }
   case 0x62:
   {
-    #include "insns/j.h"
+    switch((insn.bits >> 0x16) & 0x7)
+    {
+      case 0x0:
+      {
+        #include "insns/jalr_c.h"
+        break;
+      }
+      case 0x1:
+      {
+        #include "insns/jalr_r.h"
+        break;
+      }
+      case 0x2:
+      {
+        #include "insns/jalr_j.h"
+        break;
+      }
+      default:
+      {
+        #include "insns/unimp.h"
+      }
+    }
     break;
   }
   case 0x63:
   {
-    #include "insns/j.h"
-    break;
-  }
-  case 0x64:
-  {
-    #include "insns/jal.h"
-    break;
-  }
-  case 0x65:
-  {
-    #include "insns/jal.h"
+    switch((insn.bits >> 0x16) & 0x7)
+    {
+      case 0x0:
+      {
+        #include "insns/beq.h"
+        break;
+      }
+      case 0x1:
+      {
+        #include "insns/bne.h"
+        break;
+      }
+      case 0x4:
+      {
+        #include "insns/blt.h"
+        break;
+      }
+      case 0x5:
+      {
+        #include "insns/bge.h"
+        break;
+      }
+      case 0x6:
+      {
+        #include "insns/bltu.h"
+        break;
+      }
+      case 0x7:
+      {
+        #include "insns/bgeu.h"
+        break;
+      }
+      default:
+      {
+        #include "insns/unimp.h"
+      }
+    }
     break;
   }
-  case 0x66:
+  case 0x68:
   {
-    #include "insns/jal.h"
+    switch((insn.bits >> 0x16) & 0x7)
+    {
+      case 0x2:
+      {
+        #include "insns/l_s.h"
+        break;
+      }
+      case 0x3:
+      {
+        #include "insns/l_d.h"
+        break;
+      }
+      default:
+      {
+        #include "insns/unimp.h"
+      }
+    }
     break;
   }
-  case 0x67:
+  case 0x69:
   {
-    #include "insns/jal.h"
+    switch((insn.bits >> 0x16) & 0x7)
+    {
+      case 0x2:
+      {
+        #include "insns/s_s.h"
+        break;
+      }
+      case 0x3:
+      {
+        #include "insns/s_d.h"
+        break;
+      }
+      default:
+      {
+        #include "insns/unimp.h"
+      }
+    }
     break;
   }
-  case 0x68:
+  case 0x6a:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x16) & 0x7)
     {
       case 0x0:
       {
-        if((insn.bits & 0xfe007fe0) == 0xd0000820)
+        if((insn.bits & 0xffff8000) == 0xd40a8000)
         {
           #include "insns/c_eq_s.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd00000a0)
+        if((insn.bits & 0xffff8000) == 0xd4028000)
         {
           #include "insns/sgninj_s.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd00004c0)
+        if((insn.bits & 0xfffffc00) == 0xd4070000)
         {
           #include "insns/cvt_s_w.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0000440)
+        if((insn.bits & 0xffff8000) == 0xd4000000)
         {
-          #include "insns/trunc_w_s.h"
+          #include "insns/add_s.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0000000)
+        if((insn.bits & 0xffff83e0) == 0xd42c0000)
         {
-          #include "insns/add_s.h"
+          #include "insns/mff_s.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd00000c0)
+        if((insn.bits & 0xfffffc00) == 0xd42e0000)
         {
-          #include "insns/sgninjn_s.h"
+          #include "insns/mtf_s.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0000400)
+        if((insn.bits & 0xffff8000) == 0xd4030000)
         {
-          #include "insns/trunc_l_s.h"
+          #include "insns/sgninjn_s.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd00004e0)
+        if((insn.bits & 0xfffffc00) == 0xd4078000)
         {
           #include "insns/cvtu_s_w.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0000420)
+        if((insn.bits & 0xfffffc00) == 0xd4068000)
         {
-          #include "insns/truncu_l_s.h"
+          #include "insns/cvtu_s_l.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd00004a0)
+        if((insn.bits & 0xfffffc00) == 0xd4060000)
         {
-          #include "insns/cvtu_s_l.h"
+          #include "insns/cvt_s_l.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0000020)
+        if((insn.bits & 0xffff8000) == 0xd4008000)
         {
           #include "insns/sub_s.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0000080)
+        if((insn.bits & 0xfffffc00) == 0xd4020000)
         {
           #include "insns/sqrt_s.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0000840)
+        if((insn.bits & 0xffff8000) == 0xd40b0000)
         {
           #include "insns/c_lt_s.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd00000e0)
+        if((insn.bits & 0xffff8000) == 0xd4038000)
         {
           #include "insns/sgnmul_s.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0000480)
-        {
-          #include "insns/cvt_s_l.h"
-          break;
-        }
-        if((insn.bits & 0xfe007fe0) == 0xd0000060)
+        if((insn.bits & 0xffff8000) == 0xd4018000)
         {
           #include "insns/div_s.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0000660)
+        if((insn.bits & 0xfffffc00) == 0xd4098000)
         {
           #include "insns/cvt_s_d.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0000860)
+        if((insn.bits & 0xffff8000) == 0xd40b8000)
         {
           #include "insns/c_le_s.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0000040)
+        if((insn.bits & 0xffff8000) == 0xd4010000)
         {
           #include "insns/mul_s.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0000460)
+        #include "insns/unimp.h"
+      }
+      case 0x1:
+      {
+        if((insn.bits & 0xffcffc00) == 0xd4478000)
+        {
+          #include "insns/cvtu_s_w_rm.h"
+          break;
+        }
+        if((insn.bits & 0xffcffc00) == 0xd4440000)
+        {
+          #include "insns/cvt_l_s_rm.h"
+          break;
+        }
+        if((insn.bits & 0xffcffc00) == 0xd4468000)
+        {
+          #include "insns/cvtu_s_l_rm.h"
+          break;
+        }
+        if((insn.bits & 0xffcf8000) == 0xd4410000)
+        {
+          #include "insns/mul_s_rm.h"
+          break;
+        }
+        if((insn.bits & 0xffcffc00) == 0xd4448000)
+        {
+          #include "insns/cvtu_l_s_rm.h"
+          break;
+        }
+        if((insn.bits & 0xffcffc00) == 0xd4470000)
+        {
+          #include "insns/cvt_s_w_rm.h"
+          break;
+        }
+        if((insn.bits & 0xffcffc00) == 0xd4420000)
+        {
+          #include "insns/sqrt_s_rm.h"
+          break;
+        }
+        if((insn.bits & 0xffcffc00) == 0xd4498000)
+        {
+          #include "insns/cvt_s_d_rm.h"
+          break;
+        }
+        if((insn.bits & 0xffcf8000) == 0xd4408000)
+        {
+          #include "insns/sub_s_rm.h"
+          break;
+        }
+        if((insn.bits & 0xffcf8000) == 0xd4418000)
+        {
+          #include "insns/div_s_rm.h"
+          break;
+        }
+        if((insn.bits & 0xffcffc00) == 0xd4460000)
+        {
+          #include "insns/cvt_s_l_rm.h"
+          break;
+        }
+        if((insn.bits & 0xffcf8000) == 0xd4400000)
         {
-          #include "insns/truncu_w_s.h"
+          #include "insns/add_s_rm.h"
+          break;
+        }
+        if((insn.bits & 0xffcffc00) == 0xd4450000)
+        {
+          #include "insns/cvt_w_s_rm.h"
+          break;
+        }
+        if((insn.bits & 0xffcffc00) == 0xd4458000)
+        {
+          #include "insns/cvtu_w_s_rm.h"
           break;
         }
         #include "insns/unimp.h"
       }
       case 0x6:
       {
-        if((insn.bits & 0xfe007fe0) == 0xd00060a0)
+        if((insn.bits & 0xffff83e0) == 0xd5ac0000)
+        {
+          #include "insns/mff_d.h"
+          break;
+        }
+        if((insn.bits & 0xffff8000) == 0xd5828000)
         {
           #include "insns/sgninj_d.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0006820)
+        if((insn.bits & 0xffff8000) == 0xd5818000)
+        {
+          #include "insns/div_d.h"
+          break;
+        }
+        if((insn.bits & 0xffff8000) == 0xd58a8000)
         {
           #include "insns/c_eq_d.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd00064a0)
+        if((insn.bits & 0xfffffc00) == 0xd5868000)
         {
           #include "insns/cvtu_d_l.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0006440)
+        if((insn.bits & 0xfffffc00) == 0xd5878000)
         {
-          #include "insns/trunc_w_d.h"
+          #include "insns/cvtu_d_w.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd00064e0)
+        if((insn.bits & 0xffff83e0) == 0xd5ac8000)
         {
-          #include "insns/cvtu_d_w.h"
+          #include "insns/mffl_d.h"
+          break;
+        }
+        if((insn.bits & 0xffff8000) == 0xd5838000)
+        {
+          #include "insns/sgnmul_d.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0006000)
+        if((insn.bits & 0xffff8000) == 0xd5800000)
         {
           #include "insns/add_d.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0006860)
+        if((insn.bits & 0xffff83e0) == 0xd5ad0000)
         {
-          #include "insns/c_le_d.h"
+          #include "insns/mffh_d.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd00060e0)
+        if((insn.bits & 0xffff8000) == 0xd58b8000)
         {
-          #include "insns/sgnmul_d.h"
+          #include "insns/c_le_d.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd00060c0)
+        if((insn.bits & 0xffff8000) == 0xd5830000)
         {
           #include "insns/sgninjn_d.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0006600)
+        if((insn.bits & 0xffff8000) == 0xd5be0000)
+        {
+          #include "insns/mtflh_d.h"
+          break;
+        }
+        if((insn.bits & 0xffff8000) == 0xd5808000)
+        {
+          #include "insns/sub_d.h"
+          break;
+        }
+        if((insn.bits & 0xfffffc00) == 0xd5ae0000)
+        {
+          #include "insns/mtf_d.h"
+          break;
+        }
+        if((insn.bits & 0xfffffc00) == 0xd5820000)
+        {
+          #include "insns/sqrt_d.h"
+          break;
+        }
+        if((insn.bits & 0xfffffc00) == 0xd5880000)
         {
           #include "insns/cvt_d_s.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0006400)
+        if((insn.bits & 0xfffffc00) == 0xd5870000)
         {
-          #include "insns/trunc_l_d.h"
+          #include "insns/cvt_d_w.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0006420)
+        if((insn.bits & 0xfffffc00) == 0xd5860000)
         {
-          #include "insns/truncu_l_d.h"
+          #include "insns/cvt_d_l.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0006040)
+        if((insn.bits & 0xffff8000) == 0xd5810000)
         {
           #include "insns/mul_d.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0006020)
+        if((insn.bits & 0xffff8000) == 0xd58b0000)
         {
-          #include "insns/sub_d.h"
+          #include "insns/c_lt_d.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0006080)
+        #include "insns/unimp.h"
+      }
+      case 0x7:
+      {
+        if((insn.bits & 0xffcffc00) == 0xd5c60000)
         {
-          #include "insns/sqrt_d.h"
+          #include "insns/cvt_d_l_rm.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0006060)
+        if((insn.bits & 0xffcffc00) == 0xd5c50000)
         {
-          #include "insns/div_d.h"
+          #include "insns/cvt_w_d_rm.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd00064c0)
+        if((insn.bits & 0xffcffc00) == 0xd5c58000)
         {
-          #include "insns/cvt_d_w.h"
+          #include "insns/cvtu_w_d_rm.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0006480)
+        if((insn.bits & 0xffcffc00) == 0xd5c20000)
         {
-          #include "insns/cvt_d_l.h"
+          #include "insns/sqrt_d_rm.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0006460)
+        if((insn.bits & 0xffcffc00) == 0xd5c68000)
         {
-          #include "insns/truncu_w_d.h"
+          #include "insns/cvtu_d_l_rm.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0006840)
+        if((insn.bits & 0xffcf8000) == 0xd5c00000)
         {
-          #include "insns/c_lt_d.h"
+          #include "insns/add_d_rm.h"
+          break;
+        }
+        if((insn.bits & 0xffcffc00) == 0xd5c40000)
+        {
+          #include "insns/cvt_l_d_rm.h"
+          break;
+        }
+        if((insn.bits & 0xffcffc00) == 0xd5c48000)
+        {
+          #include "insns/cvtu_l_d_rm.h"
+          break;
+        }
+        if((insn.bits & 0xffcf8000) == 0xd5c10000)
+        {
+          #include "insns/mul_d_rm.h"
+          break;
+        }
+        if((insn.bits & 0xffcf8000) == 0xd5c18000)
+        {
+          #include "insns/div_d_rm.h"
+          break;
+        }
+        if((insn.bits & 0xffcf8000) == 0xd5c08000)
+        {
+          #include "insns/sub_d_rm.h"
           break;
         }
         #include "insns/unimp.h"
@@ -280,29 +487,46 @@ switch((insn.bits >> 0x19) & 0x7f)
     }
     break;
   }
-  case 0x69:
+  case 0x6b:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x16) & 0x7)
     {
       case 0x0:
       {
-        #include "insns/l_s.h"
-        break;
+        if((insn.bits & 0xffffffe0) == 0xd6008000)
+        {
+          #include "insns/di.h"
+          break;
+        }
+        if((insn.bits & 0xffffffe0) == 0xd6000000)
+        {
+          #include "insns/ei.h"
+          break;
+        }
+        #include "insns/unimp.h"
       }
       case 0x1:
       {
-        #include "insns/s_s.h"
-        break;
-      }
-      case 0x6:
-      {
-        #include "insns/l_d.h"
-        break;
+        if((insn.bits & 0xffff83e0) == 0xd6400000)
+        {
+          #include "insns/mfpcr.h"
+          break;
+        }
+        if((insn.bits & 0xffff801f) == 0xd6408000)
+        {
+          #include "insns/mtpcr.h"
+          break;
+        }
+        #include "insns/unimp.h"
       }
-      case 0x7:
+      case 0x2:
       {
-        #include "insns/s_d.h"
-        break;
+        if((insn.bits & 0xffffffff) == 0xd6800000)
+        {
+          #include "insns/eret.h"
+          break;
+        }
+        #include "insns/unimp.h"
       }
       default:
       {
@@ -311,48 +535,77 @@ switch((insn.bits >> 0x19) & 0x7f)
     }
     break;
   }
-  case 0x6a:
+  case 0x6c:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x16) & 0x7)
     {
       case 0x0:
       {
-        if((insn.bits & 0xfe0fffe0) == 0xd4000800)
-        {
-          #include "insns/mtf_s.h"
-          break;
-        }
-        if((insn.bits & 0xfe0fffe0) == 0xd4000000)
+        if((insn.bits & 0xfff00000) == 0xd8000000)
         {
-          #include "insns/mff_s.h"
+          #include "insns/madd_s.h"
           break;
         }
         #include "insns/unimp.h"
       }
+      case 0x1:
+      {
+        #include "insns/madd_s_rm.h"
+        break;
+      }
       case 0x6:
       {
-        if((insn.bits & 0xfe0fffe0) == 0xd4006000)
-        {
-          #include "insns/mff_d.h"
-          break;
-        }
-        if((insn.bits & 0xfe0fffe0) == 0xd4006c00)
+        if((insn.bits & 0xfff00000) == 0xd9800000)
         {
-          #include "insns/mtfh_d.h"
+          #include "insns/madd_d.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd4006400)
+        #include "insns/unimp.h"
+      }
+      case 0x7:
+      {
+        #include "insns/madd_d_rm.h"
+        break;
+      }
+      default:
+      {
+        #include "insns/unimp.h"
+      }
+    }
+    break;
+  }
+  case 0x6d:
+  {
+    switch((insn.bits >> 0x16) & 0x7)
+    {
+      case 0x0:
+      {
+        if((insn.bits & 0xfff00000) == 0xda000000)
         {
-          #include "insns/mffh_d.h"
+          #include "insns/msub_s.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd4006800)
+        #include "insns/unimp.h"
+      }
+      case 0x1:
+      {
+        #include "insns/msub_s_rm.h"
+        break;
+      }
+      case 0x6:
+      {
+        if((insn.bits & 0xfff00000) == 0xdb800000)
         {
-          #include "insns/mtf_d.h"
+          #include "insns/msub_d.h"
           break;
         }
         #include "insns/unimp.h"
       }
+      case 0x7:
+      {
+        #include "insns/msub_d_rm.h"
+        break;
+      }
       default:
       {
         #include "insns/unimp.h"
@@ -360,58 +613,38 @@ switch((insn.bits >> 0x19) & 0x7f)
     }
     break;
   }
-  case 0x6b:
+  case 0x6e:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x16) & 0x7)
     {
       case 0x0:
       {
-        if((insn.bits & 0xfe007c00) == 0xd6000800)
-        {
-          #include "insns/nmadd_s.h"
-          break;
-        }
-        if((insn.bits & 0xfe007c00) == 0xd6000400)
-        {
-          #include "insns/msub_s.h"
-          break;
-        }
-        if((insn.bits & 0xfe007c00) == 0xd6000c00)
+        if((insn.bits & 0xfff00000) == 0xdc000000)
         {
           #include "insns/nmsub_s.h"
           break;
         }
-        if((insn.bits & 0xfe007c00) == 0xd6000000)
-        {
-          #include "insns/madd_s.h"
-          break;
-        }
         #include "insns/unimp.h"
       }
+      case 0x1:
+      {
+        #include "insns/nmsub_s_rm.h"
+        break;
+      }
       case 0x6:
       {
-        if((insn.bits & 0xfe007c00) == 0xd6006800)
-        {
-          #include "insns/nmadd_d.h"
-          break;
-        }
-        if((insn.bits & 0xfe007c00) == 0xd6006c00)
+        if((insn.bits & 0xfff00000) == 0xdd800000)
         {
           #include "insns/nmsub_d.h"
           break;
         }
-        if((insn.bits & 0xfe007c00) == 0xd6006400)
-        {
-          #include "insns/msub_d.h"
-          break;
-        }
-        if((insn.bits & 0xfe007c00) == 0xd6006000)
-        {
-          #include "insns/madd_d.h"
-          break;
-        }
         #include "insns/unimp.h"
       }
+      case 0x7:
+      {
+        #include "insns/nmsub_d_rm.h"
+        break;
+      }
       default:
       {
         #include "insns/unimp.h"
@@ -419,43 +652,36 @@ switch((insn.bits >> 0x19) & 0x7f)
     }
     break;
   }
-  case 0x71:
-  {
-    #include "insns/lui.h"
-    break;
-  }
-  case 0x73:
+  case 0x6f:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x16) & 0x7)
     {
       case 0x0:
       {
-        #include "insns/beq.h"
-        break;
+        if((insn.bits & 0xfff00000) == 0xde000000)
+        {
+          #include "insns/nmadd_s.h"
+          break;
+        }
+        #include "insns/unimp.h"
       }
       case 0x1:
       {
-        #include "insns/bne.h"
-        break;
-      }
-      case 0x2:
-      {
-        #include "insns/blt.h"
-        break;
-      }
-      case 0x3:
-      {
-        #include "insns/bltu.h"
+        #include "insns/nmadd_s_rm.h"
         break;
       }
-      case 0x4:
+      case 0x6:
       {
-        #include "insns/ble.h"
-        break;
+        if((insn.bits & 0xfff00000) == 0xdf800000)
+        {
+          #include "insns/nmadd_d.h"
+          break;
+        }
+        #include "insns/unimp.h"
       }
-      case 0x5:
+      case 0x7:
       {
-        #include "insns/bleu.h"
+        #include "insns/nmadd_d_rm.h"
         break;
       }
       default:
@@ -465,40 +691,64 @@ switch((insn.bits >> 0x19) & 0x7f)
     }
     break;
   }
+  case 0x71:
+  {
+    #include "insns/lui.h"
+    break;
+  }
   case 0x74:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x16) & 0x7)
     {
       case 0x0:
       {
         #include "insns/addi.h"
         break;
       }
-      case 0x1:
+      case 0x2:
       {
         #include "insns/slti.h"
         break;
       }
-      case 0x2:
+      case 0x3:
       {
         #include "insns/sltiu.h"
         break;
       }
-      case 0x3:
+      case 0x4:
       {
         #include "insns/andi.h"
         break;
       }
-      case 0x4:
+      case 0x5:
       {
         #include "insns/ori.h"
         break;
       }
-      case 0x5:
+      case 0x6:
       {
         #include "insns/xori.h"
         break;
       }
+      case 0x7:
+      {
+        if((insn.bits & 0xffff0000) == 0xe9c20000)
+        {
+          #include "insns/srli.h"
+          break;
+        }
+        if((insn.bits & 0xffff0000) == 0xe9c30000)
+        {
+          #include "insns/srai.h"
+          break;
+        }
+        if((insn.bits & 0xffff0000) == 0xe9c10000)
+        {
+          #include "insns/slli.h"
+          break;
+        }
+        #include "insns/unimp.h"
+      }
       default:
       {
         #include "insns/unimp.h"
@@ -508,46 +758,46 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x75:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x16) & 0x7)
     {
       case 0x0:
       {
-        if((insn.bits & 0xfe007fe0) == 0xea0000e0)
+        if((insn.bits & 0xffff8000) == 0xea000000)
+        {
+          #include "insns/add.h"
+          break;
+        }
+        if((insn.bits & 0xffff8000) == 0xea038000)
         {
           #include "insns/nor.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea000060)
+        if((insn.bits & 0xffff8000) == 0xea018000)
         {
           #include "insns/sltu.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea0000c0)
+        if((insn.bits & 0xffff8000) == 0xea030000)
         {
           #include "insns/xor.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea000020)
+        if((insn.bits & 0xffff8000) == 0xea008000)
         {
           #include "insns/sub.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea0000a0)
+        if((insn.bits & 0xffff8000) == 0xea028000)
         {
           #include "insns/or.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea000000)
-        {
-          #include "insns/add.h"
-          break;
-        }
-        if((insn.bits & 0xfe007fe0) == 0xea000040)
+        if((insn.bits & 0xffff8000) == 0xea010000)
         {
           #include "insns/slt.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea000080)
+        if((insn.bits & 0xffff8000) == 0xea020000)
         {
           #include "insns/and.h"
           break;
@@ -556,85 +806,58 @@ switch((insn.bits >> 0x19) & 0x7f)
       }
       case 0x1:
       {
-        if((insn.bits & 0xfe007fe0) == 0xea001000)
+        if((insn.bits & 0xffff8000) == 0xea400000)
         {
           #include "insns/mul.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea001080)
+        if((insn.bits & 0xffff8000) == 0xea420000)
         {
           #include "insns/div.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea0010c0)
+        if((insn.bits & 0xffff8000) == 0xea430000)
         {
           #include "insns/rem.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea001040)
+        if((insn.bits & 0xffff8000) == 0xea410000)
         {
           #include "insns/mulh.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea0010e0)
+        if((insn.bits & 0xffff8000) == 0xea438000)
         {
           #include "insns/remu.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea001060)
+        if((insn.bits & 0xffff8000) == 0xea418000)
         {
           #include "insns/mulhu.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea0010a0)
+        if((insn.bits & 0xffff8000) == 0xea428000)
         {
           #include "insns/divu.h"
           break;
         }
         #include "insns/unimp.h"
       }
-      case 0x4:
-      {
-        if((insn.bits & 0xfe007fe0) == 0xea004040)
-        {
-          #include "insns/srlv.h"
-          break;
-        }
-        if((insn.bits & 0xfe007fe0) == 0xea004060)
-        {
-          #include "insns/srav.h"
-          break;
-        }
-        if((insn.bits & 0xfe007fe0) == 0xea004020)
-        {
-          #include "insns/sllv.h"
-          break;
-        }
-        #include "insns/unimp.h"
-      }
-      case 0x5:
+      case 0x7:
       {
-        if((insn.bits & 0xfff07800) == 0xea005000)
+        if((insn.bits & 0xffff8000) == 0xebc30000)
         {
-          #include "insns/sll.h"
+          #include "insns/sra.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      case 0x6:
-      {
-        if((insn.bits & 0xfff07800) == 0xea006000)
+        if((insn.bits & 0xffff8000) == 0xebc20000)
         {
           #include "insns/srl.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      case 0x7:
-      {
-        if((insn.bits & 0xfff07800) == 0xea007000)
+        if((insn.bits & 0xffff8000) == 0xebc10000)
         {
-          #include "insns/sra.h"
+          #include "insns/sll.h"
           break;
         }
         #include "insns/unimp.h"
@@ -648,13 +871,32 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x76:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x16) & 0x7)
     {
       case 0x0:
       {
         #include "insns/addiw.h"
         break;
       }
+      case 0x7:
+      {
+        if((insn.bits & 0xffff8000) == 0xedc10000)
+        {
+          #include "insns/slliw.h"
+          break;
+        }
+        if((insn.bits & 0xffff8000) == 0xedc20000)
+        {
+          #include "insns/srliw.h"
+          break;
+        }
+        if((insn.bits & 0xffff8000) == 0xedc30000)
+        {
+          #include "insns/sraiw.h"
+          break;
+        }
+        #include "insns/unimp.h"
+      }
       default:
       {
         #include "insns/unimp.h"
@@ -664,16 +906,16 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x77:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x16) & 0x7)
     {
       case 0x0:
       {
-        if((insn.bits & 0xfe007fe0) == 0xee000000)
+        if((insn.bits & 0xffff8000) == 0xee000000)
         {
           #include "insns/addw.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xee000020)
+        if((insn.bits & 0xffff8000) == 0xee008000)
         {
           #include "insns/subw.h"
           break;
@@ -682,89 +924,62 @@ switch((insn.bits >> 0x19) & 0x7f)
       }
       case 0x1:
       {
-        if((insn.bits & 0xfe007fe0) == 0xee0010e0)
+        if((insn.bits & 0xffff8000) == 0xee438000)
         {
           #include "insns/remuw.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xee0010a0)
+        if((insn.bits & 0xffff8000) == 0xee428000)
         {
           #include "insns/divuw.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xee001060)
+        if((insn.bits & 0xffff8000) == 0xee418000)
         {
           #include "insns/mulhuw.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xee001000)
+        if((insn.bits & 0xffff8000) == 0xee400000)
         {
           #include "insns/mulw.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xee0010c0)
+        if((insn.bits & 0xffff8000) == 0xee430000)
         {
           #include "insns/remw.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xee001040)
+        if((insn.bits & 0xffff8000) == 0xee410000)
         {
           #include "insns/mulhw.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xee001080)
+        if((insn.bits & 0xffff8000) == 0xee420000)
         {
           #include "insns/divw.h"
           break;
         }
         #include "insns/unimp.h"
       }
-      case 0x4:
+      case 0x7:
       {
-        if((insn.bits & 0xfe007fe0) == 0xee004060)
-        {
-          #include "insns/sravw.h"
-          break;
-        }
-        if((insn.bits & 0xfe007fe0) == 0xee004020)
+        if((insn.bits & 0xffff8000) == 0xefc20000)
         {
-          #include "insns/sllvw.h"
+          #include "insns/srlw.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xee004040)
+        if((insn.bits & 0xffff8000) == 0xefc30000)
         {
-          #include "insns/srlvw.h"
+          #include "insns/sraw.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      case 0x5:
-      {
-        if((insn.bits & 0xfff07c00) == 0xee005000)
+        if((insn.bits & 0xffff8000) == 0xefc10000)
         {
           #include "insns/sllw.h"
           break;
         }
         #include "insns/unimp.h"
       }
-      case 0x6:
-      {
-        if((insn.bits & 0xfff07c00) == 0xee006000)
-        {
-          #include "insns/srlw.h"
-          break;
-        }
-        #include "insns/unimp.h"
-      }
-      case 0x7:
-      {
-        if((insn.bits & 0xfff07c00) == 0xee007000)
-        {
-          #include "insns/sraw.h"
-          break;
-        }
-        #include "insns/unimp.h"
-      }
       default:
       {
         #include "insns/unimp.h"
@@ -774,7 +989,7 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x78:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x16) & 0x7)
     {
       case 0x0:
       {
@@ -813,7 +1028,7 @@ switch((insn.bits >> 0x19) & 0x7f)
       }
       case 0x7:
       {
-        if((insn.bits & 0xfff07000) == 0xf0007000)
+        if((insn.bits & 0xffc0001f) == 0xf1c00000)
         {
           #include "insns/synci.h"
           break;
@@ -829,7 +1044,7 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x79:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x16) & 0x7)
     {
       case 0x0:
       {
@@ -860,46 +1075,46 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x7a:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x16) & 0x7)
     {
       case 0x2:
       {
-        if((insn.bits & 0xfe007fe0) == 0xf4002040)
+        if((insn.bits & 0xffff8000) == 0xf4828000)
         {
-          #include "insns/amow_and.h"
+          #include "insns/amow_max.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xf4002080)
+        if((insn.bits & 0xffff8000) == 0xf4810000)
         {
-          #include "insns/amow_min.h"
+          #include "insns/amow_and.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xf4002060)
+        if((insn.bits & 0xffff8000) == 0xf4820000)
         {
-          #include "insns/amow_or.h"
+          #include "insns/amow_min.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xf40020a0)
+        if((insn.bits & 0xffff8000) == 0xf4818000)
         {
-          #include "insns/amow_max.h"
+          #include "insns/amow_or.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xf40020c0)
+        if((insn.bits & 0xffff8000) == 0xf4830000)
         {
           #include "insns/amow_minu.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xf4002000)
+        if((insn.bits & 0xffff8000) == 0xf4800000)
         {
           #include "insns/amow_add.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xf4002020)
+        if((insn.bits & 0xffff8000) == 0xf4808000)
         {
           #include "insns/amow_swap.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xf40020e0)
+        if((insn.bits & 0xffff8000) == 0xf4838000)
         {
           #include "insns/amow_maxu.h"
           break;
@@ -908,42 +1123,42 @@ switch((insn.bits >> 0x19) & 0x7f)
       }
       case 0x3:
       {
-        if((insn.bits & 0xfe007fe0) == 0xf4003000)
+        if((insn.bits & 0xffff8000) == 0xf4c00000)
         {
           #include "insns/amo_add.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xf4003020)
+        if((insn.bits & 0xffff8000) == 0xf4c08000)
         {
           #include "insns/amo_swap.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xf4003060)
+        if((insn.bits & 0xffff8000) == 0xf4c18000)
         {
           #include "insns/amo_or.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xf40030a0)
+        if((insn.bits & 0xffff8000) == 0xf4c28000)
         {
           #include "insns/amo_max.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xf4003080)
+        if((insn.bits & 0xffff8000) == 0xf4c20000)
         {
           #include "insns/amo_min.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xf40030c0)
+        if((insn.bits & 0xffff8000) == 0xf4c30000)
         {
           #include "insns/amo_minu.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xf4003040)
+        if((insn.bits & 0xffff8000) == 0xf4c10000)
         {
           #include "insns/amo_and.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xf40030e0)
+        if((insn.bits & 0xffff8000) == 0xf4c38000)
         {
           #include "insns/amo_maxu.h"
           break;
@@ -959,137 +1174,49 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x7b:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x16) & 0x7)
     {
       case 0x0:
       {
-        if((insn.bits & 0xfe0fffe0) == 0xf6000000)
-        {
-          #include "insns/jalr_c.h"
-          break;
-        }
-        if((insn.bits & 0xfe0fffe0) == 0xf6000040)
-        {
-          #include "insns/jalr_j.h"
-          break;
-        }
-        if((insn.bits & 0xfe0fffe0) == 0xf6000020)
+        if((insn.bits & 0xffffffe0) == 0xf6000000)
         {
-          #include "insns/jalr_r.h"
+          #include "insns/rdnpc.h"
           break;
         }
         #include "insns/unimp.h"
       }
       case 0x1:
       {
-        if((insn.bits & 0xffffffe0) == 0xf6001000)
-        {
-          #include "insns/rdpc.h"
-          break;
-        }
-        #include "insns/unimp.h"
-      }
-      case 0x2:
-      {
-        if((insn.bits & 0xfff07fe0) == 0xf6002000)
+        if((insn.bits & 0xffff83e0) == 0xf6400000)
         {
           #include "insns/mfcr.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      case 0x3:
-      {
-        if((insn.bits & 0xfe007fff) == 0xf6003000)
+        if((insn.bits & 0xffff801f) == 0xf6408000)
         {
           #include "insns/mtcr.h"
           break;
         }
         #include "insns/unimp.h"
       }
-      case 0x4:
+      case 0x2:
       {
-        if((insn.bits & 0xffffffff) == 0xf6004000)
+        if((insn.bits & 0xffffffff) == 0xf6800000)
         {
           #include "insns/sync.h"
           break;
         }
         #include "insns/unimp.h"
       }
-      case 0x5:
+      case 0x3:
       {
-        if((insn.bits & 0xffffffff) == 0xf6005000)
+        if((insn.bits & 0xffc003ff) == 0xf6c00000)
         {
           #include "insns/syscall.h"
           break;
         }
         #include "insns/unimp.h"
       }
-      case 0x6:
-      {
-        if((insn.bits & 0xffffffff) == 0xf6006000)
-        {
-          #include "insns/break.h"
-          break;
-        }
-        #include "insns/unimp.h"
-      }
-      default:
-      {
-        #include "insns/unimp.h"
-      }
-    }
-    break;
-  }
-  case 0x7e:
-  {
-    switch((insn.bits >> 0xc) & 0x7)
-    {
-      case 0x0:
-      {
-        if((insn.bits & 0xffffffe0) == 0xfc000000)
-        {
-          #include "insns/ei.h"
-          break;
-        }
-        #include "insns/unimp.h"
-      }
-      case 0x1:
-      {
-        if((insn.bits & 0xffffffe0) == 0xfc001000)
-        {
-          #include "insns/di.h"
-          break;
-        }
-        #include "insns/unimp.h"
-      }
-      case 0x2:
-      {
-        if((insn.bits & 0xffffffff) == 0xfc002000)
-        {
-          #include "insns/eret.h"
-          break;
-        }
-        #include "insns/unimp.h"
-      }
-      case 0x4:
-      {
-        if((insn.bits & 0xfff07fe0) == 0xfc004000)
-        {
-          #include "insns/mfpcr.h"
-          break;
-        }
-        #include "insns/unimp.h"
-      }
-      case 0x5:
-      {
-        if((insn.bits & 0xfe007fff) == 0xfc005000)
-        {
-          #include "insns/mtpcr.h"
-          break;
-        }
-        #include "insns/unimp.h"
-      }
       default:
       {
         #include "insns/unimp.h"