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