New RDCYCLE encoding
authorAndrew Waterman <waterman@eecs.berkeley.edu>
Mon, 9 Dec 2013 23:55:52 +0000 (15:55 -0800)
committerAndrew Waterman <waterman@eecs.berkeley.edu>
Mon, 9 Dec 2013 23:55:52 +0000 (15:55 -0800)
riscv/decode.h
riscv/disasm.cc
riscv/encoding.h
riscv/insns/csrrc.h
riscv/insns/csrrci.h
riscv/insns/csrrs.h
riscv/insns/csrrsi.h
riscv/insns/csrrw.h
riscv/insns/csrrwi.h

index 2229afbf6823d9bd7fabe3becfff44e30714be94..8e506e264ce2617fee9ac81c4b88ef11e6deccff 100644 (file)
@@ -62,6 +62,7 @@ public:
   uint32_t rs2() { return x(20, 5); }
   uint32_t rs3() { return x(27, 5); }
   uint32_t rm() { return x(12, 3); }
+  reg_t csr() { return x(20, 12); }
 private:
   uint32_t b;
   reg_t x(int lo, int len) { return b << (32-lo-len) >> (32-len); }
@@ -167,8 +168,8 @@ private:
      } while(0)
 
 #define validate_csr(which, write) ({ \
-  int read_priv = ((which) >> 10) & 3; \
-  int write_priv = ((which) >> 8) & 3; \
+  int write_priv = ((which) >> 10) & 3; \
+  int read_priv = ((which) >> 8) & 3; \
   if (read_priv > 0 || (write_priv > 0 && (write))) require_supervisor; \
   (which); })
 
index 7d5a8e2b73c84ae3c6a49208259c024fcf79748f..f81d702d632ff92e8d5b42c5d5cb2e969b653cab 100644 (file)
@@ -83,7 +83,7 @@ struct : public arg_t {
 
 struct : public arg_t {
   std::string to_string(insn_t insn) const {
-    switch (insn.i_imm())
+    switch (insn.csr())
     {
       #define DECLARE_CSR(name, num) case num: return #name;
       #include "encoding.h"
@@ -296,13 +296,13 @@ disassembler_t::disassembler_t()
   DEFINE_NOARG(fence_i);
 
   add_insn(new disasm_insn_t("csrr", match_csrrs, mask_csrrs | mask_rs1, {&xrd, &csr}));
-  add_insn(new disasm_insn_t("csrw", match_csrrw, mask_csrrw | mask_rd, {&xrs1, &csr}));
-  add_insn(new disasm_insn_t("csrrw", match_csrrw, mask_csrrw, {&xrd, &xrs1, &csr}));
-  add_insn(new disasm_insn_t("csrrs", match_csrrs, mask_csrrs, {&xrd, &xrs1, &csr}));
-  add_insn(new disasm_insn_t("csrrc", match_csrrc, mask_csrrc, {&xrd, &xrs1, &csr}));
-  add_insn(new disasm_insn_t("csrrwi", match_csrrwi, mask_csrrwi, {&xrd, &zimm5, &csr}));
-  add_insn(new disasm_insn_t("csrrsi", match_csrrsi, mask_csrrsi, {&xrd, &zimm5, &csr}));
-  add_insn(new disasm_insn_t("csrrci", match_csrrci, mask_csrrci, {&xrd, &zimm5, &csr}));
+  add_insn(new disasm_insn_t("csrw", match_csrrw, mask_csrrw | mask_rd, {&csr, &xrs1}));
+  add_insn(new disasm_insn_t("csrrw", match_csrrw, mask_csrrw, {&xrd, &csr, &xrs1}));
+  add_insn(new disasm_insn_t("csrrs", match_csrrs, mask_csrrs, {&xrd, &csr, &xrs1}));
+  add_insn(new disasm_insn_t("csrrc", match_csrrc, mask_csrrc, {&xrd, &csr, &xrs1}));
+  add_insn(new disasm_insn_t("csrrwi", match_csrrwi, mask_csrrwi, {&xrd, &csr, &zimm5}));
+  add_insn(new disasm_insn_t("csrrsi", match_csrrsi, mask_csrrsi, {&xrd, &csr, &zimm5}));
+  add_insn(new disasm_insn_t("csrrci", match_csrrci, mask_csrrci, {&xrd, &csr, &zimm5}));
   DEFINE_NOARG(sret)
 
   DEFINE_FRTYPE(fadd_s);
index 92accfef72e8884fb2b35c45ec9467e667e4aaac..48a0108f1db4efcf271763e2dfccdf711331d32c 100644 (file)
 #define MASK_FMSUB_D  0x600007f
 #define MATCH_SD 0x3023
 #define MASK_SD  0x707f
-#define CSR_SUP0 0x500
 #define CSR_FFLAGS 0x1
 #define CSR_FRM 0x2
 #define CSR_FCSR 0x3
-#define CSR_CYCLE 0x4
-#define CSR_TIME 0x5
-#define CSR_INSTRET 0x6
+#define CSR_SUP0 0x500
 #define CSR_SUP1 0x501
+#define CSR_EPC 0x502
+#define CSR_BADVADDR 0x503
+#define CSR_PTBR 0x504
+#define CSR_ASID 0x505
+#define CSR_COUNT 0x506
+#define CSR_COMPARE 0x507
 #define CSR_EVEC 0x508
 #define CSR_CAUSE 0x509
 #define CSR_STATUS 0x50a
 #define CSR_HARTID 0x50b
 #define CSR_IMPL 0x50c
-#define CSR_EPC 0x502
+#define CSR_FATC 0x50d
 #define CSR_SEND_IPI 0x50e
 #define CSR_CLEAR_IPI 0x50f
-#define CSR_BADVADDR 0x503
-#define CSR_PTBR 0x504
 #define CSR_STATS 0x51c
 #define CSR_RESET 0x51d
 #define CSR_TOHOST 0x51e
-#define CSR_ASID 0x505
-#define CSR_COUNT 0x506
-#define CSR_COMPARE 0x507
 #define CSR_FROMHOST 0x51f
-#define CSR_FATC 0x50d
+#define CSR_CYCLE 0xc00
+#define CSR_TIME 0xc01
+#define CSR_INSTRET 0xc02
 #endif
 #ifdef DECLARE_INSN
 DECLARE_INSN(fmv_s_x, MATCH_FMV_S_X, MASK_FMV_S_X)
@@ -597,30 +597,30 @@ DECLARE_INSN(fmsub_d, MATCH_FMSUB_D, MASK_FMSUB_D)
 DECLARE_INSN(sd, MATCH_SD, MASK_SD)
 #endif
 #ifdef DECLARE_CSR
-DECLARE_CSR(sup0, CSR_SUP0)
 DECLARE_CSR(fflags, CSR_FFLAGS)
 DECLARE_CSR(frm, CSR_FRM)
 DECLARE_CSR(fcsr, CSR_FCSR)
-DECLARE_CSR(cycle, CSR_CYCLE)
-DECLARE_CSR(time, CSR_TIME)
-DECLARE_CSR(instret, CSR_INSTRET)
+DECLARE_CSR(sup0, CSR_SUP0)
 DECLARE_CSR(sup1, CSR_SUP1)
+DECLARE_CSR(epc, CSR_EPC)
+DECLARE_CSR(badvaddr, CSR_BADVADDR)
+DECLARE_CSR(ptbr, CSR_PTBR)
+DECLARE_CSR(asid, CSR_ASID)
+DECLARE_CSR(count, CSR_COUNT)
+DECLARE_CSR(compare, CSR_COMPARE)
 DECLARE_CSR(evec, CSR_EVEC)
 DECLARE_CSR(cause, CSR_CAUSE)
 DECLARE_CSR(status, CSR_STATUS)
 DECLARE_CSR(hartid, CSR_HARTID)
 DECLARE_CSR(impl, CSR_IMPL)
-DECLARE_CSR(epc, CSR_EPC)
+DECLARE_CSR(fatc, CSR_FATC)
 DECLARE_CSR(send_ipi, CSR_SEND_IPI)
 DECLARE_CSR(clear_ipi, CSR_CLEAR_IPI)
-DECLARE_CSR(badvaddr, CSR_BADVADDR)
-DECLARE_CSR(ptbr, CSR_PTBR)
 DECLARE_CSR(stats, CSR_STATS)
 DECLARE_CSR(reset, CSR_RESET)
 DECLARE_CSR(tohost, CSR_TOHOST)
-DECLARE_CSR(asid, CSR_ASID)
-DECLARE_CSR(count, CSR_COUNT)
-DECLARE_CSR(compare, CSR_COMPARE)
 DECLARE_CSR(fromhost, CSR_FROMHOST)
-DECLARE_CSR(fatc, CSR_FATC)
+DECLARE_CSR(cycle, CSR_CYCLE)
+DECLARE_CSR(time, CSR_TIME)
+DECLARE_CSR(instret, CSR_INSTRET)
 #endif
index 636c3f8f34f3b901b52fcecf24bd93297be7af06..8ca7c4173783806ed54e91389e658dc7216f93dd 100644 (file)
@@ -1,2 +1,2 @@
-int csr = validate_csr(insn.i_imm(), true);
+int csr = validate_csr(insn.csr(), true);
 WRITE_RD(p->set_pcr(csr, p->get_pcr(csr) & ~RS1));
index d671f3b0b7ed10fd8c28df1cf10c0f9c0d51c033..fc980569e61fbc28940e2bf6cb734744f4061a6d 100644 (file)
@@ -1,2 +1,2 @@
-int csr = validate_csr(insn.i_imm(), true);
+int csr = validate_csr(insn.csr(), true);
 WRITE_RD(p->set_pcr(csr, p->get_pcr(csr) & ~(reg_t)insn.rs1()));
index fff9f235cc42d2685c9020b23aa90f7170f2ea0e..60ac6b3b650f148d2947373887cc72e5c588659a 100644 (file)
@@ -1,2 +1,2 @@
-int csr = validate_csr(insn.i_imm(), insn.rs1() != 0);
+int csr = validate_csr(insn.csr(), insn.rs1() != 0);
 WRITE_RD(p->set_pcr(csr, p->get_pcr(csr) | RS1));
index 99d323bccf4d46d79afa390a18172436bb4e956b..db6fcd05157365429c46e5dd79a6f044a6fe01b5 100644 (file)
@@ -1,2 +1,2 @@
-int csr = validate_csr(insn.i_imm(), true);
+int csr = validate_csr(insn.csr(), true);
 WRITE_RD(p->set_pcr(csr, p->get_pcr(csr) | insn.rs1()));
index fbccb77466a1808bd6c4bc6748f09435c71054c2..4b16773d6cbc02dce6c20756412b322f4c983157 100644 (file)
@@ -1,2 +1,2 @@
-int csr = validate_csr(insn.i_imm(), true);
+int csr = validate_csr(insn.csr(), true);
 WRITE_RD(p->set_pcr(csr, RS1));
index 840150e01ae18ca953708134db14131559661a8d..ff20833782b59476502db4dae0c7f051222e1d4d 100644 (file)
@@ -1,2 +1,2 @@
-int csr = validate_csr(insn.i_imm(), true);
+int csr = validate_csr(insn.csr(), true);
 WRITE_RD(p->set_pcr(csr, insn.rs1()));