gem5  v19.0.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
branch64.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011-2013 ARM Limited
3  * All rights reserved
4  *
5  * The license below extends only to copyright in the software and shall
6  * not be construed as granting a license to any other intellectual
7  * property including but not limited to intellectual property relating
8  * to a hardware implementation of the functionality of the software
9  * licensed hereunder. You may use the software subject to the license
10  * terms below provided that you ensure that this notice is replicated
11  * unmodified and in its entirety in all distributions of the software,
12  * modified or unmodified, in source code or in binary form.
13  *
14  * Redistribution and use in source and binary forms, with or without
15  * modification, are permitted provided that the following conditions are
16  * met: redistributions of source code must retain the above copyright
17  * notice, this list of conditions and the following disclaimer;
18  * redistributions in binary form must reproduce the above copyright
19  * notice, this list of conditions and the following disclaimer in the
20  * documentation and/or other materials provided with the distribution;
21  * neither the name of the copyright holders nor the names of its
22  * contributors may be used to endorse or promote products derived from
23  * this software without specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36  *
37  * Authors: Gabe Black
38  */
39 #ifndef __ARCH_ARM_INSTS_BRANCH64_HH__
40 #define __ARCH_ARM_INSTS_BRANCH64_HH__
41 
43 
44 namespace ArmISA
45 {
46 // Branch to a target computed with an immediate
47 class BranchImm64 : public ArmStaticInst
48 {
49  protected:
50  int64_t imm;
51 
52  public:
53  BranchImm64(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
54  int64_t _imm) :
55  ArmStaticInst(mnem, _machInst, __opClass), imm(_imm)
56  {}
57 
59  const ArmISA::PCState &branchPC) const override;
60 
63 
64  std::string generateDisassembly(
65  Addr pc, const SymbolTable *symtab) const override;
66 };
67 
68 // Conditionally Branch to a target computed with an immediate
70 {
71  protected:
73 
74  public:
75  BranchImmCond64(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
76  int64_t _imm, ConditionCode _condCode) :
77  BranchImm64(mnem, _machInst, __opClass, _imm), condCode(_condCode)
78  {}
79 
80  std::string generateDisassembly(
81  Addr pc, const SymbolTable *symtab) const override;
82 };
83 
84 // Branch to a target computed with two registers
86 {
87  protected:
90 
91  public:
92  BranchRegReg64(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
93  IntRegIndex _op1, IntRegIndex _op2) :
94  ArmStaticInst(mnem, _machInst, __opClass), op1(_op1), op2(_op2)
95  {}
96 
97  std::string generateDisassembly(
98  Addr pc, const SymbolTable *symtab) const override;
99 };
100 
101 // Branch to a target computed with a register
103 {
104  protected:
106 
107  public:
108  BranchReg64(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
109  IntRegIndex _op1) :
110  ArmStaticInst(mnem, _machInst, __opClass), op1(_op1)
111  {}
112 
113  std::string generateDisassembly(
114  Addr pc, const SymbolTable *symtab) const override;
115 };
116 
117 // Ret instruction
118 class BranchRet64 : public BranchReg64
119 {
120  public:
121  BranchRet64(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
122  IntRegIndex _op1) :
123  BranchReg64(mnem, _machInst, __opClass, _op1)
124  {}
125 
126  std::string generateDisassembly(
127  Addr pc, const SymbolTable *symtab) const override;
128 };
129 
130 // RetAA/RetAB instruction
132 {
133  public:
134  BranchRetA64(const char *mnem, ExtMachInst _machInst, OpClass __opClass) :
135  BranchRegReg64(mnem, _machInst, __opClass, INTREG_X30,
137  {}
138 
139  std::string generateDisassembly(
140  Addr pc, const SymbolTable *symtab) const override;
141 };
142 
143 // Eret instruction
145 {
146  public:
147  BranchEret64(const char *mnem, ExtMachInst _machInst, OpClass __opClass) :
148  ArmStaticInst(mnem, _machInst, __opClass)
149  {}
150 
151  std::string generateDisassembly(
152  Addr pc, const SymbolTable *symtab) const override;
153 };
154 
155 // EretA/B instruction
157 {
158  protected:
160 
161  public:
162  BranchEretA64(const char *mnem, ExtMachInst _machInst, OpClass __opClass) :
163  ArmStaticInst(mnem, _machInst, __opClass), op1(makeSP(INTREG_SPX))
164  {}
165 
166  std::string generateDisassembly(
167  Addr pc, const SymbolTable *symtab) const override;
168 };
169 // Branch to a target computed with an immediate and a register
171 {
172  protected:
173  int64_t imm;
175 
176  public:
177  BranchImmReg64(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
178  int64_t _imm, IntRegIndex _op1) :
179  ArmStaticInst(mnem, _machInst, __opClass), imm(_imm), op1(_op1)
180  {}
181 
183  const ArmISA::PCState &branchPC) const override;
184 
187 
188  std::string generateDisassembly(
189  Addr pc, const SymbolTable *symtab) const override;
190 };
191 
192 // Branch to a target computed with two immediates
194 {
195  protected:
196  int64_t imm1;
197  int64_t imm2;
199 
200  public:
201  BranchImmImmReg64(const char *mnem, ExtMachInst _machInst,
202  OpClass __opClass, int64_t _imm1, int64_t _imm2,
203  IntRegIndex _op1) :
204  ArmStaticInst(mnem, _machInst, __opClass),
205  imm1(_imm1), imm2(_imm2), op1(_op1)
206  {}
207 
209  const ArmISA::PCState &branchPC) const override;
210 
213 
214  std::string generateDisassembly(
215  Addr pc, const SymbolTable *symtab) const override;
216 };
217 
218 }
219 
220 #endif //__ARCH_ARM_INSTS_BRANCH_HH__
static IntRegIndex makeSP(IntRegIndex reg)
Definition: intregs.hh:501
IntRegIndex
Definition: intregs.hh:53
BranchImmCond64(const char *mnem, ExtMachInst _machInst, OpClass __opClass, int64_t _imm, ConditionCode _condCode)
Definition: branch64.hh:75
Definition: ccregs.hh:42
ArmISA::PCState branchTarget(const ArmISA::PCState &branchPC) const override
Definition: branch64.cc:46
BranchRet64(const char *mnem, ExtMachInst _machInst, OpClass __opClass, IntRegIndex _op1)
Definition: branch64.hh:121
BranchImm64(const char *mnem, ExtMachInst _machInst, OpClass __opClass, int64_t _imm)
Definition: branch64.hh:53
ConditionCode condCode
Definition: branch64.hh:72
BranchEret64(const char *mnem, ExtMachInst _machInst, OpClass __opClass)
Definition: branch64.hh:147
BranchImmReg64(const char *mnem, ExtMachInst _machInst, OpClass __opClass, int64_t _imm, IntRegIndex _op1)
Definition: branch64.hh:177
ConditionCode
Definition: ccregs.hh:64
Bitfield< 4 > pc
BranchReg64(const char *mnem, ExtMachInst _machInst, OpClass __opClass, IntRegIndex _op1)
Definition: branch64.hh:108
IntRegIndex op1
Definition: branch64.hh:105
BranchImmImmReg64(const char *mnem, ExtMachInst _machInst, OpClass __opClass, int64_t _imm1, int64_t _imm2, IntRegIndex _op1)
Definition: branch64.hh:201
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:142
std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: branch64.cc:83
virtual TheISA::PCState branchTarget(const TheISA::PCState &pc) const
Return the target address for a PC-relative branch.
Definition: static_inst.cc:107
BranchRetA64(const char *mnem, ExtMachInst _machInst, OpClass __opClass)
Definition: branch64.hh:134
GenericISA::SimplePCState< MachInst > PCState
Definition: types.hh:43
TheISA::ExtMachInst ExtMachInst
Binary extended machine instruction type.
Definition: static_inst.hh:87
BranchRegReg64(const char *mnem, ExtMachInst _machInst, OpClass __opClass, IntRegIndex _op1, IntRegIndex _op2)
Definition: branch64.hh:92
BranchEretA64(const char *mnem, ExtMachInst _machInst, OpClass __opClass)
Definition: branch64.hh:162

Generated on Fri Feb 28 2020 16:26:57 for gem5 by doxygen 1.8.13