mem.isa revision 10199
17119Sgblack@eecs.umich.edu// -*- mode:c++ -*-
27119Sgblack@eecs.umich.edu
310037SARM gem5 Developers// Copyright (c) 2010, 2012 ARM Limited
47120Sgblack@eecs.umich.edu// All rights reserved
57120Sgblack@eecs.umich.edu//
67120Sgblack@eecs.umich.edu// The license below extends only to copyright in the software and shall
77120Sgblack@eecs.umich.edu// not be construed as granting a license to any other intellectual
87120Sgblack@eecs.umich.edu// property including but not limited to intellectual property relating
97120Sgblack@eecs.umich.edu// to a hardware implementation of the functionality of the software
107120Sgblack@eecs.umich.edu// licensed hereunder.  You may use the software subject to the license
117120Sgblack@eecs.umich.edu// terms below provided that you ensure that this notice is replicated
127120Sgblack@eecs.umich.edu// unmodified and in its entirety in all distributions of the software,
137120Sgblack@eecs.umich.edu// modified or unmodified, in source code or in binary form.
147120Sgblack@eecs.umich.edu//
157119Sgblack@eecs.umich.edu// Copyright (c) 2007-2008 The Florida State University
167119Sgblack@eecs.umich.edu// All rights reserved.
177119Sgblack@eecs.umich.edu//
187119Sgblack@eecs.umich.edu// Redistribution and use in source and binary forms, with or without
197119Sgblack@eecs.umich.edu// modification, are permitted provided that the following conditions are
207119Sgblack@eecs.umich.edu// met: redistributions of source code must retain the above copyright
217119Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer;
227119Sgblack@eecs.umich.edu// redistributions in binary form must reproduce the above copyright
237119Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer in the
247119Sgblack@eecs.umich.edu// documentation and/or other materials provided with the distribution;
257119Sgblack@eecs.umich.edu// neither the name of the copyright holders nor the names of its
267119Sgblack@eecs.umich.edu// contributors may be used to endorse or promote products derived from
277119Sgblack@eecs.umich.edu// this software without specific prior written permission.
287119Sgblack@eecs.umich.edu//
297119Sgblack@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
307119Sgblack@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
317119Sgblack@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
327119Sgblack@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
337119Sgblack@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
347119Sgblack@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
357119Sgblack@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
367119Sgblack@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
377119Sgblack@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
387119Sgblack@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
397119Sgblack@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
407119Sgblack@eecs.umich.edu//
417119Sgblack@eecs.umich.edu// Authors: Stephen Hines
427119Sgblack@eecs.umich.edu
437119Sgblack@eecs.umich.edu
447646Sgene.wu@arm.comdef template PanicExecute {{
4510196SCurtis.Dunham@arm.com    Fault %(class_name)s::execute(CPU_EXEC_CONTEXT *xc,
467646Sgene.wu@arm.com                                  Trace::InstRecord *traceData) const
477646Sgene.wu@arm.com    {
487646Sgene.wu@arm.com        panic("Execute function executed when it shouldn't be!\n");
497646Sgene.wu@arm.com        return NoFault;
507646Sgene.wu@arm.com    }
517646Sgene.wu@arm.com}};
527646Sgene.wu@arm.com
537646Sgene.wu@arm.comdef template PanicInitiateAcc {{
5410196SCurtis.Dunham@arm.com    Fault %(class_name)s::initiateAcc(CPU_EXEC_CONTEXT *xc,
557646Sgene.wu@arm.com                                      Trace::InstRecord *traceData) const
567646Sgene.wu@arm.com    {
577646Sgene.wu@arm.com        panic("InitiateAcc function executed when it shouldn't be!\n");
587646Sgene.wu@arm.com        return NoFault;
597646Sgene.wu@arm.com    }
607646Sgene.wu@arm.com}};
617646Sgene.wu@arm.com
627646Sgene.wu@arm.comdef template PanicCompleteAcc {{
637646Sgene.wu@arm.com    Fault %(class_name)s::completeAcc(PacketPtr pkt,
6410196SCurtis.Dunham@arm.com                                      CPU_EXEC_CONTEXT *xc,
657646Sgene.wu@arm.com                                      Trace::InstRecord *traceData) const
667646Sgene.wu@arm.com    {
677646Sgene.wu@arm.com        panic("CompleteAcc function executed when it shouldn't be!\n");
687646Sgene.wu@arm.com        return NoFault;
697646Sgene.wu@arm.com    }
707646Sgene.wu@arm.com}};
717646Sgene.wu@arm.com
727646Sgene.wu@arm.com
737205Sgblack@eecs.umich.edudef template SwapExecute {{
7410196SCurtis.Dunham@arm.com    Fault %(class_name)s::execute(CPU_EXEC_CONTEXT *xc,
757205Sgblack@eecs.umich.edu                                  Trace::InstRecord *traceData) const
767205Sgblack@eecs.umich.edu    {
777205Sgblack@eecs.umich.edu        Addr EA;
787205Sgblack@eecs.umich.edu        Fault fault = NoFault;
797205Sgblack@eecs.umich.edu
807205Sgblack@eecs.umich.edu        %(op_decl)s;
817205Sgblack@eecs.umich.edu        uint64_t memData = 0;
827205Sgblack@eecs.umich.edu        %(op_rd)s;
837205Sgblack@eecs.umich.edu        %(ea_code)s;
847205Sgblack@eecs.umich.edu
857205Sgblack@eecs.umich.edu        if (%(predicate_test)s)
867205Sgblack@eecs.umich.edu        {
877205Sgblack@eecs.umich.edu            %(preacc_code)s;
887205Sgblack@eecs.umich.edu
897205Sgblack@eecs.umich.edu            if (fault == NoFault) {
908442Sgblack@eecs.umich.edu                fault = writeMemAtomic(xc, traceData, Mem, EA, memAccessFlags,
918442Sgblack@eecs.umich.edu                        &memData);
927205Sgblack@eecs.umich.edu            }
937205Sgblack@eecs.umich.edu
947205Sgblack@eecs.umich.edu            if (fault == NoFault) {
957205Sgblack@eecs.umich.edu                %(postacc_code)s;
967205Sgblack@eecs.umich.edu            }
977205Sgblack@eecs.umich.edu
987205Sgblack@eecs.umich.edu            if (fault == NoFault) {
997205Sgblack@eecs.umich.edu                %(op_wb)s;
1007205Sgblack@eecs.umich.edu            }
1017597Sminkyu.jeong@arm.com        } else {
1027597Sminkyu.jeong@arm.com            xc->setPredicate(false);
1037205Sgblack@eecs.umich.edu        }
1047205Sgblack@eecs.umich.edu
1057205Sgblack@eecs.umich.edu        return fault;
1067205Sgblack@eecs.umich.edu    }
1077205Sgblack@eecs.umich.edu}};
1087205Sgblack@eecs.umich.edu
1097205Sgblack@eecs.umich.edudef template SwapInitiateAcc {{
11010196SCurtis.Dunham@arm.com    Fault %(class_name)s::initiateAcc(CPU_EXEC_CONTEXT *xc,
1117205Sgblack@eecs.umich.edu                                      Trace::InstRecord *traceData) const
1127205Sgblack@eecs.umich.edu    {
1137205Sgblack@eecs.umich.edu        Addr EA;
1147205Sgblack@eecs.umich.edu        Fault fault = NoFault;
1157205Sgblack@eecs.umich.edu
1167205Sgblack@eecs.umich.edu        %(op_decl)s;
1177205Sgblack@eecs.umich.edu        uint64_t memData = 0;
1187205Sgblack@eecs.umich.edu        %(op_rd)s;
1197205Sgblack@eecs.umich.edu        %(ea_code)s;
1207205Sgblack@eecs.umich.edu
1217205Sgblack@eecs.umich.edu        if (%(predicate_test)s)
1227205Sgblack@eecs.umich.edu        {
1237205Sgblack@eecs.umich.edu            %(preacc_code)s;
1247205Sgblack@eecs.umich.edu
1257205Sgblack@eecs.umich.edu            if (fault == NoFault) {
1268442Sgblack@eecs.umich.edu                fault = writeMemTiming(xc, traceData, Mem, EA, memAccessFlags,
1278442Sgblack@eecs.umich.edu                        &memData);
1287205Sgblack@eecs.umich.edu            }
1297597Sminkyu.jeong@arm.com        } else {
1307597Sminkyu.jeong@arm.com            xc->setPredicate(false);
1317205Sgblack@eecs.umich.edu        }
1327205Sgblack@eecs.umich.edu
1337205Sgblack@eecs.umich.edu        return fault;
1347205Sgblack@eecs.umich.edu    }
1357205Sgblack@eecs.umich.edu}};
1367205Sgblack@eecs.umich.edu
1377205Sgblack@eecs.umich.edudef template SwapCompleteAcc {{
1387205Sgblack@eecs.umich.edu    Fault %(class_name)s::completeAcc(PacketPtr pkt,
13910196SCurtis.Dunham@arm.com                                      CPU_EXEC_CONTEXT *xc,
1407205Sgblack@eecs.umich.edu                                      Trace::InstRecord *traceData) const
1417205Sgblack@eecs.umich.edu    {
1427205Sgblack@eecs.umich.edu        Fault fault = NoFault;
1437205Sgblack@eecs.umich.edu
1447205Sgblack@eecs.umich.edu        %(op_decl)s;
1457205Sgblack@eecs.umich.edu        %(op_rd)s;
1467205Sgblack@eecs.umich.edu
1477205Sgblack@eecs.umich.edu        if (%(predicate_test)s)
1487205Sgblack@eecs.umich.edu        {
1497205Sgblack@eecs.umich.edu            // ARM instructions will not have a pkt if the predicate is false
1508442Sgblack@eecs.umich.edu            getMem(pkt, Mem, traceData);
1518442Sgblack@eecs.umich.edu            uint64_t memData = Mem;
1527205Sgblack@eecs.umich.edu
1537205Sgblack@eecs.umich.edu            %(postacc_code)s;
1547205Sgblack@eecs.umich.edu
1557205Sgblack@eecs.umich.edu            if (fault == NoFault) {
1567205Sgblack@eecs.umich.edu                %(op_wb)s;
1577205Sgblack@eecs.umich.edu            }
1587205Sgblack@eecs.umich.edu        }
1597205Sgblack@eecs.umich.edu
1607205Sgblack@eecs.umich.edu        return fault;
1617205Sgblack@eecs.umich.edu    }
1627205Sgblack@eecs.umich.edu}};
1637205Sgblack@eecs.umich.edu
1647119Sgblack@eecs.umich.edudef template LoadExecute {{
16510196SCurtis.Dunham@arm.com    Fault %(class_name)s::execute(CPU_EXEC_CONTEXT *xc,
1667119Sgblack@eecs.umich.edu                                  Trace::InstRecord *traceData) const
1677119Sgblack@eecs.umich.edu    {
1687119Sgblack@eecs.umich.edu        Addr EA;
1697119Sgblack@eecs.umich.edu        Fault fault = NoFault;
1707119Sgblack@eecs.umich.edu
1717119Sgblack@eecs.umich.edu        %(op_decl)s;
1727119Sgblack@eecs.umich.edu        %(op_rd)s;
1737119Sgblack@eecs.umich.edu        %(ea_code)s;
1747119Sgblack@eecs.umich.edu
1757119Sgblack@eecs.umich.edu        if (%(predicate_test)s)
1767119Sgblack@eecs.umich.edu        {
1777119Sgblack@eecs.umich.edu            if (fault == NoFault) {
1788442Sgblack@eecs.umich.edu                fault = readMemAtomic(xc, traceData, EA, Mem, memAccessFlags);
1797119Sgblack@eecs.umich.edu                %(memacc_code)s;
1807119Sgblack@eecs.umich.edu            }
1817119Sgblack@eecs.umich.edu
1827119Sgblack@eecs.umich.edu            if (fault == NoFault) {
1837119Sgblack@eecs.umich.edu                %(op_wb)s;
1847119Sgblack@eecs.umich.edu            }
1857597Sminkyu.jeong@arm.com        } else {
1867597Sminkyu.jeong@arm.com            xc->setPredicate(false);
1877119Sgblack@eecs.umich.edu        }
1887119Sgblack@eecs.umich.edu
1897119Sgblack@eecs.umich.edu        return fault;
1907119Sgblack@eecs.umich.edu    }
1917119Sgblack@eecs.umich.edu}};
1927119Sgblack@eecs.umich.edu
1937639Sgblack@eecs.umich.edudef template NeonLoadExecute {{
1947639Sgblack@eecs.umich.edu    template <class Element>
1957639Sgblack@eecs.umich.edu    Fault %(class_name)s<Element>::execute(
19610196SCurtis.Dunham@arm.com            CPU_EXEC_CONTEXT *xc, Trace::InstRecord *traceData) const
1977639Sgblack@eecs.umich.edu    {
1987639Sgblack@eecs.umich.edu        Addr EA;
1997639Sgblack@eecs.umich.edu        Fault fault = NoFault;
2007639Sgblack@eecs.umich.edu
2017639Sgblack@eecs.umich.edu        %(op_decl)s;
2027639Sgblack@eecs.umich.edu        %(mem_decl)s;
2037639Sgblack@eecs.umich.edu        %(op_rd)s;
2047639Sgblack@eecs.umich.edu        %(ea_code)s;
2057639Sgblack@eecs.umich.edu
2067639Sgblack@eecs.umich.edu        MemUnion memUnion;
2077639Sgblack@eecs.umich.edu        uint8_t *dataPtr = memUnion.bytes;
2087639Sgblack@eecs.umich.edu
2097639Sgblack@eecs.umich.edu        if (%(predicate_test)s)
2107639Sgblack@eecs.umich.edu        {
2117639Sgblack@eecs.umich.edu            if (fault == NoFault) {
2128444Sgblack@eecs.umich.edu                fault = xc->readMem(EA, dataPtr, %(size)d, memAccessFlags);
2137639Sgblack@eecs.umich.edu                %(memacc_code)s;
2147639Sgblack@eecs.umich.edu            }
2157639Sgblack@eecs.umich.edu
2167639Sgblack@eecs.umich.edu            if (fault == NoFault) {
2177639Sgblack@eecs.umich.edu                %(op_wb)s;
2187639Sgblack@eecs.umich.edu            }
2198072SGiacomo.Gabrielli@arm.com        } else {
2208072SGiacomo.Gabrielli@arm.com            xc->setPredicate(false);
2217639Sgblack@eecs.umich.edu        }
2227639Sgblack@eecs.umich.edu
2237639Sgblack@eecs.umich.edu        return fault;
2247639Sgblack@eecs.umich.edu    }
2257639Sgblack@eecs.umich.edu}};
2267639Sgblack@eecs.umich.edu
2277120Sgblack@eecs.umich.edudef template StoreExecute {{
22810196SCurtis.Dunham@arm.com    Fault %(class_name)s::execute(CPU_EXEC_CONTEXT *xc,
2297120Sgblack@eecs.umich.edu                                  Trace::InstRecord *traceData) const
2307120Sgblack@eecs.umich.edu    {
2317120Sgblack@eecs.umich.edu        Addr EA;
2327120Sgblack@eecs.umich.edu        Fault fault = NoFault;
2337120Sgblack@eecs.umich.edu
2347120Sgblack@eecs.umich.edu        %(op_decl)s;
2357120Sgblack@eecs.umich.edu        %(op_rd)s;
2367120Sgblack@eecs.umich.edu        %(ea_code)s;
2377120Sgblack@eecs.umich.edu
2387120Sgblack@eecs.umich.edu        if (%(predicate_test)s)
2397120Sgblack@eecs.umich.edu        {
2407120Sgblack@eecs.umich.edu            if (fault == NoFault) {
2417120Sgblack@eecs.umich.edu                %(memacc_code)s;
2427120Sgblack@eecs.umich.edu            }
2437120Sgblack@eecs.umich.edu
2447120Sgblack@eecs.umich.edu            if (fault == NoFault) {
2458442Sgblack@eecs.umich.edu                fault = writeMemAtomic(xc, traceData, Mem, EA,
2468442Sgblack@eecs.umich.edu                        memAccessFlags, NULL);
2477120Sgblack@eecs.umich.edu            }
2487120Sgblack@eecs.umich.edu
2497120Sgblack@eecs.umich.edu            if (fault == NoFault) {
2507120Sgblack@eecs.umich.edu                %(op_wb)s;
2517120Sgblack@eecs.umich.edu            }
2527597Sminkyu.jeong@arm.com        } else {
2537597Sminkyu.jeong@arm.com            xc->setPredicate(false);
2547120Sgblack@eecs.umich.edu        }
2557120Sgblack@eecs.umich.edu
2567120Sgblack@eecs.umich.edu        return fault;
2577120Sgblack@eecs.umich.edu    }
2587120Sgblack@eecs.umich.edu}};
2597120Sgblack@eecs.umich.edu
2607639Sgblack@eecs.umich.edudef template NeonStoreExecute {{
2617639Sgblack@eecs.umich.edu    template <class Element>
2627639Sgblack@eecs.umich.edu    Fault %(class_name)s<Element>::execute(
26310196SCurtis.Dunham@arm.com            CPU_EXEC_CONTEXT *xc, Trace::InstRecord *traceData) const
2647639Sgblack@eecs.umich.edu    {
2657639Sgblack@eecs.umich.edu        Addr EA;
2667639Sgblack@eecs.umich.edu        Fault fault = NoFault;
2677639Sgblack@eecs.umich.edu
2687639Sgblack@eecs.umich.edu        %(op_decl)s;
2697639Sgblack@eecs.umich.edu        %(mem_decl)s;
2707639Sgblack@eecs.umich.edu        %(op_rd)s;
2717639Sgblack@eecs.umich.edu        %(ea_code)s;
2727639Sgblack@eecs.umich.edu
2737639Sgblack@eecs.umich.edu        MemUnion memUnion;
2747639Sgblack@eecs.umich.edu        uint8_t *dataPtr = memUnion.bytes;
2757639Sgblack@eecs.umich.edu
2767639Sgblack@eecs.umich.edu        if (%(predicate_test)s)
2777639Sgblack@eecs.umich.edu        {
2787639Sgblack@eecs.umich.edu            if (fault == NoFault) {
2797639Sgblack@eecs.umich.edu                %(memacc_code)s;
2807639Sgblack@eecs.umich.edu            }
2817639Sgblack@eecs.umich.edu
2827639Sgblack@eecs.umich.edu            if (fault == NoFault) {
2838444Sgblack@eecs.umich.edu                fault = xc->writeMem(dataPtr, %(size)d, EA,
2848444Sgblack@eecs.umich.edu                                     memAccessFlags, NULL);
2857639Sgblack@eecs.umich.edu            }
2867639Sgblack@eecs.umich.edu
2877639Sgblack@eecs.umich.edu            if (fault == NoFault) {
2887639Sgblack@eecs.umich.edu                %(op_wb)s;
2897639Sgblack@eecs.umich.edu            }
2908072SGiacomo.Gabrielli@arm.com        } else {
2918072SGiacomo.Gabrielli@arm.com            xc->setPredicate(false);
2927639Sgblack@eecs.umich.edu        }
2937639Sgblack@eecs.umich.edu
2947639Sgblack@eecs.umich.edu        return fault;
2957639Sgblack@eecs.umich.edu    }
2967639Sgblack@eecs.umich.edu}};
2977639Sgblack@eecs.umich.edu
2987303Sgblack@eecs.umich.edudef template StoreExExecute {{
29910196SCurtis.Dunham@arm.com    Fault %(class_name)s::execute(CPU_EXEC_CONTEXT *xc,
3007303Sgblack@eecs.umich.edu                                  Trace::InstRecord *traceData) const
3017303Sgblack@eecs.umich.edu    {
3027303Sgblack@eecs.umich.edu        Addr EA;
3037303Sgblack@eecs.umich.edu        Fault fault = NoFault;
3047303Sgblack@eecs.umich.edu
3057303Sgblack@eecs.umich.edu        %(op_decl)s;
3067303Sgblack@eecs.umich.edu        %(op_rd)s;
3077303Sgblack@eecs.umich.edu        %(ea_code)s;
3087303Sgblack@eecs.umich.edu
3097303Sgblack@eecs.umich.edu        if (%(predicate_test)s)
3107303Sgblack@eecs.umich.edu        {
3117303Sgblack@eecs.umich.edu            if (fault == NoFault) {
3127303Sgblack@eecs.umich.edu                %(memacc_code)s;
3137303Sgblack@eecs.umich.edu            }
3147303Sgblack@eecs.umich.edu
3157303Sgblack@eecs.umich.edu            uint64_t writeResult;
3167303Sgblack@eecs.umich.edu
3177303Sgblack@eecs.umich.edu            if (fault == NoFault) {
3188442Sgblack@eecs.umich.edu                fault = writeMemAtomic(xc, traceData, Mem, EA, memAccessFlags,
3198442Sgblack@eecs.umich.edu                        &writeResult);
3207303Sgblack@eecs.umich.edu            }
3217303Sgblack@eecs.umich.edu
3227303Sgblack@eecs.umich.edu            if (fault == NoFault) {
3237303Sgblack@eecs.umich.edu                %(postacc_code)s;
3247303Sgblack@eecs.umich.edu            }
3257303Sgblack@eecs.umich.edu
3267303Sgblack@eecs.umich.edu            if (fault == NoFault) {
3277303Sgblack@eecs.umich.edu                %(op_wb)s;
3287303Sgblack@eecs.umich.edu            }
3297597Sminkyu.jeong@arm.com        } else {
3307597Sminkyu.jeong@arm.com            xc->setPredicate(false);
3317303Sgblack@eecs.umich.edu        }
3327303Sgblack@eecs.umich.edu
3337303Sgblack@eecs.umich.edu        return fault;
3347303Sgblack@eecs.umich.edu    }
3357303Sgblack@eecs.umich.edu}};
3367303Sgblack@eecs.umich.edu
3377303Sgblack@eecs.umich.edudef template StoreExInitiateAcc {{
33810196SCurtis.Dunham@arm.com    Fault %(class_name)s::initiateAcc(CPU_EXEC_CONTEXT *xc,
3397303Sgblack@eecs.umich.edu                                      Trace::InstRecord *traceData) const
3407303Sgblack@eecs.umich.edu    {
3417303Sgblack@eecs.umich.edu        Addr EA;
3427303Sgblack@eecs.umich.edu        Fault fault = NoFault;
3437303Sgblack@eecs.umich.edu
3447303Sgblack@eecs.umich.edu        %(op_decl)s;
3457303Sgblack@eecs.umich.edu        %(op_rd)s;
3467303Sgblack@eecs.umich.edu        %(ea_code)s;
3477303Sgblack@eecs.umich.edu
3487303Sgblack@eecs.umich.edu        if (%(predicate_test)s)
3497303Sgblack@eecs.umich.edu        {
3507303Sgblack@eecs.umich.edu            if (fault == NoFault) {
3517303Sgblack@eecs.umich.edu                %(memacc_code)s;
3527303Sgblack@eecs.umich.edu            }
3537303Sgblack@eecs.umich.edu
3547303Sgblack@eecs.umich.edu            if (fault == NoFault) {
3558442Sgblack@eecs.umich.edu                fault = writeMemTiming(xc, traceData, Mem, EA, memAccessFlags,
3568442Sgblack@eecs.umich.edu                        NULL);
3577303Sgblack@eecs.umich.edu            }
3587597Sminkyu.jeong@arm.com        } else {
3597597Sminkyu.jeong@arm.com            xc->setPredicate(false);
3607303Sgblack@eecs.umich.edu        }
3617408Sgblack@eecs.umich.edu
3627303Sgblack@eecs.umich.edu        return fault;
3637303Sgblack@eecs.umich.edu    }
3647303Sgblack@eecs.umich.edu}};
3657303Sgblack@eecs.umich.edu
3667120Sgblack@eecs.umich.edudef template StoreInitiateAcc {{
36710196SCurtis.Dunham@arm.com    Fault %(class_name)s::initiateAcc(CPU_EXEC_CONTEXT *xc,
3687120Sgblack@eecs.umich.edu                                      Trace::InstRecord *traceData) const
3697120Sgblack@eecs.umich.edu    {
3707120Sgblack@eecs.umich.edu        Addr EA;
3717120Sgblack@eecs.umich.edu        Fault fault = NoFault;
3727120Sgblack@eecs.umich.edu
3737120Sgblack@eecs.umich.edu        %(op_decl)s;
3747120Sgblack@eecs.umich.edu        %(op_rd)s;
3757120Sgblack@eecs.umich.edu        %(ea_code)s;
3767120Sgblack@eecs.umich.edu
3777120Sgblack@eecs.umich.edu        if (%(predicate_test)s)
3787120Sgblack@eecs.umich.edu        {
3797120Sgblack@eecs.umich.edu            if (fault == NoFault) {
3807120Sgblack@eecs.umich.edu                %(memacc_code)s;
3817120Sgblack@eecs.umich.edu            }
3827120Sgblack@eecs.umich.edu
3837120Sgblack@eecs.umich.edu            if (fault == NoFault) {
3848442Sgblack@eecs.umich.edu                fault = writeMemTiming(xc, traceData, Mem, EA, memAccessFlags,
3858442Sgblack@eecs.umich.edu                        NULL);
3867120Sgblack@eecs.umich.edu            }
3877597Sminkyu.jeong@arm.com        } else {
3887597Sminkyu.jeong@arm.com            xc->setPredicate(false);
3897120Sgblack@eecs.umich.edu        }
3907120Sgblack@eecs.umich.edu
3917120Sgblack@eecs.umich.edu        return fault;
3927120Sgblack@eecs.umich.edu    }
3937120Sgblack@eecs.umich.edu}};
3947120Sgblack@eecs.umich.edu
3957639Sgblack@eecs.umich.edudef template NeonStoreInitiateAcc {{
3967639Sgblack@eecs.umich.edu    template <class Element>
3977639Sgblack@eecs.umich.edu    Fault %(class_name)s<Element>::initiateAcc(
39810196SCurtis.Dunham@arm.com            CPU_EXEC_CONTEXT *xc, Trace::InstRecord *traceData) const
3997639Sgblack@eecs.umich.edu    {
4007639Sgblack@eecs.umich.edu        Addr EA;
4017639Sgblack@eecs.umich.edu        Fault fault = NoFault;
4027639Sgblack@eecs.umich.edu
4037639Sgblack@eecs.umich.edu        %(op_decl)s;
4047639Sgblack@eecs.umich.edu        %(mem_decl)s;
4057639Sgblack@eecs.umich.edu        %(op_rd)s;
4067639Sgblack@eecs.umich.edu        %(ea_code)s;
4077639Sgblack@eecs.umich.edu
4087639Sgblack@eecs.umich.edu        if (%(predicate_test)s)
4097639Sgblack@eecs.umich.edu        {
4107639Sgblack@eecs.umich.edu            MemUnion memUnion;
4117639Sgblack@eecs.umich.edu            if (fault == NoFault) {
4127639Sgblack@eecs.umich.edu                %(memacc_code)s;
4137639Sgblack@eecs.umich.edu            }
4147639Sgblack@eecs.umich.edu
4157639Sgblack@eecs.umich.edu            if (fault == NoFault) {
4168444Sgblack@eecs.umich.edu                fault = xc->writeMem(memUnion.bytes, %(size)d, EA,
4178444Sgblack@eecs.umich.edu                                     memAccessFlags, NULL);
4187639Sgblack@eecs.umich.edu            }
4198072SGiacomo.Gabrielli@arm.com        } else {
4208072SGiacomo.Gabrielli@arm.com            xc->setPredicate(false);
4217639Sgblack@eecs.umich.edu        }
4227639Sgblack@eecs.umich.edu
4237639Sgblack@eecs.umich.edu        return fault;
4247639Sgblack@eecs.umich.edu    }
4257639Sgblack@eecs.umich.edu}};
4267639Sgblack@eecs.umich.edu
4277119Sgblack@eecs.umich.edudef template LoadInitiateAcc {{
42810196SCurtis.Dunham@arm.com    Fault %(class_name)s::initiateAcc(CPU_EXEC_CONTEXT *xc,
4297119Sgblack@eecs.umich.edu                                      Trace::InstRecord *traceData) const
4307119Sgblack@eecs.umich.edu    {
4317119Sgblack@eecs.umich.edu        Addr EA;
4327119Sgblack@eecs.umich.edu        Fault fault = NoFault;
4337119Sgblack@eecs.umich.edu
4347119Sgblack@eecs.umich.edu        %(op_src_decl)s;
4357119Sgblack@eecs.umich.edu        %(op_rd)s;
4367119Sgblack@eecs.umich.edu        %(ea_code)s;
4377119Sgblack@eecs.umich.edu
4387119Sgblack@eecs.umich.edu        if (%(predicate_test)s)
4397119Sgblack@eecs.umich.edu        {
4407119Sgblack@eecs.umich.edu            if (fault == NoFault) {
4418442Sgblack@eecs.umich.edu                fault = readMemTiming(xc, traceData, EA, Mem, memAccessFlags);
4427119Sgblack@eecs.umich.edu            }
4437597Sminkyu.jeong@arm.com        } else {
4447597Sminkyu.jeong@arm.com            xc->setPredicate(false);
4457119Sgblack@eecs.umich.edu        }
4467119Sgblack@eecs.umich.edu
4477119Sgblack@eecs.umich.edu        return fault;
4487119Sgblack@eecs.umich.edu    }
4497119Sgblack@eecs.umich.edu}};
4507119Sgblack@eecs.umich.edu
4517639Sgblack@eecs.umich.edudef template NeonLoadInitiateAcc {{
4527639Sgblack@eecs.umich.edu    template <class Element>
4537639Sgblack@eecs.umich.edu    Fault %(class_name)s<Element>::initiateAcc(
45410196SCurtis.Dunham@arm.com            CPU_EXEC_CONTEXT *xc, Trace::InstRecord *traceData) const
4557639Sgblack@eecs.umich.edu    {
4567639Sgblack@eecs.umich.edu        Addr EA;
4577639Sgblack@eecs.umich.edu        Fault fault = NoFault;
4587639Sgblack@eecs.umich.edu
4598207SAli.Saidi@ARM.com        %(op_decl)s;
4608207SAli.Saidi@ARM.com        %(mem_decl)s;
4617639Sgblack@eecs.umich.edu        %(op_rd)s;
4627639Sgblack@eecs.umich.edu        %(ea_code)s;
4637639Sgblack@eecs.umich.edu
4648207SAli.Saidi@ARM.com        MemUnion memUnion;
4658207SAli.Saidi@ARM.com        uint8_t *dataPtr = memUnion.bytes;
4668207SAli.Saidi@ARM.com
4677639Sgblack@eecs.umich.edu        if (%(predicate_test)s)
4687639Sgblack@eecs.umich.edu        {
4697639Sgblack@eecs.umich.edu            if (fault == NoFault) {
4708444Sgblack@eecs.umich.edu                fault = xc->readMem(EA, dataPtr, %(size)d, memAccessFlags);
4717639Sgblack@eecs.umich.edu            }
4728072SGiacomo.Gabrielli@arm.com        } else {
4738072SGiacomo.Gabrielli@arm.com            xc->setPredicate(false);
4747639Sgblack@eecs.umich.edu        }
4757639Sgblack@eecs.umich.edu
4767639Sgblack@eecs.umich.edu        return fault;
4777639Sgblack@eecs.umich.edu    }
4787639Sgblack@eecs.umich.edu}};
4797639Sgblack@eecs.umich.edu
4807119Sgblack@eecs.umich.edudef template LoadCompleteAcc {{
4817119Sgblack@eecs.umich.edu    Fault %(class_name)s::completeAcc(PacketPtr pkt,
48210196SCurtis.Dunham@arm.com                                      CPU_EXEC_CONTEXT *xc,
4837119Sgblack@eecs.umich.edu                                      Trace::InstRecord *traceData) const
4847119Sgblack@eecs.umich.edu    {
4857119Sgblack@eecs.umich.edu        Fault fault = NoFault;
4867119Sgblack@eecs.umich.edu
4877119Sgblack@eecs.umich.edu        %(op_decl)s;
4887119Sgblack@eecs.umich.edu        %(op_rd)s;
4897119Sgblack@eecs.umich.edu
4907119Sgblack@eecs.umich.edu        if (%(predicate_test)s)
4917119Sgblack@eecs.umich.edu        {
4927119Sgblack@eecs.umich.edu            // ARM instructions will not have a pkt if the predicate is false
4938442Sgblack@eecs.umich.edu            getMem(pkt, Mem, traceData);
4947119Sgblack@eecs.umich.edu
4957119Sgblack@eecs.umich.edu            if (fault == NoFault) {
4967119Sgblack@eecs.umich.edu                %(memacc_code)s;
4977119Sgblack@eecs.umich.edu            }
4987119Sgblack@eecs.umich.edu
4997119Sgblack@eecs.umich.edu            if (fault == NoFault) {
5007119Sgblack@eecs.umich.edu                %(op_wb)s;
5017119Sgblack@eecs.umich.edu            }
5027119Sgblack@eecs.umich.edu        }
5037119Sgblack@eecs.umich.edu
5047119Sgblack@eecs.umich.edu        return fault;
5057119Sgblack@eecs.umich.edu    }
5067119Sgblack@eecs.umich.edu}};
5077119Sgblack@eecs.umich.edu
5087639Sgblack@eecs.umich.edudef template NeonLoadCompleteAcc {{
5097639Sgblack@eecs.umich.edu    template <class Element>
5107639Sgblack@eecs.umich.edu    Fault %(class_name)s<Element>::completeAcc(
51110196SCurtis.Dunham@arm.com            PacketPtr pkt, CPU_EXEC_CONTEXT *xc,
5127639Sgblack@eecs.umich.edu            Trace::InstRecord *traceData) const
5137639Sgblack@eecs.umich.edu    {
5147639Sgblack@eecs.umich.edu        Fault fault = NoFault;
5157639Sgblack@eecs.umich.edu
5167639Sgblack@eecs.umich.edu        %(mem_decl)s;
5177639Sgblack@eecs.umich.edu        %(op_decl)s;
5187639Sgblack@eecs.umich.edu        %(op_rd)s;
5197639Sgblack@eecs.umich.edu
5207639Sgblack@eecs.umich.edu        if (%(predicate_test)s)
5217639Sgblack@eecs.umich.edu        {
5227639Sgblack@eecs.umich.edu            // ARM instructions will not have a pkt if the predicate is false
5237639Sgblack@eecs.umich.edu            MemUnion &memUnion = *(MemUnion *)pkt->getPtr<uint8_t>();
5247639Sgblack@eecs.umich.edu
5257639Sgblack@eecs.umich.edu            if (fault == NoFault) {
5267639Sgblack@eecs.umich.edu                %(memacc_code)s;
5277639Sgblack@eecs.umich.edu            }
5287639Sgblack@eecs.umich.edu
5297639Sgblack@eecs.umich.edu            if (fault == NoFault) {
5307639Sgblack@eecs.umich.edu                %(op_wb)s;
5317639Sgblack@eecs.umich.edu            }
5327639Sgblack@eecs.umich.edu        }
5337639Sgblack@eecs.umich.edu
5347639Sgblack@eecs.umich.edu        return fault;
5357639Sgblack@eecs.umich.edu    }
5367639Sgblack@eecs.umich.edu}};
5377639Sgblack@eecs.umich.edu
5387120Sgblack@eecs.umich.edudef template StoreCompleteAcc {{
5397120Sgblack@eecs.umich.edu    Fault %(class_name)s::completeAcc(PacketPtr pkt,
54010196SCurtis.Dunham@arm.com                                      CPU_EXEC_CONTEXT *xc,
5417120Sgblack@eecs.umich.edu                                      Trace::InstRecord *traceData) const
5427120Sgblack@eecs.umich.edu    {
5437712Sgblack@eecs.umich.edu        return NoFault;
5447120Sgblack@eecs.umich.edu    }
5457120Sgblack@eecs.umich.edu}};
5467120Sgblack@eecs.umich.edu
5477639Sgblack@eecs.umich.edudef template NeonStoreCompleteAcc {{
5487639Sgblack@eecs.umich.edu    template <class Element>
5497639Sgblack@eecs.umich.edu    Fault %(class_name)s<Element>::completeAcc(
55010196SCurtis.Dunham@arm.com            PacketPtr pkt, CPU_EXEC_CONTEXT *xc,
5517639Sgblack@eecs.umich.edu            Trace::InstRecord *traceData) const
5527639Sgblack@eecs.umich.edu    {
5537712Sgblack@eecs.umich.edu        return NoFault;
5547639Sgblack@eecs.umich.edu    }
5557639Sgblack@eecs.umich.edu}};
5567639Sgblack@eecs.umich.edu
5577303Sgblack@eecs.umich.edudef template StoreExCompleteAcc {{
5587303Sgblack@eecs.umich.edu    Fault %(class_name)s::completeAcc(PacketPtr pkt,
55910196SCurtis.Dunham@arm.com                                      CPU_EXEC_CONTEXT *xc,
5607303Sgblack@eecs.umich.edu                                      Trace::InstRecord *traceData) const
5617303Sgblack@eecs.umich.edu    {
5627303Sgblack@eecs.umich.edu        Fault fault = NoFault;
5637303Sgblack@eecs.umich.edu
5647303Sgblack@eecs.umich.edu        %(op_decl)s;
5657303Sgblack@eecs.umich.edu        %(op_rd)s;
5667303Sgblack@eecs.umich.edu
5677303Sgblack@eecs.umich.edu        if (%(predicate_test)s)
5687303Sgblack@eecs.umich.edu        {
5697303Sgblack@eecs.umich.edu            uint64_t writeResult = pkt->req->getExtraData();
5707303Sgblack@eecs.umich.edu            %(postacc_code)s;
5717303Sgblack@eecs.umich.edu
5727303Sgblack@eecs.umich.edu            if (fault == NoFault) {
5737303Sgblack@eecs.umich.edu                %(op_wb)s;
5747303Sgblack@eecs.umich.edu            }
5757303Sgblack@eecs.umich.edu        }
5767303Sgblack@eecs.umich.edu
5777303Sgblack@eecs.umich.edu        return fault;
5787303Sgblack@eecs.umich.edu    }
5797303Sgblack@eecs.umich.edu}};
5807303Sgblack@eecs.umich.edu
5817291Sgblack@eecs.umich.edudef template RfeDeclare {{
5827291Sgblack@eecs.umich.edu    /**
5837291Sgblack@eecs.umich.edu     * Static instruction class for "%(mnemonic)s".
5847291Sgblack@eecs.umich.edu     */
5857291Sgblack@eecs.umich.edu    class %(class_name)s : public %(base_class)s
5867291Sgblack@eecs.umich.edu    {
5877291Sgblack@eecs.umich.edu      public:
5887291Sgblack@eecs.umich.edu
5897291Sgblack@eecs.umich.edu        /// Constructor.
5907291Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
5917291Sgblack@eecs.umich.edu                uint32_t _base, int _mode, bool _wb);
5927291Sgblack@eecs.umich.edu
5937291Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
5947291Sgblack@eecs.umich.edu
5957291Sgblack@eecs.umich.edu        %(InitiateAccDeclare)s
5967291Sgblack@eecs.umich.edu
5977291Sgblack@eecs.umich.edu        %(CompleteAccDeclare)s
5987291Sgblack@eecs.umich.edu    };
5997291Sgblack@eecs.umich.edu}};
6007291Sgblack@eecs.umich.edu
6017312Sgblack@eecs.umich.edudef template SrsDeclare {{
6027312Sgblack@eecs.umich.edu    /**
6037312Sgblack@eecs.umich.edu     * Static instruction class for "%(mnemonic)s".
6047312Sgblack@eecs.umich.edu     */
6057312Sgblack@eecs.umich.edu    class %(class_name)s : public %(base_class)s
6067312Sgblack@eecs.umich.edu    {
6077312Sgblack@eecs.umich.edu      public:
6087312Sgblack@eecs.umich.edu
6097312Sgblack@eecs.umich.edu        /// Constructor.
6107312Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
6117312Sgblack@eecs.umich.edu                uint32_t _regMode, int _mode, bool _wb);
6127312Sgblack@eecs.umich.edu
6137312Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
6147312Sgblack@eecs.umich.edu
6157312Sgblack@eecs.umich.edu        %(InitiateAccDeclare)s
6167312Sgblack@eecs.umich.edu
6177312Sgblack@eecs.umich.edu        %(CompleteAccDeclare)s
6187312Sgblack@eecs.umich.edu    };
6197312Sgblack@eecs.umich.edu}};
6207312Sgblack@eecs.umich.edu
6217205Sgblack@eecs.umich.edudef template SwapDeclare {{
6227205Sgblack@eecs.umich.edu    /**
6237205Sgblack@eecs.umich.edu     * Static instruction class for "%(mnemonic)s".
6247205Sgblack@eecs.umich.edu     */
6257205Sgblack@eecs.umich.edu    class %(class_name)s : public %(base_class)s
6267205Sgblack@eecs.umich.edu    {
6277205Sgblack@eecs.umich.edu      public:
6287205Sgblack@eecs.umich.edu
6297205Sgblack@eecs.umich.edu        /// Constructor.
6307205Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
6317205Sgblack@eecs.umich.edu                uint32_t _dest, uint32_t _op1, uint32_t _base);
6327205Sgblack@eecs.umich.edu
6337205Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
6347205Sgblack@eecs.umich.edu
6357205Sgblack@eecs.umich.edu        %(InitiateAccDeclare)s
6367205Sgblack@eecs.umich.edu
6377205Sgblack@eecs.umich.edu        %(CompleteAccDeclare)s
6387205Sgblack@eecs.umich.edu    };
6397205Sgblack@eecs.umich.edu}};
6407205Sgblack@eecs.umich.edu
6417279Sgblack@eecs.umich.edudef template LoadStoreDImmDeclare {{
6427279Sgblack@eecs.umich.edu    /**
6437279Sgblack@eecs.umich.edu     * Static instruction class for "%(mnemonic)s".
6447279Sgblack@eecs.umich.edu     */
6457279Sgblack@eecs.umich.edu    class %(class_name)s : public %(base_class)s
6467279Sgblack@eecs.umich.edu    {
6477279Sgblack@eecs.umich.edu      public:
6487279Sgblack@eecs.umich.edu
6497279Sgblack@eecs.umich.edu        /// Constructor.
6507279Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
6517279Sgblack@eecs.umich.edu                uint32_t _dest, uint32_t _dest2,
6527279Sgblack@eecs.umich.edu                uint32_t _base, bool _add, int32_t _imm);
6537279Sgblack@eecs.umich.edu
6547279Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
6557279Sgblack@eecs.umich.edu
6567279Sgblack@eecs.umich.edu        %(InitiateAccDeclare)s
6577279Sgblack@eecs.umich.edu
6587279Sgblack@eecs.umich.edu        %(CompleteAccDeclare)s
6597279Sgblack@eecs.umich.edu    };
6607279Sgblack@eecs.umich.edu}};
6617279Sgblack@eecs.umich.edu
6627303Sgblack@eecs.umich.edudef template StoreExDImmDeclare {{
6637303Sgblack@eecs.umich.edu    /**
6647303Sgblack@eecs.umich.edu     * Static instruction class for "%(mnemonic)s".
6657303Sgblack@eecs.umich.edu     */
6667303Sgblack@eecs.umich.edu    class %(class_name)s : public %(base_class)s
6677303Sgblack@eecs.umich.edu    {
6687303Sgblack@eecs.umich.edu      public:
6697303Sgblack@eecs.umich.edu
6707303Sgblack@eecs.umich.edu        /// Constructor.
6717303Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
6727303Sgblack@eecs.umich.edu                uint32_t _result, uint32_t _dest, uint32_t _dest2,
6737303Sgblack@eecs.umich.edu                uint32_t _base, bool _add, int32_t _imm);
6747303Sgblack@eecs.umich.edu
6757303Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
6767303Sgblack@eecs.umich.edu
6777303Sgblack@eecs.umich.edu        %(InitiateAccDeclare)s
6787303Sgblack@eecs.umich.edu
6797303Sgblack@eecs.umich.edu        %(CompleteAccDeclare)s
6807303Sgblack@eecs.umich.edu    };
6817303Sgblack@eecs.umich.edu}};
6827303Sgblack@eecs.umich.edu
6837119Sgblack@eecs.umich.edudef template LoadStoreImmDeclare {{
6847119Sgblack@eecs.umich.edu    /**
6857119Sgblack@eecs.umich.edu     * Static instruction class for "%(mnemonic)s".
6867119Sgblack@eecs.umich.edu     */
6877119Sgblack@eecs.umich.edu    class %(class_name)s : public %(base_class)s
6887119Sgblack@eecs.umich.edu    {
6897119Sgblack@eecs.umich.edu      public:
6907119Sgblack@eecs.umich.edu
6917119Sgblack@eecs.umich.edu        /// Constructor.
6927119Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
6937119Sgblack@eecs.umich.edu                uint32_t _dest, uint32_t _base, bool _add, int32_t _imm);
6947119Sgblack@eecs.umich.edu
6957119Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
6967119Sgblack@eecs.umich.edu
6977119Sgblack@eecs.umich.edu        %(InitiateAccDeclare)s
6987119Sgblack@eecs.umich.edu
6997119Sgblack@eecs.umich.edu        %(CompleteAccDeclare)s
70010037SARM gem5 Developers
70110037SARM gem5 Developers        virtual void
70210037SARM gem5 Developers        annotateFault(ArmFault *fault) {
70310037SARM gem5 Developers            %(fa_code)s
70410037SARM gem5 Developers        }
7057119Sgblack@eecs.umich.edu    };
7067119Sgblack@eecs.umich.edu}};
7077119Sgblack@eecs.umich.edu
7087303Sgblack@eecs.umich.edudef template StoreExImmDeclare {{
7097303Sgblack@eecs.umich.edu    /**
7107303Sgblack@eecs.umich.edu     * Static instruction class for "%(mnemonic)s".
7117303Sgblack@eecs.umich.edu     */
7127303Sgblack@eecs.umich.edu    class %(class_name)s : public %(base_class)s
7137303Sgblack@eecs.umich.edu    {
7147303Sgblack@eecs.umich.edu      public:
7157303Sgblack@eecs.umich.edu
7167303Sgblack@eecs.umich.edu        /// Constructor.
7177303Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
7187303Sgblack@eecs.umich.edu                uint32_t _result, uint32_t _dest, uint32_t _base,
7197303Sgblack@eecs.umich.edu                bool _add, int32_t _imm);
7207303Sgblack@eecs.umich.edu
7217303Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
7227303Sgblack@eecs.umich.edu
7237303Sgblack@eecs.umich.edu        %(InitiateAccDeclare)s
7247303Sgblack@eecs.umich.edu
7257303Sgblack@eecs.umich.edu        %(CompleteAccDeclare)s
7267303Sgblack@eecs.umich.edu    };
7277303Sgblack@eecs.umich.edu}};
7287303Sgblack@eecs.umich.edu
7297646Sgene.wu@arm.comdef template StoreDRegDeclare {{
7307279Sgblack@eecs.umich.edu    /**
7317279Sgblack@eecs.umich.edu     * Static instruction class for "%(mnemonic)s".
7327279Sgblack@eecs.umich.edu     */
7337279Sgblack@eecs.umich.edu    class %(class_name)s : public %(base_class)s
7347279Sgblack@eecs.umich.edu    {
7357279Sgblack@eecs.umich.edu      public:
7367279Sgblack@eecs.umich.edu
7377279Sgblack@eecs.umich.edu        /// Constructor.
7387279Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
7397279Sgblack@eecs.umich.edu                uint32_t _dest, uint32_t _dest2,
7407279Sgblack@eecs.umich.edu                uint32_t _base, bool _add,
7417279Sgblack@eecs.umich.edu                int32_t _shiftAmt, uint32_t _shiftType,
7427279Sgblack@eecs.umich.edu                uint32_t _index);
7437279Sgblack@eecs.umich.edu
7447279Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
7457279Sgblack@eecs.umich.edu
7467279Sgblack@eecs.umich.edu        %(InitiateAccDeclare)s
7477279Sgblack@eecs.umich.edu
7487279Sgblack@eecs.umich.edu        %(CompleteAccDeclare)s
7497279Sgblack@eecs.umich.edu    };
7507279Sgblack@eecs.umich.edu}};
7517279Sgblack@eecs.umich.edu
7527646Sgene.wu@arm.comdef template StoreRegDeclare {{
7537119Sgblack@eecs.umich.edu    /**
7547119Sgblack@eecs.umich.edu     * Static instruction class for "%(mnemonic)s".
7557119Sgblack@eecs.umich.edu     */
7567119Sgblack@eecs.umich.edu    class %(class_name)s : public %(base_class)s
7577119Sgblack@eecs.umich.edu    {
7587119Sgblack@eecs.umich.edu      public:
7597119Sgblack@eecs.umich.edu
7607119Sgblack@eecs.umich.edu        /// Constructor.
7617119Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
7627119Sgblack@eecs.umich.edu                uint32_t _dest, uint32_t _base, bool _add,
7637119Sgblack@eecs.umich.edu                int32_t _shiftAmt, uint32_t _shiftType,
7647119Sgblack@eecs.umich.edu                uint32_t _index);
7657119Sgblack@eecs.umich.edu
7667119Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
7677119Sgblack@eecs.umich.edu
7687119Sgblack@eecs.umich.edu        %(InitiateAccDeclare)s
7697119Sgblack@eecs.umich.edu
7707119Sgblack@eecs.umich.edu        %(CompleteAccDeclare)s
77110037SARM gem5 Developers
77210037SARM gem5 Developers        virtual void
77310037SARM gem5 Developers        annotateFault(ArmFault *fault) {
77410037SARM gem5 Developers            %(fa_code)s
77510037SARM gem5 Developers        }
7767119Sgblack@eecs.umich.edu    };
7777119Sgblack@eecs.umich.edu}};
7787119Sgblack@eecs.umich.edu
7797646Sgene.wu@arm.comdef template LoadDRegDeclare {{
7807646Sgene.wu@arm.com    /**
7817646Sgene.wu@arm.com     * Static instruction class for "%(mnemonic)s".
7827646Sgene.wu@arm.com     */
7837646Sgene.wu@arm.com    class %(class_name)s : public %(base_class)s
7847646Sgene.wu@arm.com    {
7857646Sgene.wu@arm.com      public:
7867646Sgene.wu@arm.com
7877646Sgene.wu@arm.com        /// Constructor.
7887646Sgene.wu@arm.com        %(class_name)s(ExtMachInst machInst,
7897646Sgene.wu@arm.com                uint32_t _dest, uint32_t _dest2,
7907646Sgene.wu@arm.com                uint32_t _base, bool _add,
7917646Sgene.wu@arm.com                int32_t _shiftAmt, uint32_t _shiftType,
7927646Sgene.wu@arm.com                uint32_t _index);
7937646Sgene.wu@arm.com
7947646Sgene.wu@arm.com        %(BasicExecDeclare)s
7957646Sgene.wu@arm.com
7967646Sgene.wu@arm.com        %(InitiateAccDeclare)s
7977646Sgene.wu@arm.com
7987646Sgene.wu@arm.com        %(CompleteAccDeclare)s
7997646Sgene.wu@arm.com    };
8007646Sgene.wu@arm.com}};
8017646Sgene.wu@arm.com
8027646Sgene.wu@arm.comdef template LoadRegDeclare {{
8037646Sgene.wu@arm.com    /**
8047646Sgene.wu@arm.com     * Static instruction class for "%(mnemonic)s".
8057646Sgene.wu@arm.com     */
8067646Sgene.wu@arm.com    class %(class_name)s : public %(base_class)s
8077646Sgene.wu@arm.com    {
8087646Sgene.wu@arm.com      public:
8097646Sgene.wu@arm.com
8107646Sgene.wu@arm.com        /// Constructor.
8117646Sgene.wu@arm.com        %(class_name)s(ExtMachInst machInst,
8127646Sgene.wu@arm.com                uint32_t _dest, uint32_t _base, bool _add,
8137646Sgene.wu@arm.com                int32_t _shiftAmt, uint32_t _shiftType,
8147646Sgene.wu@arm.com                uint32_t _index);
8157646Sgene.wu@arm.com
8167646Sgene.wu@arm.com        %(BasicExecDeclare)s
8177646Sgene.wu@arm.com
8187646Sgene.wu@arm.com        %(InitiateAccDeclare)s
8197646Sgene.wu@arm.com
8207646Sgene.wu@arm.com        %(CompleteAccDeclare)s
82110037SARM gem5 Developers
82210037SARM gem5 Developers        virtual void
82310037SARM gem5 Developers        annotateFault(ArmFault *fault) {
82410037SARM gem5 Developers            %(fa_code)s
82510037SARM gem5 Developers        }
8267646Sgene.wu@arm.com    };
8277646Sgene.wu@arm.com}};
8287646Sgene.wu@arm.com
8297646Sgene.wu@arm.comdef template LoadImmDeclare {{
8307646Sgene.wu@arm.com    /**
8317646Sgene.wu@arm.com     * Static instruction class for "%(mnemonic)s".
8327646Sgene.wu@arm.com     */
8337646Sgene.wu@arm.com    class %(class_name)s : public %(base_class)s
8347646Sgene.wu@arm.com    {
8357646Sgene.wu@arm.com      public:
8367646Sgene.wu@arm.com
8377646Sgene.wu@arm.com        /// Constructor.
8387646Sgene.wu@arm.com        %(class_name)s(ExtMachInst machInst,
8397646Sgene.wu@arm.com                uint32_t _dest, uint32_t _base, bool _add, int32_t _imm);
8407646Sgene.wu@arm.com
8417646Sgene.wu@arm.com        %(BasicExecDeclare)s
8427646Sgene.wu@arm.com
8437646Sgene.wu@arm.com        %(InitiateAccDeclare)s
8447646Sgene.wu@arm.com
8457646Sgene.wu@arm.com        %(CompleteAccDeclare)s
84610037SARM gem5 Developers
84710037SARM gem5 Developers        virtual void
84810037SARM gem5 Developers        annotateFault(ArmFault *fault) {
84910037SARM gem5 Developers            %(fa_code)s
85010037SARM gem5 Developers        }
8517646Sgene.wu@arm.com    };
8527646Sgene.wu@arm.com}};
8537646Sgene.wu@arm.com
8547119Sgblack@eecs.umich.edudef template InitiateAccDeclare {{
8557119Sgblack@eecs.umich.edu    Fault initiateAcc(%(CPU_exec_context)s *, Trace::InstRecord *) const;
8567119Sgblack@eecs.umich.edu}};
8577119Sgblack@eecs.umich.edu
8587119Sgblack@eecs.umich.edudef template CompleteAccDeclare {{
8597119Sgblack@eecs.umich.edu    Fault completeAcc(PacketPtr,  %(CPU_exec_context)s *, Trace::InstRecord *) const;
8607119Sgblack@eecs.umich.edu}};
8617119Sgblack@eecs.umich.edu
8627291Sgblack@eecs.umich.edudef template RfeConstructor {{
86310184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
8648140SMatt.Horsnell@arm.com                                          uint32_t _base, int _mode, bool _wb)
8658140SMatt.Horsnell@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
8668140SMatt.Horsnell@arm.com                         (IntRegIndex)_base, (AddrMode)_mode, _wb)
8677291Sgblack@eecs.umich.edu    {
8687291Sgblack@eecs.umich.edu        %(constructor)s;
8697848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
8707848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
8717848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
8727848SAli.Saidi@ARM.com            }
8737848SAli.Saidi@ARM.com        }
8747646Sgene.wu@arm.com#if %(use_uops)d
8758140SMatt.Horsnell@arm.com        uops = new StaticInstPtr[1 + %(use_wb)d + %(use_pc)d];
8768140SMatt.Horsnell@arm.com        int uopIdx = 0;
8778140SMatt.Horsnell@arm.com        uops[uopIdx] = new %(acc_name)s(machInst, _base, _mode, _wb);
8788140SMatt.Horsnell@arm.com        uops[uopIdx]->setDelayedCommit();
8798140SMatt.Horsnell@arm.com#if %(use_wb)d
8808140SMatt.Horsnell@arm.com        uops[++uopIdx] = new %(wb_decl)s;
8818140SMatt.Horsnell@arm.com        uops[uopIdx]->setDelayedCommit();
8828140SMatt.Horsnell@arm.com#endif
8838140SMatt.Horsnell@arm.com#if %(use_pc)d
8848140SMatt.Horsnell@arm.com        uops[++uopIdx] = new %(pc_decl)s;
8858140SMatt.Horsnell@arm.com#endif
8868140SMatt.Horsnell@arm.com        uops[uopIdx]->setLastMicroop();
8877646Sgene.wu@arm.com#endif
8887291Sgblack@eecs.umich.edu    }
8897291Sgblack@eecs.umich.edu}};
8907291Sgblack@eecs.umich.edu
8917312Sgblack@eecs.umich.edudef template SrsConstructor {{
89210184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
8937312Sgblack@eecs.umich.edu            uint32_t _regMode, int _mode, bool _wb)
8947312Sgblack@eecs.umich.edu         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
8957312Sgblack@eecs.umich.edu                 (OperatingMode)_regMode, (AddrMode)_mode, _wb)
8967312Sgblack@eecs.umich.edu    {
8977312Sgblack@eecs.umich.edu        %(constructor)s;
8987848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
8997848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
9007848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
9017848SAli.Saidi@ARM.com            }
9027848SAli.Saidi@ARM.com        }
9037646Sgene.wu@arm.com#if %(use_uops)d
9047646Sgene.wu@arm.com        assert(numMicroops >= 2);
9057646Sgene.wu@arm.com        uops = new StaticInstPtr[numMicroops];
9067646Sgene.wu@arm.com        uops[0] = new %(acc_name)s(machInst, _regMode, _mode, _wb);
9077724SAli.Saidi@ARM.com        uops[0]->setDelayedCommit();
9087646Sgene.wu@arm.com        uops[1] = new %(wb_decl)s;
9097646Sgene.wu@arm.com        uops[1]->setLastMicroop();
9107646Sgene.wu@arm.com#endif
9117312Sgblack@eecs.umich.edu    }
9127312Sgblack@eecs.umich.edu}};
9137312Sgblack@eecs.umich.edu
9147205Sgblack@eecs.umich.edudef template SwapConstructor {{
91510184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
9167205Sgblack@eecs.umich.edu            uint32_t _dest, uint32_t _op1, uint32_t _base)
9177205Sgblack@eecs.umich.edu         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
9187205Sgblack@eecs.umich.edu                 (IntRegIndex)_dest, (IntRegIndex)_op1, (IntRegIndex)_base)
9197205Sgblack@eecs.umich.edu    {
9207205Sgblack@eecs.umich.edu        %(constructor)s;
9217848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
9227848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
9237848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
9247848SAli.Saidi@ARM.com            }
9257848SAli.Saidi@ARM.com        }
9267205Sgblack@eecs.umich.edu    }
9277205Sgblack@eecs.umich.edu}};
9287205Sgblack@eecs.umich.edu
9297279Sgblack@eecs.umich.edudef template LoadStoreDImmConstructor {{
93010184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
9317279Sgblack@eecs.umich.edu            uint32_t _dest, uint32_t _dest2,
9327279Sgblack@eecs.umich.edu            uint32_t _base, bool _add, int32_t _imm)
9337279Sgblack@eecs.umich.edu         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
9347279Sgblack@eecs.umich.edu                 (IntRegIndex)_dest, (IntRegIndex)_dest2,
9357279Sgblack@eecs.umich.edu                 (IntRegIndex)_base, _add, _imm)
9367279Sgblack@eecs.umich.edu    {
9377279Sgblack@eecs.umich.edu        %(constructor)s;
9387848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
9397848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
9407848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
9417848SAli.Saidi@ARM.com            }
9427848SAli.Saidi@ARM.com        }
9437646Sgene.wu@arm.com#if %(use_uops)d
9447646Sgene.wu@arm.com        assert(numMicroops >= 2);
9457646Sgene.wu@arm.com        uops = new StaticInstPtr[numMicroops];
9467646Sgene.wu@arm.com        uops[0] = new %(acc_name)s(machInst, _dest, _dest2, _base, _add, _imm);
9477724SAli.Saidi@ARM.com        uops[0]->setDelayedCommit();
9487646Sgene.wu@arm.com        uops[1] = new %(wb_decl)s;
9497646Sgene.wu@arm.com        uops[1]->setLastMicroop();
9507646Sgene.wu@arm.com#endif
9517279Sgblack@eecs.umich.edu    }
9527279Sgblack@eecs.umich.edu}};
9537279Sgblack@eecs.umich.edu
9547303Sgblack@eecs.umich.edudef template StoreExDImmConstructor {{
95510184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
9567303Sgblack@eecs.umich.edu            uint32_t _result, uint32_t _dest, uint32_t _dest2,
9577303Sgblack@eecs.umich.edu            uint32_t _base, bool _add, int32_t _imm)
9587303Sgblack@eecs.umich.edu         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
9597303Sgblack@eecs.umich.edu                 (IntRegIndex)_result,
9607303Sgblack@eecs.umich.edu                 (IntRegIndex)_dest, (IntRegIndex)_dest2,
9617303Sgblack@eecs.umich.edu                 (IntRegIndex)_base, _add, _imm)
9627303Sgblack@eecs.umich.edu    {
9637303Sgblack@eecs.umich.edu        %(constructor)s;
9647848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
9657848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
9667848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
9677848SAli.Saidi@ARM.com            }
9687848SAli.Saidi@ARM.com        }
9697646Sgene.wu@arm.com#if %(use_uops)d
9707646Sgene.wu@arm.com        assert(numMicroops >= 2);
9717646Sgene.wu@arm.com        uops = new StaticInstPtr[numMicroops];
9727646Sgene.wu@arm.com        uops[0] = new %(acc_name)s(machInst, _result, _dest, _dest2,
9737646Sgene.wu@arm.com                                   _base, _add, _imm);
9747724SAli.Saidi@ARM.com        uops[0]->setDelayedCommit();
9757646Sgene.wu@arm.com        uops[1] = new %(wb_decl)s;
9767646Sgene.wu@arm.com        uops[1]->setLastMicroop();
9777646Sgene.wu@arm.com#endif
9787303Sgblack@eecs.umich.edu    }
9797303Sgblack@eecs.umich.edu}};
9807303Sgblack@eecs.umich.edu
9817119Sgblack@eecs.umich.edudef template LoadStoreImmConstructor {{
98210184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
9837119Sgblack@eecs.umich.edu            uint32_t _dest, uint32_t _base, bool _add, int32_t _imm)
9847119Sgblack@eecs.umich.edu         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
9857119Sgblack@eecs.umich.edu                 (IntRegIndex)_dest, (IntRegIndex)_base, _add, _imm)
9867119Sgblack@eecs.umich.edu    {
9877119Sgblack@eecs.umich.edu        %(constructor)s;
9887848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
9897848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
9907848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
9917848SAli.Saidi@ARM.com            }
9927848SAli.Saidi@ARM.com        }
9937646Sgene.wu@arm.com#if %(use_uops)d
9947646Sgene.wu@arm.com        assert(numMicroops >= 2);
9957646Sgene.wu@arm.com        uops = new StaticInstPtr[numMicroops];
9967646Sgene.wu@arm.com        uops[0] = new %(acc_name)s(machInst, _dest, _base, _add, _imm);
9977724SAli.Saidi@ARM.com        uops[0]->setDelayedCommit();
9987646Sgene.wu@arm.com        uops[1] = new %(wb_decl)s;
9997646Sgene.wu@arm.com        uops[1]->setLastMicroop();
10007646Sgene.wu@arm.com#endif
10017119Sgblack@eecs.umich.edu    }
10027119Sgblack@eecs.umich.edu}};
10037119Sgblack@eecs.umich.edu
10047303Sgblack@eecs.umich.edudef template StoreExImmConstructor {{
100510184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
10067303Sgblack@eecs.umich.edu            uint32_t _result, uint32_t _dest, uint32_t _base,
10077303Sgblack@eecs.umich.edu            bool _add, int32_t _imm)
10087303Sgblack@eecs.umich.edu         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
10097303Sgblack@eecs.umich.edu                 (IntRegIndex)_result, (IntRegIndex)_dest,
10107303Sgblack@eecs.umich.edu                 (IntRegIndex)_base, _add, _imm)
10117303Sgblack@eecs.umich.edu    {
10127303Sgblack@eecs.umich.edu        %(constructor)s;
10137848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
10147848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
10157848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
10167848SAli.Saidi@ARM.com            }
10177848SAli.Saidi@ARM.com        }
10187646Sgene.wu@arm.com#if %(use_uops)d
10197646Sgene.wu@arm.com        assert(numMicroops >= 2);
10207646Sgene.wu@arm.com        uops = new StaticInstPtr[numMicroops];
10217646Sgene.wu@arm.com        uops[0] = new %(acc_name)s(machInst, _result, _dest,
10227646Sgene.wu@arm.com                                   _base, _add, _imm);
10237724SAli.Saidi@ARM.com        uops[0]->setDelayedCommit();
10247646Sgene.wu@arm.com        uops[1] = new %(wb_decl)s;
10257646Sgene.wu@arm.com        uops[1]->setLastMicroop();
10267646Sgene.wu@arm.com#endif
10277303Sgblack@eecs.umich.edu    }
10287303Sgblack@eecs.umich.edu}};
10297303Sgblack@eecs.umich.edu
10307646Sgene.wu@arm.comdef template StoreDRegConstructor {{
103110184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
10327279Sgblack@eecs.umich.edu            uint32_t _dest, uint32_t _dest2, uint32_t _base, bool _add,
10337279Sgblack@eecs.umich.edu            int32_t _shiftAmt, uint32_t _shiftType, uint32_t _index)
10347279Sgblack@eecs.umich.edu         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
10357279Sgblack@eecs.umich.edu                 (IntRegIndex)_dest, (IntRegIndex)_dest2,
10367279Sgblack@eecs.umich.edu                 (IntRegIndex)_base, _add,
10377279Sgblack@eecs.umich.edu                 _shiftAmt, (ArmShiftType)_shiftType,
10387279Sgblack@eecs.umich.edu                 (IntRegIndex)_index)
10397279Sgblack@eecs.umich.edu    {
10407279Sgblack@eecs.umich.edu        %(constructor)s;
10417848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
10427848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
10437848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
10447848SAli.Saidi@ARM.com            }
10457848SAli.Saidi@ARM.com        }
10467646Sgene.wu@arm.com#if %(use_uops)d
10477646Sgene.wu@arm.com        assert(numMicroops >= 2);
10487646Sgene.wu@arm.com        uops = new StaticInstPtr[numMicroops];
10497646Sgene.wu@arm.com        uops[0] = new %(acc_name)s(machInst, _dest, _dest2, _base, _add,
10507646Sgene.wu@arm.com                                   _shiftAmt, _shiftType, _index);
10517724SAli.Saidi@ARM.com        uops[0]->setDelayedCommit();
10527646Sgene.wu@arm.com        uops[1] = new %(wb_decl)s;
10537646Sgene.wu@arm.com        uops[1]->setLastMicroop();
10547646Sgene.wu@arm.com#endif
10557279Sgblack@eecs.umich.edu    }
10567279Sgblack@eecs.umich.edu}};
10577279Sgblack@eecs.umich.edu
10587646Sgene.wu@arm.comdef template StoreRegConstructor {{
105910184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
10607119Sgblack@eecs.umich.edu            uint32_t _dest, uint32_t _base, bool _add,
10617119Sgblack@eecs.umich.edu            int32_t _shiftAmt, uint32_t _shiftType, uint32_t _index)
10627119Sgblack@eecs.umich.edu         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
10637119Sgblack@eecs.umich.edu                 (IntRegIndex)_dest, (IntRegIndex)_base, _add,
10647119Sgblack@eecs.umich.edu                 _shiftAmt, (ArmShiftType)_shiftType,
10657119Sgblack@eecs.umich.edu                 (IntRegIndex)_index)
10667119Sgblack@eecs.umich.edu    {
10677119Sgblack@eecs.umich.edu        %(constructor)s;
10687848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
10697848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
10707848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
10717848SAli.Saidi@ARM.com            }
10727848SAli.Saidi@ARM.com        }
10737646Sgene.wu@arm.com#if %(use_uops)d
10747646Sgene.wu@arm.com        assert(numMicroops >= 2);
10757646Sgene.wu@arm.com        uops = new StaticInstPtr[numMicroops];
10767646Sgene.wu@arm.com        uops[0] = new %(acc_name)s(machInst, _dest, _base, _add,
10777646Sgene.wu@arm.com                                   _shiftAmt, _shiftType, _index);
10787724SAli.Saidi@ARM.com        uops[0]->setDelayedCommit();
10797646Sgene.wu@arm.com        uops[1] = new %(wb_decl)s;
10807646Sgene.wu@arm.com        uops[1]->setLastMicroop();
10817646Sgene.wu@arm.com#endif
10827119Sgblack@eecs.umich.edu    }
10837119Sgblack@eecs.umich.edu}};
10847646Sgene.wu@arm.com
10857646Sgene.wu@arm.comdef template LoadDRegConstructor {{
108610184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
10877646Sgene.wu@arm.com            uint32_t _dest, uint32_t _dest2, uint32_t _base, bool _add,
10887646Sgene.wu@arm.com            int32_t _shiftAmt, uint32_t _shiftType, uint32_t _index)
10897646Sgene.wu@arm.com         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
10907646Sgene.wu@arm.com                 (IntRegIndex)_dest, (IntRegIndex)_dest2,
10917646Sgene.wu@arm.com                 (IntRegIndex)_base, _add,
10927646Sgene.wu@arm.com                 _shiftAmt, (ArmShiftType)_shiftType,
10937646Sgene.wu@arm.com                 (IntRegIndex)_index)
10947646Sgene.wu@arm.com    {
10957646Sgene.wu@arm.com        %(constructor)s;
10967848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
10977848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
10987848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
10997848SAli.Saidi@ARM.com            }
11007848SAli.Saidi@ARM.com        }
11017646Sgene.wu@arm.com#if %(use_uops)d
11027646Sgene.wu@arm.com        assert(numMicroops >= 2);
11037646Sgene.wu@arm.com        uops = new StaticInstPtr[numMicroops];
11047646Sgene.wu@arm.com        if ((_dest == _index) || (_dest2 == _index)) {
11057646Sgene.wu@arm.com            IntRegIndex wbIndexReg = INTREG_UREG0;
11067646Sgene.wu@arm.com            uops[0] = new MicroUopRegMov(machInst, INTREG_UREG0, _index);
11077724SAli.Saidi@ARM.com            uops[0]->setDelayedCommit();
11087646Sgene.wu@arm.com            uops[1] = new %(acc_name)s(machInst, _dest, _dest2, _base, _add,
11097646Sgene.wu@arm.com                                       _shiftAmt, _shiftType, _index);
11107724SAli.Saidi@ARM.com            uops[1]->setDelayedCommit();
11117646Sgene.wu@arm.com            uops[2] = new %(wb_decl)s;
11127646Sgene.wu@arm.com            uops[2]->setLastMicroop();
11137646Sgene.wu@arm.com        } else {
11147646Sgene.wu@arm.com            IntRegIndex wbIndexReg = index;
11157646Sgene.wu@arm.com            uops[0] = new %(acc_name)s(machInst, _dest, _dest2, _base, _add,
11167646Sgene.wu@arm.com                                       _shiftAmt, _shiftType, _index);
11177724SAli.Saidi@ARM.com            uops[0]->setDelayedCommit();
11187646Sgene.wu@arm.com            uops[1] = new %(wb_decl)s;
11197646Sgene.wu@arm.com            uops[1]->setLastMicroop();
11207646Sgene.wu@arm.com        }
11217646Sgene.wu@arm.com#endif
11227646Sgene.wu@arm.com    }
11237646Sgene.wu@arm.com}};
11247646Sgene.wu@arm.com
11257646Sgene.wu@arm.comdef template LoadRegConstructor {{
112610184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
11277646Sgene.wu@arm.com            uint32_t _dest, uint32_t _base, bool _add,
11287646Sgene.wu@arm.com            int32_t _shiftAmt, uint32_t _shiftType, uint32_t _index)
11297646Sgene.wu@arm.com         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
11307646Sgene.wu@arm.com                 (IntRegIndex)_dest, (IntRegIndex)_base, _add,
11317646Sgene.wu@arm.com                 _shiftAmt, (ArmShiftType)_shiftType,
11327646Sgene.wu@arm.com                 (IntRegIndex)_index)
11337646Sgene.wu@arm.com    {
11347646Sgene.wu@arm.com        %(constructor)s;
11358607Sgblack@eecs.umich.edu        bool conditional M5_VAR_USED = false;
11367848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
11378203SAli.Saidi@ARM.com            conditional = true;
11387848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
11397848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
11407848SAli.Saidi@ARM.com            }
11417848SAli.Saidi@ARM.com        }
11427646Sgene.wu@arm.com#if %(use_uops)d
11437646Sgene.wu@arm.com        assert(numMicroops >= 2);
11447646Sgene.wu@arm.com        uops = new StaticInstPtr[numMicroops];
11459573Ssaidi@eecs.umich.edu        if (_dest == INTREG_PC && !isFloating()) {
11467646Sgene.wu@arm.com            IntRegIndex wbIndexReg = index;
11477646Sgene.wu@arm.com            uops[0] = new %(acc_name)s(machInst, INTREG_UREG0, _base, _add,
11487646Sgene.wu@arm.com                                       _shiftAmt, _shiftType, _index);
11497724SAli.Saidi@ARM.com            uops[0]->setDelayedCommit();
11507646Sgene.wu@arm.com            uops[1] = new %(wb_decl)s;
11517724SAli.Saidi@ARM.com            uops[1]->setDelayedCommit();
11527646Sgene.wu@arm.com            uops[2] = new MicroUopRegMov(machInst, INTREG_PC, INTREG_UREG0);
11538203SAli.Saidi@ARM.com            uops[2]->setFlag(StaticInst::IsControl);
11548203SAli.Saidi@ARM.com            uops[2]->setFlag(StaticInst::IsIndirectControl);
11558203SAli.Saidi@ARM.com            if (conditional)
11568203SAli.Saidi@ARM.com                uops[2]->setFlag(StaticInst::IsCondControl);
11578203SAli.Saidi@ARM.com            else
11588203SAli.Saidi@ARM.com                uops[2]->setFlag(StaticInst::IsUncondControl);
11597646Sgene.wu@arm.com            uops[2]->setLastMicroop();
11607646Sgene.wu@arm.com        } else if(_dest == _index) {
11617646Sgene.wu@arm.com            IntRegIndex wbIndexReg = INTREG_UREG0;
11627646Sgene.wu@arm.com            uops[0] = new MicroUopRegMov(machInst, INTREG_UREG0, _index);
11637724SAli.Saidi@ARM.com            uops[0]->setDelayedCommit();
11647646Sgene.wu@arm.com            uops[1] = new %(acc_name)s(machInst, _dest, _base, _add,
11657646Sgene.wu@arm.com                                      _shiftAmt, _shiftType, _index);
11667724SAli.Saidi@ARM.com            uops[1]->setDelayedCommit();
11677646Sgene.wu@arm.com            uops[2] = new %(wb_decl)s;
11687646Sgene.wu@arm.com            uops[2]->setLastMicroop();
11697646Sgene.wu@arm.com        } else {
11707646Sgene.wu@arm.com            IntRegIndex wbIndexReg = index;
11717646Sgene.wu@arm.com            uops[0] = new %(acc_name)s(machInst, _dest, _base, _add,
11727646Sgene.wu@arm.com                                      _shiftAmt, _shiftType, _index);
11737724SAli.Saidi@ARM.com            uops[0]->setDelayedCommit();
11747646Sgene.wu@arm.com            uops[1] = new %(wb_decl)s;
11757646Sgene.wu@arm.com            uops[1]->setLastMicroop();
11767646Sgene.wu@arm.com
11777646Sgene.wu@arm.com        }
11789250SAli.Saidi@ARM.com#else
11799573Ssaidi@eecs.umich.edu        if (_dest == INTREG_PC && !isFloating()) {
11809250SAli.Saidi@ARM.com            flags[IsControl] = true;
11819250SAli.Saidi@ARM.com            flags[IsIndirectControl] = true;
11829250SAli.Saidi@ARM.com            if (conditional)
11839250SAli.Saidi@ARM.com                flags[IsCondControl] = true;
11849250SAli.Saidi@ARM.com            else
11859250SAli.Saidi@ARM.com                flags[IsUncondControl] = true;
11869250SAli.Saidi@ARM.com        }
11877646Sgene.wu@arm.com#endif
11887646Sgene.wu@arm.com    }
11897646Sgene.wu@arm.com}};
11907646Sgene.wu@arm.com
11917646Sgene.wu@arm.comdef template LoadImmConstructor {{
119210184SCurtis.Dunham@arm.com    %(class_name)s::%(class_name)s(ExtMachInst machInst,
11937646Sgene.wu@arm.com            uint32_t _dest, uint32_t _base, bool _add, int32_t _imm)
11947646Sgene.wu@arm.com         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
11957646Sgene.wu@arm.com                 (IntRegIndex)_dest, (IntRegIndex)_base, _add, _imm)
11967646Sgene.wu@arm.com    {
11977646Sgene.wu@arm.com        %(constructor)s;
11988607Sgblack@eecs.umich.edu        bool conditional M5_VAR_USED = false;
11997848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
12008203SAli.Saidi@ARM.com            conditional = true;
12017848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
12027848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
12037848SAli.Saidi@ARM.com            }
12047848SAli.Saidi@ARM.com        }
12057646Sgene.wu@arm.com#if %(use_uops)d
12067646Sgene.wu@arm.com        assert(numMicroops >= 2);
12077646Sgene.wu@arm.com        uops = new StaticInstPtr[numMicroops];
12089573Ssaidi@eecs.umich.edu        if (_dest == INTREG_PC && !isFloating()) {
12097646Sgene.wu@arm.com            uops[0] = new %(acc_name)s(machInst, INTREG_UREG0, _base, _add,
12107646Sgene.wu@arm.com                                   _imm);
12117724SAli.Saidi@ARM.com            uops[0]->setDelayedCommit();
12127646Sgene.wu@arm.com            uops[1] = new %(wb_decl)s;
12137724SAli.Saidi@ARM.com            uops[1]->setDelayedCommit();
12147646Sgene.wu@arm.com            uops[2] = new MicroUopRegMov(machInst, INTREG_PC, INTREG_UREG0);
12158203SAli.Saidi@ARM.com            uops[2]->setFlag(StaticInst::IsControl);
12168203SAli.Saidi@ARM.com            uops[2]->setFlag(StaticInst::IsIndirectControl);
121710199SAndrew.Bardsley@arm.com            /* Also set flags on the macroop so that pre-microop decomposition
121810199SAndrew.Bardsley@arm.com                branch prediction can work */
121910199SAndrew.Bardsley@arm.com            setFlag(StaticInst::IsControl);
122010199SAndrew.Bardsley@arm.com            setFlag(StaticInst::IsIndirectControl);
122110199SAndrew.Bardsley@arm.com            if (conditional) {
12228203SAli.Saidi@ARM.com                uops[2]->setFlag(StaticInst::IsCondControl);
122310199SAndrew.Bardsley@arm.com                setFlag(StaticInst::IsCondControl);
122410199SAndrew.Bardsley@arm.com            } else {
12258203SAli.Saidi@ARM.com                uops[2]->setFlag(StaticInst::IsUncondControl);
122610199SAndrew.Bardsley@arm.com                setFlag(StaticInst::IsUncondControl);
122710199SAndrew.Bardsley@arm.com            }
122810199SAndrew.Bardsley@arm.com            if (_base == INTREG_SP && _add && _imm == 4 && %(is_ras_pop)s) {
12298203SAli.Saidi@ARM.com                uops[2]->setFlag(StaticInst::IsReturn);
123010199SAndrew.Bardsley@arm.com                setFlag(StaticInst::IsReturn);
123110199SAndrew.Bardsley@arm.com            }
12327646Sgene.wu@arm.com            uops[2]->setLastMicroop();
12337646Sgene.wu@arm.com        } else {
12347646Sgene.wu@arm.com            uops[0] = new %(acc_name)s(machInst, _dest, _base, _add, _imm);
12357724SAli.Saidi@ARM.com            uops[0]->setDelayedCommit();
12367646Sgene.wu@arm.com            uops[1] = new %(wb_decl)s;
12377646Sgene.wu@arm.com            uops[1]->setLastMicroop();
12387646Sgene.wu@arm.com        }
12399250SAli.Saidi@ARM.com#else
12409573Ssaidi@eecs.umich.edu        if (_dest == INTREG_PC && !isFloating()) {
12419250SAli.Saidi@ARM.com            flags[IsControl] = true;
12429250SAli.Saidi@ARM.com            flags[IsIndirectControl] = true;
12439250SAli.Saidi@ARM.com            if (conditional)
12449250SAli.Saidi@ARM.com                flags[IsCondControl] = true;
12459250SAli.Saidi@ARM.com            else
12469250SAli.Saidi@ARM.com                flags[IsUncondControl] = true;
12479250SAli.Saidi@ARM.com        }
12487646Sgene.wu@arm.com#endif
12497646Sgene.wu@arm.com    }
12507646Sgene.wu@arm.com}};
12517646Sgene.wu@arm.com
1252