mem.isa revision 8072:128afe2b3a35
12292SN/A// -*- mode:c++ -*- 22292SN/A 32292SN/A// Copyright (c) 2010 ARM Limited 42292SN/A// All rights reserved 52292SN/A// 62292SN/A// The license below extends only to copyright in the software and shall 72292SN/A// not be construed as granting a license to any other intellectual 82292SN/A// property including but not limited to intellectual property relating 92292SN/A// to a hardware implementation of the functionality of the software 102292SN/A// licensed hereunder. You may use the software subject to the license 112292SN/A// terms below provided that you ensure that this notice is replicated 122292SN/A// unmodified and in its entirety in all distributions of the software, 132292SN/A// modified or unmodified, in source code or in binary form. 142292SN/A// 152292SN/A// Copyright (c) 2007-2008 The Florida State University 162292SN/A// All rights reserved. 172292SN/A// 182292SN/A// Redistribution and use in source and binary forms, with or without 192292SN/A// modification, are permitted provided that the following conditions are 202292SN/A// met: redistributions of source code must retain the above copyright 212292SN/A// notice, this list of conditions and the following disclaimer; 222292SN/A// redistributions in binary form must reproduce the above copyright 232292SN/A// notice, this list of conditions and the following disclaimer in the 242292SN/A// documentation and/or other materials provided with the distribution; 252292SN/A// neither the name of the copyright holders nor the names of its 262292SN/A// contributors may be used to endorse or promote products derived from 272689Sktlim@umich.edu// this software without specific prior written permission. 282689Sktlim@umich.edu// 292689Sktlim@umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 302292SN/A// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 312292SN/A// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 323326Sktlim@umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 332733Sktlim@umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 342733Sktlim@umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 352907Sktlim@umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 362292SN/A// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 372292SN/A// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 382722Sktlim@umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 392669Sktlim@umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 402292SN/A// 412790Sktlim@umich.edu// Authors: Stephen Hines 422790Sktlim@umich.edu 432790Sktlim@umich.edu 442790Sktlim@umich.edudef template PanicExecute {{ 452669Sktlim@umich.edu Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, 462678Sktlim@umich.edu Trace::InstRecord *traceData) const 472678Sktlim@umich.edu { 482678Sktlim@umich.edu panic("Execute function executed when it shouldn't be!\n"); 492292SN/A return NoFault; 502678Sktlim@umich.edu } 512292SN/A}}; 522292SN/A 532669Sktlim@umich.edudef template PanicInitiateAcc {{ 542292SN/A Fault %(class_name)s::initiateAcc(%(CPU_exec_context)s *xc, 552678Sktlim@umich.edu Trace::InstRecord *traceData) const 562292SN/A { 572678Sktlim@umich.edu panic("InitiateAcc function executed when it shouldn't be!\n"); 582678Sktlim@umich.edu return NoFault; 592678Sktlim@umich.edu } 602678Sktlim@umich.edu}}; 612678Sktlim@umich.edu 622292SN/Adef template PanicCompleteAcc {{ 632678Sktlim@umich.edu Fault %(class_name)s::completeAcc(PacketPtr pkt, 642678Sktlim@umich.edu %(CPU_exec_context)s *xc, 652678Sktlim@umich.edu Trace::InstRecord *traceData) const 662678Sktlim@umich.edu { 672678Sktlim@umich.edu panic("CompleteAcc function executed when it shouldn't be!\n"); 682678Sktlim@umich.edu return NoFault; 692292SN/A } 702678Sktlim@umich.edu}}; 712678Sktlim@umich.edu 722678Sktlim@umich.edu 732678Sktlim@umich.edudef template SwapExecute {{ 742678Sktlim@umich.edu Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, 752678Sktlim@umich.edu Trace::InstRecord *traceData) const 762678Sktlim@umich.edu { 772698Sktlim@umich.edu Addr EA; 782344SN/A Fault fault = NoFault; 792678Sktlim@umich.edu 802678Sktlim@umich.edu %(op_decl)s; 812678Sktlim@umich.edu uint64_t memData = 0; 822820Sktlim@umich.edu %(op_rd)s; 832678Sktlim@umich.edu %(ea_code)s; 842678Sktlim@umich.edu 852307SN/A if (%(predicate_test)s) 862678Sktlim@umich.edu { 872678Sktlim@umich.edu %(preacc_code)s; 882678Sktlim@umich.edu 892678Sktlim@umich.edu if (fault == NoFault) { 902678Sktlim@umich.edu fault = xc->write((uint%(mem_acc_size)d_t&)Mem, 912678Sktlim@umich.edu EA, memAccessFlags, &memData); 922678Sktlim@umich.edu } 932678Sktlim@umich.edu 942344SN/A if (fault == NoFault) { 952307SN/A %(postacc_code)s; 962678Sktlim@umich.edu } 972678Sktlim@umich.edu 982292SN/A if (fault == NoFault) { 992292SN/A %(op_wb)s; 1002292SN/A } 1012292SN/A } else { 1022678Sktlim@umich.edu xc->setPredicate(false); 1032678Sktlim@umich.edu } 1042292SN/A 1052292SN/A if (fault == NoFault && machInst.itstateMask != 0 && 1062292SN/A (!isMicroop() || isLastMicroop())) { 1072292SN/A xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate); 1082292SN/A } 1092292SN/A 1102907Sktlim@umich.edu return fault; 1112292SN/A } 1122292SN/A}}; 1132292SN/A 1142292SN/Adef template SwapInitiateAcc {{ 1152307SN/A Fault %(class_name)s::initiateAcc(%(CPU_exec_context)s *xc, 1162307SN/A Trace::InstRecord *traceData) const 1172907Sktlim@umich.edu { 1182907Sktlim@umich.edu Addr EA; 1192292SN/A Fault fault = NoFault; 1202292SN/A 1212329SN/A %(op_decl)s; 1222329SN/A uint64_t memData = 0; 1232329SN/A %(op_rd)s; 1242292SN/A %(ea_code)s; 1252292SN/A 1262292SN/A if (%(predicate_test)s) 1272292SN/A { 1282292SN/A %(preacc_code)s; 1292292SN/A 1302292SN/A if (fault == NoFault) { 1312292SN/A fault = xc->write((uint%(mem_acc_size)d_t&)Mem, EA, 1322292SN/A memAccessFlags, &memData); 1332292SN/A } 1342292SN/A } else { 1353492Sktlim@umich.edu xc->setPredicate(false); 1362329SN/A } 1372292SN/A 1382292SN/A if (fault == NoFault && machInst.itstateMask != 0 && 1392292SN/A (!isMicroop() || isLastMicroop())) { 1402292SN/A xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate); 1412292SN/A } 1422669Sktlim@umich.edu 1432733Sktlim@umich.edu return fault; 1442669Sktlim@umich.edu } 1452669Sktlim@umich.edu}}; 1462678Sktlim@umich.edu 1472733Sktlim@umich.edudef template SwapCompleteAcc {{ 1482679Sktlim@umich.edu Fault %(class_name)s::completeAcc(PacketPtr pkt, 1492679Sktlim@umich.edu %(CPU_exec_context)s *xc, 1502679Sktlim@umich.edu Trace::InstRecord *traceData) const 1512733Sktlim@umich.edu { 1522669Sktlim@umich.edu Fault fault = NoFault; 1532669Sktlim@umich.edu 1542669Sktlim@umich.edu %(op_decl)s; 1552292SN/A %(op_rd)s; 1562292SN/A 1572292SN/A if (%(predicate_test)s) 1582292SN/A { 1592292SN/A // ARM instructions will not have a pkt if the predicate is false 1602292SN/A uint64_t memData = pkt->get<typeof(Mem)>(); 1612292SN/A 1622292SN/A %(postacc_code)s; 1632292SN/A 1642292SN/A if (fault == NoFault) { 1652292SN/A %(op_wb)s; 1662292SN/A } 1672727Sktlim@umich.edu } 1682727Sktlim@umich.edu 1692727Sktlim@umich.edu if (fault == NoFault && machInst.itstateMask != 0) { 1702727Sktlim@umich.edu xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate); 1712727Sktlim@umich.edu } 1722727Sktlim@umich.edu 1732727Sktlim@umich.edu return fault; 1742727Sktlim@umich.edu } 1752727Sktlim@umich.edu}}; 1762727Sktlim@umich.edu 1772727Sktlim@umich.edudef template LoadExecute {{ 1782727Sktlim@umich.edu Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, 1792727Sktlim@umich.edu Trace::InstRecord *traceData) const 1802727Sktlim@umich.edu { 1812727Sktlim@umich.edu Addr EA; 1822727Sktlim@umich.edu Fault fault = NoFault; 1832727Sktlim@umich.edu 1842727Sktlim@umich.edu %(op_decl)s; 1852361SN/A %(op_rd)s; 1862361SN/A %(ea_code)s; 1872361SN/A 1882361SN/A if (%(predicate_test)s) 1892727Sktlim@umich.edu { 1902727Sktlim@umich.edu if (fault == NoFault) { 1912727Sktlim@umich.edu fault = xc->read(EA, (uint%(mem_acc_size)d_t&)Mem, memAccessFlags); 1922727Sktlim@umich.edu %(memacc_code)s; 1932727Sktlim@umich.edu } 1942727Sktlim@umich.edu 1952727Sktlim@umich.edu if (fault == NoFault) { 1962727Sktlim@umich.edu %(op_wb)s; 1972727Sktlim@umich.edu } 1982727Sktlim@umich.edu } else { 1992727Sktlim@umich.edu xc->setPredicate(false); 2002727Sktlim@umich.edu } 2012727Sktlim@umich.edu 2022727Sktlim@umich.edu if (fault == NoFault && machInst.itstateMask != 0 && 2032727Sktlim@umich.edu (!isMicroop() || isLastMicroop())) { 2042727Sktlim@umich.edu xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate); 2052727Sktlim@umich.edu } 2062727Sktlim@umich.edu 2072727Sktlim@umich.edu return fault; 2082727Sktlim@umich.edu } 2092727Sktlim@umich.edu}}; 2102727Sktlim@umich.edu 2112727Sktlim@umich.edudef template NeonLoadExecute {{ 2122292SN/A template <class Element> 2132292SN/A Fault %(class_name)s<Element>::execute( 2142292SN/A %(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const 2152292SN/A { 2162292SN/A Addr EA; 2172292SN/A Fault fault = NoFault; 2182292SN/A 2192292SN/A %(op_decl)s; 2202292SN/A %(mem_decl)s; 2212292SN/A %(op_rd)s; 2222292SN/A %(ea_code)s; 2232292SN/A 2242292SN/A MemUnion memUnion; 2252292SN/A uint8_t *dataPtr = memUnion.bytes; 2262307SN/A 2272307SN/A if (%(predicate_test)s) 2282307SN/A { 2292367SN/A if (fault == NoFault) { 2302367SN/A fault = xc->readBytes(EA, dataPtr, %(size)d, memAccessFlags); 2312307SN/A %(memacc_code)s; 2322367SN/A } 2332307SN/A 2342329SN/A if (fault == NoFault) { 2352307SN/A %(op_wb)s; 2362307SN/A } 2372307SN/A } else { 2382307SN/A xc->setPredicate(false); 2392307SN/A } 2402307SN/A 2412307SN/A if (fault == NoFault && machInst.itstateMask != 0 && 2422307SN/A (!isMicroop() || isLastMicroop())) { 2432307SN/A xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate); 2442307SN/A } 2452307SN/A 2462307SN/A return fault; 2472307SN/A } 2482307SN/A}}; 2492307SN/A 2502329SN/Adef template StoreExecute {{ 2512307SN/A Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, 2522307SN/A Trace::InstRecord *traceData) const 2532307SN/A { 2542307SN/A Addr EA; 2552307SN/A Fault fault = NoFault; 2562307SN/A 2572307SN/A %(op_decl)s; 2582307SN/A %(op_rd)s; 2592307SN/A %(ea_code)s; 2602307SN/A 2612292SN/A if (%(predicate_test)s) 2622292SN/A { 2632329SN/A if (fault == NoFault) { 2642329SN/A %(memacc_code)s; 2652292SN/A } 2662329SN/A 2672329SN/A if (fault == NoFault) { 2682292SN/A fault = xc->write((uint%(mem_acc_size)d_t&)Mem, EA, 2692292SN/A memAccessFlags, NULL); 2702292SN/A } 2712292SN/A 2722292SN/A if (fault == NoFault) { 2732329SN/A %(op_wb)s; 2742292SN/A } 2752292SN/A } else { 2762292SN/A xc->setPredicate(false); 2772292SN/A } 2782292SN/A 2792292SN/A if (fault == NoFault && machInst.itstateMask != 0 && 2802292SN/A (!isMicroop() || isLastMicroop())) { 2812292SN/A xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate); 2822329SN/A } 2832329SN/A 2842329SN/A return fault; 2852292SN/A } 2862292SN/A}}; 2872292SN/A 2882292SN/Adef template NeonStoreExecute {{ 2892292SN/A template <class Element> 2902329SN/A Fault %(class_name)s<Element>::execute( 2912292SN/A %(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const 2922292SN/A { 2932292SN/A Addr EA; 2942292SN/A Fault fault = NoFault; 2952292SN/A 2962292SN/A %(op_decl)s; 2972292SN/A %(mem_decl)s; 2982292SN/A %(op_rd)s; 2992292SN/A %(ea_code)s; 3002292SN/A 3012292SN/A MemUnion memUnion; 3022292SN/A uint8_t *dataPtr = memUnion.bytes; 3032292SN/A 3042292SN/A if (%(predicate_test)s) 3052292SN/A { 3062292SN/A if (fault == NoFault) { 3072292SN/A %(memacc_code)s; 3082292SN/A } 3092292SN/A 3102292SN/A if (fault == NoFault) { 3112292SN/A fault = xc->writeBytes(dataPtr, %(size)d, EA, 3122292SN/A memAccessFlags, NULL); 3132292SN/A } 3142292SN/A 3152329SN/A if (fault == NoFault) { 3162329SN/A %(op_wb)s; 3172292SN/A } 3182292SN/A } else { 3192292SN/A xc->setPredicate(false); 3202292SN/A } 3212292SN/A 3222292SN/A if (fault == NoFault && machInst.itstateMask != 0 && 3232292SN/A (!isMicroop() || isLastMicroop())) { 3242292SN/A xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate); 3252292SN/A } 3262292SN/A 3272292SN/A return fault; 3282292SN/A } 3292292SN/A}}; 3302292SN/A 3312292SN/Adef template StoreExExecute {{ 3322292SN/A Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, 3332292SN/A Trace::InstRecord *traceData) const 3342292SN/A { 3352292SN/A Addr EA; 3362292SN/A Fault fault = NoFault; 3372292SN/A 3382292SN/A %(op_decl)s; 3392292SN/A %(op_rd)s; 3402292SN/A %(ea_code)s; 3412292SN/A 3422292SN/A if (%(predicate_test)s) 3432292SN/A { 3442292SN/A if (fault == NoFault) { 3452292SN/A %(memacc_code)s; 3462292SN/A } 3472292SN/A 3482292SN/A uint64_t writeResult; 3492292SN/A 3502292SN/A if (fault == NoFault) { 3512292SN/A fault = xc->write((uint%(mem_acc_size)d_t&)Mem, EA, 3522292SN/A memAccessFlags, &writeResult); 3532292SN/A } 3542292SN/A 3552292SN/A if (fault == NoFault) { 3562292SN/A %(postacc_code)s; 3572292SN/A } 3582292SN/A 3592292SN/A if (fault == NoFault) { 3602292SN/A %(op_wb)s; 3612292SN/A } 3622292SN/A } else { 3632292SN/A xc->setPredicate(false); 3642292SN/A } 3652292SN/A 3662292SN/A if (fault == NoFault && machInst.itstateMask != 0 && 3672292SN/A (!isMicroop() || isLastMicroop())) { 3682292SN/A xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate); 3692292SN/A } 3702292SN/A 3712292SN/A return fault; 3722292SN/A } 3732292SN/A}}; 3742292SN/A 3752292SN/Adef template StoreExInitiateAcc {{ 3762292SN/A Fault %(class_name)s::initiateAcc(%(CPU_exec_context)s *xc, 3772292SN/A Trace::InstRecord *traceData) const 3782292SN/A { 3792292SN/A Addr EA; 3802292SN/A Fault fault = NoFault; 3812292SN/A 3822292SN/A %(op_decl)s; 3832292SN/A %(op_rd)s; 3842292SN/A %(ea_code)s; 3852292SN/A 3862292SN/A if (%(predicate_test)s) 3872292SN/A { 3882292SN/A if (fault == NoFault) { 3892292SN/A %(memacc_code)s; 3902292SN/A } 3912292SN/A 3922292SN/A if (fault == NoFault) { 3932292SN/A fault = xc->write((uint%(mem_acc_size)d_t&)Mem, EA, 3942292SN/A memAccessFlags, NULL); 3952292SN/A } 3962292SN/A } else { 3972292SN/A xc->setPredicate(false); 3982292SN/A } 3992292SN/A if (fault == NoFault && machInst.itstateMask != 0 && 4002292SN/A (!isMicroop() || isLastMicroop())) { 4012292SN/A xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate); 4022292SN/A } 4032292SN/A 4042292SN/A return fault; 4052292SN/A } 4062292SN/A}}; 4072292SN/A 4082292SN/Adef template StoreInitiateAcc {{ 4092292SN/A Fault %(class_name)s::initiateAcc(%(CPU_exec_context)s *xc, 4102292SN/A Trace::InstRecord *traceData) const 4112292SN/A { 4122669Sktlim@umich.edu Addr EA; 4132292SN/A Fault fault = NoFault; 4142292SN/A 4152292SN/A %(op_decl)s; 4162292SN/A %(op_rd)s; 4172329SN/A %(ea_code)s; 4182329SN/A 4192367SN/A if (%(predicate_test)s) 4202367SN/A { 4213731Sktlim@umich.edu if (fault == NoFault) { 4223731Sktlim@umich.edu %(memacc_code)s; 4232367SN/A } 4242367SN/A 4252292SN/A if (fault == NoFault) { 4262292SN/A fault = xc->write((uint%(mem_acc_size)d_t&)Mem, EA, 4272292SN/A memAccessFlags, NULL); 4282292SN/A } 4292292SN/A } else { 4302292SN/A xc->setPredicate(false); 4312292SN/A } 4322292SN/A 4332292SN/A if (fault == NoFault && machInst.itstateMask != 0 && 4342292SN/A (!isMicroop() || isLastMicroop())) { 4352292SN/A xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate); 4362292SN/A } 4372292SN/A 4382292SN/A return fault; 4392292SN/A } 4402292SN/A}}; 4412292SN/A 4422292SN/Adef template NeonStoreInitiateAcc {{ 4432292SN/A template <class Element> 4442292SN/A Fault %(class_name)s<Element>::initiateAcc( 4452292SN/A %(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const 4462292SN/A { 4472292SN/A Addr EA; 4482292SN/A Fault fault = NoFault; 4492292SN/A 4502292SN/A %(op_decl)s; 4512329SN/A %(mem_decl)s; 4522292SN/A %(op_rd)s; 4532292SN/A %(ea_code)s; 4542292SN/A 4552292SN/A if (%(predicate_test)s) 4562292SN/A { 4572292SN/A MemUnion memUnion; 4582292SN/A if (fault == NoFault) { 4592292SN/A %(memacc_code)s; 4602336SN/A } 4612336SN/A 4622336SN/A if (fault == NoFault) { 4632329SN/A fault = xc->writeBytes(memUnion.bytes, %(size)d, EA, 4642292SN/A memAccessFlags, NULL); 4652329SN/A } 4662292SN/A } else { 4672292SN/A xc->setPredicate(false); 4682292SN/A } 4692292SN/A 4702329SN/A if (fault == NoFault && machInst.itstateMask != 0 && 4712329SN/A (!isMicroop() || isLastMicroop())) { 4722329SN/A xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate); 4732292SN/A } 4742329SN/A 4752329SN/A return fault; 4762329SN/A } 4772329SN/A}}; 4782292SN/A 4792292SN/Adef template LoadInitiateAcc {{ 4802292SN/A Fault %(class_name)s::initiateAcc(%(CPU_exec_context)s *xc, 4812292SN/A Trace::InstRecord *traceData) const 4822292SN/A { 4832292SN/A Addr EA; 4842361SN/A Fault fault = NoFault; 4852292SN/A 4862292SN/A %(op_src_decl)s; 4872292SN/A %(op_rd)s; 4882292SN/A %(ea_code)s; 4892292SN/A 4902292SN/A if (%(predicate_test)s) 4912292SN/A { 4922292SN/A if (fault == NoFault) { 4932292SN/A fault = xc->read(EA, (uint%(mem_acc_size)d_t &)Mem, memAccessFlags); 4942292SN/A } 4952292SN/A } else { 4962292SN/A xc->setPredicate(false); 4972292SN/A if (fault == NoFault && machInst.itstateMask != 0 && 4982292SN/A (!isMicroop() || isLastMicroop())) { 4992292SN/A xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate); 5002292SN/A } 5012292SN/A } 5022292SN/A 5032292SN/A return fault; 5042292SN/A } 5052292SN/A}}; 5062292SN/A 5072292SN/Adef template NeonLoadInitiateAcc {{ 5082292SN/A template <class Element> 5092292SN/A Fault %(class_name)s<Element>::initiateAcc( 5102292SN/A %(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const 5112292SN/A { 5122292SN/A Addr EA; 5132292SN/A Fault fault = NoFault; 5142292SN/A 5152292SN/A %(op_src_decl)s; 5162292SN/A %(op_rd)s; 5172292SN/A %(ea_code)s; 5182292SN/A 5192292SN/A if (%(predicate_test)s) 5202292SN/A { 5212292SN/A if (fault == NoFault) { 5222292SN/A fault = xc->readBytes(EA, NULL, %(size)d, memAccessFlags); 5232292SN/A } 5242292SN/A } else { 5252292SN/A xc->setPredicate(false); 5262292SN/A if (fault == NoFault && machInst.itstateMask != 0 && 5272292SN/A (!isMicroop() || isLastMicroop())) { 5282292SN/A xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate); 5292292SN/A } 5302292SN/A } 5312292SN/A 5322292SN/A return fault; 5332292SN/A } 5342292SN/A}}; 5352292SN/A 5362329SN/Adef template LoadCompleteAcc {{ 5372329SN/A Fault %(class_name)s::completeAcc(PacketPtr pkt, 5382292SN/A %(CPU_exec_context)s *xc, 5392292SN/A Trace::InstRecord *traceData) const 5402292SN/A { 5412292SN/A Fault fault = NoFault; 5422292SN/A 5432292SN/A %(op_decl)s; 5442292SN/A %(op_rd)s; 5452292SN/A 5462292SN/A if (%(predicate_test)s) 5472292SN/A { 5482292SN/A // ARM instructions will not have a pkt if the predicate is false 5492292SN/A Mem = pkt->get<typeof(Mem)>(); 5502292SN/A 5512292SN/A if (fault == NoFault) { 5522292SN/A %(memacc_code)s; 5532292SN/A } 5542292SN/A 5552292SN/A if (fault == NoFault) { 5562292SN/A %(op_wb)s; 5572292SN/A } 5582292SN/A } 5592292SN/A 5602292SN/A if (fault == NoFault && machInst.itstateMask != 0) { 5612292SN/A xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate); 5622292SN/A } 5632292SN/A 5642292SN/A return fault; 5652292SN/A } 5662907Sktlim@umich.edu}}; 5672678Sktlim@umich.edu 5682678Sktlim@umich.edudef template NeonLoadCompleteAcc {{ 5692678Sktlim@umich.edu template <class Element> 5702678Sktlim@umich.edu Fault %(class_name)s<Element>::completeAcc( 5712678Sktlim@umich.edu PacketPtr pkt, %(CPU_exec_context)s *xc, 5722329SN/A Trace::InstRecord *traceData) const 5732329SN/A { 5742292SN/A Fault fault = NoFault; 5752292SN/A 5762292SN/A %(mem_decl)s; 5772292SN/A %(op_decl)s; 5782292SN/A %(op_rd)s; 5792292SN/A 5802292SN/A if (%(predicate_test)s) 5812678Sktlim@umich.edu { 5822292SN/A // ARM instructions will not have a pkt if the predicate is false 5832292SN/A MemUnion &memUnion = *(MemUnion *)pkt->getPtr<uint8_t>(); 5842292SN/A 5852292SN/A if (fault == NoFault) { 5862292SN/A %(memacc_code)s; 5872292SN/A } 5882292SN/A 5892292SN/A if (fault == NoFault) { 5902292SN/A %(op_wb)s; 5912292SN/A } 5922292SN/A } 5932669Sktlim@umich.edu 5942669Sktlim@umich.edu if (fault == NoFault && machInst.itstateMask != 0) { 5952669Sktlim@umich.edu xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate); 5962292SN/A } 5972292SN/A 5982669Sktlim@umich.edu return fault; 5992669Sktlim@umich.edu } 6003772Sgblack@eecs.umich.edu}}; 6013772Sgblack@eecs.umich.edu 6023772Sgblack@eecs.umich.edudef template StoreCompleteAcc {{ 6033772Sgblack@eecs.umich.edu Fault %(class_name)s::completeAcc(PacketPtr pkt, 6043797Sgblack@eecs.umich.edu %(CPU_exec_context)s *xc, 6053797Sgblack@eecs.umich.edu Trace::InstRecord *traceData) const 6063797Sgblack@eecs.umich.edu { 6073797Sgblack@eecs.umich.edu if (machInst.itstateMask != 0) { 6083797Sgblack@eecs.umich.edu warn_once("Complete acc isn't called on normal stores in O3."); 6093797Sgblack@eecs.umich.edu xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate); 6103797Sgblack@eecs.umich.edu } 6113797Sgblack@eecs.umich.edu return NoFault; 6123797Sgblack@eecs.umich.edu } 6133797Sgblack@eecs.umich.edu}}; 6143797Sgblack@eecs.umich.edu 6152669Sktlim@umich.edudef template NeonStoreCompleteAcc {{ 6162669Sktlim@umich.edu template <class Element> 6172669Sktlim@umich.edu Fault %(class_name)s<Element>::completeAcc( 6182292SN/A PacketPtr pkt, %(CPU_exec_context)s *xc, 6192678Sktlim@umich.edu Trace::InstRecord *traceData) const 6202678Sktlim@umich.edu { 6212678Sktlim@umich.edu if (machInst.itstateMask != 0) { 6222678Sktlim@umich.edu warn_once("Complete acc isn't called on normal stores in O3."); 6232678Sktlim@umich.edu xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate); 6242678Sktlim@umich.edu } 6252292SN/A return NoFault; 6262292SN/A } 6273221Sktlim@umich.edu}}; 6283797Sgblack@eecs.umich.edu 6293221Sktlim@umich.edudef template StoreExCompleteAcc {{ 6302292SN/A Fault %(class_name)s::completeAcc(PacketPtr pkt, 6312693Sktlim@umich.edu %(CPU_exec_context)s *xc, 6323172Sstever@eecs.umich.edu Trace::InstRecord *traceData) const 6333326Sktlim@umich.edu { 6343326Sktlim@umich.edu Fault fault = NoFault; 6353326Sktlim@umich.edu 6363326Sktlim@umich.edu %(op_decl)s; 6373326Sktlim@umich.edu %(op_rd)s; 6383326Sktlim@umich.edu 6393326Sktlim@umich.edu if (%(predicate_test)s) 6403326Sktlim@umich.edu { 6413326Sktlim@umich.edu uint64_t writeResult = pkt->req->getExtraData(); 6423326Sktlim@umich.edu %(postacc_code)s; 6433326Sktlim@umich.edu 6443326Sktlim@umich.edu if (fault == NoFault) { 6453326Sktlim@umich.edu %(op_wb)s; 6463326Sktlim@umich.edu } 6473326Sktlim@umich.edu } 6483326Sktlim@umich.edu 6493326Sktlim@umich.edu if (fault == NoFault && machInst.itstateMask != 0) { 6503326Sktlim@umich.edu xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate); 6512693Sktlim@umich.edu } 6522693Sktlim@umich.edu 6532693Sktlim@umich.edu return fault; 6542693Sktlim@umich.edu } 6552693Sktlim@umich.edu}}; 6562693Sktlim@umich.edu 6572669Sktlim@umich.edudef template RfeDeclare {{ 6583221Sktlim@umich.edu /** 6593221Sktlim@umich.edu * Static instruction class for "%(mnemonic)s". 6603221Sktlim@umich.edu */ 6612669Sktlim@umich.edu class %(class_name)s : public %(base_class)s 6623221Sktlim@umich.edu { 6633221Sktlim@umich.edu public: 6643221Sktlim@umich.edu 6652678Sktlim@umich.edu /// Constructor. 6662727Sktlim@umich.edu %(class_name)s(ExtMachInst machInst, 6672698Sktlim@umich.edu uint32_t _base, int _mode, bool _wb); 6682698Sktlim@umich.edu 6693014Srdreslin@umich.edu %(BasicExecDeclare)s 6702669Sktlim@umich.edu 6712693Sktlim@umich.edu %(InitiateAccDeclare)s 6722292SN/A 6732292SN/A %(CompleteAccDeclare)s 6742292SN/A }; 6752292SN/A}}; 6762292SN/A 6772292SN/Adef template SrsDeclare {{ 6782292SN/A /** 6792292SN/A * Static instruction class for "%(mnemonic)s". 6802292SN/A */ 6812292SN/A class %(class_name)s : public %(base_class)s 6822292SN/A { 6832292SN/A public: 6842292SN/A 6852292SN/A /// Constructor. 6862292SN/A %(class_name)s(ExtMachInst machInst, 6872292SN/A uint32_t _regMode, int _mode, bool _wb); 6882292SN/A 6892292SN/A %(BasicExecDeclare)s 6902292SN/A 6912292SN/A %(InitiateAccDeclare)s 6922292SN/A 6932292SN/A %(CompleteAccDeclare)s 6942292SN/A }; 6952292SN/A}}; 6962292SN/A 6972292SN/Adef template SwapDeclare {{ 6982292SN/A /** 6992292SN/A * Static instruction class for "%(mnemonic)s". 7002329SN/A */ 7012292SN/A class %(class_name)s : public %(base_class)s 7022292SN/A { 7032292SN/A public: 7042292SN/A 7052292SN/A /// Constructor. 7062292SN/A %(class_name)s(ExtMachInst machInst, 7072292SN/A uint32_t _dest, uint32_t _op1, uint32_t _base); 7082292SN/A 7092292SN/A %(BasicExecDeclare)s 7102292SN/A 7112292SN/A %(InitiateAccDeclare)s 7122292SN/A 7132292SN/A %(CompleteAccDeclare)s 7142292SN/A }; 7152292SN/A}}; 7162292SN/A 7172329SN/Adef template LoadStoreDImmDeclare {{ 7182731Sktlim@umich.edu /** 7192292SN/A * Static instruction class for "%(mnemonic)s". 7202292SN/A */ 7212292SN/A class %(class_name)s : public %(base_class)s 7222292SN/A { 7232292SN/A public: 7242292SN/A 7252292SN/A /// Constructor. 7262727Sktlim@umich.edu %(class_name)s(ExtMachInst machInst, 7272292SN/A uint32_t _dest, uint32_t _dest2, 7282292SN/A uint32_t _base, bool _add, int32_t _imm); 7292292SN/A 7302292SN/A %(BasicExecDeclare)s 7312292SN/A 7322292SN/A %(InitiateAccDeclare)s 7332292SN/A 7342292SN/A %(CompleteAccDeclare)s 7352292SN/A }; 7362292SN/A}}; 7372292SN/A 7382292SN/Adef template StoreExDImmDeclare {{ 7392292SN/A /** 7402292SN/A * Static instruction class for "%(mnemonic)s". 7412292SN/A */ 7422329SN/A class %(class_name)s : public %(base_class)s 7432292SN/A { 7442292SN/A public: 7452292SN/A 7462292SN/A /// Constructor. 7472292SN/A %(class_name)s(ExtMachInst machInst, 7482292SN/A uint32_t _result, uint32_t _dest, uint32_t _dest2, 7492292SN/A uint32_t _base, bool _add, int32_t _imm); 7502292SN/A 7512292SN/A %(BasicExecDeclare)s 7522329SN/A 7532329SN/A %(InitiateAccDeclare)s 7542292SN/A 7552292SN/A %(CompleteAccDeclare)s 7562292SN/A }; 7572292SN/A}}; 7582292SN/A 7592292SN/Adef template LoadStoreImmDeclare {{ 7602292SN/A /** 7612329SN/A * Static instruction class for "%(mnemonic)s". 7622731Sktlim@umich.edu */ 7632292SN/A class %(class_name)s : public %(base_class)s 7642292SN/A { 7652292SN/A public: 7662292SN/A 7672292SN/A /// Constructor. 7682292SN/A %(class_name)s(ExtMachInst machInst, 7692292SN/A uint32_t _dest, uint32_t _base, bool _add, int32_t _imm); 7702292SN/A 7712292SN/A %(BasicExecDeclare)s 7722292SN/A 7732727Sktlim@umich.edu %(InitiateAccDeclare)s 7742292SN/A 7752292SN/A %(CompleteAccDeclare)s 7762292SN/A }; 7772292SN/A}}; 7782292SN/A 7793349Sbinkertn@umich.edudef template StoreExImmDeclare {{ 7802693Sktlim@umich.edu /** 7812693Sktlim@umich.edu * Static instruction class for "%(mnemonic)s". 7822693Sktlim@umich.edu */ 7832693Sktlim@umich.edu class %(class_name)s : public %(base_class)s 7842693Sktlim@umich.edu { 7852693Sktlim@umich.edu public: 7862693Sktlim@umich.edu 7872693Sktlim@umich.edu /// Constructor. 7882693Sktlim@umich.edu %(class_name)s(ExtMachInst machInst, 7892693Sktlim@umich.edu uint32_t _result, uint32_t _dest, uint32_t _base, 7902693Sktlim@umich.edu bool _add, int32_t _imm); 7912693Sktlim@umich.edu 7922693Sktlim@umich.edu %(BasicExecDeclare)s 7932693Sktlim@umich.edu 7942693Sktlim@umich.edu %(InitiateAccDeclare)s 7952693Sktlim@umich.edu 7962733Sktlim@umich.edu %(CompleteAccDeclare)s 7972693Sktlim@umich.edu }; 7982732Sktlim@umich.edu}}; 7992693Sktlim@umich.edu 8002733Sktlim@umich.edudef template StoreDRegDeclare {{ 8012693Sktlim@umich.edu /** 8022693Sktlim@umich.edu * Static instruction class for "%(mnemonic)s". 8032693Sktlim@umich.edu */ 8042693Sktlim@umich.edu class %(class_name)s : public %(base_class)s 8052693Sktlim@umich.edu { 8062693Sktlim@umich.edu public: 8072693Sktlim@umich.edu 8082693Sktlim@umich.edu /// Constructor. 8092693Sktlim@umich.edu %(class_name)s(ExtMachInst machInst, 8102693Sktlim@umich.edu uint32_t _dest, uint32_t _dest2, 8112693Sktlim@umich.edu uint32_t _base, bool _add, 8122693Sktlim@umich.edu int32_t _shiftAmt, uint32_t _shiftType, 8132693Sktlim@umich.edu uint32_t _index); 8142693Sktlim@umich.edu 8152693Sktlim@umich.edu %(BasicExecDeclare)s 8162693Sktlim@umich.edu 8172693Sktlim@umich.edu %(InitiateAccDeclare)s 8182693Sktlim@umich.edu 8192693Sktlim@umich.edu %(CompleteAccDeclare)s 8202693Sktlim@umich.edu }; 8212693Sktlim@umich.edu}}; 8222693Sktlim@umich.edu 8232693Sktlim@umich.edudef template StoreRegDeclare {{ 8242693Sktlim@umich.edu /** 8252693Sktlim@umich.edu * Static instruction class for "%(mnemonic)s". 8262693Sktlim@umich.edu */ 8272693Sktlim@umich.edu class %(class_name)s : public %(base_class)s 8282678Sktlim@umich.edu { 8292678Sktlim@umich.edu public: 8302678Sktlim@umich.edu 8312678Sktlim@umich.edu /// Constructor. 8322678Sktlim@umich.edu %(class_name)s(ExtMachInst machInst, 8332678Sktlim@umich.edu uint32_t _dest, uint32_t _base, bool _add, 8342927Sktlim@umich.edu int32_t _shiftAmt, uint32_t _shiftType, 8352678Sktlim@umich.edu uint32_t _index); 8362727Sktlim@umich.edu 8372678Sktlim@umich.edu %(BasicExecDeclare)s 8382678Sktlim@umich.edu 8392678Sktlim@umich.edu %(InitiateAccDeclare)s 8402678Sktlim@umich.edu 8412678Sktlim@umich.edu %(CompleteAccDeclare)s 8422678Sktlim@umich.edu }; 8432678Sktlim@umich.edu}}; 8442678Sktlim@umich.edu 8452678Sktlim@umich.edudef template LoadDRegDeclare {{ 8462678Sktlim@umich.edu /** 8472678Sktlim@umich.edu * Static instruction class for "%(mnemonic)s". 8482678Sktlim@umich.edu */ 8492678Sktlim@umich.edu class %(class_name)s : public %(base_class)s 8502678Sktlim@umich.edu { 8512678Sktlim@umich.edu public: 8522678Sktlim@umich.edu 8532678Sktlim@umich.edu /// Constructor. 8542678Sktlim@umich.edu %(class_name)s(ExtMachInst machInst, 8552292SN/A uint32_t _dest, uint32_t _dest2, 8562292SN/A uint32_t _base, bool _add, 8572292SN/A int32_t _shiftAmt, uint32_t _shiftType, 8582292SN/A uint32_t _index); 8592292SN/A 8602292SN/A %(BasicExecDeclare)s 8612292SN/A 8622292SN/A %(InitiateAccDeclare)s 8633126Sktlim@umich.edu 8642292SN/A %(CompleteAccDeclare)s 8652292SN/A }; 8662292SN/A}}; 8672292SN/A 8682292SN/Adef template LoadRegDeclare {{ 8692292SN/A /** 8702292SN/A * Static instruction class for "%(mnemonic)s". 8712292SN/A */ 8722292SN/A class %(class_name)s : public %(base_class)s 8732292SN/A { 8742292SN/A public: 8752292SN/A 8762292SN/A /// Constructor. 8772329SN/A %(class_name)s(ExtMachInst machInst, 8782329SN/A uint32_t _dest, uint32_t _base, bool _add, 8792329SN/A int32_t _shiftAmt, uint32_t _shiftType, 8802292SN/A uint32_t _index); 8812292SN/A 8822292SN/A %(BasicExecDeclare)s 8832292SN/A 8842292SN/A %(InitiateAccDeclare)s 8852292SN/A 8862292SN/A %(CompleteAccDeclare)s 8872292SN/A }; 8882292SN/A}}; 8892292SN/A 8902316SN/Adef template LoadImmDeclare {{ 8912316SN/A /** 8922329SN/A * Static instruction class for "%(mnemonic)s". 8932329SN/A */ 8942329SN/A class %(class_name)s : public %(base_class)s 8952329SN/A { 8962733Sktlim@umich.edu public: 8972316SN/A 8982732Sktlim@umich.edu /// Constructor. 8992316SN/A %(class_name)s(ExtMachInst machInst, 9002733Sktlim@umich.edu uint32_t _dest, uint32_t _base, bool _add, int32_t _imm); 9012292SN/A 9022292SN/A %(BasicExecDeclare)s 9032292SN/A 9042693Sktlim@umich.edu %(InitiateAccDeclare)s 9052693Sktlim@umich.edu 9062693Sktlim@umich.edu %(CompleteAccDeclare)s 9072698Sktlim@umich.edu }; 9082698Sktlim@umich.edu}}; 9092693Sktlim@umich.edu 9102698Sktlim@umich.edudef template InitiateAccDeclare {{ 9113221Sktlim@umich.edu Fault initiateAcc(%(CPU_exec_context)s *, Trace::InstRecord *) const; 9123221Sktlim@umich.edu}}; 9133221Sktlim@umich.edu 9142698Sktlim@umich.edudef template CompleteAccDeclare {{ 9152699Sktlim@umich.edu Fault completeAcc(PacketPtr, %(CPU_exec_context)s *, Trace::InstRecord *) const; 9162693Sktlim@umich.edu}}; 9173014Srdreslin@umich.edu 9182693Sktlim@umich.edudef template RfeConstructor {{ 9192693Sktlim@umich.edu inline %(class_name)s::%(class_name)s(ExtMachInst machInst, 9202727Sktlim@umich.edu uint32_t _base, int _mode, bool _wb) 9212907Sktlim@umich.edu : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 9222693Sktlim@umich.edu (IntRegIndex)_base, (AddrMode)_mode, _wb) 9232693Sktlim@umich.edu { 9242693Sktlim@umich.edu %(constructor)s; 9252693Sktlim@umich.edu if (!(condCode == COND_AL || condCode == COND_UC)) { 9262693Sktlim@umich.edu for (int x = 0; x < _numDestRegs; x++) { 9272693Sktlim@umich.edu _srcRegIdx[_numSrcRegs++] = _destRegIdx[x]; 9282693Sktlim@umich.edu } 9292693Sktlim@umich.edu } 9302693Sktlim@umich.edu#if %(use_uops)d 9312693Sktlim@umich.edu assert(numMicroops >= 2); 9322292SN/A uops = new StaticInstPtr[numMicroops]; 9332292SN/A uops[0] = new %(acc_name)s(machInst, _base, _mode, _wb); 9342292SN/A uops[0]->setDelayedCommit(); 9352292SN/A uops[1] = new %(wb_decl)s; 9362292SN/A uops[1]->setLastMicroop(); 9372292SN/A#endif 9382292SN/A } 9392292SN/A}}; 9402292SN/A 9412292SN/Adef template SrsConstructor {{ 9422292SN/A inline %(class_name)s::%(class_name)s(ExtMachInst machInst, 9432292SN/A uint32_t _regMode, int _mode, bool _wb) 9442292SN/A : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 9452292SN/A (OperatingMode)_regMode, (AddrMode)_mode, _wb) 9462292SN/A { 9472292SN/A %(constructor)s; 9482292SN/A if (!(condCode == COND_AL || condCode == COND_UC)) { 9492292SN/A for (int x = 0; x < _numDestRegs; x++) { 9502292SN/A _srcRegIdx[_numSrcRegs++] = _destRegIdx[x]; 9512292SN/A } 9522292SN/A } 9532292SN/A#if %(use_uops)d 9542292SN/A assert(numMicroops >= 2); 9552292SN/A uops = new StaticInstPtr[numMicroops]; 9562292SN/A uops[0] = new %(acc_name)s(machInst, _regMode, _mode, _wb); 9572292SN/A uops[0]->setDelayedCommit(); 9582292SN/A uops[1] = new %(wb_decl)s; 9592292SN/A uops[1]->setLastMicroop(); 9602292SN/A#endif 9612292SN/A } 9622329SN/A}}; 9632329SN/A 9642329SN/Adef template SwapConstructor {{ 9652329SN/A inline %(class_name)s::%(class_name)s(ExtMachInst machInst, 9662329SN/A uint32_t _dest, uint32_t _op1, uint32_t _base) 9672329SN/A : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 9682329SN/A (IntRegIndex)_dest, (IntRegIndex)_op1, (IntRegIndex)_base) 9692329SN/A { 9702329SN/A %(constructor)s; 9712329SN/A if (!(condCode == COND_AL || condCode == COND_UC)) { 9722329SN/A for (int x = 0; x < _numDestRegs; x++) { 9732329SN/A _srcRegIdx[_numSrcRegs++] = _destRegIdx[x]; 9742329SN/A } 9752329SN/A } 9762329SN/A } 9772329SN/A}}; 9782329SN/A 9792329SN/Adef template LoadStoreDImmConstructor {{ 9802329SN/A inline %(class_name)s::%(class_name)s(ExtMachInst machInst, 9812329SN/A uint32_t _dest, uint32_t _dest2, 9822329SN/A uint32_t _base, bool _add, int32_t _imm) 9832329SN/A : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 9842329SN/A (IntRegIndex)_dest, (IntRegIndex)_dest2, 9852329SN/A (IntRegIndex)_base, _add, _imm) 9862329SN/A { 9872329SN/A %(constructor)s; 9882329SN/A if (!(condCode == COND_AL || condCode == COND_UC)) { 9892329SN/A for (int x = 0; x < _numDestRegs; x++) { 9902329SN/A _srcRegIdx[_numSrcRegs++] = _destRegIdx[x]; 9912329SN/A } 992 } 993#if %(use_uops)d 994 assert(numMicroops >= 2); 995 uops = new StaticInstPtr[numMicroops]; 996 uops[0] = new %(acc_name)s(machInst, _dest, _dest2, _base, _add, _imm); 997 uops[0]->setDelayedCommit(); 998 uops[1] = new %(wb_decl)s; 999 uops[1]->setLastMicroop(); 1000#endif 1001 } 1002}}; 1003 1004def template StoreExDImmConstructor {{ 1005 inline %(class_name)s::%(class_name)s(ExtMachInst machInst, 1006 uint32_t _result, uint32_t _dest, uint32_t _dest2, 1007 uint32_t _base, bool _add, int32_t _imm) 1008 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 1009 (IntRegIndex)_result, 1010 (IntRegIndex)_dest, (IntRegIndex)_dest2, 1011 (IntRegIndex)_base, _add, _imm) 1012 { 1013 %(constructor)s; 1014 if (!(condCode == COND_AL || condCode == COND_UC)) { 1015 for (int x = 0; x < _numDestRegs; x++) { 1016 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x]; 1017 } 1018 } 1019#if %(use_uops)d 1020 assert(numMicroops >= 2); 1021 uops = new StaticInstPtr[numMicroops]; 1022 uops[0] = new %(acc_name)s(machInst, _result, _dest, _dest2, 1023 _base, _add, _imm); 1024 uops[0]->setDelayedCommit(); 1025 uops[1] = new %(wb_decl)s; 1026 uops[1]->setLastMicroop(); 1027#endif 1028 } 1029}}; 1030 1031def template LoadStoreImmConstructor {{ 1032 inline %(class_name)s::%(class_name)s(ExtMachInst machInst, 1033 uint32_t _dest, uint32_t _base, bool _add, int32_t _imm) 1034 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 1035 (IntRegIndex)_dest, (IntRegIndex)_base, _add, _imm) 1036 { 1037 %(constructor)s; 1038 if (!(condCode == COND_AL || condCode == COND_UC)) { 1039 for (int x = 0; x < _numDestRegs; x++) { 1040 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x]; 1041 } 1042 } 1043#if %(use_uops)d 1044 assert(numMicroops >= 2); 1045 uops = new StaticInstPtr[numMicroops]; 1046 uops[0] = new %(acc_name)s(machInst, _dest, _base, _add, _imm); 1047 uops[0]->setDelayedCommit(); 1048 uops[1] = new %(wb_decl)s; 1049 uops[1]->setLastMicroop(); 1050#endif 1051 } 1052}}; 1053 1054def template StoreExImmConstructor {{ 1055 inline %(class_name)s::%(class_name)s(ExtMachInst machInst, 1056 uint32_t _result, uint32_t _dest, uint32_t _base, 1057 bool _add, int32_t _imm) 1058 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 1059 (IntRegIndex)_result, (IntRegIndex)_dest, 1060 (IntRegIndex)_base, _add, _imm) 1061 { 1062 %(constructor)s; 1063 if (!(condCode == COND_AL || condCode == COND_UC)) { 1064 for (int x = 0; x < _numDestRegs; x++) { 1065 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x]; 1066 } 1067 } 1068#if %(use_uops)d 1069 assert(numMicroops >= 2); 1070 uops = new StaticInstPtr[numMicroops]; 1071 uops[0] = new %(acc_name)s(machInst, _result, _dest, 1072 _base, _add, _imm); 1073 uops[0]->setDelayedCommit(); 1074 uops[1] = new %(wb_decl)s; 1075 uops[1]->setLastMicroop(); 1076#endif 1077 } 1078}}; 1079 1080def template StoreDRegConstructor {{ 1081 inline %(class_name)s::%(class_name)s(ExtMachInst machInst, 1082 uint32_t _dest, uint32_t _dest2, uint32_t _base, bool _add, 1083 int32_t _shiftAmt, uint32_t _shiftType, uint32_t _index) 1084 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 1085 (IntRegIndex)_dest, (IntRegIndex)_dest2, 1086 (IntRegIndex)_base, _add, 1087 _shiftAmt, (ArmShiftType)_shiftType, 1088 (IntRegIndex)_index) 1089 { 1090 %(constructor)s; 1091 if (!(condCode == COND_AL || condCode == COND_UC)) { 1092 for (int x = 0; x < _numDestRegs; x++) { 1093 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x]; 1094 } 1095 } 1096#if %(use_uops)d 1097 assert(numMicroops >= 2); 1098 uops = new StaticInstPtr[numMicroops]; 1099 uops[0] = new %(acc_name)s(machInst, _dest, _dest2, _base, _add, 1100 _shiftAmt, _shiftType, _index); 1101 uops[0]->setDelayedCommit(); 1102 uops[1] = new %(wb_decl)s; 1103 uops[1]->setLastMicroop(); 1104#endif 1105 } 1106}}; 1107 1108def template StoreRegConstructor {{ 1109 inline %(class_name)s::%(class_name)s(ExtMachInst machInst, 1110 uint32_t _dest, uint32_t _base, bool _add, 1111 int32_t _shiftAmt, uint32_t _shiftType, uint32_t _index) 1112 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 1113 (IntRegIndex)_dest, (IntRegIndex)_base, _add, 1114 _shiftAmt, (ArmShiftType)_shiftType, 1115 (IntRegIndex)_index) 1116 { 1117 %(constructor)s; 1118 if (!(condCode == COND_AL || condCode == COND_UC)) { 1119 for (int x = 0; x < _numDestRegs; x++) { 1120 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x]; 1121 } 1122 } 1123#if %(use_uops)d 1124 assert(numMicroops >= 2); 1125 uops = new StaticInstPtr[numMicroops]; 1126 uops[0] = new %(acc_name)s(machInst, _dest, _base, _add, 1127 _shiftAmt, _shiftType, _index); 1128 uops[0]->setDelayedCommit(); 1129 uops[1] = new %(wb_decl)s; 1130 uops[1]->setLastMicroop(); 1131#endif 1132 } 1133}}; 1134 1135def template LoadDRegConstructor {{ 1136 inline %(class_name)s::%(class_name)s(ExtMachInst machInst, 1137 uint32_t _dest, uint32_t _dest2, uint32_t _base, bool _add, 1138 int32_t _shiftAmt, uint32_t _shiftType, uint32_t _index) 1139 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 1140 (IntRegIndex)_dest, (IntRegIndex)_dest2, 1141 (IntRegIndex)_base, _add, 1142 _shiftAmt, (ArmShiftType)_shiftType, 1143 (IntRegIndex)_index) 1144 { 1145 %(constructor)s; 1146 if (!(condCode == COND_AL || condCode == COND_UC)) { 1147 for (int x = 0; x < _numDestRegs; x++) { 1148 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x]; 1149 } 1150 } 1151#if %(use_uops)d 1152 assert(numMicroops >= 2); 1153 uops = new StaticInstPtr[numMicroops]; 1154 if ((_dest == _index) || (_dest2 == _index)) { 1155 IntRegIndex wbIndexReg = INTREG_UREG0; 1156 uops[0] = new MicroUopRegMov(machInst, INTREG_UREG0, _index); 1157 uops[0]->setDelayedCommit(); 1158 uops[1] = new %(acc_name)s(machInst, _dest, _dest2, _base, _add, 1159 _shiftAmt, _shiftType, _index); 1160 uops[1]->setDelayedCommit(); 1161 uops[2] = new %(wb_decl)s; 1162 uops[2]->setLastMicroop(); 1163 } else { 1164 IntRegIndex wbIndexReg = index; 1165 uops[0] = new %(acc_name)s(machInst, _dest, _dest2, _base, _add, 1166 _shiftAmt, _shiftType, _index); 1167 uops[0]->setDelayedCommit(); 1168 uops[1] = new %(wb_decl)s; 1169 uops[1]->setLastMicroop(); 1170 } 1171#endif 1172 } 1173}}; 1174 1175def template LoadRegConstructor {{ 1176 inline %(class_name)s::%(class_name)s(ExtMachInst machInst, 1177 uint32_t _dest, uint32_t _base, bool _add, 1178 int32_t _shiftAmt, uint32_t _shiftType, uint32_t _index) 1179 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 1180 (IntRegIndex)_dest, (IntRegIndex)_base, _add, 1181 _shiftAmt, (ArmShiftType)_shiftType, 1182 (IntRegIndex)_index) 1183 { 1184 %(constructor)s; 1185 if (!(condCode == COND_AL || condCode == COND_UC)) { 1186 for (int x = 0; x < _numDestRegs; x++) { 1187 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x]; 1188 } 1189 } 1190#if %(use_uops)d 1191 assert(numMicroops >= 2); 1192 uops = new StaticInstPtr[numMicroops]; 1193 if (_dest == INTREG_PC) { 1194 IntRegIndex wbIndexReg = index; 1195 uops[0] = new %(acc_name)s(machInst, INTREG_UREG0, _base, _add, 1196 _shiftAmt, _shiftType, _index); 1197 uops[0]->setDelayedCommit(); 1198 uops[1] = new %(wb_decl)s; 1199 uops[1]->setDelayedCommit(); 1200 uops[2] = new MicroUopRegMov(machInst, INTREG_PC, INTREG_UREG0); 1201 uops[2]->setLastMicroop(); 1202 } else if(_dest == _index) { 1203 IntRegIndex wbIndexReg = INTREG_UREG0; 1204 uops[0] = new MicroUopRegMov(machInst, INTREG_UREG0, _index); 1205 uops[0]->setDelayedCommit(); 1206 uops[1] = new %(acc_name)s(machInst, _dest, _base, _add, 1207 _shiftAmt, _shiftType, _index); 1208 uops[1]->setDelayedCommit(); 1209 uops[2] = new %(wb_decl)s; 1210 uops[2]->setLastMicroop(); 1211 } else { 1212 IntRegIndex wbIndexReg = index; 1213 uops[0] = new %(acc_name)s(machInst, _dest, _base, _add, 1214 _shiftAmt, _shiftType, _index); 1215 uops[0]->setDelayedCommit(); 1216 uops[1] = new %(wb_decl)s; 1217 uops[1]->setLastMicroop(); 1218 1219 } 1220#endif 1221 } 1222}}; 1223 1224def template LoadImmConstructor {{ 1225 inline %(class_name)s::%(class_name)s(ExtMachInst machInst, 1226 uint32_t _dest, uint32_t _base, bool _add, int32_t _imm) 1227 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, 1228 (IntRegIndex)_dest, (IntRegIndex)_base, _add, _imm) 1229 { 1230 %(constructor)s; 1231 if (!(condCode == COND_AL || condCode == COND_UC)) { 1232 for (int x = 0; x < _numDestRegs; x++) { 1233 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x]; 1234 } 1235 } 1236#if %(use_uops)d 1237 assert(numMicroops >= 2); 1238 uops = new StaticInstPtr[numMicroops]; 1239 if (_dest == INTREG_PC) { 1240 uops[0] = new %(acc_name)s(machInst, INTREG_UREG0, _base, _add, 1241 _imm); 1242 uops[0]->setDelayedCommit(); 1243 uops[1] = new %(wb_decl)s; 1244 uops[1]->setDelayedCommit(); 1245 uops[2] = new MicroUopRegMov(machInst, INTREG_PC, INTREG_UREG0); 1246 uops[2]->setLastMicroop(); 1247 } else { 1248 uops[0] = new %(acc_name)s(machInst, _dest, _base, _add, _imm); 1249 uops[0]->setDelayedCommit(); 1250 uops[1] = new %(wb_decl)s; 1251 uops[1]->setLastMicroop(); 1252 } 1253#endif 1254 } 1255}}; 1256 1257