more hwacha supervisor stuff
authorYunsup Lee <yunsup@cs.berkeley.edu>
Sat, 19 Oct 2013 02:19:00 +0000 (19:19 -0700)
committerYunsup Lee <yunsup@cs.berkeley.edu>
Sat, 19 Oct 2013 02:19:00 +0000 (19:19 -0700)
hwacha/decode_hwacha_ut.h
hwacha/hwacha.cc
hwacha/hwacha.h
hwacha/insn_template_hwacha_ut.cc
hwacha/insns/vxcptaux.h
hwacha/insns/vxcptcause.h

index c2e003268e90588238ada97edbdae2ce12feaa74..44b993bae2019653b4d51ba0fb17ebb2f2004dfc 100644 (file)
@@ -6,7 +6,8 @@
 #include "hwacha.h"
 #include "hwacha_xcpt.h"
 
-#define UTIDX (i)
+#define UTIDX (h->get_ct_state()->count)
+#define WRITE_UTIDX(value) (h->get_ct_state()->count = (value))
 
 #undef RS1
 #undef RS2
index 192d30848cbfb02f44fa970bf989ae7036d45ef1..74cbbcf173d49cb35b076d01695ced6b5b949bed 100644 (file)
@@ -5,15 +5,13 @@
 
 void ct_state_t::reset()
 {
-  vl = 0;
-  maxvl = 32;
   nxpr = 32;
   nfpr = 32;
+  maxvl = 32;
+  vl = 0;
+  count = 0;
 
   vf_pc = -1;
-
-  cause = 0;
-  aux = 0;
 }
 
 void ut_state_t::reset()
@@ -97,10 +95,10 @@ bool hwacha_t::vf_active()
   return false;
 }
 
-void hwacha_t::take_exception(reg_t cause, reg_t aux)
+void hwacha_t::take_exception(reg_t c, reg_t a)
 {
-  get_ct_state()->cause = cause;
-  get_ct_state()->aux = aux;
+  cause = c;
+  aux = a;
   raise_interrupt();
   if (!(p->get_state()->sr & SR_EI))
     throw std::logic_error("hwacha exception posted, but SR_EI bit not set!");
index 7504e577b3b79f433f0b354af4b92defceb46bd1..100477cdfd2d1ae7b1b7d74b1325e511d8955492 100644 (file)
@@ -11,11 +11,9 @@ struct ct_state_t
   uint32_t nfpr;
   uint32_t maxvl;
   uint32_t vl;
+  uint32_t count;
 
   reg_t vf_pc;
-
-  reg_t cause;
-  reg_t aux;
 };
 
 struct ut_state_t
@@ -30,7 +28,7 @@ struct ut_state_t
 class hwacha_t : public extension_t
 {
 public:
-  hwacha_t() : debug(false) {}
+  hwacha_t() : cause(0), aux(0), debug(false) {}
   std::vector<insn_desc_t> get_instructions();
   std::vector<disasm_insn_t*> get_disasms();
   const char* name() { return "hwacha"; }
@@ -40,6 +38,8 @@ public:
   ct_state_t* get_ct_state() { return &ct_state; }
   ut_state_t* get_ut_state(int idx) { return &ut_state[idx]; }
   bool vf_active();
+  reg_t get_cause() { return cause; }
+  reg_t get_aux() { return aux; }
   void take_exception(reg_t, reg_t);
   void clear_exception() { clear_interrupt(); }
 
@@ -50,6 +50,9 @@ private:
   static const int max_uts = 2048;
   ct_state_t ct_state;
   ut_state_t ut_state[max_uts];
+  reg_t cause;
+  reg_t aux;
+
   disassembler_t ut_disassembler;
   bool debug;
 };
index 7dad75dffcf84e20ecbd938029f1e5918475889d..79e7c2f0846741130a4428d644df531b63cb4f45 100644 (file)
@@ -15,8 +15,10 @@ reg_t hwacha_NAME(processor_t* p, insn_t insn, reg_t pc)
   int xprlen = 64;
   reg_t npc = sext_xprlen(pc + insn_length(OPCODE));
   hwacha_t* h = static_cast<hwacha_t*>(p->get_extension());
-  for (uint32_t i=0; i<VL; i++) {
+  do {
     #include "insns_ut/NAME.h"
-  }
+    WRITE_UTIDX(UTIDX+1);
+  } while (UTIDX < VL);
+  WRITE_UTIDX(0);
   return npc;
 }
index 92e29201e23fb6cab32cc4f85fa01dc0c2d8f342..77318c32ce635d8739a415732b82a8d2ef1ee690 100644 (file)
@@ -1,2 +1,2 @@
 require_supervisor_hwacha;
-xd = h->get_ct_state()->aux;
+xd = h->get_aux();
index e959247402c89d332ae938e2514c9b7ba935f66e..3054ff977b65fe9d97484e4ba9c51e59070b6f84 100644 (file)
@@ -1,3 +1,3 @@
 require_supervisor_hwacha;
 h->clear_exception();
-xd = h->get_ct_state()->cause;
+xd = h->get_cause();