branch.isa revision 7848
17150Sgblack@eecs.umich.edu// -*- mode:c++ -*-
27150Sgblack@eecs.umich.edu
37150Sgblack@eecs.umich.edu// Copyright (c) 2010 ARM Limited
47150Sgblack@eecs.umich.edu// All rights reserved
57150Sgblack@eecs.umich.edu//
67150Sgblack@eecs.umich.edu// The license below extends only to copyright in the software and shall
77150Sgblack@eecs.umich.edu// not be construed as granting a license to any other intellectual
87150Sgblack@eecs.umich.edu// property including but not limited to intellectual property relating
97150Sgblack@eecs.umich.edu// to a hardware implementation of the functionality of the software
107150Sgblack@eecs.umich.edu// licensed hereunder.  You may use the software subject to the license
117150Sgblack@eecs.umich.edu// terms below provided that you ensure that this notice is replicated
127150Sgblack@eecs.umich.edu// unmodified and in its entirety in all distributions of the software,
137150Sgblack@eecs.umich.edu// modified or unmodified, in source code or in binary form.
147150Sgblack@eecs.umich.edu//
157150Sgblack@eecs.umich.edu// Redistribution and use in source and binary forms, with or without
167150Sgblack@eecs.umich.edu// modification, are permitted provided that the following conditions are
177150Sgblack@eecs.umich.edu// met: redistributions of source code must retain the above copyright
187150Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer;
197150Sgblack@eecs.umich.edu// redistributions in binary form must reproduce the above copyright
207150Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer in the
217150Sgblack@eecs.umich.edu// documentation and/or other materials provided with the distribution;
227150Sgblack@eecs.umich.edu// neither the name of the copyright holders nor the names of its
237150Sgblack@eecs.umich.edu// contributors may be used to endorse or promote products derived from
247150Sgblack@eecs.umich.edu// this software without specific prior written permission.
257150Sgblack@eecs.umich.edu//
267150Sgblack@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
277150Sgblack@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
287150Sgblack@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
297150Sgblack@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
307150Sgblack@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
317150Sgblack@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
327150Sgblack@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
337150Sgblack@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
347150Sgblack@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
357150Sgblack@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
367150Sgblack@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
377150Sgblack@eecs.umich.edu//
387150Sgblack@eecs.umich.edu// Authors: Gabe Black
397150Sgblack@eecs.umich.edu
407150Sgblack@eecs.umich.edudef template BranchImmDeclare {{
417150Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
427150Sgblack@eecs.umich.edu{
437150Sgblack@eecs.umich.edu    public:
447150Sgblack@eecs.umich.edu        // Constructor
457150Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst, int32_t _imm);
467150Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
477150Sgblack@eecs.umich.edu};
487150Sgblack@eecs.umich.edu}};
497150Sgblack@eecs.umich.edu
507150Sgblack@eecs.umich.edudef template BranchImmConstructor {{
517150Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
527150Sgblack@eecs.umich.edu                                          int32_t _imm)
537150Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _imm)
547150Sgblack@eecs.umich.edu    {
557150Sgblack@eecs.umich.edu        %(constructor)s;
567848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
577848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
587848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
597848SAli.Saidi@ARM.com            }
607848SAli.Saidi@ARM.com        }
617150Sgblack@eecs.umich.edu    }
627150Sgblack@eecs.umich.edu}};
637150Sgblack@eecs.umich.edu
647150Sgblack@eecs.umich.edudef template BranchImmCondDeclare {{
657150Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
667150Sgblack@eecs.umich.edu{
677150Sgblack@eecs.umich.edu    public:
687150Sgblack@eecs.umich.edu        // Constructor
697150Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst, int32_t _imm,
707150Sgblack@eecs.umich.edu                       ConditionCode _condCode);
717150Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
727150Sgblack@eecs.umich.edu};
737150Sgblack@eecs.umich.edu}};
747150Sgblack@eecs.umich.edu
757150Sgblack@eecs.umich.edudef template BranchImmCondConstructor {{
767150Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
777150Sgblack@eecs.umich.edu                                          int32_t _imm,
787150Sgblack@eecs.umich.edu                                          ConditionCode _condCode)
797150Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
807150Sgblack@eecs.umich.edu                         _imm, _condCode)
817150Sgblack@eecs.umich.edu    {
827150Sgblack@eecs.umich.edu        %(constructor)s;
837848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
847848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
857848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
867848SAli.Saidi@ARM.com            }
877848SAli.Saidi@ARM.com        }
887150Sgblack@eecs.umich.edu    }
897150Sgblack@eecs.umich.edu}};
907150Sgblack@eecs.umich.edu
917150Sgblack@eecs.umich.edudef template BranchRegDeclare {{
927150Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
937150Sgblack@eecs.umich.edu{
947150Sgblack@eecs.umich.edu    public:
957150Sgblack@eecs.umich.edu        // Constructor
967150Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst, IntRegIndex _op1);
977150Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
987150Sgblack@eecs.umich.edu};
997150Sgblack@eecs.umich.edu}};
1007150Sgblack@eecs.umich.edu
1017150Sgblack@eecs.umich.edudef template BranchRegConstructor {{
1027150Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
1037150Sgblack@eecs.umich.edu                                          IntRegIndex _op1)
1047150Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _op1)
1057150Sgblack@eecs.umich.edu    {
1067150Sgblack@eecs.umich.edu        %(constructor)s;
1077848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
1087848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
1097848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
1107848SAli.Saidi@ARM.com            }
1117848SAli.Saidi@ARM.com        }
1127150Sgblack@eecs.umich.edu    }
1137150Sgblack@eecs.umich.edu}};
1147150Sgblack@eecs.umich.edu
1157150Sgblack@eecs.umich.edudef template BranchRegCondDeclare {{
1167150Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
1177150Sgblack@eecs.umich.edu{
1187150Sgblack@eecs.umich.edu    public:
1197150Sgblack@eecs.umich.edu        // Constructor
1207150Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst, IntRegIndex _op1,
1217150Sgblack@eecs.umich.edu                       ConditionCode _condCode);
1227150Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
1237150Sgblack@eecs.umich.edu};
1247150Sgblack@eecs.umich.edu}};
1257150Sgblack@eecs.umich.edu
1267150Sgblack@eecs.umich.edudef template BranchRegCondConstructor {{
1277150Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
1287150Sgblack@eecs.umich.edu                                          IntRegIndex _op1,
1297150Sgblack@eecs.umich.edu                                          ConditionCode _condCode)
1307150Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
1317150Sgblack@eecs.umich.edu                         _op1, _condCode)
1327150Sgblack@eecs.umich.edu    {
1337150Sgblack@eecs.umich.edu        %(constructor)s;
1347848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
1357848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
1367848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
1377848SAli.Saidi@ARM.com            }
1387848SAli.Saidi@ARM.com        }
1397150Sgblack@eecs.umich.edu    }
1407150Sgblack@eecs.umich.edu}};
1417150Sgblack@eecs.umich.edu
1427150Sgblack@eecs.umich.edudef template BranchRegRegDeclare {{
1437150Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
1447150Sgblack@eecs.umich.edu{
1457150Sgblack@eecs.umich.edu    public:
1467150Sgblack@eecs.umich.edu        // Constructor
1477150Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
1487150Sgblack@eecs.umich.edu                       IntRegIndex _op1, IntRegIndex _op2);
1497150Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
1507150Sgblack@eecs.umich.edu};
1517150Sgblack@eecs.umich.edu}};
1527150Sgblack@eecs.umich.edu
1537150Sgblack@eecs.umich.edudef template BranchTableDeclare {{
1547150Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
1557150Sgblack@eecs.umich.edu{
1567150Sgblack@eecs.umich.edu    public:
1577150Sgblack@eecs.umich.edu        // Constructor
1587150Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
1597150Sgblack@eecs.umich.edu                       IntRegIndex _op1, IntRegIndex _op2);
1607150Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
1617150Sgblack@eecs.umich.edu
1627150Sgblack@eecs.umich.edu        %(InitiateAccDeclare)s
1637150Sgblack@eecs.umich.edu
1647150Sgblack@eecs.umich.edu        %(CompleteAccDeclare)s
1657150Sgblack@eecs.umich.edu};
1667150Sgblack@eecs.umich.edu}};
1677150Sgblack@eecs.umich.edu
1687150Sgblack@eecs.umich.edudef template BranchRegRegConstructor {{
1697150Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
1707150Sgblack@eecs.umich.edu                                          IntRegIndex _op1,
1717150Sgblack@eecs.umich.edu                                          IntRegIndex _op2)
1727150Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _op1, _op2)
1737150Sgblack@eecs.umich.edu    {
1747150Sgblack@eecs.umich.edu        %(constructor)s;
1757848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
1767848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
1777848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
1787848SAli.Saidi@ARM.com            }
1797848SAli.Saidi@ARM.com        }
1807150Sgblack@eecs.umich.edu    }
1817150Sgblack@eecs.umich.edu}};
1827150Sgblack@eecs.umich.edu
1837150Sgblack@eecs.umich.edudef template BranchImmRegDeclare {{
1847150Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
1857150Sgblack@eecs.umich.edu{
1867150Sgblack@eecs.umich.edu    public:
1877150Sgblack@eecs.umich.edu        // Constructor
1887150Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst machInst,
1897150Sgblack@eecs.umich.edu                       int32_t imm, IntRegIndex _op1);
1907150Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
1917150Sgblack@eecs.umich.edu};
1927150Sgblack@eecs.umich.edu}};
1937150Sgblack@eecs.umich.edu
1947150Sgblack@eecs.umich.edudef template BranchImmRegConstructor {{
1957150Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
1967150Sgblack@eecs.umich.edu                                          int32_t _imm,
1977150Sgblack@eecs.umich.edu                                          IntRegIndex _op1)
1987150Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _imm, _op1)
1997150Sgblack@eecs.umich.edu    {
2007150Sgblack@eecs.umich.edu        %(constructor)s;
2017848SAli.Saidi@ARM.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
2027848SAli.Saidi@ARM.com            for (int x = 0; x < _numDestRegs; x++) {
2037848SAli.Saidi@ARM.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
2047848SAli.Saidi@ARM.com            }
2057848SAli.Saidi@ARM.com        }
2067150Sgblack@eecs.umich.edu    }
2077150Sgblack@eecs.umich.edu}};
208