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