create ldsp immediate offset overrides
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sat, 6 Oct 2018 09:24:25 +0000 (10:24 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sat, 6 Oct 2018 09:24:25 +0000 (10:24 +0100)
this allows C.LWSP/C.LDSP to do predicated load/stores from contiguous
blocks of memory

id_regs.py
riscv/sv.cc
riscv/sv_decode.h

index 782cbcb1620bda12c0a420744f83d3e8ba29584b..d6259cd1989c7327ebebe076f727eda5c4259e6e 100644 (file)
@@ -129,6 +129,12 @@ def find_registers(fname, insn, twin_predication, immed_offset):
     if immed_offset: # C.LWSP
         predargs.append('&src_pred')
         fsrc = insn in ['c_flwsp', 'c_fldsp']
+        c_sp_width = {'c_lwsp': 4, 'c_ldsp': 8, 'c_lqsp': 16,
+                      'c_flwsp': 4, 'c_fldsp': 8,
+                      'c_swsp': 4, 'c_sdsp': 8, 'c_sqsp': 16,
+                      'c_fswsp': 4, 'c_fsdsp': 8}
+        iwidth = c_sp_width[insn]
+        res.append('#define IMMEDWIDTH %d' % (iwidth))
         res.append('#define SRC_PREDINT %d' % (0 if fsrc else 1))
 
     if twin_predication:
index a6bf42a6708fb45af0ef7eefc7180b4aa251a78e..8088ef4652136176ff54dd2a1743d5bfcc012d41 100644 (file)
@@ -92,7 +92,7 @@ uint64_t sv_insn_t::remap(uint64_t reg, bool intreg, int voffs)
   // we return the re-mapped register...
   if (!r->isvec) // scalar
   {
-    return reg; 
+    return reg;
   }
   vloop_continue = true;
 
@@ -167,3 +167,25 @@ bool sv_insn_t::stop_vloop(void)
 }
 
 
+/* c_lwsp's immediate offset is turned into a Vector "unit stride" if
+ * x2 (sp by convention) is marked as vectorised.
+ *
+ */
+uint64_t sv_insn_t::_rvc_spoffs_imm(uint64_t elwidth, uint64_t offs)
+{
+  sv_reg_entry *r = get_regentry(X_SP, 1);
+  if (!r->active)
+  {
+    return offs;
+  }
+  vloop_continue = true;
+  reg_t reg = r->regidx;
+  if (!r->isvec)
+  {
+    return offs;
+  }
+  offs += (*offs_imm) * elwidth;
+
+  return offs;
+}
+
index 8065013261e348cb8b639d7d1ff0d6f3582ffc11..d85f04745488cba4bfb1b64d3505dc87444eead1 100644 (file)
@@ -26,7 +26,11 @@ public:
             int *o_rd, int *o_rs1, int *o_rs2, int *o_rs3, int *o_imm) :
             insn_t(bits), p(pr), vloop_continue(false), fimap(f),
             offs_rd(o_rd), offs_rs1(o_rs1), offs_rs2(o_rs2), offs_rs3(o_rs3),
+            offs_imm(o_imm),
             prd(p_rd), prs1(p_rs1), prs2(p_rs2), prs3(p_rs3) {}
+  uint64_t _rvc_spoffs_imm(uint64_t elwidth, uint64_t baseoffs);
+  uint64_t rvc_ldsp_imm() { return _rvc_spoffs_imm(4, insn_t::rvc_ldsp_imm()); }
+  uint64_t rvc_lwsp_imm() { return _rvc_spoffs_imm(8, insn_t::rvc_lwsp_imm()); }
   uint64_t rd () { return predicated(_rd (), *offs_rd, prd); }
   uint64_t rs1() { return predicated(_rs1(), *offs_rs1, prs1); }
   uint64_t rs2() { return predicated(_rs2(), *offs_rs2, prs2); }
@@ -65,6 +69,7 @@ private:
   int *offs_rs1;
   int *offs_rs2;
   int *offs_rs3;
+  int *offs_imm;
   uint64_t &prd;
   uint64_t &prs1;
   uint64_t &prs2;