summaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/riscv/isa/bitfields.isa4
-rw-r--r--src/arch/riscv/isa/decoder.isa2
-rw-r--r--src/arch/riscv/isa/formats/standard.isa59
3 files changed, 64 insertions, 1 deletions
diff --git a/src/arch/riscv/isa/bitfields.isa b/src/arch/riscv/isa/bitfields.isa
index 20f1fc0de..fcda90cf7 100644
--- a/src/arch/riscv/isa/bitfields.isa
+++ b/src/arch/riscv/isa/bitfields.isa
@@ -54,6 +54,10 @@ def bitfield SHAMT6 <25:20>;
// I-Type
def bitfield IMM12 <31:20>;
+// Sync
+def bitfield SUCC <23:20>;
+def bitfield PRED <27:24>;
+
// S-Type
def bitfield IMM5 <11:7>;
def bitfield IMM7 <31:25>;
diff --git a/src/arch/riscv/isa/decoder.isa b/src/arch/riscv/isa/decoder.isa
index fd9c574e1..c53420347 100644
--- a/src/arch/riscv/isa/decoder.isa
+++ b/src/arch/riscv/isa/decoder.isa
@@ -400,7 +400,7 @@ decode QUADRANT default Unknown::unknown() {
}
0x03: decode FUNCT3 {
- format IOp {
+ format FenceOp {
0x0: fence({{
}}, uint64_t, IsMemBarrier, No_OpClass);
0x1: fence_i({{
diff --git a/src/arch/riscv/isa/formats/standard.isa b/src/arch/riscv/isa/formats/standard.isa
index e67fdfcbd..78d8144f8 100644
--- a/src/arch/riscv/isa/formats/standard.isa
+++ b/src/arch/riscv/isa/formats/standard.isa
@@ -90,6 +90,54 @@ def template ImmExecute {{
}
}};
+def template FenceExecute {{
+ Fault
+ %(class_name)s::execute(
+ ExecContext *xc, Trace::InstRecord *traceData) const
+ {
+ Fault fault = NoFault;
+
+ %(op_decl)s;
+ %(op_rd)s;
+ if (fault == NoFault) {
+ %(code)s;
+ if (fault == NoFault) {
+ %(op_wb)s;
+ }
+ }
+ return fault;
+ }
+
+ std::string
+ %(class_name)s::generateDisassembly(Addr pc,
+ const SymbolTable *symtab) const
+ {
+ std::stringstream ss;
+ ss << mnemonic;
+ if (!FUNCT3) {
+ ss << ' ';
+ if (PRED & 0x8)
+ ss << 'i';
+ if (PRED & 0x4)
+ ss << 'o';
+ if (PRED & 0x2)
+ ss << 'r';
+ if (PRED & 0x1)
+ ss << 'w';
+ ss << ", ";
+ if (SUCC & 0x8)
+ ss << 'i';
+ if (SUCC & 0x4)
+ ss << 'o';
+ if (SUCC & 0x2)
+ ss << 'r';
+ if (SUCC & 0x1)
+ ss << 'w';
+ }
+ return ss.str();
+ }
+}};
+
def template BranchDeclare {{
//
// Static instruction class for "%(mnemonic)s".
@@ -307,6 +355,17 @@ def format IOp(code, imm_type='int64_t', *opt_flags) {{
exec_output = ImmExecute.subst(iop)
}};
+def format FenceOp(code, imm_type='int64_t', *opt_flags) {{
+ regs = ['_destRegIdx[0]','_srcRegIdx[0]']
+ iop = InstObjParams(name, Name, 'ImmOp<%s>' % imm_type,
+ {'code': code, 'imm_code': 'imm = sext<12>(IMM12);',
+ 'regs': ','.join(regs)}, opt_flags)
+ header_output = ImmDeclare.subst(iop)
+ decoder_output = ImmConstructor.subst(iop)
+ decode_block = BasicDecode.subst(iop)
+ exec_output = FenceExecute.subst(iop)
+}};
+
def format BOp(code, *opt_flags) {{
imm_code = """
imm = BIMM12BITS4TO1 << 1 |