diff options
Diffstat (limited to 'src/arch/riscv/isa/formats/compressed.isa')
-rw-r--r-- | src/arch/riscv/isa/formats/compressed.isa | 79 |
1 files changed, 73 insertions, 6 deletions
diff --git a/src/arch/riscv/isa/formats/compressed.isa b/src/arch/riscv/isa/formats/compressed.isa index b520d53eb..9c812e886 100644 --- a/src/arch/riscv/isa/formats/compressed.isa +++ b/src/arch/riscv/isa/formats/compressed.isa @@ -36,8 +36,8 @@ def format CROp(code, *opt_flags) {{ exec_output = BasicExecute.subst(iop) }}; -def format CIOp(imm_code, code, imm_type='int64_t', *opt_flags) {{ - regs = ['_destRegIdx[0]','_srcRegIdx[0]'] +def format CIAddi4spnOp(imm_code, 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_code, 'regs': ','.join(regs)}, opt_flags) @@ -47,8 +47,17 @@ def format CIOp(imm_code, code, imm_type='int64_t', *opt_flags) {{ exec_output = ImmExecute.subst(iop) }}; +def format CIOp(imm_code, code, imm_type='int64_t', *opt_flags) {{ + iop = InstObjParams(name, Name, 'ImmOp<%s>' % imm_type, + {'code': code, 'imm_code': imm_code, + 'regs': '_destRegIdx[0]'}, opt_flags) + header_output = ImmDeclare.subst(iop) + decoder_output = ImmConstructor.subst(iop) + decode_block = BasicDecode.subst(iop) + exec_output = ImmExecute.subst(iop) +}}; + def format CJOp(code, *opt_flags) {{ - regs = ['_destRegIdx[0]', '_srcRegIdx[0]'] imm_code = """ imm = CJUMPIMM3TO1 << 1 | CJUMPIMM4TO4 << 4 | @@ -62,7 +71,7 @@ def format CJOp(code, *opt_flags) {{ """ iop = InstObjParams(name, Name, 'ImmOp<int64_t>', {'code': code, 'imm_code': imm_code, - 'regs': ','.join(regs)}, opt_flags) + 'regs': ''}, opt_flags) header_output = BranchDeclare.subst(iop) decoder_output = ImmConstructor.subst(iop) decode_block = BasicDecode.subst(iop) @@ -78,10 +87,10 @@ def format CBOp(code, *opt_flags) {{ if (CIMM3<2:2> > 0) imm |= ~((int64_t)0xFF); """ - regs = ['_srcRegIdx[0]','_srcRegIdx[1]'] + regs = '_srcRegIdx[0]' iop = InstObjParams(name, Name, 'ImmOp<int64_t>', {'code': code, 'imm_code': imm_code, - 'regs': ','.join(regs)}, opt_flags) + 'regs': '_srcRegIdx[0]'}, opt_flags) header_output = BranchDeclare.subst(iop) decoder_output = ImmConstructor.subst(iop) decode_block = BasicDecode.subst(iop) @@ -101,3 +110,61 @@ def format CompressedStore(sdisp_code, memacc_code, LoadStoreBase(name, Name, sdisp_code, ea_code, memacc_code, mem_flags, inst_flags, 'Store', exec_template_base='Store') }}; + +// Compressed basic instruction class declaration template. +def template CBasicDeclare {{ + // + // Static instruction class for "%(mnemonic)s". + // + class %(class_name)s : public %(base_class)s + { + public: + /// Constructor. + %(class_name)s(MachInst machInst); + Fault execute(ExecContext *, Trace::InstRecord *) const override; + std::string generateDisassembly(Addr pc, + const SymbolTable *symtab) const override; + }; +}}; + +// Compressed basic instruction class execute method template. +def template CBasicExecute {{ + 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::vector<RegId> indices = {%(regs)s}; + std::stringstream ss; + ss << mnemonic << ' '; + ss << registerName(indices[0]) << ", "; + ss << registerName(indices[1]); + return ss.str(); + } +}}; + +def format CompressedROp(code, *opt_flags) {{ + regs = ['_destRegIdx[0]','_srcRegIdx[1]'] + iop = InstObjParams(name, Name, 'RegOp', + {'code': code, 'regs': ','.join(regs)}, opt_flags) + header_output = CBasicDeclare.subst(iop) + decoder_output = BasicConstructor.subst(iop) + decode_block = BasicDecode.subst(iop) + exec_output = CBasicExecute.subst(iop) +}}; |