misc.isa revision 7609
17202Sgblack@eecs.umich.edu// -*- mode:c++ -*-
27202Sgblack@eecs.umich.edu
37202Sgblack@eecs.umich.edu// Copyright (c) 2010 ARM Limited
47202Sgblack@eecs.umich.edu// All rights reserved
57202Sgblack@eecs.umich.edu//
67202Sgblack@eecs.umich.edu// The license below extends only to copyright in the software and shall
77202Sgblack@eecs.umich.edu// not be construed as granting a license to any other intellectual
87202Sgblack@eecs.umich.edu// property including but not limited to intellectual property relating
97202Sgblack@eecs.umich.edu// to a hardware implementation of the functionality of the software
107202Sgblack@eecs.umich.edu// licensed hereunder.  You may use the software subject to the license
117202Sgblack@eecs.umich.edu// terms below provided that you ensure that this notice is replicated
127202Sgblack@eecs.umich.edu// unmodified and in its entirety in all distributions of the software,
137202Sgblack@eecs.umich.edu// modified or unmodified, in source code or in binary form.
147202Sgblack@eecs.umich.edu//
157202Sgblack@eecs.umich.edu// Redistribution and use in source and binary forms, with or without
167202Sgblack@eecs.umich.edu// modification, are permitted provided that the following conditions are
177202Sgblack@eecs.umich.edu// met: redistributions of source code must retain the above copyright
187202Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer;
197202Sgblack@eecs.umich.edu// redistributions in binary form must reproduce the above copyright
207202Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer in the
217202Sgblack@eecs.umich.edu// documentation and/or other materials provided with the distribution;
227202Sgblack@eecs.umich.edu// neither the name of the copyright holders nor the names of its
237202Sgblack@eecs.umich.edu// contributors may be used to endorse or promote products derived from
247202Sgblack@eecs.umich.edu// this software without specific prior written permission.
257202Sgblack@eecs.umich.edu//
267202Sgblack@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
277202Sgblack@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
287202Sgblack@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
297202Sgblack@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
307202Sgblack@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
317202Sgblack@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
327202Sgblack@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
337202Sgblack@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
347202Sgblack@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
357202Sgblack@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
367202Sgblack@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
377202Sgblack@eecs.umich.edu//
387202Sgblack@eecs.umich.edu// Authors: Gabe Black
397202Sgblack@eecs.umich.edu
407202Sgblack@eecs.umich.edudef template MrsDeclare {{
417202Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
427202Sgblack@eecs.umich.edu{
437202Sgblack@eecs.umich.edu  protected:
447202Sgblack@eecs.umich.edu    public:
457202Sgblack@eecs.umich.edu        // Constructor
467202Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst, IntRegIndex _dest);
477202Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
487202Sgblack@eecs.umich.edu};
497202Sgblack@eecs.umich.edu}};
507202Sgblack@eecs.umich.edu
517202Sgblack@eecs.umich.edudef template MrsConstructor {{
527202Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
537202Sgblack@eecs.umich.edu                                          IntRegIndex _dest)
547202Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _dest)
557202Sgblack@eecs.umich.edu    {
567202Sgblack@eecs.umich.edu        %(constructor)s;
577202Sgblack@eecs.umich.edu    }
587202Sgblack@eecs.umich.edu}};
597202Sgblack@eecs.umich.edu
607202Sgblack@eecs.umich.edudef template MsrRegDeclare {{
617202Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
627202Sgblack@eecs.umich.edu{
637202Sgblack@eecs.umich.edu  protected:
647202Sgblack@eecs.umich.edu    public:
657202Sgblack@eecs.umich.edu        // Constructor
667202Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst, IntRegIndex _op1, uint8_t mask);
677202Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
687202Sgblack@eecs.umich.edu};
697202Sgblack@eecs.umich.edu}};
707202Sgblack@eecs.umich.edu
717202Sgblack@eecs.umich.edudef template MsrRegConstructor {{
727202Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
737202Sgblack@eecs.umich.edu                                          IntRegIndex _op1,
747202Sgblack@eecs.umich.edu                                          uint8_t mask)
757202Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _op1, mask)
767202Sgblack@eecs.umich.edu    {
777202Sgblack@eecs.umich.edu        %(constructor)s;
787202Sgblack@eecs.umich.edu    }
797202Sgblack@eecs.umich.edu}};
807202Sgblack@eecs.umich.edu
817202Sgblack@eecs.umich.edudef template MsrImmDeclare {{
827202Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
837202Sgblack@eecs.umich.edu{
847202Sgblack@eecs.umich.edu  protected:
857202Sgblack@eecs.umich.edu    public:
867202Sgblack@eecs.umich.edu        // Constructor
877202Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst, uint32_t imm, uint8_t mask);
887202Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
897202Sgblack@eecs.umich.edu};
907202Sgblack@eecs.umich.edu}};
917202Sgblack@eecs.umich.edu
927202Sgblack@eecs.umich.edudef template MsrImmConstructor {{
937202Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
947202Sgblack@eecs.umich.edu                                          uint32_t imm,
957202Sgblack@eecs.umich.edu                                          uint8_t mask)
967202Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, imm, mask)
977202Sgblack@eecs.umich.edu    {
987202Sgblack@eecs.umich.edu        %(constructor)s;
997202Sgblack@eecs.umich.edu    }
1007202Sgblack@eecs.umich.edu}};
1017208Sgblack@eecs.umich.edu
1027306Sgblack@eecs.umich.edudef template ImmOpDeclare {{
1037306Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
1047306Sgblack@eecs.umich.edu{
1057306Sgblack@eecs.umich.edu  protected:
1067306Sgblack@eecs.umich.edu    public:
1077306Sgblack@eecs.umich.edu        // Constructor
1087330Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst, uint64_t _imm);
1097306Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
1107306Sgblack@eecs.umich.edu};
1117306Sgblack@eecs.umich.edu}};
1127306Sgblack@eecs.umich.edu
1137306Sgblack@eecs.umich.edudef template ImmOpConstructor {{
1147330Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(ExtMachInst machInst, uint64_t _imm)
1157306Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _imm)
1167306Sgblack@eecs.umich.edu    {
1177306Sgblack@eecs.umich.edu        %(constructor)s;
1187306Sgblack@eecs.umich.edu    }
1197306Sgblack@eecs.umich.edu}};
1207306Sgblack@eecs.umich.edu
1217332Sgblack@eecs.umich.edudef template RegImmOpDeclare {{
1227332Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
1237332Sgblack@eecs.umich.edu{
1247332Sgblack@eecs.umich.edu  protected:
1257332Sgblack@eecs.umich.edu    public:
1267332Sgblack@eecs.umich.edu        // Constructor
1277332Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst, IntRegIndex _dest, uint64_t _imm);
1287332Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
1297332Sgblack@eecs.umich.edu};
1307332Sgblack@eecs.umich.edu}};
1317332Sgblack@eecs.umich.edu
1327332Sgblack@eecs.umich.edudef template RegImmOpConstructor {{
1337332Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
1347332Sgblack@eecs.umich.edu            IntRegIndex _dest, uint64_t _imm)
1357332Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _dest, _imm)
1367332Sgblack@eecs.umich.edu    {
1377332Sgblack@eecs.umich.edu        %(constructor)s;
1387332Sgblack@eecs.umich.edu    }
1397332Sgblack@eecs.umich.edu}};
1407332Sgblack@eecs.umich.edu
1417261Sgblack@eecs.umich.edudef template RegRegOpDeclare {{
1427208Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
1437208Sgblack@eecs.umich.edu{
1447208Sgblack@eecs.umich.edu  protected:
1457208Sgblack@eecs.umich.edu    public:
1467208Sgblack@eecs.umich.edu        // Constructor
1477208Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
1487208Sgblack@eecs.umich.edu                       IntRegIndex _dest, IntRegIndex _op1);
1497208Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
1507208Sgblack@eecs.umich.edu};
1517208Sgblack@eecs.umich.edu}};
1527208Sgblack@eecs.umich.edu
1537261Sgblack@eecs.umich.edudef template RegRegOpConstructor {{
1547208Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
1557208Sgblack@eecs.umich.edu                                          IntRegIndex _dest, IntRegIndex _op1)
1567208Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _dest, _op1)
1577208Sgblack@eecs.umich.edu    {
1587208Sgblack@eecs.umich.edu        %(constructor)s;
1597208Sgblack@eecs.umich.edu    }
1607208Sgblack@eecs.umich.edu}};
1617225Sgblack@eecs.umich.edu
1627233Sgblack@eecs.umich.edudef template RegRegRegImmOpDeclare {{
1637233Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
1647233Sgblack@eecs.umich.edu{
1657233Sgblack@eecs.umich.edu  protected:
1667233Sgblack@eecs.umich.edu    public:
1677233Sgblack@eecs.umich.edu        // Constructor
1687233Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
1697233Sgblack@eecs.umich.edu                       IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2,
1707330Sgblack@eecs.umich.edu                       uint64_t _imm);
1717233Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
1727233Sgblack@eecs.umich.edu};
1737233Sgblack@eecs.umich.edu}};
1747233Sgblack@eecs.umich.edu
1757233Sgblack@eecs.umich.edudef template RegRegRegImmOpConstructor {{
1767233Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
1777233Sgblack@eecs.umich.edu                                          IntRegIndex _dest,
1787233Sgblack@eecs.umich.edu                                          IntRegIndex _op1,
1797233Sgblack@eecs.umich.edu                                          IntRegIndex _op2,
1807330Sgblack@eecs.umich.edu                                          uint64_t _imm)
1817233Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
1827233Sgblack@eecs.umich.edu                         _dest, _op1, _op2, _imm)
1837233Sgblack@eecs.umich.edu    {
1847233Sgblack@eecs.umich.edu        %(constructor)s;
1857233Sgblack@eecs.umich.edu    }
1867233Sgblack@eecs.umich.edu}};
1877233Sgblack@eecs.umich.edu
1887241Sgblack@eecs.umich.edudef template RegRegRegRegOpDeclare {{
1897241Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
1907241Sgblack@eecs.umich.edu{
1917241Sgblack@eecs.umich.edu  protected:
1927241Sgblack@eecs.umich.edu    public:
1937241Sgblack@eecs.umich.edu        // Constructor
1947241Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
1957241Sgblack@eecs.umich.edu                       IntRegIndex _dest, IntRegIndex _op1,
1967241Sgblack@eecs.umich.edu                       IntRegIndex _op2, IntRegIndex _op3);
1977241Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
1987241Sgblack@eecs.umich.edu};
1997241Sgblack@eecs.umich.edu}};
2007241Sgblack@eecs.umich.edu
2017241Sgblack@eecs.umich.edudef template RegRegRegRegOpConstructor {{
2027241Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
2037241Sgblack@eecs.umich.edu                                          IntRegIndex _dest,
2047241Sgblack@eecs.umich.edu                                          IntRegIndex _op1,
2057241Sgblack@eecs.umich.edu                                          IntRegIndex _op2,
2067241Sgblack@eecs.umich.edu                                          IntRegIndex _op3)
2077241Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
2087241Sgblack@eecs.umich.edu                         _dest, _op1, _op2, _op3)
2097241Sgblack@eecs.umich.edu    {
2107241Sgblack@eecs.umich.edu        %(constructor)s;
2117241Sgblack@eecs.umich.edu    }
2127241Sgblack@eecs.umich.edu}};
2137241Sgblack@eecs.umich.edu
2147238Sgblack@eecs.umich.edudef template RegRegRegOpDeclare {{
2157238Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
2167238Sgblack@eecs.umich.edu{
2177238Sgblack@eecs.umich.edu  protected:
2187238Sgblack@eecs.umich.edu    public:
2197238Sgblack@eecs.umich.edu        // Constructor
2207238Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
2217238Sgblack@eecs.umich.edu                       IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2);
2227238Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
2237238Sgblack@eecs.umich.edu};
2247238Sgblack@eecs.umich.edu}};
2257238Sgblack@eecs.umich.edu
2267238Sgblack@eecs.umich.edudef template RegRegRegOpConstructor {{
2277238Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
2287238Sgblack@eecs.umich.edu                                          IntRegIndex _dest,
2297238Sgblack@eecs.umich.edu                                          IntRegIndex _op1,
2307238Sgblack@eecs.umich.edu                                          IntRegIndex _op2)
2317238Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
2327238Sgblack@eecs.umich.edu                         _dest, _op1, _op2)
2337238Sgblack@eecs.umich.edu    {
2347238Sgblack@eecs.umich.edu        %(constructor)s;
2357238Sgblack@eecs.umich.edu    }
2367238Sgblack@eecs.umich.edu}};
2377238Sgblack@eecs.umich.edu
2387331Sgblack@eecs.umich.edudef template RegRegImmOpDeclare {{
2397331Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
2407331Sgblack@eecs.umich.edu{
2417331Sgblack@eecs.umich.edu  protected:
2427331Sgblack@eecs.umich.edu    public:
2437331Sgblack@eecs.umich.edu        // Constructor
2447331Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
2457331Sgblack@eecs.umich.edu                       IntRegIndex _dest, IntRegIndex _op1,
2467331Sgblack@eecs.umich.edu                       uint64_t _imm);
2477331Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
2487331Sgblack@eecs.umich.edu};
2497331Sgblack@eecs.umich.edu}};
2507331Sgblack@eecs.umich.edu
2517331Sgblack@eecs.umich.edudef template RegRegImmOpConstructor {{
2527331Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
2537331Sgblack@eecs.umich.edu                                          IntRegIndex _dest,
2547331Sgblack@eecs.umich.edu                                          IntRegIndex _op1,
2557331Sgblack@eecs.umich.edu                                          uint64_t _imm)
2567331Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
2577331Sgblack@eecs.umich.edu                         _dest, _op1, _imm)
2587331Sgblack@eecs.umich.edu    {
2597331Sgblack@eecs.umich.edu        %(constructor)s;
2607331Sgblack@eecs.umich.edu    }
2617331Sgblack@eecs.umich.edu}};
2627331Sgblack@eecs.umich.edu
2637253Sgblack@eecs.umich.edudef template RegRegImmImmOpDeclare {{
2647253Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
2657253Sgblack@eecs.umich.edu{
2667253Sgblack@eecs.umich.edu  protected:
2677253Sgblack@eecs.umich.edu    public:
2687253Sgblack@eecs.umich.edu        // Constructor
2697253Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
2707253Sgblack@eecs.umich.edu                       IntRegIndex _dest, IntRegIndex _op1,
2717330Sgblack@eecs.umich.edu                       uint64_t _imm1, uint64_t _imm2);
2727253Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
2737253Sgblack@eecs.umich.edu};
2747253Sgblack@eecs.umich.edu}};
2757253Sgblack@eecs.umich.edu
2767253Sgblack@eecs.umich.edudef template RegRegImmImmOpConstructor {{
2777253Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
2787253Sgblack@eecs.umich.edu                                          IntRegIndex _dest,
2797253Sgblack@eecs.umich.edu                                          IntRegIndex _op1,
2807330Sgblack@eecs.umich.edu                                          uint64_t _imm1,
2817330Sgblack@eecs.umich.edu                                          uint64_t _imm2)
2827253Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
2837253Sgblack@eecs.umich.edu                         _dest, _op1, _imm1, _imm2)
2847253Sgblack@eecs.umich.edu    {
2857253Sgblack@eecs.umich.edu        %(constructor)s;
2867253Sgblack@eecs.umich.edu    }
2877253Sgblack@eecs.umich.edu}};
2887253Sgblack@eecs.umich.edu
2897232Sgblack@eecs.umich.edudef template RegImmRegOpDeclare {{
2907225Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
2917225Sgblack@eecs.umich.edu{
2927225Sgblack@eecs.umich.edu  protected:
2937225Sgblack@eecs.umich.edu    public:
2947225Sgblack@eecs.umich.edu        // Constructor
2957225Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
2967330Sgblack@eecs.umich.edu                       IntRegIndex _dest, uint64_t _imm, IntRegIndex _op1);
2977225Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
2987225Sgblack@eecs.umich.edu};
2997225Sgblack@eecs.umich.edu}};
3007225Sgblack@eecs.umich.edu
3017232Sgblack@eecs.umich.edudef template RegImmRegOpConstructor {{
3027225Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
3037225Sgblack@eecs.umich.edu                                          IntRegIndex _dest,
3047330Sgblack@eecs.umich.edu                                          uint64_t _imm,
3057225Sgblack@eecs.umich.edu                                          IntRegIndex _op1)
3067225Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
3077232Sgblack@eecs.umich.edu                         _dest, _imm, _op1)
3087225Sgblack@eecs.umich.edu    {
3097225Sgblack@eecs.umich.edu        %(constructor)s;
3107225Sgblack@eecs.umich.edu    }
3117225Sgblack@eecs.umich.edu}};
3127225Sgblack@eecs.umich.edu
3137232Sgblack@eecs.umich.edudef template RegImmRegShiftOpDeclare {{
3147225Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
3157225Sgblack@eecs.umich.edu{
3167225Sgblack@eecs.umich.edu  protected:
3177225Sgblack@eecs.umich.edu    public:
3187225Sgblack@eecs.umich.edu        // Constructor
3197225Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
3207330Sgblack@eecs.umich.edu                       IntRegIndex _dest, uint64_t _imm, IntRegIndex _op1,
3217225Sgblack@eecs.umich.edu                       int32_t _shiftAmt, ArmShiftType _shiftType);
3227225Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
3237225Sgblack@eecs.umich.edu};
3247225Sgblack@eecs.umich.edu}};
3257225Sgblack@eecs.umich.edu
3267232Sgblack@eecs.umich.edudef template RegImmRegShiftOpConstructor {{
3277225Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
3287225Sgblack@eecs.umich.edu                                          IntRegIndex _dest,
3297330Sgblack@eecs.umich.edu                                          uint64_t _imm,
3307225Sgblack@eecs.umich.edu                                          IntRegIndex _op1,
3317225Sgblack@eecs.umich.edu                                          int32_t _shiftAmt,
3327225Sgblack@eecs.umich.edu                                          ArmShiftType _shiftType)
3337225Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
3347232Sgblack@eecs.umich.edu                         _dest, _imm, _op1, _shiftAmt, _shiftType)
3357225Sgblack@eecs.umich.edu    {
3367225Sgblack@eecs.umich.edu        %(constructor)s;
3377225Sgblack@eecs.umich.edu    }
3387225Sgblack@eecs.umich.edu}};
3397609SGene.Wu@arm.com
3407609SGene.Wu@arm.comdef template ClrexDeclare {{
3417609SGene.Wu@arm.com    /**
3427609SGene.Wu@arm.com     * Static instruction class for "%(mnemonic)s".
3437609SGene.Wu@arm.com     */
3447609SGene.Wu@arm.com    class %(class_name)s : public %(base_class)s
3457609SGene.Wu@arm.com    {
3467609SGene.Wu@arm.com      public:
3477609SGene.Wu@arm.com
3487609SGene.Wu@arm.com        /// Constructor.
3497609SGene.Wu@arm.com        %(class_name)s(ExtMachInst machInst);
3507609SGene.Wu@arm.com
3517609SGene.Wu@arm.com        %(BasicExecDeclare)s
3527609SGene.Wu@arm.com
3537609SGene.Wu@arm.com        %(InitiateAccDeclare)s
3547609SGene.Wu@arm.com
3557609SGene.Wu@arm.com        %(CompleteAccDeclare)s
3567609SGene.Wu@arm.com    };
3577609SGene.Wu@arm.com}};
3587609SGene.Wu@arm.com
3597609SGene.Wu@arm.comdef template ClrexInitiateAcc {{
3607609SGene.Wu@arm.com    Fault %(class_name)s::initiateAcc(%(CPU_exec_context)s *xc,
3617609SGene.Wu@arm.com                                      Trace::InstRecord *traceData) const
3627609SGene.Wu@arm.com    {
3637609SGene.Wu@arm.com        Fault fault = NoFault;
3647609SGene.Wu@arm.com        %(op_decl)s;
3657609SGene.Wu@arm.com        %(op_rd)s;
3667609SGene.Wu@arm.com
3677609SGene.Wu@arm.com        if (%(predicate_test)s)
3687609SGene.Wu@arm.com        {
3697609SGene.Wu@arm.com            if (fault == NoFault) {
3707609SGene.Wu@arm.com                unsigned memAccessFlags = ArmISA::TLB::Clrex|3|Request::LLSC;
3717609SGene.Wu@arm.com                fault = xc->read(0, (uint32_t&)Mem, memAccessFlags);
3727609SGene.Wu@arm.com            }
3737609SGene.Wu@arm.com        } else {
3747609SGene.Wu@arm.com            xc->setPredicate(false);
3757609SGene.Wu@arm.com            if (fault == NoFault && machInst.itstateMask != 0) {
3767609SGene.Wu@arm.com                xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate);
3777609SGene.Wu@arm.com            }
3787609SGene.Wu@arm.com        }
3797609SGene.Wu@arm.com
3807609SGene.Wu@arm.com        return fault;
3817609SGene.Wu@arm.com    }
3827609SGene.Wu@arm.com}};
3837609SGene.Wu@arm.com
3847609SGene.Wu@arm.comdef template ClrexCompleteAcc {{
3857609SGene.Wu@arm.com    Fault %(class_name)s::completeAcc(PacketPtr pkt,
3867609SGene.Wu@arm.com                                      %(CPU_exec_context)s *xc,
3877609SGene.Wu@arm.com                                      Trace::InstRecord *traceData) const
3887609SGene.Wu@arm.com    {
3897609SGene.Wu@arm.com        Fault fault = NoFault;
3907609SGene.Wu@arm.com
3917609SGene.Wu@arm.com        %(op_decl)s;
3927609SGene.Wu@arm.com        %(op_rd)s;
3937609SGene.Wu@arm.com
3947609SGene.Wu@arm.com
3957609SGene.Wu@arm.com        if (fault == NoFault && machInst.itstateMask != 0) {
3967609SGene.Wu@arm.com            xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate);
3977609SGene.Wu@arm.com        }
3987609SGene.Wu@arm.com
3997609SGene.Wu@arm.com        return fault;
4007609SGene.Wu@arm.com    }
4017609SGene.Wu@arm.com}};
4027609SGene.Wu@arm.com
403