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