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)
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 |
"""
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)
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)
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)
+}};