mem.isa

来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· ISA 代码 · 共 773 行 · 第 1/2 页

ISA
773
字号
        %(fp_enable_check)s;        %(op_decl)s;        %(op_rd)s;        EA = xc->getEA();        if (fault == NoFault) {            %(memacc_code)s;        }        if (fault == NoFault) {            fault = xc->write((uint%(mem_acc_size)d_t&)Mem, EA,                              memAccessFlags, &write_result);            if (traceData) { traceData->setData(Mem); }        }        if (fault == NoFault) {            %(postacc_code)s;        }        if (fault == NoFault) {            %(op_wb)s;        }        return fault;    }}};def template StoreExecute {{    Fault %(class_name)s::execute(%(CPU_exec_context)s *xc,                                  Trace::InstRecord *traceData) const    {        Addr EA;        Fault fault = NoFault;        %(fp_enable_check)s;        %(op_decl)s;        %(op_rd)s;        %(ea_code)s;        if (fault == NoFault) {            %(memacc_code)s;        }        if (fault == NoFault) {            fault = xc->write((uint%(mem_acc_size)d_t&)Mem, EA,                              memAccessFlags, NULL);            if (traceData) { traceData->setData(Mem); }        }        if (fault == NoFault) {            %(postacc_code)s;        }        if (fault == NoFault) {            %(op_wb)s;        }        return fault;    }}};def template StoreCondExecute {{    Fault %(class_name)s::execute(%(CPU_exec_context)s *xc,                                  Trace::InstRecord *traceData) const    {        Addr EA;        Fault fault = NoFault;        uint64_t write_result = 0;        %(fp_enable_check)s;        %(op_decl)s;        %(op_rd)s;        %(ea_code)s;        if (fault == NoFault) {            %(memacc_code)s;        }        if (fault == NoFault) {            fault = xc->write((uint%(mem_acc_size)d_t&)Mem, EA,                              memAccessFlags, &write_result);            if (traceData) { traceData->setData(Mem); }        }        if (fault == NoFault) {            %(postacc_code)s;        }        if (fault == NoFault) {            %(op_wb)s;        }        return fault;    }}};def template StoreInitiateAcc {{    Fault %(class_name)s::initiateAcc(%(CPU_exec_context)s *xc,                                      Trace::InstRecord *traceData) const    {        Addr EA;        Fault fault = NoFault;        %(fp_enable_check)s;        %(op_decl)s;        %(op_rd)s;        %(ea_code)s;        if (fault == NoFault) {            %(memacc_code)s;        }        if (fault == NoFault) {            fault = xc->write((uint%(mem_acc_size)d_t&)Mem, EA,                              memAccessFlags, NULL);            if (traceData) { traceData->setData(Mem); }        }        return fault;    }}};def template StoreCompleteAcc {{    Fault %(class_name)s::completeAcc(PacketPtr pkt,                                      %(CPU_exec_context)s *xc,                                      Trace::InstRecord *traceData) const    {        Fault fault = NoFault;        %(fp_enable_check)s;        %(op_dest_decl)s;        if (fault == NoFault) {            %(postacc_code)s;        }        if (fault == NoFault) {            %(op_wb)s;        }        return fault;    }}};def template StoreCondCompleteAcc {{    Fault %(class_name)s::completeAcc(PacketPtr pkt,                                      %(CPU_exec_context)s *xc,                                      Trace::InstRecord *traceData) const    {        Fault fault = NoFault;        %(fp_enable_check)s;        %(op_dest_decl)s;        uint64_t write_result = pkt->req->getExtraData();        if (fault == NoFault) {            %(postacc_code)s;        }        if (fault == NoFault) {            %(op_wb)s;        }        return fault;    }}};def template MiscMemAccExecute {{    Fault %(class_name)s::MemAcc::execute(%(CPU_exec_context)s *xc,                                          Trace::InstRecord *traceData) const    {        Addr EA;        Fault fault = NoFault;        %(fp_enable_check)s;        %(op_decl)s;        %(op_rd)s;        EA = xc->getEA();        if (fault == NoFault) {            %(memacc_code)s;        }        return NoFault;    }}};def template MiscExecute {{    Fault %(class_name)s::execute(%(CPU_exec_context)s *xc,                                  Trace::InstRecord *traceData) const    {        Addr EA;        Fault fault = NoFault;        %(fp_enable_check)s;        %(op_decl)s;        %(op_rd)s;        %(ea_code)s;        if (fault == NoFault) {            %(memacc_code)s;        }        return NoFault;    }}};def template MiscInitiateAcc {{    Fault %(class_name)s::initiateAcc(%(CPU_exec_context)s *xc,                                      Trace::InstRecord *traceData) const    {        warn("Misc instruction does not support split access method!");        return NoFault;    }}};def template MiscCompleteAcc {{    Fault %(class_name)s::completeAcc(PacketPtr pkt,                                      %(CPU_exec_context)s *xc,                                      Trace::InstRecord *traceData) const    {        warn("Misc instruction does not support split access method!");        return NoFault;    }}};// load instructions use Ra as dest, so check for// Ra == 31 to detect nopsdef template LoadNopCheckDecode {{ {     AlphaStaticInst *i = new %(class_name)s(machInst);     if (RA == 31) {         i = makeNop(i);     }     return i; }}};// for some load instructions, Ra == 31 indicates a prefetch (not a nop)def template LoadPrefetchCheckDecode {{ {     if (RA != 31) {         return new %(class_name)s(machInst);     }     else {         return new %(class_name)sPrefetch(machInst);     } }}};let {{def LoadStoreBase(name, Name, ea_code, memacc_code, mem_flags, inst_flags,                  postacc_code = '', base_class = 'MemoryDisp32',                  decode_template = BasicDecode, exec_template_base = ''):    # Make sure flags are in lists (convert to lists if not).    mem_flags = makeList(mem_flags)    inst_flags = makeList(inst_flags)    # add hook to get effective addresses into execution trace output.    ea_code += '\nif (traceData) { traceData->setAddr(EA); }\n'    # Some CPU models execute the memory operation as an atomic unit,    # while others want to separate them into an effective address    # computation and a memory access operation.  As a result, we need    # to generate three StaticInst objects.  Note that the latter two    # are nested inside the larger "atomic" one.    # Generate InstObjParams for each of the three objects.  Note that    # they differ only in the set of code objects contained (which in    # turn affects the object's overall operand list).    iop = InstObjParams(name, Name, base_class,                        { 'ea_code':ea_code, 'memacc_code':memacc_code, 'postacc_code':postacc_code },                        inst_flags)    ea_iop = InstObjParams(name, Name, base_class,                        { 'ea_code':ea_code },                        inst_flags)    memacc_iop = InstObjParams(name, Name, base_class,                        { 'memacc_code':memacc_code, 'postacc_code':postacc_code },                        inst_flags)    if mem_flags:        s = '\n\tmemAccessFlags = ' + string.join(mem_flags, '|') + ';'        iop.constructor += s        memacc_iop.constructor += s    # select templates    # The InitiateAcc template is the same for StoreCond templates as the    # corresponding Store template..    StoreCondInitiateAcc = StoreInitiateAcc    memAccExecTemplate = eval(exec_template_base + 'MemAccExecute')    fullExecTemplate = eval(exec_template_base + 'Execute')    initiateAccTemplate = eval(exec_template_base + 'InitiateAcc')    completeAccTemplate = eval(exec_template_base + 'CompleteAcc')    # (header_output, decoder_output, decode_block, exec_output)    return (LoadStoreDeclare.subst(iop),            EACompConstructor.subst(ea_iop)            + MemAccConstructor.subst(memacc_iop)            + LoadStoreConstructor.subst(iop),            decode_template.subst(iop),            EACompExecute.subst(ea_iop)            + memAccExecTemplate.subst(memacc_iop)            + fullExecTemplate.subst(iop)            + initiateAccTemplate.subst(iop)            + completeAccTemplate.subst(iop))}};def format LoadOrNop(memacc_code, ea_code = {{ EA = Rb + disp; }},                     mem_flags = [], inst_flags = []) {{    (header_output, decoder_output, decode_block, exec_output) = \        LoadStoreBase(name, Name, ea_code, memacc_code, mem_flags, inst_flags,                      decode_template = LoadNopCheckDecode,                      exec_template_base = 'Load')}};// Note that the flags passed in apply only to the prefetch versiondef format LoadOrPrefetch(memacc_code, ea_code = {{ EA = Rb + disp; }},                          mem_flags = [], pf_flags = [], inst_flags = []) {{    # declare the load instruction object and generate the decode block    (header_output, decoder_output, decode_block, exec_output) = \        LoadStoreBase(name, Name, ea_code, memacc_code, mem_flags, inst_flags,                      decode_template = LoadPrefetchCheckDecode,                      exec_template_base = 'Load')    # Declare the prefetch instruction object.    # Make sure flag args are lists so we can mess with them.    mem_flags = makeList(mem_flags)    pf_flags = makeList(pf_flags)    inst_flags = makeList(inst_flags)    pf_mem_flags = mem_flags + pf_flags + ['NO_FAULT']    pf_inst_flags = inst_flags + ['IsMemRef', 'IsLoad',                                  'IsDataPrefetch', 'MemReadOp']    (pf_header_output, pf_decoder_output, _, pf_exec_output) = \        LoadStoreBase(name, Name + 'Prefetch', ea_code,                      'xc->prefetch(EA, memAccessFlags);',                      pf_mem_flags, pf_inst_flags, exec_template_base = 'Misc')    header_output += pf_header_output    decoder_output += pf_decoder_output    exec_output += pf_exec_output}};def format Store(memacc_code, ea_code = {{ EA = Rb + disp; }},                 mem_flags = [], inst_flags = []) {{    (header_output, decoder_output, decode_block, exec_output) = \        LoadStoreBase(name, Name, ea_code, memacc_code, mem_flags, inst_flags,                      exec_template_base = 'Store')}};def format StoreCond(memacc_code, postacc_code,                     ea_code = {{ EA = Rb + disp; }},                     mem_flags = [], inst_flags = []) {{    (header_output, decoder_output, decode_block, exec_output) = \        LoadStoreBase(name, Name, ea_code, memacc_code, mem_flags, inst_flags,                      postacc_code, exec_template_base = 'StoreCond')}};// Use 'MemoryNoDisp' as base: for wh64, fetch, ecbdef format MiscPrefetch(ea_code, memacc_code,                        mem_flags = [], inst_flags = []) {{    (header_output, decoder_output, decode_block, exec_output) = \        LoadStoreBase(name, Name, ea_code, memacc_code, mem_flags, inst_flags,                      base_class = 'MemoryNoDisp', exec_template_base = 'Misc')}};

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?