c_lwsp and c_swsp were not working correctly
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sun, 11 Nov 2018 20:20:11 +0000 (20:20 +0000)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sun, 11 Nov 2018 20:20:11 +0000 (20:20 +0000)
needed to be in ADDRmode (dropping down to mmu_t::load_xxx not sv_mmu_t)
and also needed to stop using reg_spec.offset.  added an extra
argument to rvc_sp() which is "use_offset=true/false".

switching to use_offset=false for c_lwsp and c_swsp, and getting them
to both NOT be in the normal ADDRmode for LD/ST, we get an
increment on the registers from SP.

really should redirect the CSRs to not use SP, x28-x30 instead or
something, in the unit tests...

riscv/insns/c_lwsp.h
riscv/insns/c_swsp.h
riscv/sv_decode.h
riscv/sv_insn_redirect.cc

index 6fd192c7244a2b95e722d3a360380d6bd4986efd..e0bf8cb80a640cb88c486c4848a8686ab554fc2c 100644 (file)
@@ -1,3 +1,3 @@
 require_extension('C');
 require(insn.insn_t::rvc_rd() != 0);
-WRITE_RD(MMU.load_int32(rv_add(RVC_SP, insn.rvc_lwsp_imm())));
+WRITE_RD(MMU.load_int32(insn.rvc_sp(false), insn.rvc_lwsp_imm()));
index 57b17351f5c6d31e45829fb12f22e0c49f8ea0d7..4aa3e0eb9bcb8a83f38213dcfd6fab28e32b6f9c 100644 (file)
@@ -1,2 +1,2 @@
 require_extension('C');
-MMU.store_uint32(rv_add(RVC_SP, insn.rvc_swsp_imm()), RVC_RS2);
+MMU.store_uint32(insn.rvc_sp(false), insn.rvc_swsp_imm(), RVC_RS2);
index f9551e8d23f2cc463a5651ba53ae333d310dc4ea..18f67aeb9d3d7940c5699e0293a6000904aff0fb 100644 (file)
@@ -68,7 +68,8 @@ public:
   reg_spec_t rvc_rs1s() { return predicated(_rvc_rs1s(), prs1); }
   reg_spec_t rvc_rs2 () { return predicated(_rvc_rs2 (), prs2); }
   reg_spec_t rvc_rs2s() { return predicated(_rvc_rs2s(), prs2); }
-  reg_spec_t rvc_sp  () { return predicated(_rvc_sp  (), psp ); }
+  reg_spec_t rvc_sp  (bool use_offs=true)
+                     { return predicated(_rvc_sp  (use_offs), psp ); }
 
   reg_spec_t _rd () { return _remap(insn_t::rd (), fimap & REG_RD , offs_rd); }
   reg_spec_t _rs1() { return _remap(insn_t::rs1(), fimap & REG_RS1, offs_rs1); }
@@ -82,8 +83,9 @@ public:
                                        offs_rs2); }
   reg_spec_t _rvc_rs2s() { return _remap(insn_t::rvc_rs2s(), fimap & REG_RVC_RS2S,
                                        offs_rs2); }
-  reg_spec_t _rvc_sp  () { return _remap(2, true, // sp always 2, always int
-                                       offs_sp); }
+  reg_spec_t _rvc_sp  (bool use_offs=true)
+                { return _remap(2, true, // sp always 2, always int
+                                use_offs ? offs_sp : NULL); }
 
   void setpc(int xlen, int vlen, reg_t &npc, reg_t addr, uint64_t offs,
              reg_t *target_reg);
index 67c39e32bee47a2216a1b252badb929f34b2a484..7905245f2071f9c6544d2973c4a6d4dc8ee7f397 100644 (file)
@@ -308,7 +308,7 @@ reg_t sv_proc_t::READ_REG(reg_spec_t const& spec,
     int bitwidth = get_bitwidth(_insn->reg_elwidth(reg, true), xlen);
     int shift = 0;
     int offs = 0;
-    if (spec.offset != NULL && spec.reg != 2) { // XXX HACK on spec.reg != 2
+    if (spec.offset != NULL) {
         int nbytes = width / bitwidth;
         if (nbytes == 0) {
             nbytes = 1;
@@ -338,10 +338,10 @@ reg_t sv_proc_t::READ_REG(reg_spec_t const& spec,
             // gets element within the reg-block
             ndata = data >> (shift*bitwidth);
             ndata &= ((1UL<<bitwidth)-1UL); // masks off the right bits
-            fprintf(stderr, "readreg %ld bitwidth %d offs %d " \
-                            "shift %d %lx->%lx\n",
-                            spec.reg, bitwidth, offs, shift, data, ndata);
         }
+        fprintf(stderr, "readreg %ld bitwidth %d offs %d " \
+                        "shift %d %lx->%lx\n",
+                        spec.reg, bitwidth, offs, shift, data, ndata);
     }
     return ndata;
 }