add predication remap option
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 15 Nov 2018 23:23:13 +0000 (23:23 +0000)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 15 Nov 2018 23:23:13 +0000 (23:23 +0000)
riscv/processor.cc
riscv/processor.h
riscv/sv.cc
riscv/sv.h
riscv/sv_decode.h
riscv/sv_insn_redirect.cc
riscv/sv_insn_redirect.h

index 773fab85c0d5efde829469657cb998b46c4c143a..f84aa8f91e9c85fec755061b7863594a78f82bda 100644 (file)
@@ -193,13 +193,13 @@ sv_csr_t &state_t::sv()
     return get_usv();
 }
 
-sv_shape_t* state_t::get_shape(reg_t reg)
+sv_shape_t* state_t::get_shape(reg_t reg, bool pred)
 {
     if (prv == PRV_M || prv == PRV_S || reg == 0) {
         return NULL;
     }
     for (int i = 0; i < 3; i++) {
-        if (remap[i].regidx == reg) {
+        if (remap[i].regidx == reg && remap[i].pred == pred) {
             return &shape[i];
         }
     }
@@ -614,6 +614,9 @@ reg_t processor_t::set_csr(int which, reg_t val, bool imm_mode)
       state.remap[0].regidx = get_field(val, SV_REMAP_REGIDX0);
       state.remap[1].regidx = get_field(val, SV_REMAP_REGIDX1);
       state.remap[2].regidx = get_field(val, SV_REMAP_REGIDX2);
+      state.remap[0].pred = get_field(val, SV_REMAP_PRED0);
+      state.remap[1].pred = get_field(val, SV_REMAP_PRED1);
+      state.remap[2].pred = get_field(val, SV_REMAP_PRED2);
       state.remap[0].shape = get_field(val, SV_REMAP_SHAPE0);
       state.remap[1].shape = get_field(val, SV_REMAP_SHAPE1);
       state.remap[2].shape = get_field(val, SV_REMAP_SHAPE2);
index 4a7fee8290c09ecf301ec90f8dbba991861cbeb5..efd894523831cf03784f4d6f212b9daff6eb7e82 100644 (file)
@@ -168,7 +168,7 @@ struct state_t
   sv_remap_t remap[3];
   sv_shape_t shape[3];
 
-  sv_shape_t *get_shape(reg_t reg);
+  sv_shape_t *get_shape(reg_t reg, bool pred=false);
   void sv_csr_reg_unpack();
   void sv_csr_pred_unpack();
   void get_csr_start_end(int &start, int &end);
index 2096351da8ab2eb33cefe67753ff264ba72ced5d..8f24631f8a8d31bd899011a17f932ac133fa8d0e 100644 (file)
@@ -277,15 +277,14 @@ uint64_t sv_insn_t::_rvc_spoffs_imm(uint64_t elwidth, uint64_t offs)
 }
 
 // for use in predicated branches. sets bit N if val=true; clears bit N if false
-uint64_t sv_insn_t::rd_bitset(reg_t reg, uint64_t bit, bool set)
+uint64_t sv_insn_t::rd_bitset(reg_t reg, int bit, bool set)
 {
-    //reg_spec_t rs = {reg, NULL};
-    //uint64_t val = p->s.READ_REG(rs);
+    reg_spec_t rs = {reg, &bit};
     uint64_t val = STATE.XPR[reg];
     if (set) {
-        val |= (1<<bit);
+        val |= (1UL<<bit);
     } else {
-        val &= ~(1<<bit);
+        val &= ~(1UL<<bit);
     }
     STATE.XPR.write(reg, val);
     return val;
@@ -377,11 +376,11 @@ uint64_t sv_csr_t::regpush(uint16_t csrval, int len, bool top)
                 fprintf(stderr, "regcsr shuffle %d %d\n", idx, idx+1);
             }
             sv_csrs[topstack].u = csrval;
-            fprintf(stderr, "regcsr set %d %lx\n", topstack, csrval);
+            fprintf(stderr, "regcsr set %d %x\n", topstack, csrval);
             return popped;
         } else {
             sv_csrs[topstack].u = csrval;
-            fprintf(stderr, "regcsr set %d %lx\n", topstack, csrval);
+            fprintf(stderr, "regcsr set %d %x\n", topstack, csrval);
             return 0;
         }
     }
index d5db778f5e5a3093d19975356f3f92498df8cfbf..3df72d2f858dc95fc26545a39c106425fb29c0de 100644 (file)
@@ -74,6 +74,7 @@ bool sv_check_reg(bool intreg, uint64_t reg);
 typedef struct {
     uint64_t regidx: 7; // actual i.e. real register (0-127)
     unsigned int shape: 2; // which shape register to use
+    bool pred;
 } sv_remap_t;
 
 typedef struct {
@@ -87,8 +88,11 @@ typedef struct {
 } sv_shape_t;
 
 #define SV_REMAP_REGIDX0 (0x7f)
+#define SV_REMAP_PRED0 (0x80)
 #define SV_REMAP_REGIDX1 (0x7f<<8)
+#define SV_REMAP_PRED1 (0x800)
 #define SV_REMAP_REGIDX2 (0x7f<<16)
+#define SV_REMAP_PRED2 (0x8000)
 #define SV_REMAP_SHAPE0 (0x3<<24)
 #define SV_REMAP_SHAPE1 (0x3<<26)
 #define SV_REMAP_SHAPE2 (0x3<<28)
index 18f67aeb9d3d7940c5699e0293a6000904aff0fb..07274870d0e0137e1df2f8a9baeb10f4233cfc07 100644 (file)
@@ -91,7 +91,7 @@ public:
              reg_t *target_reg);
 
   // used for predicated branches. sets bit N if val=true; clears bit N if false
-  uint64_t rd_bitset(reg_t reg, uint64_t bit, bool val);
+  uint64_t rd_bitset(reg_t reg, int bit, bool val);
 
   bool sv_check_reg(bool intreg, uint64_t reg);
   sv_reg_entry* get_regentry(uint64_t reg, bool isint);
index 7905245f2071f9c6544d2973c4a6d4dc8ee7f397..14a9d658073dd3293f50742311886480ee8e3b10 100644 (file)
@@ -121,10 +121,10 @@ union freg_shift {
     uint8_t b[sizeof(freg_t)*8];
 };
 
-unsigned int sv_proc_t::remap(reg_spec_t const& spec)
+unsigned int sv_proc_t::remap(reg_spec_t const& spec, bool pred)
 {
     unsigned int offs = *spec.offset;
-    sv_shape_t *shape = p->get_state()->get_shape(spec.reg);
+    sv_shape_t *shape = p->get_state()->get_shape(spec.reg, pred);
     if (shape == NULL) {
         return offs;
     }
index c90eb67563360422948bb932d010144370e851f9..e510b4e3f4ff180db76739f27aa7b1e3f093dd25 100644 (file)
@@ -265,7 +265,7 @@ public:
     sv_reg_t to_uint32(sv_freg_t const& reg);
     sv_reg_t to_uint32(sv_float32_t const& reg);
 
-    unsigned int remap(reg_spec_t const& regspec);
+    unsigned int remap(reg_spec_t const& regspec, bool pred=false);
 
     bool rv_int_op_prepare(sv_reg_t const & lhs, sv_reg_t const & rhs,
                            uint64_t &vlhs, uint64_t &vrhs,