check if register redirection is active, and if vectorisation enabled
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Wed, 26 Sep 2018 08:03:08 +0000 (09:03 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Wed, 26 Sep 2018 08:03:08 +0000 (09:03 +0100)
check each register (if used) - this is what the #define USING_RD etc.
macros are for, to disable checks that are not needed

riscv/insn_template_sv.cc
riscv/sv.cc
riscv/sv.h

index c3401423f2ff7934914af9520508cb9a534e93af..4199de033fe893d18a576b44af299d9b1cc1e4ab 100644 (file)
@@ -15,6 +15,42 @@ reg_t FN(processor_t* p, insn_t s_insn, reg_t pc)
   int vlen = 1;
   sv_insn_t insn(bits, voffs);
   bool vectorop = false;
+  reg_t predicate = 0;
+  // identify which regs have had their CSR entries set as vectorised.
+  // really could do with a macro for-loop here... oh well...
+  // integer ops, RD, RS1, RS2, RS3 (use sv_int_tb)
+#ifdef USING_RD
+  vectorop &= check_reg(true, s_insn.rd());
+#endif
+#ifdef USING_RS1
+  vectorop &= check_reg(true, s_insn.rs1());
+#endif
+#ifdef USING_RS2
+  vectorop &= check_reg(true, s_insn.rs2());
+#endif
+#ifdef USING_RS2
+  vectorop &= check_reg(true, s_insn.rs3());
+#endif
+  // fp ops, RD, RS1, RS2, RS3 (use sv_fp_tb)
+#ifdef USING_FRD
+  vectorop &= check_reg(false, s_insn.frd());
+#endif
+#ifdef USING_FRS1
+  vectorop &= check_reg(false, s_insn.frs1());
+#endif
+#ifdef USING_FRS2
+  vectorop &= check_reg(false, s_insn.rs2());
+#endif
+#ifdef USING_FRS2
+  vectorop &= check_reg(false, s_insn.rs3());
+#endif
+
+  // if vectorop is set, one of the regs is not a scalar,
+  // so we must read the VL CSR and do a loop
+  if (vectorop)
+  {
+    // TODO: vlen = p->CSR(SIMPLEV_VL); // something like that...
+  }
   for (; voffs < vlen; voffs++)
   {
       #include INCLUDEFILE
index 824541c7a37953901f3998eba166e1c63113b727..296e2d39ef24323bde6a7469c9056f73e15508d6 100644 (file)
@@ -6,3 +6,24 @@ sv_reg_entry sv_fp_tb[NFPR];
 sv_pred_csr_entry sv_pred_csrs[SV_CSR_SZ];
 sv_pred_entry sv_pred_tb[NXPR];
 
+bool sv_check_reg(bool intreg, uint64_t reg)
+{
+  sv_reg_entry *r;
+  if (intreg)
+  {
+    r = &sv_int_tb[reg];
+  }
+  else
+  {
+    r = &sv_fp_tb[reg];
+  }
+  if (r->elwidth != 0)
+  {
+    // XXX raise exception
+  }
+  if (r->active && r->isvec)
+  {
+    return true;
+  }
+  return false;
+}
index cd2f8fbb030384246701333719d4f82006a5987c..8c2bf3a4216fd6b1c0d483bda3b29bae12370203 100644 (file)
@@ -63,4 +63,6 @@ typedef struct {
 // 32 entries, only integer regs are predicates.
 extern sv_pred_entry sv_pred_tb[NXPR];
 
+bool sv_check_reg(bool intreg, uint64_t reg);
+
 #endif