[opcodes, sim, xcc] added mffl.d instruction
authorAndrew Waterman <waterman@s141.Millennium.Berkeley.EDU>
Wed, 29 Sep 2010 00:17:04 +0000 (17:17 -0700)
committerAndrew Waterman <waterman@s141.Millennium.Berkeley.EDU>
Wed, 29 Sep 2010 00:17:04 +0000 (17:17 -0700)
...to be used instead of mff.s when doing int -> DP FP moves on a 32-bit cpu

riscv/execute.h
riscv/insns/mffl_d.h [new file with mode: 0644]

index 2c500c4d8e6a483f3389528910e12f015576a77e..15f4e1a08e2ec22f2fb7d1650082c95bea4eeaaa 100644 (file)
@@ -62,291 +62,296 @@ switch((insn.bits >> 0x19) & 0x7f)
     break;
   }
   case 0x68:
+  {
+    switch((insn.bits >> 0xc) & 0x7)
+    {
+      case 0x2:
+      {
+        #include "insns/l_s.h"
+        break;
+      }
+      case 0x3:
+      {
+        #include "insns/l_d.h"
+        break;
+      }
+      default:
+      {
+        #include "insns/unimp.h"
+      }
+    }
+    break;
+  }
+  case 0x69:
+  {
+    switch((insn.bits >> 0xc) & 0x7)
+    {
+      case 0x2:
+      {
+        #include "insns/s_s.h"
+        break;
+      }
+      case 0x3:
+      {
+        #include "insns/s_d.h"
+        break;
+      }
+      default:
+      {
+        #include "insns/unimp.h"
+      }
+    }
+    break;
+  }
+  case 0x6a:
   {
     switch((insn.bits >> 0xc) & 0x7)
     {
       case 0x0:
       {
-        if((insn.bits & 0xfe007fe0) == 0xd0000820)
+        if((insn.bits & 0xfe007fe0) == 0xd4000820)
         {
           #include "insns/c_eq_s.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd00000a0)
+        if((insn.bits & 0xfe007fe0) == 0xd40000a0)
         {
           #include "insns/sgninj_s.h"
           break;
         }
-        if((insn.bits & 0xfff07fe0) == 0xd00004c0)
+        if((insn.bits & 0xfff07fe0) == 0xd40004c0)
         {
           #include "insns/cvt_s_w.h"
           break;
         }
-        if((insn.bits & 0xfff07fe0) == 0xd0000440)
+        if((insn.bits & 0xfff07fe0) == 0xd4000440)
         {
           #include "insns/trunc_w_s.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0000000)
+        if((insn.bits & 0xfe007fe0) == 0xd4000000)
         {
           #include "insns/add_s.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd00000c0)
+        if((insn.bits & 0xfe007fe0) == 0xd40000c0)
         {
           #include "insns/sgninjn_s.h"
           break;
         }
-        if((insn.bits & 0xfff07fe0) == 0xd0000400)
+        if((insn.bits & 0xfff07fe0) == 0xd4000400)
         {
           #include "insns/trunc_l_s.h"
           break;
         }
-        if((insn.bits & 0xfff07fe0) == 0xd00004e0)
+        if((insn.bits & 0xfff07fe0) == 0xd40004e0)
         {
           #include "insns/cvtu_s_w.h"
           break;
         }
-        if((insn.bits & 0xfff07fe0) == 0xd0000420)
+        if((insn.bits & 0xfff07fe0) == 0xd4000420)
         {
           #include "insns/truncu_l_s.h"
           break;
         }
-        if((insn.bits & 0xfff07fe0) == 0xd00004a0)
+        if((insn.bits & 0xfff07fe0) == 0xd40004a0)
         {
           #include "insns/cvtu_s_l.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0000020)
+        if((insn.bits & 0xfe007fe0) == 0xd4000020)
         {
           #include "insns/sub_s.h"
           break;
         }
-        if((insn.bits & 0xfff07fe0) == 0xd0000080)
+        if((insn.bits & 0xfff07fe0) == 0xd4000080)
         {
           #include "insns/sqrt_s.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0000840)
+        if((insn.bits & 0xfe007fe0) == 0xd4000840)
         {
           #include "insns/c_lt_s.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd00000e0)
+        if((insn.bits & 0xfe007fe0) == 0xd40000e0)
         {
           #include "insns/sgnmul_s.h"
           break;
         }
-        if((insn.bits & 0xfff07fe0) == 0xd0000480)
+        if((insn.bits & 0xfff07fe0) == 0xd4000480)
         {
           #include "insns/cvt_s_l.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0000060)
+        if((insn.bits & 0xfe007fe0) == 0xd4000060)
         {
           #include "insns/div_s.h"
           break;
         }
-        if((insn.bits & 0xfff07fe0) == 0xd0000660)
+        if((insn.bits & 0xfff07fe0) == 0xd4000660)
         {
           #include "insns/cvt_s_d.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0000860)
+        if((insn.bits & 0xfe007fe0) == 0xd4000860)
         {
           #include "insns/c_le_s.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0000040)
+        if((insn.bits & 0xfe007fe0) == 0xd4000040)
         {
           #include "insns/mul_s.h"
           break;
         }
-        if((insn.bits & 0xfff07fe0) == 0xd0000460)
+        if((insn.bits & 0xfff07fe0) == 0xd4000460)
         {
           #include "insns/truncu_w_s.h"
           break;
         }
         #include "insns/unimp.h"
       }
+      case 0x1:
+      {
+        if((insn.bits & 0xfff07fe0) == 0xd4001400)
+        {
+          #include "insns/mffl_d.h"
+          break;
+        }
+        if((insn.bits & 0xfff07fe0) == 0xd4001420)
+        {
+          #include "insns/mffh_d.h"
+          break;
+        }
+        if((insn.bits & 0xfff07fe0) == 0xd4001800)
+        {
+          #include "insns/mff_s.h"
+          break;
+        }
+        if((insn.bits & 0xfff07fe0) == 0xd4001c00)
+        {
+          #include "insns/mtf_s.h"
+          break;
+        }
+        #include "insns/unimp.h"
+      }
       case 0x6:
       {
-        if((insn.bits & 0xfe007fe0) == 0xd00060a0)
+        if((insn.bits & 0xfe007fe0) == 0xd40060a0)
         {
           #include "insns/sgninj_d.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0006060)
+        if((insn.bits & 0xfe007fe0) == 0xd4006060)
         {
           #include "insns/div_d.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0006820)
+        if((insn.bits & 0xfe007fe0) == 0xd4006820)
         {
           #include "insns/c_eq_d.h"
           break;
         }
-        if((insn.bits & 0xfff07fe0) == 0xd00064a0)
+        if((insn.bits & 0xfff07fe0) == 0xd40064a0)
         {
           #include "insns/cvtu_d_l.h"
           break;
         }
-        if((insn.bits & 0xfff07fe0) == 0xd0006440)
+        if((insn.bits & 0xfff07fe0) == 0xd4006440)
         {
           #include "insns/trunc_w_d.h"
           break;
         }
-        if((insn.bits & 0xfff07fe0) == 0xd00064e0)
+        if((insn.bits & 0xfff07fe0) == 0xd40064e0)
         {
           #include "insns/cvtu_d_w.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0006000)
+        if((insn.bits & 0xfe007fe0) == 0xd4006000)
         {
           #include "insns/add_d.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0006860)
+        if((insn.bits & 0xfe007fe0) == 0xd4006860)
         {
           #include "insns/c_le_d.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd00060e0)
+        if((insn.bits & 0xfe007fe0) == 0xd40060e0)
         {
           #include "insns/sgnmul_d.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd00060c0)
+        if((insn.bits & 0xfe007fe0) == 0xd40060c0)
         {
           #include "insns/sgninjn_d.h"
           break;
         }
-        if((insn.bits & 0xfff07fe0) == 0xd0006600)
+        if((insn.bits & 0xfff07fe0) == 0xd4006600)
         {
           #include "insns/cvt_d_s.h"
           break;
         }
-        if((insn.bits & 0xfff07fe0) == 0xd0006400)
+        if((insn.bits & 0xfff07fe0) == 0xd4006400)
         {
           #include "insns/trunc_l_d.h"
           break;
         }
-        if((insn.bits & 0xfff07fe0) == 0xd0006420)
+        if((insn.bits & 0xfff07fe0) == 0xd4006420)
         {
           #include "insns/truncu_l_d.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0006020)
+        if((insn.bits & 0xfe007fe0) == 0xd4006020)
         {
           #include "insns/sub_d.h"
           break;
         }
-        if((insn.bits & 0xfff07fe0) == 0xd0006080)
+        if((insn.bits & 0xfff07fe0) == 0xd4006080)
         {
           #include "insns/sqrt_d.h"
           break;
         }
-        if((insn.bits & 0xfff07fe0) == 0xd00064c0)
+        if((insn.bits & 0xfff07fe0) == 0xd40064c0)
         {
           #include "insns/cvt_d_w.h"
           break;
         }
-        if((insn.bits & 0xfff07fe0) == 0xd0006480)
+        if((insn.bits & 0xfff07fe0) == 0xd4006480)
         {
           #include "insns/cvt_d_l.h"
           break;
         }
-        if((insn.bits & 0xfff07fe0) == 0xd0006460)
+        if((insn.bits & 0xfff07fe0) == 0xd4006460)
         {
           #include "insns/truncu_w_d.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0006040)
+        if((insn.bits & 0xfe007fe0) == 0xd4006040)
         {
           #include "insns/mul_d.h"
           break;
         }
-        if((insn.bits & 0xfe007fe0) == 0xd0006840)
+        if((insn.bits & 0xfe007fe0) == 0xd4006840)
         {
           #include "insns/c_lt_d.h"
           break;
         }
         #include "insns/unimp.h"
       }
-      default:
-      {
-        #include "insns/unimp.h"
-      }
-    }
-    break;
-  }
-  case 0x69:
-  {
-    switch((insn.bits >> 0xc) & 0x7)
-    {
-      case 0x0:
-      {
-        #include "insns/l_s.h"
-        break;
-      }
-      case 0x1:
-      {
-        #include "insns/s_s.h"
-        break;
-      }
-      case 0x6:
-      {
-        #include "insns/l_d.h"
-        break;
-      }
       case 0x7:
       {
-        #include "insns/s_d.h"
-        break;
-      }
-      default:
-      {
-        #include "insns/unimp.h"
-      }
-    }
-    break;
-  }
-  case 0x6a:
-  {
-    switch((insn.bits >> 0xc) & 0x7)
-    {
-      case 0x0:
-      {
-        if((insn.bits & 0xfff07fe0) == 0xd4000000)
-        {
-          #include "insns/mff_s.h"
-          break;
-        }
-        if((insn.bits & 0xfff07fe0) == 0xd4000800)
-        {
-          #include "insns/mtf_s.h"
-          break;
-        }
-        #include "insns/unimp.h"
-      }
-      case 0x6:
-      {
-        if((insn.bits & 0xfff07fe0) == 0xd4006000)
+        if((insn.bits & 0xfff07fe0) == 0xd4007800)
         {
           #include "insns/mff_d.h"
           break;
         }
-        if((insn.bits & 0xfff07fe0) == 0xd4006400)
-        {
-          #include "insns/mffh_d.h"
-          break;
-        }
-        if((insn.bits & 0xfe007fe0) == 0xd4006c00)
+        if((insn.bits & 0xfe007fe0) == 0xd4007000)
         {
           #include "insns/mtflh_d.h"
           break;
         }
-        if((insn.bits & 0xfff07fe0) == 0xd4006800)
+        if((insn.bits & 0xfff07fe0) == 0xd4007c00)
         {
           #include "insns/mtf_d.h"
           break;
@@ -366,12 +371,12 @@ switch((insn.bits >> 0x19) & 0x7f)
     {
       case 0x0:
       {
-        if((insn.bits & 0xfe007c00) == 0xd6000800)
+        if((insn.bits & 0xfe007c00) == 0xd6000c00)
         {
           #include "insns/nmadd_s.h"
           break;
         }
-        if((insn.bits & 0xfe007c00) == 0xd6000c00)
+        if((insn.bits & 0xfe007c00) == 0xd6000800)
         {
           #include "insns/nmsub_s.h"
           break;
@@ -390,12 +395,12 @@ switch((insn.bits >> 0x19) & 0x7f)
       }
       case 0x6:
       {
-        if((insn.bits & 0xfe007c00) == 0xd6006800)
+        if((insn.bits & 0xfe007c00) == 0xd6006c00)
         {
           #include "insns/nmadd_d.h"
           break;
         }
-        if((insn.bits & 0xfe007c00) == 0xd6006c00)
+        if((insn.bits & 0xfe007c00) == 0xd6006800)
         {
           #include "insns/nmsub_d.h"
           break;
diff --git a/riscv/insns/mffl_d.h b/riscv/insns/mffl_d.h
new file mode 100644 (file)
index 0000000..a258aa0
--- /dev/null
@@ -0,0 +1,2 @@
+require_fp;
+RDR = sext32(FRS1);