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