mem.isa revision 10184
11689SN/A// -*- mode:c++ -*- 22326SN/A 31689SN/A// Copyright (c) 2003-2005 The Regents of The University of Michigan 41689SN/A// All rights reserved. 51689SN/A// 61689SN/A// Redistribution and use in source and binary forms, with or without 71689SN/A// modification, are permitted provided that the following conditions are 81689SN/A// met: redistributions of source code must retain the above copyright 91689SN/A// notice, this list of conditions and the following disclaimer; 101689SN/A// redistributions in binary form must reproduce the above copyright 111689SN/A// notice, this list of conditions and the following disclaimer in the 121689SN/A// documentation and/or other materials provided with the distribution; 131689SN/A// neither the name of the copyright holders nor the names of its 141689SN/A// contributors may be used to endorse or promote products derived from 151689SN/A// this software without specific prior written permission. 161689SN/A// 171689SN/A// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 181689SN/A// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 191689SN/A// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 201689SN/A// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 211689SN/A// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 221689SN/A// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 231689SN/A// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 241689SN/A// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 251689SN/A// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 261689SN/A// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 272665Ssaidi@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 282665Ssaidi@eecs.umich.edu// 292831Sksewell@umich.edu// Authors: Steve Reinhardt 301689SN/A// Kevin Lim 311689SN/A 322064SN/A//////////////////////////////////////////////////////////////////// 331060SN/A// 341060SN/A// Memory-format instructions: LoadAddress, Load, Store 351696SN/A// 361689SN/A 372292SN/Aoutput header {{ 381717SN/A /** 391060SN/A * Base class for general Alpha memory-format instructions. 401061SN/A */ 412292SN/A class Memory : public AlphaStaticInst 422292SN/A { 432292SN/A protected: 442292SN/A 452326SN/A /// Memory request flags. See mem_req_base.hh. 461060SN/A Request::Flags memAccessFlags; 472292SN/A 482292SN/A /// Constructor 492292SN/A Memory(const char *mnem, ExtMachInst _machInst, OpClass __opClass) 502292SN/A : AlphaStaticInst(mnem, _machInst, __opClass) 512292SN/A { 522292SN/A } 532292SN/A 542326SN/A std::string 552292SN/A generateDisassembly(Addr pc, const SymbolTable *symtab) const; 562292SN/A }; 572292SN/A 582292SN/A /** 592292SN/A * Base class for memory-format instructions using a 32-bit 602292SN/A * displacement (i.e. most of them). 612292SN/A */ 622292SN/A class MemoryDisp32 : public Memory 632292SN/A { 642292SN/A protected: 652292SN/A /// Displacement for EA calculation (signed). 662292SN/A int32_t disp; 672292SN/A 682669Sktlim@umich.edu /// Constructor. 692292SN/A MemoryDisp32(const char *mnem, ExtMachInst _machInst, OpClass __opClass) 702292SN/A : Memory(mnem, _machInst, __opClass), 712292SN/A disp(MEMDISP) 722292SN/A { 732292SN/A } 742292SN/A }; 752292SN/A 762292SN/A 772307SN/A /** 782307SN/A * Base class for a few miscellaneous memory-format insts 792292SN/A * that don't interpret the disp field: wh64, fetch, fetch_m, ecb. 801060SN/A * None of these instructions has a destination register either. 811060SN/A */ 821060SN/A class MemoryNoDisp : public Memory 831060SN/A { 842292SN/A protected: 851060SN/A /// Constructor 861060SN/A MemoryNoDisp(const char *mnem, ExtMachInst _machInst, OpClass __opClass) 871060SN/A : Memory(mnem, _machInst, __opClass) 882326SN/A { 891060SN/A } 901060SN/A 911060SN/A std::string 921060SN/A generateDisassembly(Addr pc, const SymbolTable *symtab) const; 932292SN/A }; 942292SN/A}}; 952292SN/A 962292SN/A 971060SN/Aoutput decoder {{ 981060SN/A std::string 992307SN/A Memory::generateDisassembly(Addr pc, const SymbolTable *symtab) const 1002292SN/A { 1012980Sgblack@eecs.umich.edu return csprintf("%-10s %c%d,%d(r%d)", mnemonic, 1022292SN/A flags[IsFloating] ? 'f' : 'r', RA, MEMDISP, RB); 1032292SN/A } 1042292SN/A 1052292SN/A std::string 1062292SN/A MemoryNoDisp::generateDisassembly(Addr pc, const SymbolTable *symtab) const 1072292SN/A { 1082292SN/A return csprintf("%-10s (r%d)", mnemonic, RB); 1092292SN/A } 1102292SN/A}}; 1112292SN/A 1122292SN/Adef format LoadAddress(code) {{ 1132292SN/A iop = InstObjParams(name, Name, 'MemoryDisp32', code) 1142292SN/A header_output = BasicDeclare.subst(iop) 1152292SN/A decoder_output = BasicConstructor.subst(iop) 1162292SN/A decode_block = BasicDecode.subst(iop) 1172292SN/A exec_output = BasicExecute.subst(iop) 1182292SN/A}}; 1192292SN/A 1202292SN/A 1212292SN/Adef template LoadStoreDeclare {{ 1222292SN/A /** 1232292SN/A * Static instruction class for "%(mnemonic)s". 1242292SN/A */ 1252292SN/A class %(class_name)s : public %(base_class)s 1262292SN/A { 1272831Sksewell@umich.edu public: 1282292SN/A 1292292SN/A /// Constructor. 1302292SN/A %(class_name)s(ExtMachInst machInst); 1312292SN/A 1322292SN/A %(BasicExecDeclare)s 1332292SN/A 1342292SN/A %(EACompDeclare)s 1352292SN/A 1362292SN/A %(InitiateAccDeclare)s 1372292SN/A 1382292SN/A %(CompleteAccDeclare)s 1392292SN/A }; 1402292SN/A}}; 1412292SN/A 1422831Sksewell@umich.edu 1432292SN/Adef template EACompDeclare {{ 1442292SN/A Fault eaComp(%(CPU_exec_context)s *, Trace::InstRecord *) const; 1452292SN/A}}; 1462292SN/A 1472292SN/Adef template InitiateAccDeclare {{ 1482292SN/A Fault initiateAcc(%(CPU_exec_context)s *, Trace::InstRecord *) const; 1492292SN/A}}; 1502292SN/A 1512292SN/A 1522292SN/Adef template CompleteAccDeclare {{ 1532326SN/A Fault completeAcc(PacketPtr, %(CPU_exec_context)s *, 1542348SN/A Trace::InstRecord *) const; 1552326SN/A}}; 1562326SN/A 1572348SN/Adef template LoadStoreConstructor {{ 1582292SN/A %(class_name)s::%(class_name)s(ExtMachInst machInst) 1592292SN/A : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s) 1602292SN/A { 1612292SN/A %(constructor)s; 1622292SN/A } 1632292SN/A}}; 1642292SN/A 1651060SN/Adef template EACompExecute {{ 1661060SN/A Fault %(class_name)s::eaComp(%(CPU_exec_context)s *xc, 1671061SN/A Trace::InstRecord *traceData) const 1681060SN/A { 1691062SN/A Addr EA; 1701062SN/A Fault fault = NoFault; 1712301SN/A 1721062SN/A %(fp_enable_check)s; 1731062SN/A %(op_decl)s; 1741062SN/A %(op_rd)s; 1751062SN/A %(ea_code)s; 1761062SN/A 1771062SN/A if (fault == NoFault) { 1781062SN/A %(op_wb)s; 1791062SN/A xc->setEA(EA); 1801062SN/A } 1811062SN/A 1822301SN/A return fault; 1832301SN/A } 1842301SN/A}}; 1852301SN/A 1861062SN/A 1871062SN/Adef template LoadExecute {{ 1881062SN/A Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, 1891062SN/A Trace::InstRecord *traceData) const 1901062SN/A { 1911062SN/A Addr EA; 1921062SN/A Fault fault = NoFault; 1931062SN/A 1941062SN/A %(fp_enable_check)s; 1951062SN/A %(op_decl)s; 1961062SN/A %(op_rd)s; 1971062SN/A %(ea_code)s; 1981062SN/A 1991062SN/A if (fault == NoFault) { 2001062SN/A fault = readMemAtomic(xc, traceData, EA, Mem, memAccessFlags); 2011062SN/A %(memacc_code)s; 2021062SN/A } 2031062SN/A 2041062SN/A if (fault == NoFault) { 2051062SN/A %(op_wb)s; 2061062SN/A } 2071062SN/A 2081062SN/A return fault; 2091062SN/A } 2101062SN/A}}; 2111062SN/A 2121062SN/A 2131062SN/Adef template LoadInitiateAcc {{ 2141062SN/A Fault %(class_name)s::initiateAcc(%(CPU_exec_context)s *xc, 2151062SN/A Trace::InstRecord *traceData) const 2161062SN/A { 2171062SN/A Addr EA; 2181062SN/A Fault fault = NoFault; 2191062SN/A 2201062SN/A %(fp_enable_check)s; 2211062SN/A %(op_src_decl)s; 2221062SN/A %(op_rd)s; 2231062SN/A %(ea_code)s; 2241062SN/A 2251062SN/A if (fault == NoFault) { 2261062SN/A fault = readMemTiming(xc, traceData, EA, Mem, memAccessFlags); 2271062SN/A } 2281062SN/A 2291062SN/A return fault; 2301062SN/A } 2311062SN/A}}; 2321062SN/A 2331062SN/A 2342326SN/Adef template LoadCompleteAcc {{ 2352301SN/A Fault %(class_name)s::completeAcc(PacketPtr pkt, 2362301SN/A %(CPU_exec_context)s *xc, 2372301SN/A Trace::InstRecord *traceData) const 2382301SN/A { 2392301SN/A Fault fault = NoFault; 2402301SN/A 2412326SN/A %(fp_enable_check)s; 2422301SN/A %(op_decl)s; 2432326SN/A 2442307SN/A getMem(pkt, Mem, traceData); 2452301SN/A 2462301SN/A if (fault == NoFault) { 2472307SN/A %(memacc_code)s; 2482301SN/A } 2492301SN/A 2502301SN/A if (fault == NoFault) { 2512301SN/A %(op_wb)s; 2522301SN/A } 2532301SN/A 2542301SN/A return fault; 2552301SN/A } 2562301SN/A}}; 2572301SN/A 2582301SN/A 2592301SN/Adef template StoreExecute {{ 2602326SN/A Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, 2612301SN/A Trace::InstRecord *traceData) const 2622301SN/A { 2632301SN/A Addr EA; 2642301SN/A Fault fault = NoFault; 2652301SN/A 2662326SN/A %(fp_enable_check)s; 2672301SN/A %(op_decl)s; 2682301SN/A %(op_rd)s; 2692301SN/A %(ea_code)s; 2702301SN/A 2712301SN/A if (fault == NoFault) { 2722326SN/A %(memacc_code)s; 2732301SN/A } 2742301SN/A 2752301SN/A if (fault == NoFault) { 2762301SN/A fault = writeMemAtomic(xc, traceData, Mem, EA, 2772301SN/A memAccessFlags, NULL); 2782301SN/A } 2792301SN/A 2802980Sgblack@eecs.umich.edu if (fault == NoFault) { 2812301SN/A %(postacc_code)s; 2822326SN/A } 2832301SN/A 2842301SN/A if (fault == NoFault) { 2852326SN/A %(op_wb)s; 2862301SN/A } 2872301SN/A 2882301SN/A return fault; 2892301SN/A } 2902326SN/A}}; 2912727Sktlim@umich.edu 2922326SN/Adef template StoreCondExecute {{ 2932301SN/A Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, 2942301SN/A Trace::InstRecord *traceData) const 2952301SN/A { 2962301SN/A Addr EA; 2972301SN/A Fault fault = NoFault; 2982301SN/A uint64_t write_result = 0; 2992326SN/A 3002301SN/A %(fp_enable_check)s; 3012301SN/A %(op_decl)s; 3022326SN/A %(op_rd)s; 3032301SN/A %(ea_code)s; 3042301SN/A 3052301SN/A if (fault == NoFault) { 3062301SN/A %(memacc_code)s; 3072301SN/A } 3082301SN/A 3092326SN/A if (fault == NoFault) { 3102301SN/A fault = writeMemAtomic(xc, traceData, Mem, EA, 3112301SN/A memAccessFlags, &write_result); 3122301SN/A } 3132301SN/A 3142326SN/A if (fault == NoFault) { 3152301SN/A %(postacc_code)s; 3162292SN/A } 3172292SN/A 3182292SN/A if (fault == NoFault) { 3192292SN/A %(op_wb)s; 3201062SN/A } 3211062SN/A 3221062SN/A return fault; 3231062SN/A } 3242307SN/A}}; 3251060SN/A 3262307SN/Adef template StoreInitiateAcc {{ 3272307SN/A Fault %(class_name)s::initiateAcc(%(CPU_exec_context)s *xc, 3282307SN/A Trace::InstRecord *traceData) const 3292307SN/A { 3302307SN/A Addr EA; 3311060SN/A Fault fault = NoFault; 3322307SN/A 3332307SN/A %(fp_enable_check)s; 3342307SN/A %(op_decl)s; 3352307SN/A %(op_rd)s; 3362307SN/A %(ea_code)s; 3372307SN/A 3382307SN/A if (fault == NoFault) { 3392307SN/A %(memacc_code)s; 3402307SN/A } 3412307SN/A 3422307SN/A if (fault == NoFault) { 3432307SN/A fault = writeMemTiming(xc, traceData, Mem, EA, 3442307SN/A memAccessFlags, NULL); 3452307SN/A } 3462307SN/A 3472307SN/A return fault; 3482307SN/A } 3492307SN/A}}; 3502307SN/A 3512307SN/A 3522307SN/Adef template StoreCompleteAcc {{ 3532307SN/A Fault %(class_name)s::completeAcc(PacketPtr pkt, 3542307SN/A %(CPU_exec_context)s *xc, 3552307SN/A Trace::InstRecord *traceData) const 3561060SN/A { 3571060SN/A return NoFault; 3581061SN/A } 3591060SN/A}}; 3602980Sgblack@eecs.umich.edu 3611060SN/A 3622292SN/Adef template StoreCondCompleteAcc {{ 3632292SN/A Fault %(class_name)s::completeAcc(PacketPtr pkt, 3642064SN/A %(CPU_exec_context)s *xc, 3652064SN/A Trace::InstRecord *traceData) const 3662064SN/A { 3672064SN/A Fault fault = NoFault; 3682292SN/A 3692064SN/A %(fp_enable_check)s; 3702292SN/A %(op_dest_decl)s; 3711060SN/A 3721060SN/A uint64_t write_result = pkt->req->getExtraData(); 3731060SN/A 3741061SN/A if (fault == NoFault) { 3751060SN/A %(postacc_code)s; 3761060SN/A } 3771060SN/A 3782292SN/A if (fault == NoFault) { 3791060SN/A %(op_wb)s; 3801060SN/A } 3811060SN/A 3821060SN/A return fault; 3831060SN/A } 3841684SN/A}}; 3852307SN/A 3862307SN/A 3872307SN/Adef template MiscExecute {{ 3882307SN/A Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, 3892326SN/A Trace::InstRecord *traceData) const 3902307SN/A { 3912307SN/A Addr EA M5_VAR_USED; 3922307SN/A Fault fault = NoFault; 3932307SN/A 3942307SN/A %(fp_enable_check)s; 3952307SN/A %(op_decl)s; 3962307SN/A %(op_rd)s; 3972307SN/A %(ea_code)s; 3982307SN/A 3992307SN/A warn_once("Prefetch instructions in Alpha do not do anything\n"); 4002307SN/A if (fault == NoFault) { 4012307SN/A %(memacc_code)s; 4022307SN/A } 4032307SN/A 4042292SN/A return NoFault; 4052292SN/A } 4062292SN/A}}; 4072292SN/A 4082292SN/A// Prefetches in Alpha don't actually do anything 4092292SN/A// They just build an effective address and complete 4102292SN/Adef template MiscInitiateAcc {{ 4112292SN/A Fault %(class_name)s::initiateAcc(%(CPU_exec_context)s *xc, 4122292SN/A Trace::InstRecord *traceData) const 4132292SN/A { 4142292SN/A warn("initiateAcc undefined: Misc instruction does not support split " 4152292SN/A "access method!"); 4162292SN/A return NoFault; 4172292SN/A } 4182292SN/A}}; 4192292SN/A 4202292SN/A 4212292SN/Adef template MiscCompleteAcc {{ 4222980Sgblack@eecs.umich.edu Fault %(class_name)s::completeAcc(PacketPtr pkt, 4232980Sgblack@eecs.umich.edu %(CPU_exec_context)s *xc, 4242292SN/A Trace::InstRecord *traceData) const 4252292SN/A { 4262292SN/A warn("completeAcc undefined: Misc instruction does not support split " 4272292SN/A "access method!"); 4282292SN/A 4292292SN/A return NoFault; 4302292SN/A } 4312292SN/A}}; 4322292SN/A 4332292SN/A 4342292SN/A// load instructions use Ra as dest, so check for 4352292SN/A// Ra == 31 to detect nops 4361684SN/Adef template LoadNopCheckDecode {{ 4371684SN/A { 4381684SN/A AlphaStaticInst *i = new %(class_name)s(machInst); 4391684SN/A if (RA == 31) { 4401684SN/A i = makeNop(i); 4411684SN/A } 4422292SN/A return i; 4432292SN/A } 4442292SN/A}}; 4452292SN/A 4462292SN/A 4472292SN/A// for some load instructions, Ra == 31 indicates a prefetch (not a nop) 4482292SN/Adef template LoadPrefetchCheckDecode {{ 4491060SN/A { 4501060SN/A if (RA != 31) { 4511061SN/A return new %(class_name)s(machInst); 4521060SN/A } 4531060SN/A else { 4541060SN/A return new %(class_name)sPrefetch(machInst); 4551060SN/A } 4561060SN/A } 4571060SN/A}}; 4581060SN/A 4591060SN/A 4601060SN/Alet {{ 4611060SN/Adef LoadStoreBase(name, Name, ea_code, memacc_code, mem_flags, inst_flags, 4621061SN/A postacc_code = '', base_class = 'MemoryDisp32', 4632292SN/A decode_template = BasicDecode, exec_template_base = ''): 4642292SN/A # Make sure flags are in lists (convert to lists if not). 4652292SN/A mem_flags = makeList(mem_flags) 4662292SN/A inst_flags = makeList(inst_flags) 4672292SN/A 4682292SN/A iop = InstObjParams(name, Name, base_class, 4692292SN/A { 'ea_code':ea_code, 'memacc_code':memacc_code, 'postacc_code':postacc_code }, 4702292SN/A inst_flags) 4712292SN/A 4722292SN/A if mem_flags: 4732292SN/A mem_flags = [ 'Request::%s' % flag for flag in mem_flags ] 4742292SN/A s = '\n\tmemAccessFlags = ' + string.join(mem_flags, '|') + ';' 4752292SN/A iop.constructor += s 4762292SN/A 4772292SN/A # select templates 4782292SN/A 4792292SN/A # The InitiateAcc template is the same for StoreCond templates as the 4802292SN/A # corresponding Store template.. 4812292SN/A StoreCondInitiateAcc = StoreInitiateAcc 4822292SN/A 4832292SN/A fullExecTemplate = eval(exec_template_base + 'Execute') 4842292SN/A initiateAccTemplate = eval(exec_template_base + 'InitiateAcc') 4852292SN/A completeAccTemplate = eval(exec_template_base + 'CompleteAcc') 4862292SN/A 4872292SN/A # (header_output, decoder_output, decode_block, exec_output) 4882292SN/A return (LoadStoreDeclare.subst(iop), 4892292SN/A LoadStoreConstructor.subst(iop), 4902292SN/A decode_template.subst(iop), 4911060SN/A fullExecTemplate.subst(iop) 4921061SN/A + EACompExecute.subst(iop) 4931060SN/A + initiateAccTemplate.subst(iop) 4941060SN/A + completeAccTemplate.subst(iop)) 4951060SN/A}}; 4961060SN/A 4972326SN/Adef format LoadOrNop(memacc_code, ea_code = {{ EA = Rb + disp; }}, 4982326SN/A mem_flags = [], inst_flags = []) {{ 4991060SN/A (header_output, decoder_output, decode_block, exec_output) = \ 5001060SN/A LoadStoreBase(name, Name, ea_code, memacc_code, mem_flags, inst_flags, 5011060SN/A decode_template = LoadNopCheckDecode, 5022292SN/A exec_template_base = 'Load') 5031060SN/A}}; 5042064SN/A 5051060SN/A 5062292SN/A// Note that the flags passed in apply only to the prefetch version 5071060SN/Adef format LoadOrPrefetch(memacc_code, ea_code = {{ EA = Rb + disp; }}, 5081060SN/A mem_flags = [], pf_flags = [], inst_flags = []) {{ 5091060SN/A # declare the load instruction object and generate the decode block 5101060SN/A (header_output, decoder_output, decode_block, exec_output) = \ 5111060SN/A LoadStoreBase(name, Name, ea_code, memacc_code, mem_flags, inst_flags, 5121060SN/A decode_template = LoadPrefetchCheckDecode, 5131060SN/A exec_template_base = 'Load') 5142326SN/A 5151060SN/A # Declare the prefetch instruction object. 5161061SN/A 5172292SN/A # Make sure flag args are lists so we can mess with them. 5181062SN/A mem_flags = makeList(mem_flags) 5191062SN/A pf_flags = makeList(pf_flags) 5201061SN/A inst_flags = makeList(inst_flags) 5211061SN/A 5221062SN/A pf_mem_flags = mem_flags + pf_flags + ['PREFETCH'] 5231060SN/A pf_inst_flags = inst_flags 5242292SN/A 5252292SN/A (pf_header_output, pf_decoder_output, _, pf_exec_output) = \ 5261060SN/A LoadStoreBase(name, Name + 'Prefetch', ea_code, ';', 5271060SN/A pf_mem_flags, pf_inst_flags, exec_template_base = 'Misc') 5281060SN/A 5291061SN/A header_output += pf_header_output 5301061SN/A decoder_output += pf_decoder_output 5312292SN/A exec_output += pf_exec_output 5321061SN/A}}; 5331061SN/A 5341061SN/A 5351061SN/Adef format Store(memacc_code, ea_code = {{ EA = Rb + disp; }}, 5362292SN/A mem_flags = [], inst_flags = []) {{ 5371061SN/A (header_output, decoder_output, decode_block, exec_output) = \ 5382292SN/A LoadStoreBase(name, Name, ea_code, memacc_code, mem_flags, inst_flags, 5391061SN/A exec_template_base = 'Store') 5402326SN/A}}; 5412326SN/A 5422326SN/A 5432064SN/Adef format StoreCond(memacc_code, postacc_code, 5441061SN/A ea_code = {{ EA = Rb + disp; }}, 5451061SN/A mem_flags = [], inst_flags = []) {{ 5462292SN/A (header_output, decoder_output, decode_block, exec_output) = \ 5471061SN/A LoadStoreBase(name, Name, ea_code, memacc_code, mem_flags, inst_flags, 5482064SN/A postacc_code, exec_template_base = 'StoreCond') 5491061SN/A}}; 5502292SN/A 5511061SN/A 5521061SN/A// Use 'MemoryNoDisp' as base: for wh64, fetch, ecb 5531061SN/Adef format MiscPrefetch(ea_code, memacc_code, 5542326SN/A mem_flags = [], inst_flags = []) {{ 5551061SN/A (header_output, decoder_output, decode_block, exec_output) = \ 5561061SN/A LoadStoreBase(name, Name, ea_code, memacc_code, mem_flags, inst_flags, 5571061SN/A base_class = 'MemoryNoDisp', exec_template_base = 'Misc') 5582292SN/A}}; 5592292SN/A 5601061SN/A 5611062SN/A