aboutsummaryrefslogtreecommitdiff
path: root/riscv
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@s141.Millennium.Berkeley.EDU>2010-09-28 17:17:04 -0700
committerAndrew Waterman <waterman@s141.Millennium.Berkeley.EDU>2010-09-28 17:17:04 -0700
commit68ddbd26c3643ebe13aa34e58d7dad5dbc1ddbd3 (patch)
treeaa3b83abc16c3c5069e41478021ba00c028bf031 /riscv
parentee7cb7243e6d297051e1f7bc028196b40d470cb3 (diff)
downloadspike-68ddbd26c3643ebe13aa34e58d7dad5dbc1ddbd3.zip
spike-68ddbd26c3643ebe13aa34e58d7dad5dbc1ddbd3.tar.gz
spike-68ddbd26c3643ebe13aa34e58d7dad5dbc1ddbd3.tar.bz2
[opcodes, sim, xcc] added mffl.d instruction
...to be used instead of mff.s when doing int -> DP FP moves on a 32-bit cpu
Diffstat (limited to 'riscv')
-rw-r--r--riscv/execute.h221
-rw-r--r--riscv/insns/mffl_d.h2
2 files changed, 115 insertions, 108 deletions
diff --git a/riscv/execute.h b/riscv/execute.h
index 2c500c4..15f4e1a 100644
--- a/riscv/execute.h
+++ b/riscv/execute.h
@@ -65,288 +65,293 @@ switch((insn.bits >> 0x19) & 0x7f)
{
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
index 0000000..a258aa0
--- /dev/null
+++ b/riscv/insns/mffl_d.h
@@ -0,0 +1,2 @@
+require_fp;
+RDR = sext32(FRS1);