@@ -156,6 +156,26 @@
: "memory"); \
})
+#if __riscv_xlen == 64
+#define __csrrw64(op, csr, csrh, val) (true ? op(csr, val) : (uint64_t)csrh)
+#define __csrr64( op, csr, csrh) (true ? op(csr) : (uint64_t)csrh)
+#define __csrw64( op, csr, csrh, val) (true ? op(csr, val) : (uint64_t)csrh)
+#elif __riscv_xlen == 32
+#define __csrrw64(op, csr, csrh, val) ( op(csr, val) | (uint64_t)op(csrh, val >> 32) << 32)
+#define __csrr64( op, csr, csrh) ( op(csr) | (uint64_t)op(csrh) << 32)
+#define __csrw64( op, csr, csrh, val) ({ op(csr, val); op(csrh, val >> 32); })
+#endif
+
+#define csr_swap64( csr, val) __csrrw64(csr_swap, csr, csr ## H, val)
+#define csr_read64( csr) __csrr64 (csr_read, csr, csr ## H)
+#define csr_read_relaxed64(csr) __csrr64 (csr_read_relaxed, csr, csr ## H)
+#define csr_write64( csr, val) __csrw64 (csr_write, csr, csr ## H, val)
+#define csr_read_set64( csr, val) __csrrw64(csr_read_set, csr, csr ## H, val)
+#define csr_set64( csr, val) __csrw64 (csr_set, csr, csr ## H, val)
+#define csr_clear64( csr, val) __csrw64 (csr_clear, csr, csr ## H, val)
+#define csr_read_clear64( csr, val) __csrrw64(csr_read_clear, csr, csr ## H, val)
+#define csr_clear64( csr, val) __csrw64 (csr_clear, csr, csr ## H, val)
+
unsigned long csr_read_num(int csr_num);
void csr_write_num(int csr_num, unsigned long val);