implement vxcptsave/vxcptrestore
authorYunsup Lee <yunsup@cs.berkeley.edu>
Sat, 19 Oct 2013 05:28:23 +0000 (22:28 -0700)
committerYunsup Lee <yunsup@cs.berkeley.edu>
Sat, 19 Oct 2013 05:28:23 +0000 (22:28 -0700)
hwacha/decode_hwacha.h
hwacha/decode_hwacha_ut.h
hwacha/insns/vxcptrestore.h
hwacha/insns/vxcptsave.h

index 9353cb9dae509e8f9e2622d30ed3c07fbb63e2a8..b7069fad74c08ed092599229c757390e543d6c90 100644 (file)
 #define NFPR (h->get_ct_state()->nfpr)
 #define MAXVL (h->get_ct_state()->maxvl)
 #define VL (h->get_ct_state()->vl)
+#define UTIDX (h->get_ct_state()->count)
 #define VF_PC (h->get_ct_state()->vf_pc)
 #define WRITE_NXPR(nxprnext) (h->get_ct_state()->nxpr = (nxprnext))
 #define WRITE_NFPR(nfprnext) (h->get_ct_state()->nfpr = (nfprnext))
 #define WRITE_MAXVL(maxvlnext) (h->get_ct_state()->maxvl = (maxvlnext))
 #define WRITE_VL(vlnext) (h->get_ct_state()->vl = (vlnext))
+#define WRITE_UTIDX(value) (h->get_ct_state()->count = (value))
 #define WRITE_VF_PC(pcnext) (h->get_ct_state()->vf_pc = (pcnext))
 
 #define INSN_RS1 (insn.rs1())
index 44b993bae2019653b4d51ba0fb17ebb2f2004dfc..a07af8251f3a6c512a10bb9ef51ce49f1301e553 100644 (file)
@@ -6,9 +6,6 @@
 #include "hwacha.h"
 #include "hwacha_xcpt.h"
 
-#define UTIDX (h->get_ct_state()->count)
-#define WRITE_UTIDX(value) (h->get_ct_state()->count = (value))
-
 #undef RS1
 #undef RS2
 #undef WRITE_RD
index cb3d8f0a8aad00ff4af976ff87a94125405dd343..db7a62e26b125f9b47cf3f87a50f662d46874ca4 100644 (file)
@@ -1 +1,40 @@
 require_supervisor_hwacha;
+reg_t addr = XS1;
+
+#define LOAD_B(addr) \
+  (addr += 1, p->get_mmu()->load_uint8(addr-1))
+
+#define LOAD_W(addr) \
+  (addr += 4, p->get_mmu()->load_uint32(addr-4))
+
+#define LOAD_D(addr) \
+  (addr += 8, p->get_mmu()->load_uint64(addr-8))
+
+
+WRITE_NXPR(LOAD_W(addr));
+WRITE_NFPR(LOAD_W(addr));
+WRITE_MAXVL(LOAD_W(addr));
+WRITE_VL(LOAD_W(addr));
+WRITE_UTIDX(LOAD_W(addr));
+addr += 4;
+WRITE_VF_PC(LOAD_D(addr));
+
+for (uint32_t x=1; x<NXPR; x++) {
+  for (uint32_t i=0; i<VL; i++) {
+    UT_WRITE_XPR(i, x, LOAD_D(addr));
+  }
+}
+
+for (uint32_t f=0; f<NFPR; f++) {
+  for (uint32_t i=0; i<VL; i++) {
+    UT_WRITE_FPR(i, f, LOAD_D(addr));
+  }
+}
+
+for (uint32_t i=0; i<VL; i++) {
+  h->get_ut_state(i)->run = LOAD_B(addr);
+}
+
+#undef LOAD_B
+#undef LOAD_W
+#undef LOAD_D
index cb3d8f0a8aad00ff4af976ff87a94125405dd343..2ff776129b19903428e363c4d7b337accabce8ea 100644 (file)
@@ -1 +1,42 @@
 require_supervisor_hwacha;
+reg_t addr = XS1;
+
+#define STORE_B(addr, value) \
+  p->get_mmu()->store_uint8(addr, value); \
+  addr += 1; \
+
+#define STORE_W(addr, value) \
+  p->get_mmu()->store_uint32(addr, value); \
+  addr += 4; \
+
+#define STORE_D(addr, value) \
+  p->get_mmu()->store_uint64(addr, value); \
+  addr += 8; \
+
+STORE_W(addr, NXPR);
+STORE_W(addr, NFPR);
+STORE_W(addr, MAXVL);
+STORE_W(addr, VL);
+STORE_W(addr, UTIDX);
+addr += 4;
+STORE_D(addr, VF_PC);
+
+for (uint32_t x=1; x<NXPR; x++) {
+  for (uint32_t i=0; i<VL; i++) {
+    STORE_D(addr, UT_READ_XPR(i, x));
+  }
+}
+
+for (uint32_t f=0; f<NFPR; f++) {
+  for (uint32_t i=0; i<VL; i++) {
+    STORE_D(addr, UT_READ_FPR(i, f));
+  }
+}
+
+for (uint32_t i=0; i<VL; i++) {
+  STORE_B(addr, h->get_ut_state(i)->run);
+}
+
+#undef STORE_B
+#undef STORE_W
+#undef STORE_D