swap.isa
来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· ISA 代码 · 共 160 行
ISA
160 行
//This template provides the execute functions for a swapdef template SwapExecute {{ Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const { Fault fault = NoFault; //This is to support the conditional store in cas instructions. //It should be optomized out in all the others bool storeCond = true; Addr EA; %(fp_enable_check)s; %(op_decl)s; uint64_t mem_data = 0; %(op_rd)s; %(ea_code)s; DPRINTF(Sparc, "%s: The address is 0x%x\n", mnemonic, EA); %(fault_check)s; if(fault == NoFault) { %(code)s; } if(storeCond && fault == NoFault) { %(EA_trunc)s fault = xc->write((uint%(mem_acc_size)s_t)Mem, EA, %(asi_val)s, &mem_data); } if(fault == NoFault) { //Handle the swapping %(postacc_code)s; } if(fault == NoFault) { //Write the resulting state to the execution context %(op_wb)s; } return fault; }}};def template SwapInitiateAcc {{ Fault %(class_name)s::initiateAcc(%(CPU_exec_context)s * xc, Trace::InstRecord * traceData) const { Fault fault = NoFault; Addr EA; %(fp_enable_check)s; uint64_t mem_data = 0; %(op_decl)s; %(op_rd)s; %(ea_code)s; DPRINTF(Sparc, "%s: The address is 0x%x\n", mnemonic, EA); %(fault_check)s; if(fault == NoFault) { %(code)s; } if(fault == NoFault) { %(EA_trunc)s fault = xc->write((uint%(mem_acc_size)s_t)Mem, EA, %(asi_val)s, &mem_data); } return fault; }}};def template SwapCompleteAcc {{ Fault %(class_name)s::completeAcc(PacketPtr pkt, %(CPU_exec_context)s * xc, Trace::InstRecord * traceData) const { Fault fault = NoFault; %(op_decl)s; uint64_t mem_data = pkt->get<uint%(mem_acc_size)s_t>(); if(fault == NoFault) { //Handle the swapping %(postacc_code)s; } if(fault == NoFault) { //Write the resulting state to the execution context %(op_wb)s; } return fault; }}};let {{ SwapFuncs = [SwapExecute, SwapInitiateAcc, SwapCompleteAcc]}};def format Swap(code, postacc_code, mem_flags, *opt_flags) {{ mem_flags = makeList(mem_flags) flags = string.join(mem_flags, '|') (header_output, decoder_output, exec_output, decode_block) = doMemFormat(code, SwapFuncs, '', name, Name, flags, ["IsStoreConditional"], postacc_code)}};def format SwapAlt(code, postacc_code, mem_flags, *opt_flags) {{ mem_flags = makeList(mem_flags) mem_flags.append("EXT_ASI") flags = string.join(mem_flags, '|') (header_output, decoder_output, exec_output, decode_block) = doMemFormat(code, SwapFuncs, AlternateASIPrivFaultCheck, name, Name, flags, ["IsStoreConditional"], postacc_code)}};let {{ def doCasFormat(code, execute, faultCode, name, Name, mem_flags, opt_flags, postacc_code = ''): addrCalcReg = 'EA = Rs1;' iop = InstObjParams(name, Name, 'Mem', {"code": code, "postacc_code" : postacc_code, "fault_check": faultCode, "ea_code": addrCalcReg, "EA_trunc" : TruncateEA}, opt_flags) header_output = MemDeclare.subst(iop) decoder_output = BasicConstructor.subst(iop) decode_block = BasicDecode.subst(iop) microParams = {"code": code, "postacc_code" : postacc_code, "ea_code" : addrCalcReg, "fault_check" : faultCode, "EA_trunc" : TruncateEA} exec_output = doSplitExecute(execute, name, Name, mem_flags, ["IsStoreConditional"], microParams); return (header_output, decoder_output, exec_output, decode_block)}};def format CasAlt(code, postacc_code, mem_flags, *opt_flags) {{ mem_flags = makeList(mem_flags) mem_flags.append("EXT_ASI") flags = string.join(mem_flags, '|') (header_output, decoder_output, exec_output, decode_block) = doCasFormat(code, SwapFuncs, AlternateASIPrivFaultCheck, name, Name, flags, ["IsStoreConditional"], postacc_code)}};
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?