start using subvl to calculate offset. predication and stack pointer needed
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 27 Jun 2019 10:58:04 +0000 (11:58 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 27 Jun 2019 10:58:04 +0000 (11:58 +0100)
sub-offsets, one fake (predication does not use subvl), one real

riscv/sv_decode.h
riscv/sv_insn_redirect.cc

index 956653da46eea3fec1e311c7f8d2ac75a88bf253..060aa3af841fc93915c04ccff80eab0bce0e34af 100644 (file)
@@ -139,6 +139,7 @@ public:
   uint64_t get_if_one_reg_vectorised() { return at_least_one_reg_vectorised; }
 
   int *get_sp_offs() { return offs_sp; }
+  int *get_sp_subo() { return subo_sp; }
 
 private:
   bool vloop_continue;
index ce48de779c098c12f79483b9749a09159e862351..988cfcaa99fad14863b67e619cf640a3de8ed0af 100644 (file)
@@ -123,13 +123,20 @@ union freg_shift {
 
 unsigned int sv_proc_t::pred_remap(reg_t reg, int bit)
 {
-    reg_spec_t rs = {reg, &bit};
+    int ignore_subvl = 0; // predication does not use subvl
+    reg_spec_t rs = {reg, &bit, &ignore_subvl};
     return remap(rs, true);
 }
 
 unsigned int sv_proc_t::remap(reg_spec_t const& spec, bool pred)
 {
     unsigned int offs = *spec.offset;
+    unsigned int subo = *spec.suboff;
+    // this is where (after all the fuss, passing info around) the actual
+    // register offset is computed.  if subvl is active, it's a multiplier
+    //fprintf(stderr, "remap %ld subvl %ld offs %ld subo %ld\n",
+    //                spec.reg, p->get_state()->sv().subvl, offs, subo);
+    offs = offs * p->get_state()->sv().subvl + subo;
     sv_shape_t *shape = p->get_state()->get_shape(spec.reg, pred);
     if (shape == NULL) {
         return offs;
@@ -399,7 +406,7 @@ GET_REG(rvc_rs2)
 
 sv_reg_t sv_proc_t::get_rvc_sp()
 {
-    return get_intreg({X_SP, _insn->get_sp_offs()});
+    return get_intreg({X_SP, _insn->get_sp_offs(), _insn->get_sp_subo()});
 }
 
 #define GET_FPREG(name, getter) \