add the subvl offset to sv_insn_t
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 27 Jun 2019 09:01:02 +0000 (10:01 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 27 Jun 2019 09:01:02 +0000 (10:01 +0100)
id_regs.py
riscv/insn_template_sv.cc
riscv/sv.cc
riscv/sv_decode.h

index c641c90bbe16e423be87615ecb216ce5fdad1160..04d91633b067e85adb656c2972766966d4c802a5 100644 (file)
@@ -202,9 +202,13 @@ def find_registers(fname, insn, twin_predication, immed_offset, is_branch):
 
     res.append('#define PRED_ARGS %s' % ','.join(predargs))
     offsargs = []
+    suboargs = []
     for i in range(len(predargs)):
         offsargs.append(predargs[i].replace('pred', 'offs').replace("&", ''))
     res.append('#define OFFS_ARGS %s' % ','.join(offsargs))
+    for i in range(len(predargs)):
+        suboargs.append(predargs[i].replace('pred', 'subo').replace("&", ''))
+    res.append('#define SUBO_ARGS %s' % ','.join(suboargs))
 
     return '\n'.join(res)
 
@@ -220,6 +224,7 @@ if __name__ == '__main__':
         twin_predication = False
         immed_offset = False
         is_branch = False
+        print regsname
         with open(regsname, "w") as f:
             txt = "\n#define INSN_%s\n" % insn.upper()
             # help identify type of register
index 7b385933f5e71be97a57b14a4c6241b37694cef8..8f14778937056c7144933ee935e6f6ffa141d721 100644 (file)
@@ -30,6 +30,7 @@ reg_t FN(processor_t* p, insn_t s_insn, reg_t pc)
 #define SRC_PREDINT 1
 #define PRED_ARGS dest_pred,dest_pred,dest_pred,dest_pred,dest_pred,&dest_pred
 #define OFFS_ARGS dest_offs,dest_offs,dest_offs,dest_offs,dest_offs,dest_offs
+#define SUBO_ARGS dest_subo,dest_subo,dest_subo,dest_subo,dest_subo,dest_subo
 #else
 #define sv_enabled true
 #endif
@@ -74,7 +75,7 @@ reg_t sv_proc_t::FN(processor_t* p, insn_t s_insn, reg_t pc)
 #endif
   sv_insn_t insn(p, sv_enabled, bits, floatintmap, xlen,
                  INSN_SRC_FLEN, INSN_DEST_FLEN,
-                 PRED_ARGS, OFFS_ARGS,
+                 PRED_ARGS, OFFS_ARGS, SUBO_ARGS,
 #ifdef INSN_TYPE_SIGNED
                  true
 #else
index ac98c696f3c8085670bce5e32d31754b73c8d8a3..99b0f7bdf01729434556c90b92b146b09c5ca207 100644 (file)
@@ -50,6 +50,8 @@ sv_insn_t::sv_insn_t(processor_t *pr, bool _sv_enabled,
             uint64_t &p_sp, uint64_t *p_im,
             int *o_rd, int *o_rs1, int *o_rs2, int *o_rs3, int *o_sp,
             int *o_imm,
+            int *s_rd, int *s_rs1, int *s_rs2, int *s_rs3, int *s_sp,
+            int *s_imm,
             bool _sign) :
             insn_t(bits), p(pr), src_bitwidth(0),
             xlen(_xlen), src_flen(_src_flen), dest_flen(_dest_flen),
@@ -59,6 +61,9 @@ sv_insn_t::sv_insn_t(processor_t *pr, bool _sv_enabled,
             offs_rd(o_rd), offs_rs1(o_rs1), offs_rs2(o_rs2), offs_rs3(o_rs3),
             offs_sp(o_sp),
             offs_imm(o_imm),
+            subo_rd(s_rd), subo_rs1(s_rs1), subo_rs2(s_rs2), subo_rs3(s_rs3),
+            subo_sp(s_sp),
+            subo_imm(s_imm),
             prd(p_rd), prs1(p_rs1), prs2(p_rs2), prs3(p_rs3), psp(p_sp),
             save_branch_addr(0)
 {
index f1d53fc32768dd218a29f6316a3c1df9400d1eaf..1f62ade949d2d808ec8102fed1bbf244bbf2ef1c 100644 (file)
@@ -30,6 +30,7 @@ struct reg_spec_t
 {
     reg_t reg;
     int *offset;
+    int *suboff;
     bool isvec;
     bool signextend;
 };
@@ -43,6 +44,8 @@ public:
             uint64_t &p_sp, uint64_t *p_im,
             int *o_rd, int *o_rs1, int *o_rs2, int *o_rs3, int *o_sp,
             int *o_imm,
+            int *s_rd, int *s_rs1, int *s_rs2, int *s_rs3, int *s_sp,
+            int *s_imm,
             bool _sign);
 
   uint8_t reg_elwidth(reg_t reg, bool intreg);
@@ -138,6 +141,14 @@ private:
   int *offs_rs3;
   int *offs_sp;
   int *offs_imm;
+
+  int *subo_rd;
+  int *subo_rs1;
+  int *subo_rs2;
+  int *subo_rs3;
+  int *subo_sp;
+  int *subo_imm;
+
   uint64_t &prd;
   uint64_t &prs1;
   uint64_t &prs2;