//////////////////////////////////////////////////////////////////// // // Integer operate instructions // output header {{ /** * Base class for integer operations. */ class IntegerOp : public SparcStaticInst { protected: // Constructor IntegerOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass) : SparcStaticInst(mnem, _machInst, __opClass) { } std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const; }; }}; output decoder {{ std::string IntegerOp::generateDisassembly(Addr pc, const SymbolTable *symtab) const { return "Integer instruction\n"; } }}; def template IntegerExecute {{ Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const { Fault fault; //These are set to constants when the execute method //is generated bool useCc = ; %(op_decl)s; %(op_rd)s; %(code)s; //Write the resulting state to the execution context if(fault == NoFault) { %(op_wb)s; if(useCc) { CcrIccN = Rd & (1 << 63); CcrIccZ = (Rd == 0); CcrIccV = ivValue; CcrIccC = icValue; CcrXccN = Rd & (1 << 31); CcrXccZ = ((Rd & 0xFFFFFFFF) == 0); CcrXccV = xvValue; CcrXccC = xcValue; } } return fault; } }}; // Primary format for integer operate instructions: def format IntegerOp(code, *opt_flags) {{ orig_code = code cblk = CodeBlock(code) for (marker, value) in (('ivValue', '0'), ('icValue', '0'), ('xvValue', '0'), ('xcValue', '0')): code.replace(marker, value) iop = InstObjParams(name, Name, 'SparcStaticInst', cblk, opt_flags) header_output = BasicDeclare.subst(iop) decoder_output = BasicConstructor.subst(iop) decode_block = BasicDecode.subst(iop) exec_output = IntegerExecute.subst(iop) }}; // Primary format for integer operate instructions: def format IntegerOpCc(code, icValue, ivValue, xcValue, xvValue, *opt_flags) {{ orig_code = code cblk = CodeBlock(code) for (marker, value) in (('ivValue', ivValue), ('icValue', icValue), ('xvValue', xvValue), ('xcValue', xcValue)): code.replace(marker, value) iop = InstObjParams(name, Name, 'SparcStaticInst', cblk, opt_flags) header_output = BasicDeclare.subst(iop) decoder_output = BasicConstructor.subst(iop) decode_block = BasicDecode.subst(iop) exec_output = IntegerExecute.subst(iop) }};