branch.isa revision 10334
111726Sar4jc@virginia.edu// -*- mode:c++ -*-
211726Sar4jc@virginia.edu
311726Sar4jc@virginia.edu// Copyright (c) 2010, 2014 ARM Limited
411726Sar4jc@virginia.edu// All rights reserved
511726Sar4jc@virginia.edu//
611726Sar4jc@virginia.edu// The license below extends only to copyright in the software and shall
711726Sar4jc@virginia.edu// not be construed as granting a license to any other intellectual
811726Sar4jc@virginia.edu// property including but not limited to intellectual property relating
911726Sar4jc@virginia.edu// to a hardware implementation of the functionality of the software
1011726Sar4jc@virginia.edu// licensed hereunder.  You may use the software subject to the license
1111726Sar4jc@virginia.edu// terms below provided that you ensure that this notice is replicated
1211726Sar4jc@virginia.edu// unmodified and in its entirety in all distributions of the software,
1311726Sar4jc@virginia.edu// modified or unmodified, in source code or in binary form.
1411726Sar4jc@virginia.edu//
1511726Sar4jc@virginia.edu// Redistribution and use in source and binary forms, with or without
1611726Sar4jc@virginia.edu// modification, are permitted provided that the following conditions are
1711726Sar4jc@virginia.edu// met: redistributions of source code must retain the above copyright
1811726Sar4jc@virginia.edu// notice, this list of conditions and the following disclaimer;
1911726Sar4jc@virginia.edu// redistributions in binary form must reproduce the above copyright
2011726Sar4jc@virginia.edu// notice, this list of conditions and the following disclaimer in the
2111726Sar4jc@virginia.edu// documentation and/or other materials provided with the distribution;
2211726Sar4jc@virginia.edu// neither the name of the copyright holders nor the names of its
2311726Sar4jc@virginia.edu// contributors may be used to endorse or promote products derived from
2411726Sar4jc@virginia.edu// this software without specific prior written permission.
2511726Sar4jc@virginia.edu//
2611726Sar4jc@virginia.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2711726Sar4jc@virginia.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2811726Sar4jc@virginia.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2911726Sar4jc@virginia.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3011726Sar4jc@virginia.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3111726Sar4jc@virginia.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3211726Sar4jc@virginia.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3311726Sar4jc@virginia.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3411726Sar4jc@virginia.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3511726Sar4jc@virginia.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3611726Sar4jc@virginia.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3711726Sar4jc@virginia.edu//
3811726Sar4jc@virginia.edu// Authors: Gabe Black
3911726Sar4jc@virginia.edu
4011726Sar4jc@virginia.edudef template BranchImmDeclare {{
4111726Sar4jc@virginia.educlass %(class_name)s : public %(base_class)s
4211726Sar4jc@virginia.edu{
4311726Sar4jc@virginia.edu    public:
4411726Sar4jc@virginia.edu        // Constructor
4511726Sar4jc@virginia.edu        %(class_name)s(ExtMachInst machInst, int32_t _imm);
4611726Sar4jc@virginia.edu        %(BasicExecDeclare)s
4711726Sar4jc@virginia.edu};
4811726Sar4jc@virginia.edu}};
4911726Sar4jc@virginia.edu
5011726Sar4jc@virginia.edudef template BranchImmConstructor {{
5111726Sar4jc@virginia.edu    %(class_name)s::%(class_name)s(ExtMachInst machInst,
5211726Sar4jc@virginia.edu                                          int32_t _imm)
5311726Sar4jc@virginia.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _imm)
5412482Sgabeblack@google.com    {
5512482Sgabeblack@google.com        %(constructor)s;
5612482Sgabeblack@google.com        if (!(condCode == COND_AL || condCode == COND_UC)) {
5712236Sgabeblack@google.com            for (int x = 0; x < _numDestRegs; x++) {
5812482Sgabeblack@google.com                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
5911726Sar4jc@virginia.edu            }
6011726Sar4jc@virginia.edu            flags[IsCondControl] = true;
6111726Sar4jc@virginia.edu        } else {
6211726Sar4jc@virginia.edu            flags[IsUncondControl] = true;
6311726Sar4jc@virginia.edu        }
6411726Sar4jc@virginia.edu
6511726Sar4jc@virginia.edu    }
6611726Sar4jc@virginia.edu}};
6712482Sgabeblack@google.com
6812482Sgabeblack@google.comdef template BranchImmCondDeclare {{
6912482Sgabeblack@google.comclass %(class_name)s : public %(base_class)s
7012236Sgabeblack@google.com{
7112482Sgabeblack@google.com    public:
7211726Sar4jc@virginia.edu        // Constructor
7311726Sar4jc@virginia.edu        %(class_name)s(ExtMachInst machInst, int32_t _imm,
7411726Sar4jc@virginia.edu                       ConditionCode _condCode);
7511726Sar4jc@virginia.edu        %(BasicExecDeclare)s
7611965Sar4jc@virginia.edu        ArmISA::PCState branchTarget(const ArmISA::PCState &branchPC) const;
7711965Sar4jc@virginia.edu
7811965Sar4jc@virginia.edu        /// Explicitly import the otherwise hidden branchTarget
7911965Sar4jc@virginia.edu        using StaticInst::branchTarget;
8011965Sar4jc@virginia.edu};
8111965Sar4jc@virginia.edu}};
8211965Sar4jc@virginia.edu
8311965Sar4jc@virginia.edudef template BranchImmCondConstructor {{
8411965Sar4jc@virginia.edu    %(class_name)s::%(class_name)s(ExtMachInst machInst,
8511965Sar4jc@virginia.edu                                          int32_t _imm,
8611965Sar4jc@virginia.edu                                          ConditionCode _condCode)
8711965Sar4jc@virginia.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
8811726Sar4jc@virginia.edu                         _imm, _condCode)
8911726Sar4jc@virginia.edu    {
9011726Sar4jc@virginia.edu        %(constructor)s;
9111726Sar4jc@virginia.edu        if (!(condCode == COND_AL || condCode == COND_UC)) {
9211726Sar4jc@virginia.edu            for (int x = 0; x < _numDestRegs; x++) {
9311726Sar4jc@virginia.edu                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
9411726Sar4jc@virginia.edu            }
9511726Sar4jc@virginia.edu            flags[IsCondControl] = true;
9611726Sar4jc@virginia.edu        } else {
9711726Sar4jc@virginia.edu            flags[IsUncondControl] = true;
9811726Sar4jc@virginia.edu        }
9911726Sar4jc@virginia.edu    }
10011726Sar4jc@virginia.edu}};
10111726Sar4jc@virginia.edu
10211726Sar4jc@virginia.edudef template BranchRegDeclare {{
10311726Sar4jc@virginia.educlass %(class_name)s : public %(base_class)s
10411726Sar4jc@virginia.edu{
10511726Sar4jc@virginia.edu    public:
10611726Sar4jc@virginia.edu        // Constructor
10711726Sar4jc@virginia.edu        %(class_name)s(ExtMachInst machInst, IntRegIndex _op1);
10811726Sar4jc@virginia.edu        %(BasicExecDeclare)s
10911726Sar4jc@virginia.edu};
11011726Sar4jc@virginia.edu}};
11111726Sar4jc@virginia.edu
11211726Sar4jc@virginia.edudef template BranchRegConstructor {{
11311726Sar4jc@virginia.edu    %(class_name)s::%(class_name)s(ExtMachInst machInst,
11411726Sar4jc@virginia.edu                                          IntRegIndex _op1)
11511726Sar4jc@virginia.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _op1)
11611726Sar4jc@virginia.edu    {
11711726Sar4jc@virginia.edu        %(constructor)s;
11811726Sar4jc@virginia.edu        if (!(condCode == COND_AL || condCode == COND_UC)) {
11911726Sar4jc@virginia.edu            for (int x = 0; x < _numDestRegs; x++) {
12011726Sar4jc@virginia.edu                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
12111726Sar4jc@virginia.edu            }
12211726Sar4jc@virginia.edu            flags[IsCondControl] = true;
12311726Sar4jc@virginia.edu        } else {
12411965Sar4jc@virginia.edu            flags[IsUncondControl] = true;
12512234Sgabeblack@google.com        }
12611965Sar4jc@virginia.edu        if (%(is_ras_pop)s)
12711965Sar4jc@virginia.edu            flags[IsReturn] = true;
12811965Sar4jc@virginia.edu    }
12911965Sar4jc@virginia.edu}};
13011965Sar4jc@virginia.edu
13111965Sar4jc@virginia.edudef template BranchRegCondDeclare {{
13211965Sar4jc@virginia.educlass %(class_name)s : public %(base_class)s
13311965Sar4jc@virginia.edu{
13411965Sar4jc@virginia.edu    public:
13511965Sar4jc@virginia.edu        // Constructor
13611965Sar4jc@virginia.edu        %(class_name)s(ExtMachInst machInst, IntRegIndex _op1,
13711965Sar4jc@virginia.edu                       ConditionCode _condCode);
13811965Sar4jc@virginia.edu        %(BasicExecDeclare)s
13911965Sar4jc@virginia.edu};
14011965Sar4jc@virginia.edu}};
14111965Sar4jc@virginia.edu
14211965Sar4jc@virginia.edudef template BranchRegCondConstructor {{
14311965Sar4jc@virginia.edu    %(class_name)s::%(class_name)s(ExtMachInst machInst,
14411965Sar4jc@virginia.edu                                          IntRegIndex _op1,
14511965Sar4jc@virginia.edu                                          ConditionCode _condCode)
14611965Sar4jc@virginia.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
14711965Sar4jc@virginia.edu                         _op1, _condCode)
14811965Sar4jc@virginia.edu    {
14911965Sar4jc@virginia.edu        %(constructor)s;
15011965Sar4jc@virginia.edu        if (!(condCode == COND_AL || condCode == COND_UC)) {
15111965Sar4jc@virginia.edu            for (int x = 0; x < _numDestRegs; x++) {
15211965Sar4jc@virginia.edu                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
15311965Sar4jc@virginia.edu            }
15411965Sar4jc@virginia.edu            flags[IsCondControl] = true;
15511965Sar4jc@virginia.edu        } else {
15611965Sar4jc@virginia.edu            flags[IsUncondControl] = true;
15711965Sar4jc@virginia.edu        }
15811965Sar4jc@virginia.edu        if (%(is_ras_pop)s)
15911965Sar4jc@virginia.edu            flags[IsReturn] = true;
16011726Sar4jc@virginia.edu    }
16112234Sgabeblack@google.com}};
16211726Sar4jc@virginia.edu
16311726Sar4jc@virginia.edudef template BranchRegRegDeclare {{
16411726Sar4jc@virginia.educlass %(class_name)s : public %(base_class)s
16511726Sar4jc@virginia.edu{
16611726Sar4jc@virginia.edu    public:
16711726Sar4jc@virginia.edu        // Constructor
16811726Sar4jc@virginia.edu        %(class_name)s(ExtMachInst machInst,
16911726Sar4jc@virginia.edu                       IntRegIndex _op1, IntRegIndex _op2);
17011726Sar4jc@virginia.edu        %(BasicExecDeclare)s
17111726Sar4jc@virginia.edu};
17211726Sar4jc@virginia.edu}};
17311726Sar4jc@virginia.edu
17411726Sar4jc@virginia.edudef template BranchTableDeclare {{
17511726Sar4jc@virginia.educlass %(class_name)s : public %(base_class)s
17611726Sar4jc@virginia.edu{
17711726Sar4jc@virginia.edu    public:
17811726Sar4jc@virginia.edu        // Constructor
17911726Sar4jc@virginia.edu        %(class_name)s(ExtMachInst machInst,
18011726Sar4jc@virginia.edu                       IntRegIndex _op1, IntRegIndex _op2);
18111726Sar4jc@virginia.edu        %(BasicExecDeclare)s
18211726Sar4jc@virginia.edu
18311726Sar4jc@virginia.edu        %(InitiateAccDeclare)s
18411726Sar4jc@virginia.edu
18511726Sar4jc@virginia.edu        %(CompleteAccDeclare)s
18611726Sar4jc@virginia.edu};
18711726Sar4jc@virginia.edu}};
18812234Sgabeblack@google.com
18911726Sar4jc@virginia.edudef template BranchRegRegConstructor {{
19011726Sar4jc@virginia.edu    %(class_name)s::%(class_name)s(ExtMachInst machInst,
19111726Sar4jc@virginia.edu                                          IntRegIndex _op1,
19211726Sar4jc@virginia.edu                                          IntRegIndex _op2)
19311726Sar4jc@virginia.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _op1, _op2)
19411726Sar4jc@virginia.edu    {
19511726Sar4jc@virginia.edu        %(constructor)s;
19611726Sar4jc@virginia.edu        if (!(condCode == COND_AL || condCode == COND_UC)) {
19711726Sar4jc@virginia.edu            for (int x = 0; x < _numDestRegs; x++) {
19811726Sar4jc@virginia.edu                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
19911726Sar4jc@virginia.edu            }
20011726Sar4jc@virginia.edu            flags[IsCondControl] = true;
20111726Sar4jc@virginia.edu        } else {
20211726Sar4jc@virginia.edu            flags[IsUncondControl] = true;
20311726Sar4jc@virginia.edu        }
20411726Sar4jc@virginia.edu    }
20511726Sar4jc@virginia.edu}};
20611726Sar4jc@virginia.edu
20711726Sar4jc@virginia.edudef template BranchImmRegDeclare {{
20811726Sar4jc@virginia.educlass %(class_name)s : public %(base_class)s
20911726Sar4jc@virginia.edu{
21011726Sar4jc@virginia.edu    public:
21111726Sar4jc@virginia.edu        // Constructor
21211726Sar4jc@virginia.edu        %(class_name)s(ExtMachInst machInst,
21311726Sar4jc@virginia.edu                       int32_t imm, IntRegIndex _op1);
21411726Sar4jc@virginia.edu        %(BasicExecDeclare)s
21511726Sar4jc@virginia.edu        ArmISA::PCState branchTarget(const ArmISA::PCState &branchPC) const;
21612234Sgabeblack@google.com
21711726Sar4jc@virginia.edu        /// Explicitly import the otherwise hidden branchTarget
21811726Sar4jc@virginia.edu        using StaticInst::branchTarget;
21911726Sar4jc@virginia.edu};
22011726Sar4jc@virginia.edu}};
22111726Sar4jc@virginia.edu
22211726Sar4jc@virginia.edu// Only used by CBNZ, CBZ which is conditional based on
22311726Sar4jc@virginia.edu// a register value even though the instruction is always unconditional.
22411726Sar4jc@virginia.edudef template BranchImmRegConstructor {{
22511726Sar4jc@virginia.edu    %(class_name)s::%(class_name)s(ExtMachInst machInst,
22611726Sar4jc@virginia.edu                                          int32_t _imm,
22711726Sar4jc@virginia.edu                                          IntRegIndex _op1)
22811726Sar4jc@virginia.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _imm, _op1)
22911726Sar4jc@virginia.edu    {
23011726Sar4jc@virginia.edu        %(constructor)s;
23111726Sar4jc@virginia.edu        flags[IsCondControl] = true;
23211726Sar4jc@virginia.edu    }
23311726Sar4jc@virginia.edu}};
23411726Sar4jc@virginia.edu
23511726Sar4jc@virginia.edudef template BranchTarget {{
23612234Sgabeblack@google.com
23711726Sar4jc@virginia.edu    ArmISA::PCState
23811726Sar4jc@virginia.edu    %(class_name)s::branchTarget(const ArmISA::PCState &branchPC) const
23911726Sar4jc@virginia.edu    {
24011726Sar4jc@virginia.edu        %(op_decl)s;
24111726Sar4jc@virginia.edu        %(op_rd)s;
24211726Sar4jc@virginia.edu
24311726Sar4jc@virginia.edu        ArmISA::PCState pcs = branchPC;
24411726Sar4jc@virginia.edu        %(brTgtCode)s
24511726Sar4jc@virginia.edu        pcs.advance();
24611726Sar4jc@virginia.edu        return pcs;
24711726Sar4jc@virginia.edu    }
24811726Sar4jc@virginia.edu}};
24911726Sar4jc@virginia.edu
25011726Sar4jc@virginia.edu
25111726Sar4jc@virginia.edu