From 2396c22658275c3df83ac24453e81fb5d252f5e6 Mon Sep 17 00:00:00 2001 From: Yannis Huber <32066446+yannishuber@users.noreply.github.com> Date: Mon, 8 Jun 2020 16:47:39 +0200 Subject: [PATCH] risc-v: add support for 64-bit RISC-V CPUs --- src/runtime/volatile/register.go | 64 +++++++++++++++++++++++++- src/runtime/volatile/volatile.go | 6 +++ targets/fe310.json | 2 +- targets/riscv-qemu.json | 2 +- targets/riscv.json | 5 -- targets/riscv32.json | 12 +++++ targets/riscv64.json | 13 ++++++ tools/gen-device-svd/gen-device-svd.go | 4 ++ 8 files changed, 100 insertions(+), 8 deletions(-) create mode 100644 targets/riscv32.json create mode 100644 targets/riscv64.json diff --git a/src/runtime/volatile/register.go b/src/runtime/volatile/register.go index 5be97e7f..adfe372e 100644 --- a/src/runtime/volatile/register.go +++ b/src/runtime/volatile/register.go @@ -1,6 +1,6 @@ package volatile -// This file defines Register{8,16,32} types, which are convenience types for +// This file defines Register{8,16,32,64} types, which are convenience types for // volatile register accesses. // Special types that causes loads/stores to be volatile (necessary for @@ -190,3 +190,65 @@ func (r *Register32) HasBits(value uint32) bool { func (r *Register32) ReplaceBits(value uint32, mask uint32, pos uint8) { StoreUint32(&r.Reg, LoadUint32(&r.Reg)&^(mask< 0 +// +//go:inline +func (r *Register64) HasBits(value uint64) bool { + return (r.Get() & value) > 0 +} + +// ReplaceBits is a helper to simplify setting multiple bits high and/or low at +// once. It is the volatile equivalent of: +// +// r.Reg = (r.Reg & ^(mask << pos)) | value << pos +// +// go:inline +func (r *Register64) ReplaceBits(value uint64, mask uint64, pos uint8) { + StoreUint64(&r.Reg, LoadUint64(&r.Reg)&^(mask<