redirect RS2 to sv_proc_t class
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 12 Oct 2018 14:16:07 +0000 (15:16 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 12 Oct 2018 14:16:07 +0000 (15:16 +0100)
riscv/insns/amomaxu_d.h
riscv/insns/amominu_d.h
riscv/sv_insn_redirect.cc
riscv/sv_insn_redirect.h

index 12b173313d9e4f1636e13a67fea6785fbae8f8ae..e5ae07f177a86ceaf3cedd7840619beed8daea29 100644 (file)
@@ -1,3 +1,3 @@
 require_extension('A');
 require_rv64;
-WRITE_RD(MMU.amo_uint64(RS1, [&](uint64_t lhs) { return std::max(lhs, RS2); }));
+WRITE_RD(MMU.amo_uint64(RS1, [&](uint64_t lhs) { return (lhs > RS2) ? lhs : RS2; }));
index 15b6c0a48bad12e9cafd9738fe7481bc933eb974..a03a1d6e9882809940132cae4d9f93df26e1e373 100644 (file)
@@ -1,3 +1,3 @@
 require_extension('A');
 require_rv64;
-WRITE_RD(MMU.amo_uint64(RS1, [&](uint64_t lhs) { return std::min(lhs, RS2); }));
+WRITE_RD(MMU.amo_uint64(RS1, [&](uint64_t lhs) { return (lhs < RS2) ? lhs : RS2; }));
index e222922f63f9ec5adad97784feb44e6db91c71fc..616ed3356983988aac724186509c4d1488e694d3 100644 (file)
@@ -13,7 +13,11 @@ reg_t (sv_proc_t::READ_REG)(uint64_t i)
 }
 */
 
-RS1::operator reg_t () const {
+RS1::operator reg_t () const {
     return _insn->p->get_state()->XPR[_insn->rs1()];
 }
 
+RS2::operator reg_t () const & {
+    return _insn->p->get_state()->XPR[_insn->rs2()];
+}
+
index 2e71c951ceb9b4a36a25ae1577d0b2ec2fab916d..2efcce3c664b2c169346ecb544924c786bc516f1 100644 (file)
@@ -6,6 +6,7 @@
 #include "sv_decode.h"
 
 #undef RS1
+#undef RS2
 
 class processor_t;
 class insn_t;
@@ -16,7 +17,16 @@ class RS1 {
         RS1() : _insn(NULL) {}
         //sv_insn_t & operator = (sv_insn_t &i)
         //{ _insn = &i; return i; }
-        operator reg_t () const;
+        operator reg_t () const &;
+};
+
+class RS2 {
+    public:
+        sv_insn_t *_insn;
+        RS2() : _insn(NULL) {}
+        //sv_insn_t & operator = (sv_insn_t &i)
+        //{ _insn = &i; return i; }
+        operator reg_t () const &;
 };
 
 class sv_proc_t
@@ -29,6 +39,7 @@ public:
     processor_t *p;
 
     class RS1 RS1;
+    class RS2 RS2;
 
     class {
         public:
@@ -42,6 +53,7 @@ public:
     void set_insn(sv_insn_t *i) {
         this->insn = *i;
         RS1._insn = i;
+        RS2._insn = i;
     }
 
 #include "sv_insn_decl.h"