[sim,pk] fixed minor pk bugs and trap codes
[riscv-isa-sim.git] / riscv / execute.h
index 554962d148f3826fbd69de38e91e7584af4c1a4c..ad21a0bd25f6622cfc34c50cd50fe0511d61bd12 100644 (file)
 /* Automatically generated by parse-opcodes */
-switch((insn.bits >> 0x19) & 0x7f)
+switch((insn.bits >> 0x0) & 0x7f)
 {
   case 0x0:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    #include "insns/c_addi.h"
+    break;
+  }
+  case 0x1:
+  {
+    #include "insns/c_li.h"
+    break;
+  }
+  case 0x2:
+  {
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x0:
       {
-        if((insn.bits & 0xffffffff) == 0x0)
+        if((insn.bits & 0x801f) == 0x2)
+        {
+          #include "insns/c_move.h"
+          break;
+        }
+        if((insn.bits & 0x801f) == 0x8002)
+        {
+          #include "insns/c_j.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x1:
+      {
+        if((insn.bits & 0x801f) == 0x2)
+        {
+          #include "insns/c_move.h"
+          break;
+        }
+        if((insn.bits & 0x801f) == 0x8002)
+        {
+          #include "insns/c_j.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x2:
+      {
+        if((insn.bits & 0x801f) == 0x2)
+        {
+          #include "insns/c_move.h"
+          break;
+        }
+        if((insn.bits & 0x801f) == 0x8002)
+        {
+          #include "insns/c_j.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x3:
+      {
+        if((insn.bits & 0x801f) == 0x2)
+        {
+          #include "insns/c_move.h"
+          break;
+        }
+        if((insn.bits & 0x801f) == 0x8002)
+        {
+          #include "insns/c_j.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x4:
+      {
+        if((insn.bits & 0x801f) == 0x2)
+        {
+          #include "insns/c_move.h"
+          break;
+        }
+        if((insn.bits & 0x801f) == 0x8002)
+        {
+          #include "insns/c_j.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x5:
+      {
+        if((insn.bits & 0x801f) == 0x2)
+        {
+          #include "insns/c_move.h"
+          break;
+        }
+        if((insn.bits & 0x801f) == 0x8002)
+        {
+          #include "insns/c_j.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x6:
+      {
+        if((insn.bits & 0x801f) == 0x2)
+        {
+          #include "insns/c_move.h"
+          break;
+        }
+        if((insn.bits & 0x801f) == 0x8002)
+        {
+          #include "insns/c_j.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x7:
+      {
+        if((insn.bits & 0x801f) == 0x2)
+        {
+          #include "insns/c_move.h"
+          break;
+        }
+        if((insn.bits & 0x801f) == 0x8002)
         {
-          #include "insns/unimp.h"
+          #include "insns/c_j.h"
           break;
         }
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
       default:
       {
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
     }
     break;
   }
-  case 0x60:
-  {
-    #include "insns/j.h"
-    break;
-  }
-  case 0x61:
-  {
-    #include "insns/j.h"
-    break;
-  }
-  case 0x62:
-  {
-    #include "insns/j.h"
-    break;
-  }
-  case 0x63:
-  {
-    #include "insns/j.h"
-    break;
-  }
-  case 0x64:
-  {
-    #include "insns/jal.h"
-    break;
-  }
-  case 0x65:
+  case 0x3:
   {
-    #include "insns/jal.h"
-    break;
-  }
-  case 0x66:
-  {
-    #include "insns/jal.h"
+    switch((insn.bits >> 0x7) & 0x7)
+    {
+      case 0x0:
+      {
+        #include "insns/lb.h"
+        break;
+      }
+      case 0x1:
+      {
+        #include "insns/lh.h"
+        break;
+      }
+      case 0x2:
+      {
+        #include "insns/lw.h"
+        break;
+      }
+      case 0x3:
+      {
+        #include "insns/ld.h"
+        break;
+      }
+      case 0x4:
+      {
+        #include "insns/lbu.h"
+        break;
+      }
+      case 0x5:
+      {
+        #include "insns/lhu.h"
+        break;
+      }
+      case 0x6:
+      {
+        #include "insns/lwu.h"
+        break;
+      }
+      default:
+      {
+        throw trap_illegal_instruction;
+      }
+    }
     break;
   }
-  case 0x67:
+  case 0x7:
   {
-    #include "insns/jal.h"
+    switch((insn.bits >> 0x7) & 0x7)
+    {
+      case 0x2:
+      {
+        #include "insns/flw.h"
+        break;
+      }
+      case 0x3:
+      {
+        #include "insns/fld.h"
+        break;
+      }
+      default:
+      {
+        throw trap_illegal_instruction;
+      }
+    }
     break;
   }
-  case 0x68:
+  case 0xb:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x0:
       {
-        if((insn.bits & 0xfe007fe0) == 0xd0000820)
+        if((insn.bits & 0x1ffff) == 0x280b)
+        {
+          #include "insns/sbseg_v.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x100b)
+        {
+          #include "insns/lbst_v.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x180b)
         {
-          #include "insns/c_eq_s.h"
+          #include "insns/sbst_v.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd00000a0)
+        if((insn.bits & 0x3fffff) == 0xb)
         {
-          #include "insns/sgninj_s.h"
+          #include "insns/lb_v.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd00004c0)
+        if((insn.bits & 0x1ffff) == 0x200b)
         {
-          #include "insns/cvt_s_w.h"
+          #include "insns/lbseg_v.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0000440)
+        if((insn.bits & 0x3fffff) == 0x1000b)
         {
-          #include "insns/trunc_w_s.h"
+          #include "insns/mov_vv.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0000000)
+        if((insn.bits & 0x3fffff) == 0x1800b)
         {
-          #include "insns/add_s.h"
+          #include "insns/fmov_vv.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd00000c0)
+        if((insn.bits & 0x3fffff) == 0x80b)
         {
-          #include "insns/sgninjn_s.h"
+          #include "insns/sb_v.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0000400)
+        throw trap_illegal_instruction;
+      }
+      case 0x1:
+      {
+        if((insn.bits & 0x1ffff) == 0x208b)
         {
-          #include "insns/trunc_l_s.h"
+          #include "insns/lhseg_v.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd00004e0)
+        if((insn.bits & 0x1ffff) == 0x108b)
         {
-          #include "insns/cvtu_s_w.h"
+          #include "insns/lhst_v.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0000420)
+        if((insn.bits & 0x3fffff) == 0x1008b)
         {
-          #include "insns/truncu_l_s.h"
+          #include "insns/mov_sv.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd00004a0)
+        if((insn.bits & 0x3fffff) == 0x1808b)
         {
-          #include "insns/cvtu_s_l.h"
+          #include "insns/fmov_sv.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0000020)
+        if((insn.bits & 0x3fffff) == 0x8b)
         {
-          #include "insns/sub_s.h"
+          #include "insns/lh_v.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0000080)
+        if((insn.bits & 0x3fffff) == 0x88b)
         {
-          #include "insns/sqrt_s.h"
+          #include "insns/sh_v.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0000840)
+        if((insn.bits & 0x1ffff) == 0x288b)
         {
-          #include "insns/c_lt_s.h"
+          #include "insns/shseg_v.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd00000e0)
+        if((insn.bits & 0x1ffff) == 0x188b)
         {
-          #include "insns/sgnmul_s.h"
+          #include "insns/shst_v.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0000480)
+        throw trap_illegal_instruction;
+      }
+      case 0x2:
+      {
+        if((insn.bits & 0x3fffff) == 0x10b)
         {
-          #include "insns/cvt_s_l.h"
+          #include "insns/lw_v.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0000060)
+        if((insn.bits & 0x1ffff) == 0x1810b)
         {
-          #include "insns/div_s.h"
+          #include "insns/fmov_su.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0000660)
+        if((insn.bits & 0x1ffff) == 0x290b)
         {
-          #include "insns/cvt_s_d.h"
+          #include "insns/swseg_v.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0000860)
+        if((insn.bits & 0x1ffff) == 0x1010b)
         {
-          #include "insns/c_le_s.h"
+          #include "insns/mov_su.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0000040)
+        if((insn.bits & 0x1ffff) == 0x1d0b)
         {
-          #include "insns/mul_s.h"
+          #include "insns/fswst_v.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0000460)
+        if((insn.bits & 0x1ffff) == 0x190b)
         {
-          #include "insns/truncu_w_s.h"
+          #include "insns/swst_v.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      case 0x6:
-      {
-        if((insn.bits & 0xfe007fe0) == 0xd00060a0)
+        if((insn.bits & 0x3fffff) == 0xd0b)
         {
-          #include "insns/sgninj_d.h"
+          #include "insns/fsw_v.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0006820)
+        if((insn.bits & 0x1ffff) == 0x250b)
         {
-          #include "insns/c_eq_d.h"
+          #include "insns/flwseg_v.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd00064a0)
+        if((insn.bits & 0x3fffff) == 0x50b)
         {
-          #include "insns/cvtu_d_l.h"
+          #include "insns/flw_v.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0006440)
+        if((insn.bits & 0x3fffff) == 0x90b)
         {
-          #include "insns/trunc_w_d.h"
+          #include "insns/sw_v.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd00064e0)
+        if((insn.bits & 0x1ffff) == 0x150b)
         {
-          #include "insns/cvtu_d_w.h"
+          #include "insns/flwst_v.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0006000)
+        if((insn.bits & 0x1ffff) == 0x210b)
         {
-          #include "insns/add_d.h"
+          #include "insns/lwseg_v.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0006860)
+        if((insn.bits & 0x1ffff) == 0x2d0b)
         {
-          #include "insns/c_le_d.h"
+          #include "insns/fswseg_v.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd00060e0)
+        if((insn.bits & 0x1ffff) == 0x110b)
         {
-          #include "insns/sgnmul_d.h"
+          #include "insns/lwst_v.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd00060c0)
+        throw trap_illegal_instruction;
+      }
+      case 0x3:
+      {
+        if((insn.bits & 0x1ffff) == 0x218b)
         {
-          #include "insns/sgninjn_d.h"
+          #include "insns/ldseg_v.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0006600)
+        if((insn.bits & 0x3fffff) == 0x58b)
         {
-          #include "insns/cvt_d_s.h"
+          #include "insns/fld_v.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0006400)
+        if((insn.bits & 0x3fffff) == 0x18b)
         {
-          #include "insns/trunc_l_d.h"
+          #include "insns/ld_v.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0006420)
+        if((insn.bits & 0x3fffff) == 0xd8b)
         {
-          #include "insns/truncu_l_d.h"
+          #include "insns/fsd_v.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0006040)
+        if((insn.bits & 0x1ffff) == 0x2d8b)
         {
-          #include "insns/mul_d.h"
+          #include "insns/fsdseg_v.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0006020)
+        if((insn.bits & 0x1ffff) == 0x1d8b)
         {
-          #include "insns/sub_d.h"
+          #include "insns/fsdst_v.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0006080)
+        if((insn.bits & 0x1ffff) == 0x118b)
         {
-          #include "insns/sqrt_d.h"
+          #include "insns/ldst_v.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0006060)
+        if((insn.bits & 0x1ffff) == 0x258b)
         {
-          #include "insns/div_d.h"
+          #include "insns/fldseg_v.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd00064c0)
+        if((insn.bits & 0x1ffff) == 0x1018b)
         {
-          #include "insns/cvt_d_w.h"
+          #include "insns/mov_us.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0006480)
+        if((insn.bits & 0x1ffff) == 0x158b)
         {
-          #include "insns/cvt_d_l.h"
+          #include "insns/fldst_v.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0006460)
+        if((insn.bits & 0x1ffff) == 0x298b)
         {
-          #include "insns/truncu_w_d.h"
+          #include "insns/sdseg_v.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0006840)
+        if((insn.bits & 0x1ffff) == 0x1818b)
         {
-          #include "insns/c_lt_d.h"
+          #include "insns/fmov_us.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      default:
-      {
-        #include "insns/unimp.h"
+        if((insn.bits & 0x3fffff) == 0x98b)
+        {
+          #include "insns/sd_v.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x198b)
+        {
+          #include "insns/sdst_v.h"
+          break;
+        }
+        throw trap_illegal_instruction;
       }
-    }
-    break;
-  }
-  case 0x69:
-  {
-    switch((insn.bits >> 0xc) & 0x7)
-    {
-      case 0x0:
+      case 0x4:
       {
-        #include "insns/l_s.h"
-        break;
+        if((insn.bits & 0x3fffff) == 0x20b)
+        {
+          #include "insns/lbu_v.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x220b)
+        {
+          #include "insns/lbuseg_v.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x120b)
+        {
+          #include "insns/lbust_v.h"
+          break;
+        }
+        throw trap_illegal_instruction;
       }
-      case 0x1:
+      case 0x5:
       {
-        #include "insns/s_s.h"
-        break;
+        if((insn.bits & 0x1ffff) == 0x128b)
+        {
+          #include "insns/lhust_v.h"
+          break;
+        }
+        if((insn.bits & 0x3fffff) == 0x28b)
+        {
+          #include "insns/lhu_v.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x228b)
+        {
+          #include "insns/lhuseg_v.h"
+          break;
+        }
+        throw trap_illegal_instruction;
       }
       case 0x6:
       {
-        #include "insns/l_d.h"
-        break;
-      }
-      case 0x7:
-      {
-        #include "insns/s_d.h"
-        break;
+        if((insn.bits & 0x1ffff) == 0x230b)
+        {
+          #include "insns/lwuseg_v.h"
+          break;
+        }
+        if((insn.bits & 0x3fffff) == 0x30b)
+        {
+          #include "insns/lwu_v.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x130b)
+        {
+          #include "insns/lwust_v.h"
+          break;
+        }
+        throw trap_illegal_instruction;
       }
       default:
       {
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
     }
     break;
   }
-  case 0x6a:
+  case 0xf:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x0:
       {
-        if((insn.bits & 0xfe0fffe0) == 0xd4000800)
+        if((insn.bits & 0xfff) == 0x80f)
         {
-          #include "insns/mtf_s.h"
+          #include "insns/sbsegst_v.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd4000000)
+        if((insn.bits & 0xfff) == 0xf)
         {
-          #include "insns/mff_s.h"
+          #include "insns/lbsegst_v.h"
           break;
         }
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
-      case 0x6:
+      case 0x1:
       {
-        if((insn.bits & 0xfe0fffe0) == 0xd4006000)
-        {
-          #include "insns/mff_d.h"
-          break;
-        }
-        if((insn.bits & 0xfe0fffe0) == 0xd4006c00)
-        {
-          #include "insns/mtfh_d.h"
-          break;
-        }
-        if((insn.bits & 0xfe0fffe0) == 0xd4006400)
+        if((insn.bits & 0xfff) == 0x88f)
         {
-          #include "insns/mffh_d.h"
+          #include "insns/shsegst_v.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd4006800)
+        if((insn.bits & 0xfff) == 0x8f)
         {
-          #include "insns/mtf_d.h"
+          #include "insns/lhsegst_v.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      default:
-      {
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
-    }
-    break;
-  }
-  case 0x6b:
-  {
-    switch((insn.bits >> 0xc) & 0x7)
-    {
-      case 0x0:
+      case 0x2:
       {
-        if((insn.bits & 0xfe007c00) == 0xd6000800)
+        if((insn.bits & 0xfff) == 0xd0f)
         {
-          #include "insns/nmadd_s.h"
+          #include "insns/fswsegst_v.h"
           break;
         }
-        if((insn.bits & 0xfe007c00) == 0xd6000400)
+        if((insn.bits & 0xfff) == 0x50f)
         {
-          #include "insns/msub_s.h"
+          #include "insns/flwsegst_v.h"
           break;
         }
-        if((insn.bits & 0xfe007c00) == 0xd6000c00)
+        if((insn.bits & 0xfff) == 0x10f)
         {
-          #include "insns/nmsub_s.h"
+          #include "insns/lwsegst_v.h"
           break;
         }
-        if((insn.bits & 0xfe007c00) == 0xd6000000)
+        if((insn.bits & 0xfff) == 0x90f)
         {
-          #include "insns/madd_s.h"
+          #include "insns/swsegst_v.h"
           break;
         }
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
-      case 0x6:
+      case 0x3:
       {
-        if((insn.bits & 0xfe007c00) == 0xd6006800)
+        if((insn.bits & 0xfff) == 0x18f)
         {
-          #include "insns/nmadd_d.h"
+          #include "insns/ldsegst_v.h"
           break;
         }
-        if((insn.bits & 0xfe007c00) == 0xd6006c00)
+        if((insn.bits & 0xfff) == 0x98f)
         {
-          #include "insns/nmsub_d.h"
+          #include "insns/sdsegst_v.h"
           break;
         }
-        if((insn.bits & 0xfe007c00) == 0xd6006400)
+        if((insn.bits & 0xfff) == 0x58f)
         {
-          #include "insns/msub_d.h"
+          #include "insns/fldsegst_v.h"
           break;
         }
-        if((insn.bits & 0xfe007c00) == 0xd6006000)
+        if((insn.bits & 0xfff) == 0xd8f)
         {
-          #include "insns/madd_d.h"
+          #include "insns/fsdsegst_v.h"
           break;
         }
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
-      default:
+      case 0x4:
       {
-        #include "insns/unimp.h"
+        if((insn.bits & 0xfff) == 0x20f)
+        {
+          #include "insns/lbusegst_v.h"
+          break;
+        }
+        throw trap_illegal_instruction;
       }
-    }
-    break;
-  }
-  case 0x71:
-  {
+      case 0x5:
+      {
+        if((insn.bits & 0xfff) == 0x28f)
+        {
+          #include "insns/lhusegst_v.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x6:
+      {
+        if((insn.bits & 0xfff) == 0x30f)
+        {
+          #include "insns/lwusegst_v.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      default:
+      {
+        throw trap_illegal_instruction;
+      }
+    }
+    break;
+  }
+  case 0x13:
+  {
+    switch((insn.bits >> 0x7) & 0x7)
+    {
+      case 0x0:
+      {
+        #include "insns/addi.h"
+        break;
+      }
+      case 0x1:
+      {
+        if((insn.bits & 0x3f03ff) == 0x93)
+        {
+          #include "insns/slli.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x2:
+      {
+        #include "insns/slti.h"
+        break;
+      }
+      case 0x3:
+      {
+        #include "insns/sltiu.h"
+        break;
+      }
+      case 0x4:
+      {
+        #include "insns/xori.h"
+        break;
+      }
+      case 0x5:
+      {
+        if((insn.bits & 0x3f03ff) == 0x293)
+        {
+          #include "insns/srli.h"
+          break;
+        }
+        if((insn.bits & 0x3f03ff) == 0x10293)
+        {
+          #include "insns/srai.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x6:
+      {
+        #include "insns/ori.h"
+        break;
+      }
+      case 0x7:
+      {
+        #include "insns/andi.h"
+        break;
+      }
+      default:
+      {
+        throw trap_illegal_instruction;
+      }
+    }
+    break;
+  }
+  case 0x1b:
+  {
+    switch((insn.bits >> 0x7) & 0x7)
+    {
+      case 0x0:
+      {
+        #include "insns/addiw.h"
+        break;
+      }
+      case 0x1:
+      {
+        if((insn.bits & 0x3f83ff) == 0x9b)
+        {
+          #include "insns/slliw.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x5:
+      {
+        if((insn.bits & 0x3f83ff) == 0x29b)
+        {
+          #include "insns/srliw.h"
+          break;
+        }
+        if((insn.bits & 0x3f83ff) == 0x1029b)
+        {
+          #include "insns/sraiw.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      default:
+      {
+        throw trap_illegal_instruction;
+      }
+    }
+    break;
+  }
+  case 0x20:
+  {
+    #include "insns/c_addi.h"
+    break;
+  }
+  case 0x21:
+  {
+    #include "insns/c_li.h"
+    break;
+  }
+  case 0x22:
+  {
+    switch((insn.bits >> 0x7) & 0x7)
+    {
+      case 0x0:
+      {
+        if((insn.bits & 0x801f) == 0x2)
+        {
+          #include "insns/c_move.h"
+          break;
+        }
+        if((insn.bits & 0x801f) == 0x8002)
+        {
+          #include "insns/c_j.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x1:
+      {
+        if((insn.bits & 0x801f) == 0x2)
+        {
+          #include "insns/c_move.h"
+          break;
+        }
+        if((insn.bits & 0x801f) == 0x8002)
+        {
+          #include "insns/c_j.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x2:
+      {
+        if((insn.bits & 0x801f) == 0x2)
+        {
+          #include "insns/c_move.h"
+          break;
+        }
+        if((insn.bits & 0x801f) == 0x8002)
+        {
+          #include "insns/c_j.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x3:
+      {
+        if((insn.bits & 0x801f) == 0x2)
+        {
+          #include "insns/c_move.h"
+          break;
+        }
+        if((insn.bits & 0x801f) == 0x8002)
+        {
+          #include "insns/c_j.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x4:
+      {
+        if((insn.bits & 0x801f) == 0x2)
+        {
+          #include "insns/c_move.h"
+          break;
+        }
+        if((insn.bits & 0x801f) == 0x8002)
+        {
+          #include "insns/c_j.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x5:
+      {
+        if((insn.bits & 0x801f) == 0x2)
+        {
+          #include "insns/c_move.h"
+          break;
+        }
+        if((insn.bits & 0x801f) == 0x8002)
+        {
+          #include "insns/c_j.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x6:
+      {
+        if((insn.bits & 0x801f) == 0x2)
+        {
+          #include "insns/c_move.h"
+          break;
+        }
+        if((insn.bits & 0x801f) == 0x8002)
+        {
+          #include "insns/c_j.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x7:
+      {
+        if((insn.bits & 0x801f) == 0x2)
+        {
+          #include "insns/c_move.h"
+          break;
+        }
+        if((insn.bits & 0x801f) == 0x8002)
+        {
+          #include "insns/c_j.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      default:
+      {
+        throw trap_illegal_instruction;
+      }
+    }
+    break;
+  }
+  case 0x23:
+  {
+    switch((insn.bits >> 0x7) & 0x7)
+    {
+      case 0x0:
+      {
+        #include "insns/sb.h"
+        break;
+      }
+      case 0x1:
+      {
+        #include "insns/sh.h"
+        break;
+      }
+      case 0x2:
+      {
+        #include "insns/sw.h"
+        break;
+      }
+      case 0x3:
+      {
+        #include "insns/sd.h"
+        break;
+      }
+      default:
+      {
+        throw trap_illegal_instruction;
+      }
+    }
+    break;
+  }
+  case 0x27:
+  {
+    switch((insn.bits >> 0x7) & 0x7)
+    {
+      case 0x2:
+      {
+        #include "insns/fsw.h"
+        break;
+      }
+      case 0x3:
+      {
+        #include "insns/fsd.h"
+        break;
+      }
+      default:
+      {
+        throw trap_illegal_instruction;
+      }
+    }
+    break;
+  }
+  case 0x2b:
+  {
+    switch((insn.bits >> 0x7) & 0x7)
+    {
+      case 0x2:
+      {
+        if((insn.bits & 0x1ffff) == 0x192b)
+        {
+          #include "insns/amominu_w.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x92b)
+        {
+          #include "insns/amoand_w.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x1d2b)
+        {
+          #include "insns/amomaxu_w.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x152b)
+        {
+          #include "insns/amomax_w.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x12b)
+        {
+          #include "insns/amoadd_w.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0xd2b)
+        {
+          #include "insns/amoor_w.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x112b)
+        {
+          #include "insns/amomin_w.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x52b)
+        {
+          #include "insns/amoswap_w.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x3:
+      {
+        if((insn.bits & 0x1ffff) == 0x19ab)
+        {
+          #include "insns/amominu_d.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x9ab)
+        {
+          #include "insns/amoand_d.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x1dab)
+        {
+          #include "insns/amomaxu_d.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x1ab)
+        {
+          #include "insns/amoadd_d.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x15ab)
+        {
+          #include "insns/amomax_d.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0xdab)
+        {
+          #include "insns/amoor_d.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x5ab)
+        {
+          #include "insns/amoswap_d.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x11ab)
+        {
+          #include "insns/amomin_d.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      default:
+      {
+        throw trap_illegal_instruction;
+      }
+    }
+    break;
+  }
+  case 0x2f:
+  {
+    switch((insn.bits >> 0x7) & 0x7)
+    {
+      case 0x1:
+      {
+        #include "insns/fence_i.h"
+        break;
+      }
+      case 0x2:
+      {
+        #include "insns/fence.h"
+        break;
+      }
+      case 0x4:
+      {
+        #include "insns/fence_l_v.h"
+        break;
+      }
+      case 0x5:
+      {
+        #include "insns/fence_g_v.h"
+        break;
+      }
+      case 0x6:
+      {
+        #include "insns/fence_l_cv.h"
+        break;
+      }
+      case 0x7:
+      {
+        #include "insns/fence_g_cv.h"
+        break;
+      }
+      default:
+      {
+        throw trap_illegal_instruction;
+      }
+    }
+    break;
+  }
+  case 0x33:
+  {
+    switch((insn.bits >> 0x7) & 0x7)
+    {
+      case 0x0:
+      {
+        if((insn.bits & 0x1ffff) == 0x33)
+        {
+          #include "insns/add.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x433)
+        {
+          #include "insns/mul.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x10033)
+        {
+          #include "insns/sub.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x1:
+      {
+        if((insn.bits & 0x1ffff) == 0xb3)
+        {
+          #include "insns/sll.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x4b3)
+        {
+          #include "insns/mulh.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x2:
+      {
+        if((insn.bits & 0x1ffff) == 0x533)
+        {
+          #include "insns/mulhsu.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x133)
+        {
+          #include "insns/slt.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x3:
+      {
+        if((insn.bits & 0x1ffff) == 0x1b3)
+        {
+          #include "insns/sltu.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x5b3)
+        {
+          #include "insns/mulhu.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x4:
+      {
+        if((insn.bits & 0x1ffff) == 0x633)
+        {
+          #include "insns/div.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x233)
+        {
+          #include "insns/xor.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x5:
+      {
+        if((insn.bits & 0x1ffff) == 0x102b3)
+        {
+          #include "insns/sra.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x2b3)
+        {
+          #include "insns/srl.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x6b3)
+        {
+          #include "insns/divu.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x6:
+      {
+        if((insn.bits & 0x1ffff) == 0x733)
+        {
+          #include "insns/rem.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x333)
+        {
+          #include "insns/or.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x7:
+      {
+        if((insn.bits & 0x1ffff) == 0x7b3)
+        {
+          #include "insns/remu.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x3b3)
+        {
+          #include "insns/and.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      default:
+      {
+        throw trap_illegal_instruction;
+      }
+    }
+    break;
+  }
+  case 0x37:
+  {
     #include "insns/lui.h"
     break;
   }
-  case 0x73:
+  case 0x3b:
+  {
+    switch((insn.bits >> 0x7) & 0x7)
+    {
+      case 0x0:
+      {
+        if((insn.bits & 0x1ffff) == 0x43b)
+        {
+          #include "insns/mulw.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x3b)
+        {
+          #include "insns/addw.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x1003b)
+        {
+          #include "insns/subw.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x1:
+      {
+        if((insn.bits & 0x1ffff) == 0xbb)
+        {
+          #include "insns/sllw.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x4:
+      {
+        if((insn.bits & 0x1ffff) == 0x63b)
+        {
+          #include "insns/divw.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x5:
+      {
+        if((insn.bits & 0x1ffff) == 0x6bb)
+        {
+          #include "insns/divuw.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x2bb)
+        {
+          #include "insns/srlw.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x102bb)
+        {
+          #include "insns/sraw.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x6:
+      {
+        if((insn.bits & 0x1ffff) == 0x73b)
+        {
+          #include "insns/remw.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x7:
+      {
+        if((insn.bits & 0x1ffff) == 0x7bb)
+        {
+          #include "insns/remuw.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      default:
+      {
+        throw trap_illegal_instruction;
+      }
+    }
+    break;
+  }
+  case 0x40:
+  {
+    #include "insns/c_addi.h"
+    break;
+  }
+  case 0x41:
+  {
+    #include "insns/c_li.h"
+    break;
+  }
+  case 0x42:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x0:
       {
-        #include "insns/beq.h"
+        if((insn.bits & 0x801f) == 0x2)
+        {
+          #include "insns/c_move.h"
+          break;
+        }
+        if((insn.bits & 0x801f) == 0x8002)
+        {
+          #include "insns/c_j.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x1:
+      {
+        if((insn.bits & 0x801f) == 0x2)
+        {
+          #include "insns/c_move.h"
+          break;
+        }
+        if((insn.bits & 0x801f) == 0x8002)
+        {
+          #include "insns/c_j.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x2:
+      {
+        if((insn.bits & 0x801f) == 0x2)
+        {
+          #include "insns/c_move.h"
+          break;
+        }
+        if((insn.bits & 0x801f) == 0x8002)
+        {
+          #include "insns/c_j.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x3:
+      {
+        if((insn.bits & 0x801f) == 0x2)
+        {
+          #include "insns/c_move.h"
+          break;
+        }
+        if((insn.bits & 0x801f) == 0x8002)
+        {
+          #include "insns/c_j.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x4:
+      {
+        if((insn.bits & 0x801f) == 0x2)
+        {
+          #include "insns/c_move.h"
+          break;
+        }
+        if((insn.bits & 0x801f) == 0x8002)
+        {
+          #include "insns/c_j.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x5:
+      {
+        if((insn.bits & 0x801f) == 0x2)
+        {
+          #include "insns/c_move.h"
+          break;
+        }
+        if((insn.bits & 0x801f) == 0x8002)
+        {
+          #include "insns/c_j.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x6:
+      {
+        if((insn.bits & 0x801f) == 0x2)
+        {
+          #include "insns/c_move.h"
+          break;
+        }
+        if((insn.bits & 0x801f) == 0x8002)
+        {
+          #include "insns/c_j.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x7:
+      {
+        if((insn.bits & 0x801f) == 0x2)
+        {
+          #include "insns/c_move.h"
+          break;
+        }
+        if((insn.bits & 0x801f) == 0x8002)
+        {
+          #include "insns/c_j.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      default:
+      {
+        throw trap_illegal_instruction;
+      }
+    }
+    break;
+  }
+  case 0x43:
+  {
+    switch((insn.bits >> 0x7) & 0x7)
+    {
+      case 0x0:
+      {
+        #include "insns/fmadd_s.h"
         break;
       }
       case 0x1:
       {
-        #include "insns/bne.h"
+        #include "insns/fmadd_d.h"
         break;
       }
-      case 0x2:
+      case 0x4:
       {
-        #include "insns/blt.h"
+        #include "insns/fmadd_s.h"
         break;
       }
-      case 0x3:
+      case 0x5:
       {
-        #include "insns/bltu.h"
+        #include "insns/fmadd_d.h"
+        break;
+      }
+      default:
+      {
+        throw trap_illegal_instruction;
+      }
+    }
+    break;
+  }
+  case 0x47:
+  {
+    switch((insn.bits >> 0x7) & 0x7)
+    {
+      case 0x0:
+      {
+        #include "insns/fmsub_s.h"
+        break;
+      }
+      case 0x1:
+      {
+        #include "insns/fmsub_d.h"
         break;
       }
       case 0x4:
       {
-        #include "insns/ble.h"
+        #include "insns/fmsub_s.h"
         break;
       }
       case 0x5:
       {
-        #include "insns/bleu.h"
+        #include "insns/fmsub_d.h"
         break;
       }
       default:
       {
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
     }
     break;
   }
-  case 0x74:
+  case 0x4b:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x0:
       {
-        #include "insns/addi.h"
+        #include "insns/fnmsub_s.h"
         break;
       }
       case 0x1:
       {
-        #include "insns/slti.h"
+        #include "insns/fnmsub_d.h"
         break;
       }
-      case 0x2:
+      case 0x4:
       {
-        #include "insns/sltiu.h"
+        #include "insns/fnmsub_s.h"
         break;
       }
-      case 0x3:
+      case 0x5:
       {
-        #include "insns/andi.h"
+        #include "insns/fnmsub_d.h"
+        break;
+      }
+      default:
+      {
+        throw trap_illegal_instruction;
+      }
+    }
+    break;
+  }
+  case 0x4f:
+  {
+    switch((insn.bits >> 0x7) & 0x7)
+    {
+      case 0x0:
+      {
+        #include "insns/fnmadd_s.h"
+        break;
+      }
+      case 0x1:
+      {
+        #include "insns/fnmadd_d.h"
         break;
       }
       case 0x4:
       {
-        #include "insns/ori.h"
+        #include "insns/fnmadd_s.h"
         break;
       }
       case 0x5:
       {
-        #include "insns/xori.h"
+        #include "insns/fnmadd_d.h"
         break;
       }
       default:
       {
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
     }
     break;
   }
-  case 0x75:
+  case 0x53:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x0:
       {
-        if((insn.bits & 0xfe007fe0) == 0xea0000e0)
+        if((insn.bits & 0x3ff1ff) == 0x9053)
+        {
+          #include "insns/fcvt_lu_s.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x18053)
+        {
+          #include "insns/fmin_s.h"
+          break;
+        }
+        if((insn.bits & 0x3ff1ff) == 0x11053)
+        {
+          #include "insns/fcvt_s_d.h"
+          break;
+        }
+        if((insn.bits & 0x3ff1ff) == 0xe053)
+        {
+          #include "insns/fcvt_s_w.h"
+          break;
+        }
+        if((insn.bits & 0x7c1ffff) == 0x1c053)
+        {
+          #include "insns/mftx_s.h"
+          break;
+        }
+        if((insn.bits & 0x3ff1ff) == 0x8053)
+        {
+          #include "insns/fcvt_l_s.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x17053)
+        {
+          #include "insns/fle_s.h"
+          break;
+        }
+        if((insn.bits & 0x7ffffff) == 0x1d053)
+        {
+          #include "insns/mffsr.h"
+          break;
+        }
+        if((insn.bits & 0x1f1ff) == 0x3053)
+        {
+          #include "insns/fdiv_s.h"
+          break;
+        }
+        if((insn.bits & 0x3fffff) == 0x1f053)
+        {
+          #include "insns/mtfsr.h"
+          break;
+        }
+        if((insn.bits & 0x3ff1ff) == 0xd053)
+        {
+          #include "insns/fcvt_s_lu.h"
+          break;
+        }
+        if((insn.bits & 0x1f1ff) == 0x2053)
+        {
+          #include "insns/fmul_s.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x16053)
+        {
+          #include "insns/flt_s.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x15053)
+        {
+          #include "insns/feq_s.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x7053)
+        {
+          #include "insns/fsgnjx_s.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x19053)
+        {
+          #include "insns/fmax_s.h"
+          break;
+        }
+        if((insn.bits & 0x3ff1ff) == 0xb053)
+        {
+          #include "insns/fcvt_wu_s.h"
+          break;
+        }
+        if((insn.bits & 0x3ff1ff) == 0xa053)
+        {
+          #include "insns/fcvt_w_s.h"
+          break;
+        }
+        if((insn.bits & 0x3fffff) == 0x1e053)
+        {
+          #include "insns/mxtf_s.h"
+          break;
+        }
+        if((insn.bits & 0x1f1ff) == 0x1053)
+        {
+          #include "insns/fsub_s.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x5053)
+        {
+          #include "insns/fsgnj_s.h"
+          break;
+        }
+        if((insn.bits & 0x3ff1ff) == 0xf053)
+        {
+          #include "insns/fcvt_s_wu.h"
+          break;
+        }
+        if((insn.bits & 0x3ff1ff) == 0xc053)
+        {
+          #include "insns/fcvt_s_l.h"
+          break;
+        }
+        if((insn.bits & 0x3ff1ff) == 0x4053)
+        {
+          #include "insns/fsqrt_s.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x6053)
+        {
+          #include "insns/fsgnjn_s.h"
+          break;
+        }
+        if((insn.bits & 0x1f1ff) == 0x53)
+        {
+          #include "insns/fadd_s.h"
+          break;
+        }
+        throw trap_illegal_instruction;
+      }
+      case 0x1:
+      {
+        if((insn.bits & 0x1ffff) == 0x180d3)
+        {
+          #include "insns/fmin_d.h"
+          break;
+        }
+        if((insn.bits & 0x3ff1ff) == 0xc0d3)
+        {
+          #include "insns/fcvt_d_l.h"
+          break;
+        }
+        if((insn.bits & 0x3fffff) == 0xe0d3)
+        {
+          #include "insns/fcvt_d_w.h"
+          break;
+        }
+        if((insn.bits & 0x3fffff) == 0x100d3)
+        {
+          #include "insns/fcvt_d_s.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x190d3)
+        {
+          #include "insns/fmax_d.h"
+          break;
+        }
+        if((insn.bits & 0x7c1ffff) == 0x1c0d3)
+        {
+          #include "insns/mftx_d.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x170d3)
+        {
+          #include "insns/fle_d.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x160d3)
+        {
+          #include "insns/flt_d.h"
+          break;
+        }
+        if((insn.bits & 0x1f1ff) == 0x20d3)
+        {
+          #include "insns/fmul_d.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x70d3)
+        {
+          #include "insns/fsgnjx_d.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x150d3)
+        {
+          #include "insns/feq_d.h"
+          break;
+        }
+        if((insn.bits & 0x3fffff) == 0xf0d3)
+        {
+          #include "insns/fcvt_d_wu.h"
+          break;
+        }
+        if((insn.bits & 0x3ff1ff) == 0xb0d3)
+        {
+          #include "insns/fcvt_wu_d.h"
+          break;
+        }
+        if((insn.bits & 0x1ffff) == 0x60d3)
+        {
+          #include "insns/fsgnjn_d.h"
+          break;
+        }
+        if((insn.bits & 0x3ff1ff) == 0xd0d3)
         {
-          #include "insns/nor.h"
+          #include "insns/fcvt_d_lu.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea000060)
+        if((insn.bits & 0x3ff1ff) == 0xa0d3)
         {
-          #include "insns/sltu.h"
+          #include "insns/fcvt_w_d.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea0000c0)
+        if((insn.bits & 0x3fffff) == 0x1e0d3)
         {
-          #include "insns/xor.h"
+          #include "insns/mxtf_d.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea000020)
+        if((insn.bits & 0x1ffff) == 0x50d3)
         {
-          #include "insns/sub.h"
+          #include "insns/fsgnj_d.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea0000a0)
+        if((insn.bits & 0x3ff1ff) == 0x80d3)
         {
-          #include "insns/or.h"
+          #include "insns/fcvt_l_d.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea000000)
+        if((insn.bits & 0x1f1ff) == 0xd3)
         {
-          #include "insns/add.h"
+          #include "insns/fadd_d.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea000040)
+        if((insn.bits & 0x3ff1ff) == 0x90d3)
         {
-          #include "insns/slt.h"
+          #include "insns/fcvt_lu_d.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea000080)
+        if((insn.bits & 0x1f1ff) == 0x10d3)
         {
-          #include "insns/and.h"
+          #include "insns/fsub_d.h"
+          break;
+        }
+        if((insn.bits & 0x3ff1ff) == 0x40d3)
+        {
+          #include "insns/fsqrt_d.h"
           break;
         }
-        #include "insns/unimp.h"
+        if((insn.bits & 0x1f1ff) == 0x30d3)
+        {
+          #include "insns/fdiv_d.h"
+          break;
+        }
+        throw trap_illegal_instruction;
       }
-      case 0x1:
+      case 0x4:
       {
-        if((insn.bits & 0xfe007fe0) == 0xea001000)
+        if((insn.bits & 0x3ff1ff) == 0x9053)
         {
-          #include "insns/mul.h"
+          #include "insns/fcvt_lu_s.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea001080)
+        if((insn.bits & 0x3ff1ff) == 0x11053)
         {
-          #include "insns/div.h"
+          #include "insns/fcvt_s_d.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea0010c0)
+        if((insn.bits & 0x3ff1ff) == 0xe053)
         {
-          #include "insns/rem.h"
+          #include "insns/fcvt_s_w.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea001040)
+        if((insn.bits & 0x3ff1ff) == 0x8053)
         {
-          #include "insns/mulh.h"
+          #include "insns/fcvt_l_s.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea0010e0)
+        if((insn.bits & 0x1f1ff) == 0x3053)
         {
-          #include "insns/remu.h"
+          #include "insns/fdiv_s.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea001060)
+        if((insn.bits & 0x3ff1ff) == 0xd053)
         {
-          #include "insns/mulhu.h"
+          #include "insns/fcvt_s_lu.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea0010a0)
+        if((insn.bits & 0x1f1ff) == 0x2053)
         {
-          #include "insns/divu.h"
+          #include "insns/fmul_s.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      case 0x4:
-      {
-        if((insn.bits & 0xfe007fe0) == 0xea004040)
+        if((insn.bits & 0x3ff1ff) == 0xb053)
+        {
+          #include "insns/fcvt_wu_s.h"
+          break;
+        }
+        if((insn.bits & 0x3ff1ff) == 0xa053)
+        {
+          #include "insns/fcvt_w_s.h"
+          break;
+        }
+        if((insn.bits & 0x1f1ff) == 0x1053)
+        {
+          #include "insns/fsub_s.h"
+          break;
+        }
+        if((insn.bits & 0x3ff1ff) == 0xf053)
         {
-          #include "insns/srlv.h"
+          #include "insns/fcvt_s_wu.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea004060)
+        if((insn.bits & 0x3ff1ff) == 0xc053)
         {
-          #include "insns/srav.h"
+          #include "insns/fcvt_s_l.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea004020)
+        if((insn.bits & 0x3ff1ff) == 0x4053)
         {
-          #include "insns/sllv.h"
+          #include "insns/fsqrt_s.h"
           break;
         }
-        #include "insns/unimp.h"
+        if((insn.bits & 0x1f1ff) == 0x53)
+        {
+          #include "insns/fadd_s.h"
+          break;
+        }
+        throw trap_illegal_instruction;
       }
       case 0x5:
       {
-        if((insn.bits & 0xfff07800) == 0xea005000)
+        if((insn.bits & 0x3ff1ff) == 0xc0d3)
         {
-          #include "insns/sll.h"
+          #include "insns/fcvt_d_l.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      case 0x6:
-      {
-        if((insn.bits & 0xfff07800) == 0xea006000)
+        if((insn.bits & 0x1f1ff) == 0x20d3)
         {
-          #include "insns/srl.h"
+          #include "insns/fmul_d.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      case 0x7:
-      {
-        if((insn.bits & 0xfff07800) == 0xea007000)
+        if((insn.bits & 0x3ff1ff) == 0xb0d3)
         {
-          #include "insns/sra.h"
+          #include "insns/fcvt_wu_d.h"
+          break;
+        }
+        if((insn.bits & 0x3ff1ff) == 0xd0d3)
+        {
+          #include "insns/fcvt_d_lu.h"
+          break;
+        }
+        if((insn.bits & 0x3ff1ff) == 0xa0d3)
+        {
+          #include "insns/fcvt_w_d.h"
+          break;
+        }
+        if((insn.bits & 0x3ff1ff) == 0x80d3)
+        {
+          #include "insns/fcvt_l_d.h"
+          break;
+        }
+        if((insn.bits & 0x1f1ff) == 0xd3)
+        {
+          #include "insns/fadd_d.h"
+          break;
+        }
+        if((insn.bits & 0x3ff1ff) == 0x90d3)
+        {
+          #include "insns/fcvt_lu_d.h"
+          break;
+        }
+        if((insn.bits & 0x1f1ff) == 0x10d3)
+        {
+          #include "insns/fsub_d.h"
+          break;
+        }
+        if((insn.bits & 0x3ff1ff) == 0x40d3)
+        {
+          #include "insns/fsqrt_d.h"
+          break;
+        }
+        if((insn.bits & 0x1f1ff) == 0x30d3)
+        {
+          #include "insns/fdiv_d.h"
           break;
         }
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
       default:
       {
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
     }
     break;
   }
-  case 0x76:
+  case 0x60:
   {
-    switch((insn.bits >> 0xc) & 0x7)
-    {
-      case 0x0:
-      {
-        #include "insns/addiw.h"
-        break;
-      }
-      default:
-      {
-        #include "insns/unimp.h"
-      }
-    }
+    #include "insns/c_addi.h"
     break;
   }
-  case 0x77:
+  case 0x61:
+  {
+    #include "insns/c_li.h"
+    break;
+  }
+  case 0x62:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x0:
       {
-        if((insn.bits & 0xfe007fe0) == 0xee000000)
+        if((insn.bits & 0x801f) == 0x2)
         {
-          #include "insns/addw.h"
+          #include "insns/c_move.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xee000020)
+        if((insn.bits & 0x801f) == 0x8002)
         {
-          #include "insns/subw.h"
+          #include "insns/c_j.h"
           break;
         }
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
       case 0x1:
       {
-        if((insn.bits & 0xfe007fe0) == 0xee0010e0)
-        {
-          #include "insns/remuw.h"
-          break;
-        }
-        if((insn.bits & 0xfe007fe0) == 0xee0010a0)
+        if((insn.bits & 0x801f) == 0x2)
         {
-          #include "insns/divuw.h"
+          #include "insns/c_move.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xee001060)
+        if((insn.bits & 0x801f) == 0x8002)
         {
-          #include "insns/mulhuw.h"
+          #include "insns/c_j.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xee001000)
+        throw trap_illegal_instruction;
+      }
+      case 0x2:
+      {
+        if((insn.bits & 0x801f) == 0x2)
         {
-          #include "insns/mulw.h"
+          #include "insns/c_move.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xee0010c0)
+        if((insn.bits & 0x801f) == 0x8002)
         {
-          #include "insns/remw.h"
+          #include "insns/c_j.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xee001040)
+        throw trap_illegal_instruction;
+      }
+      case 0x3:
+      {
+        if((insn.bits & 0x801f) == 0x2)
         {
-          #include "insns/mulhw.h"
+          #include "insns/c_move.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xee001080)
+        if((insn.bits & 0x801f) == 0x8002)
         {
-          #include "insns/divw.h"
+          #include "insns/c_j.h"
           break;
         }
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
       case 0x4:
       {
-        if((insn.bits & 0xfe007fe0) == 0xee004060)
-        {
-          #include "insns/sravw.h"
-          break;
-        }
-        if((insn.bits & 0xfe007fe0) == 0xee004020)
+        if((insn.bits & 0x801f) == 0x2)
         {
-          #include "insns/sllvw.h"
+          #include "insns/c_move.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xee004040)
+        if((insn.bits & 0x801f) == 0x8002)
         {
-          #include "insns/srlvw.h"
+          #include "insns/c_j.h"
           break;
         }
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
       case 0x5:
       {
-        if((insn.bits & 0xfff07c00) == 0xee005000)
+        if((insn.bits & 0x801f) == 0x2)
         {
-          #include "insns/sllw.h"
+          #include "insns/c_move.h"
+          break;
+        }
+        if((insn.bits & 0x801f) == 0x8002)
+        {
+          #include "insns/c_j.h"
           break;
         }
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
       case 0x6:
       {
-        if((insn.bits & 0xfff07c00) == 0xee006000)
+        if((insn.bits & 0x801f) == 0x2)
         {
-          #include "insns/srlw.h"
+          #include "insns/c_move.h"
+          break;
+        }
+        if((insn.bits & 0x801f) == 0x8002)
+        {
+          #include "insns/c_j.h"
           break;
         }
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
       case 0x7:
       {
-        if((insn.bits & 0xfff07c00) == 0xee007000)
+        if((insn.bits & 0x801f) == 0x2)
         {
-          #include "insns/sraw.h"
+          #include "insns/c_move.h"
+          break;
+        }
+        if((insn.bits & 0x801f) == 0x8002)
+        {
+          #include "insns/c_j.h"
           break;
         }
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
       default:
       {
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
     }
     break;
   }
-  case 0x78:
+  case 0x63:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x0:
       {
-        #include "insns/lb.h"
+        #include "insns/beq.h"
         break;
       }
       case 0x1:
       {
-        #include "insns/lh.h"
-        break;
-      }
-      case 0x2:
-      {
-        #include "insns/lw.h"
-        break;
-      }
-      case 0x3:
-      {
-        #include "insns/ld.h"
+        #include "insns/bne.h"
         break;
       }
       case 0x4:
       {
-        #include "insns/lbu.h"
+        #include "insns/blt.h"
         break;
       }
       case 0x5:
       {
-        #include "insns/lhu.h"
+        #include "insns/bge.h"
         break;
       }
       case 0x6:
       {
-        #include "insns/lwu.h"
+        #include "insns/bltu.h"
         break;
       }
       case 0x7:
       {
-        if((insn.bits & 0xfff07000) == 0xf0007000)
-        {
-          #include "insns/synci.h"
-          break;
-        }
-        #include "insns/unimp.h"
+        #include "insns/bgeu.h"
+        break;
       }
       default:
       {
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
     }
     break;
   }
-  case 0x79:
+  case 0x67:
+  {
+    #include "insns/j.h"
+    break;
+  }
+  case 0x6b:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x0:
       {
-        #include "insns/sb.h"
+        #include "insns/jalr_c.h"
         break;
       }
       case 0x1:
       {
-        #include "insns/sh.h"
+        #include "insns/jalr_r.h"
         break;
       }
       case 0x2:
       {
-        #include "insns/sw.h"
+        #include "insns/jalr_j.h"
         break;
       }
-      case 0x3:
+      case 0x4:
       {
-        #include "insns/sd.h"
-        break;
+        if((insn.bits & 0x7ffffff) == 0x26b)
+        {
+          #include "insns/rdnpc.h"
+          break;
+        }
+        throw trap_illegal_instruction;
       }
       default:
       {
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
     }
     break;
   }
-  case 0x7a:
+  case 0x6f:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    #include "insns/jal.h"
+    break;
+  }
+  case 0x73:
+  {
+    switch((insn.bits >> 0x7) & 0x7)
     {
-      case 0x2:
+      case 0x0:
       {
-        if((insn.bits & 0xfe007fe0) == 0xf4002040)
-        {
-          #include "insns/amow_and.h"
-          break;
-        }
-        if((insn.bits & 0xfe007fe0) == 0xf4002080)
-        {
-          #include "insns/amow_min.h"
-          break;
-        }
-        if((insn.bits & 0xfe007fe0) == 0xf4002060)
-        {
-          #include "insns/amow_or.h"
-          break;
-        }
-        if((insn.bits & 0xfe007fe0) == 0xf40020a0)
-        {
-          #include "insns/amow_max.h"
-          break;
-        }
-        if((insn.bits & 0xfe007fe0) == 0xf40020c0)
-        {
-          #include "insns/amow_minu.h"
-          break;
-        }
-        if((insn.bits & 0xfe007fe0) == 0xf4002000)
-        {
-          #include "insns/amow_add.h"
-          break;
-        }
-        if((insn.bits & 0xfe007fe0) == 0xf4002020)
-        {
-          #include "insns/amow_swap.h"
-          break;
-        }
-        if((insn.bits & 0xfe007fe0) == 0xf40020e0)
-        {
-          #include "insns/amow_maxu.h"
-          break;
-        }
-        #include "insns/unimp.h"
+        #include "insns/vcfgivl.h"
+        break;
       }
-      case 0x3:
+      case 0x1:
       {
-        if((insn.bits & 0xfe007fe0) == 0xf4003000)
-        {
-          #include "insns/amo_add.h"
-          break;
-        }
-        if((insn.bits & 0xfe007fe0) == 0xf4003020)
-        {
-          #include "insns/amo_swap.h"
-          break;
-        }
-        if((insn.bits & 0xfe007fe0) == 0xf4003060)
-        {
-          #include "insns/amo_or.h"
-          break;
-        }
-        if((insn.bits & 0xfe007fe0) == 0xf40030a0)
-        {
-          #include "insns/amo_max.h"
-          break;
-        }
-        if((insn.bits & 0xfe007fe0) == 0xf4003080)
-        {
-          #include "insns/amo_min.h"
-          break;
-        }
-        if((insn.bits & 0xfe007fe0) == 0xf40030c0)
-        {
-          #include "insns/amo_minu.h"
-          break;
-        }
-        if((insn.bits & 0xfe007fe0) == 0xf4003040)
+        if((insn.bits & 0x3fffff) == 0xf3)
         {
-          #include "insns/amo_and.h"
+          #include "insns/setvl.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xf40030e0)
+        throw trap_illegal_instruction;
+      }
+      case 0x2:
+      {
+        if((insn.bits & 0xf80003ff) == 0x173)
         {
-          #include "insns/amo_maxu.h"
+          #include "insns/vf.h"
           break;
         }
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
       default:
       {
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
     }
     break;
   }
-  case 0x7b:
+  case 0x77:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x0:
       {
-        if((insn.bits & 0xfe0fffe0) == 0xf6000000)
-        {
-          #include "insns/jalr_c.h"
-          break;
-        }
-        if((insn.bits & 0xfe0fffe0) == 0xf6000040)
+        if((insn.bits & 0xffffffff) == 0x77)
         {
-          #include "insns/jalr_j.h"
-          break;
-        }
-        if((insn.bits & 0xfe0fffe0) == 0xf6000020)
-        {
-          #include "insns/jalr_r.h"
+          #include "insns/syscall.h"
           break;
         }
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
       case 0x1:
       {
-        if((insn.bits & 0xffffffe0) == 0xf6001000)
+        if((insn.bits & 0xffffffff) == 0xf7)
         {
-          #include "insns/rdpc.h"
+          #include "insns/break.h"
           break;
         }
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
       case 0x2:
       {
-        if((insn.bits & 0xfff07fe0) == 0xf6002000)
+        if((insn.bits & 0xffffffff) == 0x177)
         {
-          #include "insns/mfcr.h"
+          #include "insns/stop.h"
           break;
         }
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
       case 0x3:
       {
-        if((insn.bits & 0xfe007fff) == 0xf6003000)
-        {
-          #include "insns/mtcr.h"
-          break;
-        }
-        #include "insns/unimp.h"
-      }
-      case 0x4:
-      {
-        if((insn.bits & 0xffffffff) == 0xf6004000)
-        {
-          #include "insns/sync.h"
-          break;
-        }
-        #include "insns/unimp.h"
-      }
-      case 0x5:
-      {
-        if((insn.bits & 0xffffffff) == 0xf6005000)
-        {
-          #include "insns/syscall.h"
-          break;
-        }
-        #include "insns/unimp.h"
-      }
-      case 0x6:
-      {
-        if((insn.bits & 0xffffffff) == 0xf6006000)
+        if((insn.bits & 0x7ffffff) == 0x1f7)
         {
-          #include "insns/break.h"
+          #include "insns/utidx.h"
           break;
         }
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
       default:
       {
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
     }
     break;
   }
-  case 0x7e:
+  case 0x7b:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x7) & 0x7)
     {
       case 0x0:
       {
-        if((insn.bits & 0xffffffe0) == 0xfc000000)
+        if((insn.bits & 0x7ffffff) == 0x7b)
         {
           #include "insns/ei.h"
           break;
         }
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
       case 0x1:
       {
-        if((insn.bits & 0xffffffe0) == 0xfc001000)
+        if((insn.bits & 0x7ffffff) == 0xfb)
         {
           #include "insns/di.h"
           break;
         }
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
       case 0x2:
       {
-        if((insn.bits & 0xffffffff) == 0xfc002000)
+        if((insn.bits & 0x7c1ffff) == 0x17b)
         {
-          #include "insns/eret.h"
+          #include "insns/mfpcr.h"
           break;
         }
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
-      case 0x4:
+      case 0x3:
       {
-        if((insn.bits & 0xfff07fe0) == 0xfc004000)
+        if((insn.bits & 0xf801ffff) == 0x1fb)
         {
-          #include "insns/mfpcr.h"
+          #include "insns/mtpcr.h"
           break;
         }
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
-      case 0x5:
+      case 0x4:
       {
-        if((insn.bits & 0xfe007fff) == 0xfc005000)
+        if((insn.bits & 0xffffffff) == 0x27b)
         {
-          #include "insns/mtpcr.h"
+          #include "insns/eret.h"
           break;
         }
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
       default:
       {
-        #include "insns/unimp.h"
+        throw trap_illegal_instruction;
       }
     }
     break;
   }
   default:
   {
-    #include "insns/unimp.h"
+    throw trap_illegal_instruction;
   }
 }