#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())
#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
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
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