[opcodes] generate latex and verilog correctly
[riscv-isa-sim.git] / riscv / execute.h
index ad655ac3d3951d9876ed8e8d71231d3c6ff7b53a..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,300 +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) == 0xd0000ca0)
+        if((insn.bits & 0xffff8000) == 0xd40a8000)
         {
-          #include "insns/sgninj_d.h"
+          #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 & 0xfe007fe0) == 0xd0000000)
+        if((insn.bits & 0xfffffc00) == 0xd4070000)
         {
-          #include "insns/add_s.h"
+          #include "insns/cvt_s_w.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0000c00)
+        if((insn.bits & 0xffff8000) == 0xd4000000)
         {
-          #include "insns/add_d.h"
+          #include "insns/add_s.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0000ce0)
+        if((insn.bits & 0xffff83e0) == 0xd42c0000)
         {
-          #include "insns/sgnmul_d.h"
+          #include "insns/mff_s.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0000cc0)
+        if((insn.bits & 0xfffffc00) == 0xd42e0000)
         {
-          #include "insns/sgninjn_d.h"
+          #include "insns/mtf_s.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd00000c0)
+        if((insn.bits & 0xffff8000) == 0xd4030000)
         {
           #include "insns/sgninjn_s.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0000c40)
+        if((insn.bits & 0xfffffc00) == 0xd4078000)
         {
-          #include "insns/mul_d.h"
+          #include "insns/cvtu_s_w.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0000020)
+        if((insn.bits & 0xfffffc00) == 0xd4068000)
         {
-          #include "insns/sub_s.h"
+          #include "insns/cvtu_s_l.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0000c20)
+        if((insn.bits & 0xfffffc00) == 0xd4060000)
         {
-          #include "insns/sub_d.h"
+          #include "insns/cvt_s_l.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0000080)
+        if((insn.bits & 0xffff8000) == 0xd4008000)
+        {
+          #include "insns/sub_s.h"
+          break;
+        }
+        if((insn.bits & 0xfffffc00) == 0xd4020000)
         {
           #include "insns/sqrt_s.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xd0000c80)
+        if((insn.bits & 0xffff8000) == 0xd40b0000)
         {
-          #include "insns/sqrt_d.h"
+          #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 & 0xfe007fe0) == 0xd0000c60)
+        if((insn.bits & 0xffff8000) == 0xd4018000)
         {
-          #include "insns/div_d.h"
+          #include "insns/div_s.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0000060)
+        if((insn.bits & 0xfffffc00) == 0xd4098000)
         {
-          #include "insns/div_s.h"
+          #include "insns/cvt_s_d.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0000040)
+        if((insn.bits & 0xffff8000) == 0xd40b8000)
         {
-          #include "insns/mul_s.h"
+          #include "insns/c_le_s.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      default:
-      {
-        #include "insns/unimp.h"
-      }
-    }
-    break;
-  }
-  case 0x69:
-  {
-    switch((insn.bits >> 0xc) & 0x7)
-    {
-      case 0x0:
-      {
-        if((insn.bits & 0xfe0ffc00) == 0xd2000000)
+        if((insn.bits & 0xffff8000) == 0xd4010000)
         {
-          #include "insns/round_l_fmt.h"
+          #include "insns/mul_s.h"
           break;
         }
         #include "insns/unimp.h"
       }
       case 0x1:
       {
-        if((insn.bits & 0xfe0ffc00) == 0xd2001000)
+        if((insn.bits & 0xffcffc00) == 0xd4478000)
         {
-          #include "insns/trunc_l_fmt.h"
+          #include "insns/cvtu_s_w_rm.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      case 0x2:
-      {
-        if((insn.bits & 0xfe0ffc00) == 0xd2002000)
+        if((insn.bits & 0xffcffc00) == 0xd4440000)
         {
-          #include "insns/ceil_l_fmt.h"
+          #include "insns/cvt_l_s_rm.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      case 0x3:
-      {
-        if((insn.bits & 0xfe0ffc00) == 0xd2003000)
+        if((insn.bits & 0xffcffc00) == 0xd4468000)
         {
-          #include "insns/floor_l_fmt.h"
+          #include "insns/cvtu_s_l_rm.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      case 0x4:
-      {
-        if((insn.bits & 0xfe0ffc00) == 0xd2004000)
+        if((insn.bits & 0xffcf8000) == 0xd4410000)
         {
-          #include "insns/round_w_fmt.h"
+          #include "insns/mul_s_rm.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      case 0x5:
-      {
-        if((insn.bits & 0xfe0ffc00) == 0xd2005000)
+        if((insn.bits & 0xffcffc00) == 0xd4448000)
         {
-          #include "insns/trunc_w_fmt.h"
+          #include "insns/cvtu_l_s_rm.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      case 0x6:
-      {
-        if((insn.bits & 0xfe0ffc00) == 0xd2006000)
+        if((insn.bits & 0xffcffc00) == 0xd4470000)
         {
-          #include "insns/ceil_w_fmt.h"
+          #include "insns/cvt_s_w_rm.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      case 0x7:
-      {
-        if((insn.bits & 0xfe0ffc00) == 0xd2007000)
+        if((insn.bits & 0xffcffc00) == 0xd4420000)
         {
-          #include "insns/floor_w_fmt.h"
+          #include "insns/sqrt_s_rm.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      default:
-      {
-        #include "insns/unimp.h"
-      }
-    }
-    break;
-  }
-  case 0x6a:
-  {
-    switch((insn.bits >> 0xc) & 0x7)
-    {
-      case 0x0:
-      {
-        if((insn.bits & 0xfe007fff) == 0xd4000000)
+        if((insn.bits & 0xffcffc00) == 0xd4498000)
         {
-          #include "insns/mff_s.h"
+          #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/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 0x1:
+      case 0x6:
       {
-        if((insn.bits & 0xfe007fff) == 0xd4001000)
+        if((insn.bits & 0xffff83e0) == 0xd5ac0000)
         {
           #include "insns/mff_d.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      case 0x4:
-      {
-        if((insn.bits & 0xfe007fff) == 0xd4004000)
+        if((insn.bits & 0xffff8000) == 0xd5828000)
         {
-          #include "insns/mtf_s.h"
+          #include "insns/sgninj_d.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      case 0x5:
-      {
-        if((insn.bits & 0xfe007fff) == 0xd4005000)
+        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 & 0xfffffc00) == 0xd5868000)
+        {
+          #include "insns/cvtu_d_l.h"
+          break;
+        }
+        if((insn.bits & 0xfffffc00) == 0xd5878000)
+        {
+          #include "insns/cvtu_d_w.h"
+          break;
+        }
+        if((insn.bits & 0xffff83e0) == 0xd5ac8000)
+        {
+          #include "insns/mffl_d.h"
+          break;
+        }
+        if((insn.bits & 0xffff8000) == 0xd5838000)
+        {
+          #include "insns/sgnmul_d.h"
+          break;
+        }
+        if((insn.bits & 0xffff8000) == 0xd5800000)
+        {
+          #include "insns/add_d.h"
+          break;
+        }
+        if((insn.bits & 0xffff83e0) == 0xd5ad0000)
+        {
+          #include "insns/mffh_d.h"
+          break;
+        }
+        if((insn.bits & 0xffff8000) == 0xd58b8000)
+        {
+          #include "insns/c_le_d.h"
+          break;
+        }
+        if((insn.bits & 0xffff8000) == 0xd5830000)
+        {
+          #include "insns/sgninjn_d.h"
+          break;
+        }
+        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;
         }
-        #include "insns/unimp.h"
-      }
-      default:
-      {
-        #include "insns/unimp.h"
-      }
-    }
-    break;
-  }
-  case 0x6b:
-  {
-    switch((insn.bits >> 0xc) & 0x7)
-    {
-      case 0x0:
-      {
-        if((insn.bits & 0xfe0ffc00) == 0xd6000000)
+        if((insn.bits & 0xfffffc00) == 0xd5820000)
         {
-          #include "insns/cvt_s_fmt.h"
+          #include "insns/sqrt_d.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      case 0x1:
-      {
-        if((insn.bits & 0xfe0ffc00) == 0xd6001000)
+        if((insn.bits & 0xfffffc00) == 0xd5880000)
         {
-          #include "insns/cvt_d_fmt.h"
+          #include "insns/cvt_d_s.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      case 0x4:
-      {
-        if((insn.bits & 0xfe0ffc00) == 0xd6004000)
+        if((insn.bits & 0xfffffc00) == 0xd5870000)
+        {
+          #include "insns/cvt_d_w.h"
+          break;
+        }
+        if((insn.bits & 0xfffffc00) == 0xd5860000)
+        {
+          #include "insns/cvt_d_l.h"
+          break;
+        }
+        if((insn.bits & 0xffff8000) == 0xd5810000)
+        {
+          #include "insns/mul_d.h"
+          break;
+        }
+        if((insn.bits & 0xffff8000) == 0xd58b0000)
         {
-          #include "insns/cvt_w_fmt.h"
+          #include "insns/c_lt_d.h"
           break;
         }
         #include "insns/unimp.h"
       }
-      case 0x5:
+      case 0x7:
       {
-        if((insn.bits & 0xfe0ffc00) == 0xd6005000)
+        if((insn.bits & 0xffcffc00) == 0xd5c60000)
+        {
+          #include "insns/cvt_d_l_rm.h"
+          break;
+        }
+        if((insn.bits & 0xffcffc00) == 0xd5c50000)
         {
-          #include "insns/cvt_l_fmt.h"
+          #include "insns/cvt_w_d_rm.h"
+          break;
+        }
+        if((insn.bits & 0xffcffc00) == 0xd5c58000)
+        {
+          #include "insns/cvtu_w_d_rm.h"
+          break;
+        }
+        if((insn.bits & 0xffcffc00) == 0xd5c20000)
+        {
+          #include "insns/sqrt_d_rm.h"
+          break;
+        }
+        if((insn.bits & 0xffcffc00) == 0xd5c68000)
+        {
+          #include "insns/cvtu_d_l_rm.h"
+          break;
+        }
+        if((insn.bits & 0xffcf8000) == 0xd5c00000)
+        {
+          #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"
@@ -333,81 +487,85 @@ switch((insn.bits >> 0x19) & 0x7f)
     }
     break;
   }
-  case 0x6c:
+  case 0x6b:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x16) & 0x7)
     {
       case 0x0:
       {
-        if((insn.bits & 0xfe007c00) == 0xd8000000)
+        if((insn.bits & 0xffffffe0) == 0xd6008000)
+        {
+          #include "insns/di.h"
+          break;
+        }
+        if((insn.bits & 0xffffffe0) == 0xd6000000)
         {
-          #include "insns/c_f_fmt.h"
+          #include "insns/ei.h"
           break;
         }
         #include "insns/unimp.h"
       }
       case 0x1:
       {
-        if((insn.bits & 0xfe007c00) == 0xd8001000)
+        if((insn.bits & 0xffff83e0) == 0xd6400000)
         {
-          #include "insns/c_un_fmt.h"
+          #include "insns/mfpcr.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      case 0x2:
-      {
-        if((insn.bits & 0xfe007c00) == 0xd8002000)
+        if((insn.bits & 0xffff801f) == 0xd6408000)
         {
-          #include "insns/c_eq_fmt.h"
+          #include "insns/mtpcr.h"
           break;
         }
         #include "insns/unimp.h"
       }
-      case 0x3:
+      case 0x2:
       {
-        if((insn.bits & 0xfe007c00) == 0xd8003000)
+        if((insn.bits & 0xffffffff) == 0xd6800000)
         {
-          #include "insns/c_ueq_fmt.h"
+          #include "insns/eret.h"
           break;
         }
         #include "insns/unimp.h"
       }
-      case 0x4:
+      default:
       {
-        if((insn.bits & 0xfe007c00) == 0xd8004000)
-        {
-          #include "insns/c_olt_fmt.h"
-          break;
-        }
         #include "insns/unimp.h"
       }
-      case 0x5:
+    }
+    break;
+  }
+  case 0x6c:
+  {
+    switch((insn.bits >> 0x16) & 0x7)
+    {
+      case 0x0:
       {
-        if((insn.bits & 0xfe007c00) == 0xd8005000)
+        if((insn.bits & 0xfff00000) == 0xd8000000)
         {
-          #include "insns/c_ult_fmt.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 & 0xfe007c00) == 0xd8006000)
+        if((insn.bits & 0xfff00000) == 0xd9800000)
         {
-          #include "insns/c_ole_fmt.h"
+          #include "insns/madd_d.h"
           break;
         }
         #include "insns/unimp.h"
       }
       case 0x7:
       {
-        if((insn.bits & 0xfe007c00) == 0xd8007000)
-        {
-          #include "insns/c_ule_fmt.h"
-          break;
-        }
-        #include "insns/unimp.h"
+        #include "insns/madd_d_rm.h"
+        break;
       }
       default:
       {
@@ -418,79 +576,74 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x6d:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x16) & 0x7)
     {
       case 0x0:
       {
-        if((insn.bits & 0xfe007c00) == 0xda000000)
+        if((insn.bits & 0xfff00000) == 0xda000000)
         {
-          #include "insns/c_sf_fmt.h"
+          #include "insns/msub_s.h"
           break;
         }
         #include "insns/unimp.h"
       }
       case 0x1:
       {
-        if((insn.bits & 0xfe007c00) == 0xda001000)
-        {
-          #include "insns/c_ngle_fmt.h"
-          break;
-        }
-        #include "insns/unimp.h"
+        #include "insns/msub_s_rm.h"
+        break;
       }
-      case 0x2:
+      case 0x6:
       {
-        if((insn.bits & 0xfe007c00) == 0xda002000)
+        if((insn.bits & 0xfff00000) == 0xdb800000)
         {
-          #include "insns/c_seq_fmt.h"
+          #include "insns/msub_d.h"
           break;
         }
         #include "insns/unimp.h"
       }
-      case 0x3:
+      case 0x7:
       {
-        if((insn.bits & 0xfe007c00) == 0xda003000)
-        {
-          #include "insns/c_ngl_fmt.h"
-          break;
-        }
-        #include "insns/unimp.h"
+        #include "insns/msub_d_rm.h"
+        break;
       }
-      case 0x4:
+      default:
       {
-        if((insn.bits & 0xfe007c00) == 0xda004000)
-        {
-          #include "insns/c_lt_fmt.h"
-          break;
-        }
         #include "insns/unimp.h"
       }
-      case 0x5:
+    }
+    break;
+  }
+  case 0x6e:
+  {
+    switch((insn.bits >> 0x16) & 0x7)
+    {
+      case 0x0:
       {
-        if((insn.bits & 0xfe007c00) == 0xda005000)
+        if((insn.bits & 0xfff00000) == 0xdc000000)
         {
-          #include "insns/c_nge_fmt.h"
+          #include "insns/nmsub_s.h"
           break;
         }
         #include "insns/unimp.h"
       }
+      case 0x1:
+      {
+        #include "insns/nmsub_s_rm.h"
+        break;
+      }
       case 0x6:
       {
-        if((insn.bits & 0xfe007c00) == 0xda006000)
+        if((insn.bits & 0xfff00000) == 0xdd800000)
         {
-          #include "insns/c_le_fmt.h"
+          #include "insns/nmsub_d.h"
           break;
         }
         #include "insns/unimp.h"
       }
       case 0x7:
       {
-        if((insn.bits & 0xfe007c00) == 0xda007000)
-        {
-          #include "insns/c_ngt_fmt.h"
-          break;
-        }
-        #include "insns/unimp.h"
+        #include "insns/nmsub_d_rm.h"
+        break;
       }
       default:
       {
@@ -499,48 +652,36 @@ switch((insn.bits >> 0x19) & 0x7f)
     }
     break;
   }
-  case 0x71:
-  {
-    #include "insns/lui.h"
-    break;
-  }
-  case 0x72:
+  case 0x6f:
   {
-    #include "insns/slori.h"
-    break;
-  }
-  case 0x73:
-  {
-    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:
@@ -550,20 +691,20 @@ 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:
-      {
-        #include "insns/addiw.h"
-        break;
-      }
       case 0x2:
       {
         #include "insns/slti.h"
@@ -589,6 +730,25 @@ switch((insn.bits >> 0x19) & 0x7f)
         #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"
@@ -598,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;
@@ -646,85 +806,93 @@ 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:
+      case 0x7:
       {
-        if((insn.bits & 0xfe007fe0) == 0xea004040)
+        if((insn.bits & 0xffff8000) == 0xebc30000)
         {
-          #include "insns/srlv.h"
+          #include "insns/sra.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea004060)
+        if((insn.bits & 0xffff8000) == 0xebc20000)
         {
-          #include "insns/srav.h"
+          #include "insns/srl.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xea004020)
+        if((insn.bits & 0xffff8000) == 0xebc10000)
         {
-          #include "insns/sllv.h"
+          #include "insns/sll.h"
           break;
         }
         #include "insns/unimp.h"
       }
-      case 0x5:
+      default:
       {
-        if((insn.bits & 0xfff07800) == 0xea005000)
-        {
-          #include "insns/sll.h"
-          break;
-        }
         #include "insns/unimp.h"
       }
-      case 0x6:
+    }
+    break;
+  }
+  case 0x76:
+  {
+    switch((insn.bits >> 0x16) & 0x7)
+    {
+      case 0x0:
       {
-        if((insn.bits & 0xfff07800) == 0xea006000)
-        {
-          #include "insns/srl.h"
-          break;
-        }
-        #include "insns/unimp.h"
+        #include "insns/addiw.h"
+        break;
       }
       case 0x7:
       {
-        if((insn.bits & 0xfff07800) == 0xea007000)
+        if((insn.bits & 0xffff8000) == 0xedc10000)
         {
-          #include "insns/sra.h"
+          #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"
@@ -736,18 +904,18 @@ switch((insn.bits >> 0x19) & 0x7f)
     }
     break;
   }
-  case 0x76:
+  case 0x77:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x16) & 0x7)
     {
       case 0x0:
       {
-        if((insn.bits & 0xfe007fe0) == 0xec000000)
+        if((insn.bits & 0xffff8000) == 0xee000000)
         {
           #include "insns/addw.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xec000020)
+        if((insn.bits & 0xffff8000) == 0xee008000)
         {
           #include "insns/subw.h"
           break;
@@ -756,89 +924,62 @@ switch((insn.bits >> 0x19) & 0x7f)
       }
       case 0x1:
       {
-        if((insn.bits & 0xfe007fe0) == 0xec0010e0)
+        if((insn.bits & 0xffff8000) == 0xee438000)
         {
           #include "insns/remuw.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xec0010a0)
+        if((insn.bits & 0xffff8000) == 0xee428000)
         {
           #include "insns/divuw.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xec001060)
+        if((insn.bits & 0xffff8000) == 0xee418000)
         {
           #include "insns/mulhuw.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xec001000)
+        if((insn.bits & 0xffff8000) == 0xee400000)
         {
           #include "insns/mulw.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xec0010c0)
+        if((insn.bits & 0xffff8000) == 0xee430000)
         {
           #include "insns/remw.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xec001040)
+        if((insn.bits & 0xffff8000) == 0xee410000)
         {
           #include "insns/mulhw.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xec001080)
+        if((insn.bits & 0xffff8000) == 0xee420000)
         {
           #include "insns/divw.h"
           break;
         }
         #include "insns/unimp.h"
       }
-      case 0x4:
+      case 0x7:
       {
-        if((insn.bits & 0xfe007fe0) == 0xec004060)
+        if((insn.bits & 0xffff8000) == 0xefc20000)
         {
-          #include "insns/sravw.h"
-          break;
-        }
-        if((insn.bits & 0xfe007fe0) == 0xec004020)
-        {
-          #include "insns/sllvw.h"
+          #include "insns/srlw.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xec004040)
+        if((insn.bits & 0xffff8000) == 0xefc30000)
         {
-          #include "insns/srlvw.h"
+          #include "insns/sraw.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      case 0x5:
-      {
-        if((insn.bits & 0xfff07c00) == 0xec005000)
+        if((insn.bits & 0xffff8000) == 0xefc10000)
         {
           #include "insns/sllw.h"
           break;
         }
         #include "insns/unimp.h"
       }
-      case 0x6:
-      {
-        if((insn.bits & 0xfff07c00) == 0xec006000)
-        {
-          #include "insns/srlw.h"
-          break;
-        }
-        #include "insns/unimp.h"
-      }
-      case 0x7:
-      {
-        if((insn.bits & 0xfff07c00) == 0xec007000)
-        {
-          #include "insns/sraw.h"
-          break;
-        }
-        #include "insns/unimp.h"
-      }
       default:
       {
         #include "insns/unimp.h"
@@ -848,7 +989,7 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x78:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x16) & 0x7)
     {
       case 0x0:
       {
@@ -887,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;
@@ -903,7 +1044,7 @@ switch((insn.bits >> 0x19) & 0x7f)
   }
   case 0x79:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x16) & 0x7)
     {
       case 0x0:
       {
@@ -925,26 +1066,6 @@ switch((insn.bits >> 0x19) & 0x7f)
         #include "insns/sd.h"
         break;
       }
-      case 0x4:
-      {
-        #include "insns/l_s.h"
-        break;
-      }
-      case 0x5:
-      {
-        #include "insns/l_d.h"
-        break;
-      }
-      case 0x6:
-      {
-        #include "insns/s_s.h"
-        break;
-      }
-      case 0x7:
-      {
-        #include "insns/s_d.h"
-        break;
-      }
       default:
       {
         #include "insns/unimp.h"
@@ -952,70 +1073,94 @@ switch((insn.bits >> 0x19) & 0x7f)
     }
     break;
   }
-  case 0x7b:
+  case 0x7a:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x16) & 0x7)
     {
-      case 0x0:
+      case 0x2:
       {
-        if((insn.bits & 0xfe0fffe0) == 0xf6000000)
+        if((insn.bits & 0xffff8000) == 0xf4828000)
         {
-          #include "insns/jalr_c.h"
+          #include "insns/amow_max.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xf6000040)
+        if((insn.bits & 0xffff8000) == 0xf4810000)
         {
-          #include "insns/jalr_j.h"
+          #include "insns/amow_and.h"
           break;
         }
-        if((insn.bits & 0xfe0fffe0) == 0xf6000020)
+        if((insn.bits & 0xffff8000) == 0xf4820000)
         {
-          #include "insns/jalr_r.h"
+          #include "insns/amow_min.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      case 0x1:
-      {
-        if((insn.bits & 0xffffffe0) == 0xf6001000)
+        if((insn.bits & 0xffff8000) == 0xf4818000)
         {
-          #include "insns/rdpc.h"
+          #include "insns/amow_or.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      case 0x2:
-      {
-        if((insn.bits & 0xfe0fffe0) == 0xf6002000)
+        if((insn.bits & 0xffff8000) == 0xf4830000)
         {
-          #include "insns/rdhwr.h"
+          #include "insns/amow_minu.h"
+          break;
+        }
+        if((insn.bits & 0xffff8000) == 0xf4800000)
+        {
+          #include "insns/amow_add.h"
+          break;
+        }
+        if((insn.bits & 0xffff8000) == 0xf4808000)
+        {
+          #include "insns/amow_swap.h"
+          break;
+        }
+        if((insn.bits & 0xffff8000) == 0xf4838000)
+        {
+          #include "insns/amow_maxu.h"
           break;
         }
         #include "insns/unimp.h"
       }
       case 0x3:
       {
-        if((insn.bits & 0xffffffff) == 0xf6003000)
+        if((insn.bits & 0xffff8000) == 0xf4c00000)
         {
-          #include "insns/sync.h"
+          #include "insns/amo_add.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      case 0x4:
-      {
-        if((insn.bits & 0xffffffff) == 0xf6004000)
+        if((insn.bits & 0xffff8000) == 0xf4c08000)
         {
-          #include "insns/syscall.h"
+          #include "insns/amo_swap.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      case 0x5:
-      {
-        if((insn.bits & 0xffffffff) == 0xf6005000)
+        if((insn.bits & 0xffff8000) == 0xf4c18000)
+        {
+          #include "insns/amo_or.h"
+          break;
+        }
+        if((insn.bits & 0xffff8000) == 0xf4c28000)
+        {
+          #include "insns/amo_max.h"
+          break;
+        }
+        if((insn.bits & 0xffff8000) == 0xf4c20000)
+        {
+          #include "insns/amo_min.h"
+          break;
+        }
+        if((insn.bits & 0xffff8000) == 0xf4c30000)
+        {
+          #include "insns/amo_minu.h"
+          break;
+        }
+        if((insn.bits & 0xffff8000) == 0xf4c10000)
+        {
+          #include "insns/amo_and.h"
+          break;
+        }
+        if((insn.bits & 0xffff8000) == 0xf4c38000)
         {
-          #include "insns/break.h"
+          #include "insns/amo_maxu.h"
           break;
         }
         #include "insns/unimp.h"
@@ -1027,69 +1172,47 @@ switch((insn.bits >> 0x19) & 0x7f)
     }
     break;
   }
-  case 0x7e:
+  case 0x7b:
   {
-    switch((insn.bits >> 0xc) & 0x7)
+    switch((insn.bits >> 0x16) & 0x7)
     {
       case 0x0:
       {
-        if((insn.bits & 0xfe0fffff) == 0xfc000000)
+        if((insn.bits & 0xffffffe0) == 0xf6000000)
         {
-          #include "insns/ei.h"
+          #include "insns/rdnpc.h"
           break;
         }
         #include "insns/unimp.h"
       }
       case 0x1:
       {
-        if((insn.bits & 0xfe0fffff) == 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 & 0xfe007fff) == 0xfc004000)
+        if((insn.bits & 0xffff83e0) == 0xf6400000)
         {
-          #include "insns/mfpcr.h"
+          #include "insns/mfcr.h"
           break;
         }
-        #include "insns/unimp.h"
-      }
-      case 0x5:
-      {
-        if((insn.bits & 0xfe007fff) == 0xfc005000)
+        if((insn.bits & 0xffff801f) == 0xf6408000)
         {
-          #include "insns/mwfpcr.h"
+          #include "insns/mtcr.h"
           break;
         }
         #include "insns/unimp.h"
       }
-      case 0x6:
+      case 0x2:
       {
-        if((insn.bits & 0xfe007fff) == 0xfc006000)
+        if((insn.bits & 0xffffffff) == 0xf6800000)
         {
-          #include "insns/mtpcr.h"
+          #include "insns/sync.h"
           break;
         }
         #include "insns/unimp.h"
       }
-      case 0x7:
+      case 0x3:
       {
-        if((insn.bits & 0xfe007fff) == 0xfc007000)
+        if((insn.bits & 0xffc003ff) == 0xf6c00000)
         {
-          #include "insns/mwtpcr.h"
+          #include "insns/syscall.h"
           break;
         }
         #include "insns/unimp.h"