mem.isa revision 7119
16019Shines@cs.fsu.edu// -*- mode:c++ -*-
26019Shines@cs.fsu.edu
37119Sgblack@eecs.umich.edu// Copyright (c) 2010 ARM Limited
47119Sgblack@eecs.umich.edu// All rights reserved
57119Sgblack@eecs.umich.edu//
67119Sgblack@eecs.umich.edu// The license below extends only to copyright in the software and shall
77119Sgblack@eecs.umich.edu// not be construed as granting a license to any other intellectual
87119Sgblack@eecs.umich.edu// property including but not limited to intellectual property relating
97119Sgblack@eecs.umich.edu// to a hardware implementation of the functionality of the software
107119Sgblack@eecs.umich.edu// licensed hereunder.  You may use the software subject to the license
117119Sgblack@eecs.umich.edu// terms below provided that you ensure that this notice is replicated
127119Sgblack@eecs.umich.edu// unmodified and in its entirety in all distributions of the software,
137119Sgblack@eecs.umich.edu// modified or unmodified, in source code or in binary form.
147119Sgblack@eecs.umich.edu//
156019Shines@cs.fsu.edu// Copyright (c) 2007-2008 The Florida State University
166019Shines@cs.fsu.edu// All rights reserved.
176019Shines@cs.fsu.edu//
186019Shines@cs.fsu.edu// Redistribution and use in source and binary forms, with or without
196019Shines@cs.fsu.edu// modification, are permitted provided that the following conditions are
206019Shines@cs.fsu.edu// met: redistributions of source code must retain the above copyright
216019Shines@cs.fsu.edu// notice, this list of conditions and the following disclaimer;
226019Shines@cs.fsu.edu// redistributions in binary form must reproduce the above copyright
236019Shines@cs.fsu.edu// notice, this list of conditions and the following disclaimer in the
246019Shines@cs.fsu.edu// documentation and/or other materials provided with the distribution;
256019Shines@cs.fsu.edu// neither the name of the copyright holders nor the names of its
266019Shines@cs.fsu.edu// contributors may be used to endorse or promote products derived from
276019Shines@cs.fsu.edu// this software without specific prior written permission.
286019Shines@cs.fsu.edu//
296019Shines@cs.fsu.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
306019Shines@cs.fsu.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
316019Shines@cs.fsu.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
326019Shines@cs.fsu.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
336019Shines@cs.fsu.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
346019Shines@cs.fsu.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
356019Shines@cs.fsu.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
366019Shines@cs.fsu.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
376019Shines@cs.fsu.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
386019Shines@cs.fsu.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
396019Shines@cs.fsu.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
406019Shines@cs.fsu.edu//
416019Shines@cs.fsu.edu// Authors: Stephen Hines
426019Shines@cs.fsu.edu
436019Shines@cs.fsu.edu////////////////////////////////////////////////////////////////////
446019Shines@cs.fsu.edu//
456019Shines@cs.fsu.edu// Memory-format instructions
466019Shines@cs.fsu.edu//
476019Shines@cs.fsu.edu
486019Shines@cs.fsu.edudef template LoadStoreDeclare {{
496019Shines@cs.fsu.edu    /**
506019Shines@cs.fsu.edu     * Static instruction class for "%(mnemonic)s".
516019Shines@cs.fsu.edu     */
526019Shines@cs.fsu.edu    class %(class_name)s : public %(base_class)s
536019Shines@cs.fsu.edu    {
546019Shines@cs.fsu.edu      public:
556019Shines@cs.fsu.edu
566019Shines@cs.fsu.edu        /// Constructor.
576250Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst);
586019Shines@cs.fsu.edu
596019Shines@cs.fsu.edu        %(BasicExecDeclare)s
606019Shines@cs.fsu.edu
616019Shines@cs.fsu.edu        %(InitiateAccDeclare)s
626019Shines@cs.fsu.edu
636019Shines@cs.fsu.edu        %(CompleteAccDeclare)s
646019Shines@cs.fsu.edu    };
656019Shines@cs.fsu.edu}};
666019Shines@cs.fsu.edu
676019Shines@cs.fsu.edu
686019Shines@cs.fsu.edudef template InitiateAccDeclare {{
696019Shines@cs.fsu.edu    Fault initiateAcc(%(CPU_exec_context)s *, Trace::InstRecord *) const;
706019Shines@cs.fsu.edu}};
716019Shines@cs.fsu.edu
726019Shines@cs.fsu.edu
736019Shines@cs.fsu.edudef template CompleteAccDeclare {{
746019Shines@cs.fsu.edu    Fault completeAcc(PacketPtr,  %(CPU_exec_context)s *, Trace::InstRecord *) const;
756019Shines@cs.fsu.edu}};
766019Shines@cs.fsu.edu
776019Shines@cs.fsu.edu
786305Sgblack@eecs.umich.edudef template LoadStoreConstructor {{
796305Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(ExtMachInst machInst)
806305Sgblack@eecs.umich.edu         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s)
816019Shines@cs.fsu.edu    {
826019Shines@cs.fsu.edu        %(constructor)s;
836019Shines@cs.fsu.edu    }
846019Shines@cs.fsu.edu}};
856019Shines@cs.fsu.edu
866019Shines@cs.fsu.edu
876019Shines@cs.fsu.edudef template StoreExecute {{
886019Shines@cs.fsu.edu    Fault %(class_name)s::execute(%(CPU_exec_context)s *xc,
896019Shines@cs.fsu.edu                                  Trace::InstRecord *traceData) const
906019Shines@cs.fsu.edu    {
916019Shines@cs.fsu.edu        Addr EA;
926019Shines@cs.fsu.edu        Fault fault = NoFault;
936019Shines@cs.fsu.edu
946019Shines@cs.fsu.edu        %(op_decl)s;
956019Shines@cs.fsu.edu        %(op_rd)s;
966019Shines@cs.fsu.edu        %(ea_code)s;
976019Shines@cs.fsu.edu
986243Sgblack@eecs.umich.edu        if (%(predicate_test)s)
996019Shines@cs.fsu.edu        {
1006019Shines@cs.fsu.edu            if (fault == NoFault) {
1016019Shines@cs.fsu.edu                %(memacc_code)s;
1026019Shines@cs.fsu.edu            }
1036019Shines@cs.fsu.edu
1046019Shines@cs.fsu.edu            if (fault == NoFault) {
1056019Shines@cs.fsu.edu                fault = xc->write((uint%(mem_acc_size)d_t&)Mem, EA,
1066019Shines@cs.fsu.edu                                  memAccessFlags, NULL);
1076019Shines@cs.fsu.edu            }
1086019Shines@cs.fsu.edu
1096019Shines@cs.fsu.edu            if (fault == NoFault) {
1106019Shines@cs.fsu.edu                %(op_wb)s;
1116019Shines@cs.fsu.edu            }
1126019Shines@cs.fsu.edu        }
1136019Shines@cs.fsu.edu
1146019Shines@cs.fsu.edu        return fault;
1156019Shines@cs.fsu.edu    }
1166019Shines@cs.fsu.edu}};
1176019Shines@cs.fsu.edu
1186019Shines@cs.fsu.edudef template StoreInitiateAcc {{
1196019Shines@cs.fsu.edu    Fault %(class_name)s::initiateAcc(%(CPU_exec_context)s *xc,
1206019Shines@cs.fsu.edu                                      Trace::InstRecord *traceData) const
1216019Shines@cs.fsu.edu    {
1226019Shines@cs.fsu.edu        Addr EA;
1236019Shines@cs.fsu.edu        Fault fault = NoFault;
1246019Shines@cs.fsu.edu
1256019Shines@cs.fsu.edu        %(op_decl)s;
1266019Shines@cs.fsu.edu        %(op_rd)s;
1276019Shines@cs.fsu.edu        %(ea_code)s;
1286019Shines@cs.fsu.edu
1296243Sgblack@eecs.umich.edu        if (%(predicate_test)s)
1306019Shines@cs.fsu.edu        {
1316019Shines@cs.fsu.edu            if (fault == NoFault) {
1326019Shines@cs.fsu.edu                %(memacc_code)s;
1336019Shines@cs.fsu.edu            }
1346019Shines@cs.fsu.edu
1356019Shines@cs.fsu.edu            if (fault == NoFault) {
1366019Shines@cs.fsu.edu                fault = xc->write((uint%(mem_acc_size)d_t&)Mem, EA,
1376019Shines@cs.fsu.edu                                  memAccessFlags, NULL);
1386019Shines@cs.fsu.edu            }
1396019Shines@cs.fsu.edu
1406019Shines@cs.fsu.edu            // Need to write back any potential address register update
1416019Shines@cs.fsu.edu            if (fault == NoFault) {
1426019Shines@cs.fsu.edu                %(op_wb)s;
1436019Shines@cs.fsu.edu            }
1446019Shines@cs.fsu.edu        }
1456019Shines@cs.fsu.edu
1466019Shines@cs.fsu.edu        return fault;
1476019Shines@cs.fsu.edu    }
1486019Shines@cs.fsu.edu}};
1496019Shines@cs.fsu.edu
1506019Shines@cs.fsu.edu
1516019Shines@cs.fsu.edudef template StoreCompleteAcc {{
1526019Shines@cs.fsu.edu    Fault %(class_name)s::completeAcc(PacketPtr pkt,
1536019Shines@cs.fsu.edu                                      %(CPU_exec_context)s *xc,
1546019Shines@cs.fsu.edu                                      Trace::InstRecord *traceData) const
1556019Shines@cs.fsu.edu    {
1566019Shines@cs.fsu.edu        Fault fault = NoFault;
1576019Shines@cs.fsu.edu
1586302Sgblack@eecs.umich.edu        %(op_decl)s;
1596302Sgblack@eecs.umich.edu        %(op_rd)s;
1606019Shines@cs.fsu.edu
1616243Sgblack@eecs.umich.edu        if (%(predicate_test)s)
1626019Shines@cs.fsu.edu        {
1636019Shines@cs.fsu.edu            if (fault == NoFault) {
1646019Shines@cs.fsu.edu                %(op_wb)s;
1656019Shines@cs.fsu.edu            }
1666019Shines@cs.fsu.edu        }
1676019Shines@cs.fsu.edu
1686019Shines@cs.fsu.edu        return fault;
1696019Shines@cs.fsu.edu    }
1706019Shines@cs.fsu.edu}};
1716019Shines@cs.fsu.edu
1726019Shines@cs.fsu.edudef template StoreCondCompleteAcc {{
1736019Shines@cs.fsu.edu    Fault %(class_name)s::completeAcc(PacketPtr pkt,
1746019Shines@cs.fsu.edu                                      %(CPU_exec_context)s *xc,
1756019Shines@cs.fsu.edu                                      Trace::InstRecord *traceData) const
1766019Shines@cs.fsu.edu    {
1776019Shines@cs.fsu.edu        Fault fault = NoFault;
1786019Shines@cs.fsu.edu
1796019Shines@cs.fsu.edu        %(op_dest_decl)s;
1806019Shines@cs.fsu.edu
1816243Sgblack@eecs.umich.edu        if (%(predicate_test)s)
1826019Shines@cs.fsu.edu        {
1836019Shines@cs.fsu.edu            if (fault == NoFault) {
1846019Shines@cs.fsu.edu                %(op_wb)s;
1856019Shines@cs.fsu.edu            }
1866019Shines@cs.fsu.edu        }
1876019Shines@cs.fsu.edu
1886019Shines@cs.fsu.edu        return fault;
1896019Shines@cs.fsu.edu    }
1906019Shines@cs.fsu.edu}};
1916019Shines@cs.fsu.edu
1926301Sgblack@eecs.umich.edulet {{
1936301Sgblack@eecs.umich.edu    def buildPUBWLCase(p, u, b, w, l):
1946301Sgblack@eecs.umich.edu        return (p << 4) + (u << 3) + (b << 2) + (w << 1) + (l << 0)
1956301Sgblack@eecs.umich.edu
1966303Sgblack@eecs.umich.edu    def buildMode2Inst(p, u, b, w, l, suffix, offset):
1976303Sgblack@eecs.umich.edu        mnem = ("str", "ldr")[l]
1986303Sgblack@eecs.umich.edu        op = ("-", "+")[u]
1996303Sgblack@eecs.umich.edu        offset = op + ArmGenericCodeSubs(offset);
2006303Sgblack@eecs.umich.edu        mem = ("Mem", "Mem.ub")[b]
2016303Sgblack@eecs.umich.edu        code = ("%s = Rd;", "Rd = %s;")[l] % mem
2026303Sgblack@eecs.umich.edu        ea_code = "EA = Rn %s;" % ("", offset)[p]
2036303Sgblack@eecs.umich.edu        if p == 0 or w == 1:
2046303Sgblack@eecs.umich.edu            code += "Rn = Rn %s;" % offset
2056303Sgblack@eecs.umich.edu        if p == 0 and w == 0:
2066303Sgblack@eecs.umich.edu            # Here's where we'll tack on a flag to make this a usermode access.
2076303Sgblack@eecs.umich.edu            mnem += "t"
2086303Sgblack@eecs.umich.edu        type = ("Store", "Load")[l]
2096307Sgblack@eecs.umich.edu        newSuffix = "_%s_P%dU%dB%dW%d" % (suffix, p, u, b, w)
2106303Sgblack@eecs.umich.edu        if b == 1:
2116303Sgblack@eecs.umich.edu            mnem += "b"
2126307Sgblack@eecs.umich.edu        return LoadStoreBase(mnem, mnem.capitalize() + newSuffix,
2136303Sgblack@eecs.umich.edu                ea_code, code, mem_flags = [], inst_flags = [],
2146307Sgblack@eecs.umich.edu                base_class = 'Memory' + suffix,
2156303Sgblack@eecs.umich.edu                exec_template_base = type.capitalize())
2166303Sgblack@eecs.umich.edu
2176301Sgblack@eecs.umich.edu    def buildMode3Inst(p, u, i, w, type, code, mnem):
2186301Sgblack@eecs.umich.edu        op = ("-", "+")[u]
2196301Sgblack@eecs.umich.edu        offset = ("%s Rm", "%s hilo")[i] % op
2206301Sgblack@eecs.umich.edu        ea_code = "EA = Rn %s;" % ("", offset)[p]
2216301Sgblack@eecs.umich.edu        if p == 0 or w == 1:
2226301Sgblack@eecs.umich.edu            code += "Rn = Rn %s;" % offset
2236307Sgblack@eecs.umich.edu        newSuffix = "_P%dU%dI%dW%d" % (p, u, i, w)
2246307Sgblack@eecs.umich.edu        suffix = ("Reg", "Hilo")[i]
2256307Sgblack@eecs.umich.edu        return LoadStoreBase(mnem, mnem.capitalize() + newSuffix,
2266301Sgblack@eecs.umich.edu                ea_code, code, mem_flags = [], inst_flags = [],
2276307Sgblack@eecs.umich.edu                base_class = 'Memory' + suffix,
2286301Sgblack@eecs.umich.edu                exec_template_base = type.capitalize())
2296301Sgblack@eecs.umich.edu}};
2306301Sgblack@eecs.umich.edu
2317119Sgblack@eecs.umich.edudef format AddrMode2(imm, suffix, offset) {{
2327119Sgblack@eecs.umich.edu    if eval(imm):
2337119Sgblack@eecs.umich.edu        imm = True
2347119Sgblack@eecs.umich.edu    else:
2357119Sgblack@eecs.umich.edu        imm = False
2367119Sgblack@eecs.umich.edu
2376303Sgblack@eecs.umich.edu    header_output = decoder_output = exec_output = ""
2386303Sgblack@eecs.umich.edu    decode_block = "switch(PUBWL) {\n"
2396303Sgblack@eecs.umich.edu
2406303Sgblack@eecs.umich.edu    # Loop over all the values of p, u, b, w and l and build instructions and
2416303Sgblack@eecs.umich.edu    # a decode block for them.
2426303Sgblack@eecs.umich.edu    for p in (0, 1):
2436303Sgblack@eecs.umich.edu        for u in (0, 1):
2446303Sgblack@eecs.umich.edu            for b in (0, 1):
2456303Sgblack@eecs.umich.edu                for w in (0, 1):
2467119Sgblack@eecs.umich.edu                    (new_header_output,
2477119Sgblack@eecs.umich.edu                     new_decoder_output,
2487119Sgblack@eecs.umich.edu                     new_decode_block,
2497119Sgblack@eecs.umich.edu                     new_exec_output) = buildMode2Inst(p, u, b, w, 0,
2507119Sgblack@eecs.umich.edu                                                       suffix, offset)
2517119Sgblack@eecs.umich.edu                    header_output += new_header_output
2527119Sgblack@eecs.umich.edu                    decoder_output += new_decoder_output
2537119Sgblack@eecs.umich.edu                    exec_output += new_exec_output
2547119Sgblack@eecs.umich.edu                    decode_block += '''
2557119Sgblack@eecs.umich.edu                        case %#x:
2567119Sgblack@eecs.umich.edu                          {%s}
2577119Sgblack@eecs.umich.edu                          break;
2587119Sgblack@eecs.umich.edu                    ''' % (buildPUBWLCase(p,u,b,w,0), new_decode_block)
2597119Sgblack@eecs.umich.edu
2607119Sgblack@eecs.umich.edu                    post = (p == 0)
2617119Sgblack@eecs.umich.edu                    user = (p == 0 and w == 0)
2627119Sgblack@eecs.umich.edu                    writeback = (p == 0 or w == 1)
2637119Sgblack@eecs.umich.edu                    add = (u == 1)
2647119Sgblack@eecs.umich.edu                    if b == 0:
2657119Sgblack@eecs.umich.edu                        size = 4
2667119Sgblack@eecs.umich.edu                    else:
2677119Sgblack@eecs.umich.edu                        size = 1
2687119Sgblack@eecs.umich.edu                    if add:
2697119Sgblack@eecs.umich.edu                        addStr = "true"
2707119Sgblack@eecs.umich.edu                    else:
2717119Sgblack@eecs.umich.edu                        addStr = "false"
2727119Sgblack@eecs.umich.edu                    if imm:
2737119Sgblack@eecs.umich.edu                        newDecode = "return new %s(machInst, RD, RN," + \
2747119Sgblack@eecs.umich.edu                                                  "%s, machInst.immed11_0);"
2757119Sgblack@eecs.umich.edu                        className = loadImmClassName(post, add, writeback,
2767119Sgblack@eecs.umich.edu                                                     size, False, user)
2777119Sgblack@eecs.umich.edu                        newDecode = newDecode % (className, addStr)
2787119Sgblack@eecs.umich.edu                    else:
2797119Sgblack@eecs.umich.edu                        newDecode = "return new %s(machInst, RD, RN, %s," + \
2807119Sgblack@eecs.umich.edu                                                  "machInst.shiftSize," + \
2817119Sgblack@eecs.umich.edu                                                  "machInst.shift, RM);"
2827119Sgblack@eecs.umich.edu                        className = loadRegClassName(post, add, writeback,
2837119Sgblack@eecs.umich.edu                                                     size, False, user)
2847119Sgblack@eecs.umich.edu                        newDecode = newDecode % (className, addStr)
2857119Sgblack@eecs.umich.edu                    decode_block += '''
2867119Sgblack@eecs.umich.edu                        case %#x:
2877119Sgblack@eecs.umich.edu                          {%s}
2887119Sgblack@eecs.umich.edu                          break;
2897119Sgblack@eecs.umich.edu                    ''' % (buildPUBWLCase(p,u,b,w,1), newDecode)
2906303Sgblack@eecs.umich.edu    decode_block += '''
2916303Sgblack@eecs.umich.edu        default:
2926303Sgblack@eecs.umich.edu          return new Unknown(machInst);
2936303Sgblack@eecs.umich.edu        break;
2946303Sgblack@eecs.umich.edu    }'''
2956303Sgblack@eecs.umich.edu}};
2966303Sgblack@eecs.umich.edu
2976301Sgblack@eecs.umich.edudef format AddrMode3(l0Type, l0Code, l1Type, l1Code) {{
2986301Sgblack@eecs.umich.edu    l0Code = ArmGenericCodeSubs(l0Code);
2996301Sgblack@eecs.umich.edu    l1Code = ArmGenericCodeSubs(l1Code);
3006301Sgblack@eecs.umich.edu
3016301Sgblack@eecs.umich.edu    header_output = decoder_output = exec_output = ""
3026301Sgblack@eecs.umich.edu    decode_block = "switch(PUBWL) {\n"
3036301Sgblack@eecs.umich.edu    (l0Mnem, l1Mnem) = name.split("_");
3046301Sgblack@eecs.umich.edu
3056301Sgblack@eecs.umich.edu    # Loop over all the values of p, u, i, w and l and build instructions and
3066301Sgblack@eecs.umich.edu    # a decode block for them.
3076301Sgblack@eecs.umich.edu    for (l, type, code, mnem) in ((0, l0Type, l0Code, l0Mnem),
3086301Sgblack@eecs.umich.edu                                  (1, l1Type, l1Code, l1Mnem)):
3096301Sgblack@eecs.umich.edu        for p in (0, 1):
3106301Sgblack@eecs.umich.edu            wset = (0, 1)
3116301Sgblack@eecs.umich.edu            if (p == 0):
3126301Sgblack@eecs.umich.edu                wset = (0,)
3136301Sgblack@eecs.umich.edu            for u in (0, 1):
3146301Sgblack@eecs.umich.edu                for i in (0, 1):
3156301Sgblack@eecs.umich.edu                    for w in wset:
3166301Sgblack@eecs.umich.edu                        (new_header_output,
3176301Sgblack@eecs.umich.edu                         new_decoder_output,
3186301Sgblack@eecs.umich.edu                         new_decode_block,
3196301Sgblack@eecs.umich.edu                         new_exec_output) = buildMode3Inst(p, u, i, w,
3206301Sgblack@eecs.umich.edu                                                           type, code, mnem)
3216301Sgblack@eecs.umich.edu                        header_output += new_header_output
3226301Sgblack@eecs.umich.edu                        decoder_output += new_decoder_output
3236301Sgblack@eecs.umich.edu                        exec_output += new_exec_output
3246301Sgblack@eecs.umich.edu                        decode_block += '''
3256301Sgblack@eecs.umich.edu                            case %#x:
3266301Sgblack@eecs.umich.edu                              {%s}
3276301Sgblack@eecs.umich.edu                              break;
3286301Sgblack@eecs.umich.edu                        ''' % (buildPUBWLCase(p,u,i,w,l), new_decode_block)
3296301Sgblack@eecs.umich.edu
3306301Sgblack@eecs.umich.edu    decode_block += '''
3316301Sgblack@eecs.umich.edu        default:
3326301Sgblack@eecs.umich.edu          return new Unknown(machInst);
3336301Sgblack@eecs.umich.edu        break;
3346301Sgblack@eecs.umich.edu    }'''
3356301Sgblack@eecs.umich.edu}};
3366301Sgblack@eecs.umich.edu
3376019Shines@cs.fsu.edudef format ArmLoadMemory(memacc_code, ea_code = {{ EA = Rn + disp; }},
3386019Shines@cs.fsu.edu                     mem_flags = [], inst_flags = []) {{
3396019Shines@cs.fsu.edu    ea_code = ArmGenericCodeSubs(ea_code)
3406019Shines@cs.fsu.edu    memacc_code = ArmGenericCodeSubs(memacc_code)
3416019Shines@cs.fsu.edu    (header_output, decoder_output, decode_block, exec_output) = \
3426019Shines@cs.fsu.edu        LoadStoreBase(name, Name, ea_code, memacc_code, mem_flags, inst_flags,
3436019Shines@cs.fsu.edu                      decode_template = BasicDecode,
3446019Shines@cs.fsu.edu                      exec_template_base = 'Load')
3456019Shines@cs.fsu.edu}};
3466019Shines@cs.fsu.edu
3476019Shines@cs.fsu.edudef format ArmStoreMemory(memacc_code, ea_code = {{ EA = Rn + disp; }},
3486019Shines@cs.fsu.edu                     mem_flags = [], inst_flags = []) {{
3496019Shines@cs.fsu.edu    ea_code = ArmGenericCodeSubs(ea_code)
3506019Shines@cs.fsu.edu    memacc_code = ArmGenericCodeSubs(memacc_code)
3516019Shines@cs.fsu.edu    (header_output, decoder_output, decode_block, exec_output) = \
3526019Shines@cs.fsu.edu        LoadStoreBase(name, Name, ea_code, memacc_code, mem_flags, inst_flags,
3536019Shines@cs.fsu.edu                      exec_template_base = 'Store')
3546019Shines@cs.fsu.edu}};
3556019Shines@cs.fsu.edu
356