misc.isa (12503:47b60911f9ba) misc.isa (12616:4b463b4dc098)
1// -*- mode:c++ -*-
2
3// Copyright (c) 2010-2013,2017-2018 ARM Limited
4// All rights reserved
5//
6// The license below extends only to copyright in the software and shall
7// not be construed as granting a license to any other intellectual
8// property including but not limited to intellectual property relating
9// to a hardware implementation of the functionality of the software
10// licensed hereunder. You may use the software subject to the license
11// terms below provided that you ensure that this notice is replicated
12// unmodified and in its entirety in all distributions of the software,
13// modified or unmodified, in source code or in binary form.
14//
15// Redistribution and use in source and binary forms, with or without
16// modification, are permitted provided that the following conditions are
17// met: redistributions of source code must retain the above copyright
18// notice, this list of conditions and the following disclaimer;
19// redistributions in binary form must reproduce the above copyright
20// notice, this list of conditions and the following disclaimer in the
21// documentation and/or other materials provided with the distribution;
22// neither the name of the copyright holders nor the names of its
23// contributors may be used to endorse or promote products derived from
24// this software without specific prior written permission.
25//
26// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37//
38// Authors: Gabe Black
39
40def template MrsDeclare {{
41class %(class_name)s : public %(base_class)s
42{
43 protected:
44 public:
45 // Constructor
46 %(class_name)s(ExtMachInst machInst, IntRegIndex _dest);
1// -*- mode:c++ -*-
2
3// Copyright (c) 2010-2013,2017-2018 ARM Limited
4// All rights reserved
5//
6// The license below extends only to copyright in the software and shall
7// not be construed as granting a license to any other intellectual
8// property including but not limited to intellectual property relating
9// to a hardware implementation of the functionality of the software
10// licensed hereunder. You may use the software subject to the license
11// terms below provided that you ensure that this notice is replicated
12// unmodified and in its entirety in all distributions of the software,
13// modified or unmodified, in source code or in binary form.
14//
15// Redistribution and use in source and binary forms, with or without
16// modification, are permitted provided that the following conditions are
17// met: redistributions of source code must retain the above copyright
18// notice, this list of conditions and the following disclaimer;
19// redistributions in binary form must reproduce the above copyright
20// notice, this list of conditions and the following disclaimer in the
21// documentation and/or other materials provided with the distribution;
22// neither the name of the copyright holders nor the names of its
23// contributors may be used to endorse or promote products derived from
24// this software without specific prior written permission.
25//
26// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37//
38// Authors: Gabe Black
39
40def template MrsDeclare {{
41class %(class_name)s : public %(base_class)s
42{
43 protected:
44 public:
45 // Constructor
46 %(class_name)s(ExtMachInst machInst, IntRegIndex _dest);
47 Fault execute(ExecContext *, Trace::InstRecord *) const;
47 Fault execute(ExecContext *, Trace::InstRecord *) const override;
48};
49}};
50
51def template MrsConstructor {{
52 %(class_name)s::%(class_name)s(ExtMachInst machInst,
53 IntRegIndex _dest)
54 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _dest)
55 {
56 %(constructor)s;
57 if (!(condCode == COND_AL || condCode == COND_UC)) {
58 for (int x = 0; x < _numDestRegs; x++) {
59 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
60 }
61 }
62 }
63}};
64
65def template MrsBankedRegDeclare {{
66class %(class_name)s : public %(base_class)s
67{
68 protected:
69 uint8_t byteMask;
70 bool r;
71
72 public:
73 // Constructor
74 %(class_name)s(ExtMachInst machInst, IntRegIndex _dest,
75 uint8_t _sysM, bool _r);
48};
49}};
50
51def template MrsConstructor {{
52 %(class_name)s::%(class_name)s(ExtMachInst machInst,
53 IntRegIndex _dest)
54 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _dest)
55 {
56 %(constructor)s;
57 if (!(condCode == COND_AL || condCode == COND_UC)) {
58 for (int x = 0; x < _numDestRegs; x++) {
59 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
60 }
61 }
62 }
63}};
64
65def template MrsBankedRegDeclare {{
66class %(class_name)s : public %(base_class)s
67{
68 protected:
69 uint8_t byteMask;
70 bool r;
71
72 public:
73 // Constructor
74 %(class_name)s(ExtMachInst machInst, IntRegIndex _dest,
75 uint8_t _sysM, bool _r);
76 Fault execute(ExecContext *, Trace::InstRecord *) const;
76 Fault execute(ExecContext *, Trace::InstRecord *) const override;
77};
78}};
79
80def template MrsBankedRegConstructor {{
81 %(class_name)s::%(class_name)s(ExtMachInst machInst,
82 IntRegIndex _dest,
83 uint8_t _sysM,
84 bool _r)
85 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _dest),
86 byteMask(_sysM), r(_r)
87 {
88 %(constructor)s;
89 if (!(condCode == COND_AL || condCode == COND_UC)) {
90 for (int x = 0; x < _numDestRegs; x++) {
91 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
92 }
93 }
94 }
95}};
96
97def template MsrBankedRegDeclare {{
98class %(class_name)s : public %(base_class)s
99{
100 protected:
101 bool r;
102
103 public:
104 // Constructor
105 %(class_name)s(ExtMachInst machInst, IntRegIndex _op1,
106 uint8_t _sysM, bool _r);
77};
78}};
79
80def template MrsBankedRegConstructor {{
81 %(class_name)s::%(class_name)s(ExtMachInst machInst,
82 IntRegIndex _dest,
83 uint8_t _sysM,
84 bool _r)
85 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _dest),
86 byteMask(_sysM), r(_r)
87 {
88 %(constructor)s;
89 if (!(condCode == COND_AL || condCode == COND_UC)) {
90 for (int x = 0; x < _numDestRegs; x++) {
91 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
92 }
93 }
94 }
95}};
96
97def template MsrBankedRegDeclare {{
98class %(class_name)s : public %(base_class)s
99{
100 protected:
101 bool r;
102
103 public:
104 // Constructor
105 %(class_name)s(ExtMachInst machInst, IntRegIndex _op1,
106 uint8_t _sysM, bool _r);
107 Fault execute(ExecContext *, Trace::InstRecord *) const;
107 Fault execute(ExecContext *, Trace::InstRecord *) const override;
108};
109}};
110
111def template MsrBankedRegConstructor {{
112 %(class_name)s::%(class_name)s(ExtMachInst machInst,
113 IntRegIndex _op1,
114 uint8_t _sysM,
115 bool _r)
116 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _op1, _sysM),
117 r(_r)
118 {
119 %(constructor)s;
120 if (!(condCode == COND_AL || condCode == COND_UC)) {
121 for (int x = 0; x < _numDestRegs; x++) {
122 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
123 }
124 }
125 }
126}};
127
128def template MsrRegDeclare {{
129class %(class_name)s : public %(base_class)s
130{
131 protected:
132 public:
133 // Constructor
134 %(class_name)s(ExtMachInst machInst, IntRegIndex _op1, uint8_t mask);
108};
109}};
110
111def template MsrBankedRegConstructor {{
112 %(class_name)s::%(class_name)s(ExtMachInst machInst,
113 IntRegIndex _op1,
114 uint8_t _sysM,
115 bool _r)
116 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _op1, _sysM),
117 r(_r)
118 {
119 %(constructor)s;
120 if (!(condCode == COND_AL || condCode == COND_UC)) {
121 for (int x = 0; x < _numDestRegs; x++) {
122 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
123 }
124 }
125 }
126}};
127
128def template MsrRegDeclare {{
129class %(class_name)s : public %(base_class)s
130{
131 protected:
132 public:
133 // Constructor
134 %(class_name)s(ExtMachInst machInst, IntRegIndex _op1, uint8_t mask);
135 Fault execute(ExecContext *, Trace::InstRecord *) const;
135 Fault execute(ExecContext *, Trace::InstRecord *) const override;
136};
137}};
138
139def template MsrRegConstructor {{
140 %(class_name)s::%(class_name)s(ExtMachInst machInst,
141 IntRegIndex _op1,
142 uint8_t mask)
143 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _op1, mask)
144 {
145 %(constructor)s;
146 if (!(condCode == COND_AL || condCode == COND_UC)) {
147 for (int x = 0; x < _numDestRegs; x++) {
148 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
149 }
150 }
151 }
152}};
153
154def template MsrImmDeclare {{
155class %(class_name)s : public %(base_class)s
156{
157 protected:
158 public:
159 // Constructor
160 %(class_name)s(ExtMachInst machInst, uint32_t imm, uint8_t mask);
136};
137}};
138
139def template MsrRegConstructor {{
140 %(class_name)s::%(class_name)s(ExtMachInst machInst,
141 IntRegIndex _op1,
142 uint8_t mask)
143 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _op1, mask)
144 {
145 %(constructor)s;
146 if (!(condCode == COND_AL || condCode == COND_UC)) {
147 for (int x = 0; x < _numDestRegs; x++) {
148 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
149 }
150 }
151 }
152}};
153
154def template MsrImmDeclare {{
155class %(class_name)s : public %(base_class)s
156{
157 protected:
158 public:
159 // Constructor
160 %(class_name)s(ExtMachInst machInst, uint32_t imm, uint8_t mask);
161 Fault execute(ExecContext *, Trace::InstRecord *) const;
161 Fault execute(ExecContext *, Trace::InstRecord *) const override;
162};
163}};
164
165def template MsrImmConstructor {{
166 %(class_name)s::%(class_name)s(ExtMachInst machInst,
167 uint32_t imm,
168 uint8_t mask)
169 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, imm, mask)
170 {
171 %(constructor)s;
172 if (!(condCode == COND_AL || condCode == COND_UC)) {
173 for (int x = 0; x < _numDestRegs; x++) {
174 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
175 }
176 }
177 }
178}};
179
180def template MrrcOpDeclare {{
181class %(class_name)s : public %(base_class)s
182{
183 protected:
184 public:
185 // Constructor
186 %(class_name)s(ExtMachInst machInst, MiscRegIndex _op1,
187 IntRegIndex _dest, IntRegIndex _dest2, uint32_t imm);
162};
163}};
164
165def template MsrImmConstructor {{
166 %(class_name)s::%(class_name)s(ExtMachInst machInst,
167 uint32_t imm,
168 uint8_t mask)
169 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, imm, mask)
170 {
171 %(constructor)s;
172 if (!(condCode == COND_AL || condCode == COND_UC)) {
173 for (int x = 0; x < _numDestRegs; x++) {
174 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
175 }
176 }
177 }
178}};
179
180def template MrrcOpDeclare {{
181class %(class_name)s : public %(base_class)s
182{
183 protected:
184 public:
185 // Constructor
186 %(class_name)s(ExtMachInst machInst, MiscRegIndex _op1,
187 IntRegIndex _dest, IntRegIndex _dest2, uint32_t imm);
188 Fault execute(ExecContext *, Trace::InstRecord *) const;
188 Fault execute(ExecContext *, Trace::InstRecord *) const override;
189};
190}};
191
192def template MrrcOpConstructor {{
193 %(class_name)s::%(class_name)s(ExtMachInst machInst,
194 MiscRegIndex op1,
195 IntRegIndex dest,
196 IntRegIndex dest2,
197 uint32_t imm)
198 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, op1, dest,
199 dest2, imm)
200 {
201 %(constructor)s;
202 if (!(condCode == COND_AL || condCode == COND_UC)) {
203 for (int x = 0; x < _numDestRegs; x++) {
204 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
205 }
206 }
207 }
208}};
209
210def template McrrOpDeclare {{
211class %(class_name)s : public %(base_class)s
212{
213 protected:
214 public:
215 // Constructor
216 %(class_name)s(ExtMachInst machInst, IntRegIndex _op1, IntRegIndex _op2,
217 MiscRegIndex _dest, uint32_t imm);
189};
190}};
191
192def template MrrcOpConstructor {{
193 %(class_name)s::%(class_name)s(ExtMachInst machInst,
194 MiscRegIndex op1,
195 IntRegIndex dest,
196 IntRegIndex dest2,
197 uint32_t imm)
198 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, op1, dest,
199 dest2, imm)
200 {
201 %(constructor)s;
202 if (!(condCode == COND_AL || condCode == COND_UC)) {
203 for (int x = 0; x < _numDestRegs; x++) {
204 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
205 }
206 }
207 }
208}};
209
210def template McrrOpDeclare {{
211class %(class_name)s : public %(base_class)s
212{
213 protected:
214 public:
215 // Constructor
216 %(class_name)s(ExtMachInst machInst, IntRegIndex _op1, IntRegIndex _op2,
217 MiscRegIndex _dest, uint32_t imm);
218 Fault execute(ExecContext *, Trace::InstRecord *) const;
218 Fault execute(ExecContext *, Trace::InstRecord *) const override;
219};
220}};
221
222def template McrrOpConstructor {{
223 %(class_name)s::%(class_name)s(ExtMachInst machInst,
224 IntRegIndex op1,
225 IntRegIndex op2,
226 MiscRegIndex dest,
227 uint32_t imm)
228 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, op1, op2,
229 dest, imm)
230 {
231 %(constructor)s;
232 if (!(condCode == COND_AL || condCode == COND_UC)) {
233 for (int x = 0; x < _numDestRegs; x++) {
234 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
235 }
236 }
237 }
238}};
239
240def template ImmOpDeclare {{
241class %(class_name)s : public %(base_class)s
242{
243 protected:
244 public:
245 // Constructor
246 %(class_name)s(ExtMachInst machInst, uint64_t _imm);
219};
220}};
221
222def template McrrOpConstructor {{
223 %(class_name)s::%(class_name)s(ExtMachInst machInst,
224 IntRegIndex op1,
225 IntRegIndex op2,
226 MiscRegIndex dest,
227 uint32_t imm)
228 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, op1, op2,
229 dest, imm)
230 {
231 %(constructor)s;
232 if (!(condCode == COND_AL || condCode == COND_UC)) {
233 for (int x = 0; x < _numDestRegs; x++) {
234 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
235 }
236 }
237 }
238}};
239
240def template ImmOpDeclare {{
241class %(class_name)s : public %(base_class)s
242{
243 protected:
244 public:
245 // Constructor
246 %(class_name)s(ExtMachInst machInst, uint64_t _imm);
247 Fault execute(ExecContext *, Trace::InstRecord *) const;
247 Fault execute(ExecContext *, Trace::InstRecord *) const override;
248};
249}};
250
251def template ImmOpConstructor {{
252 %(class_name)s::%(class_name)s(ExtMachInst machInst, uint64_t _imm)
253 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _imm)
254 {
255 %(constructor)s;
256 if (!(condCode == COND_AL || condCode == COND_UC)) {
257 for (int x = 0; x < _numDestRegs; x++) {
258 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
259 }
260 }
261 }
262}};
263
264def template RegImmOpDeclare {{
265class %(class_name)s : public %(base_class)s
266{
267 protected:
268 public:
269 // Constructor
270 %(class_name)s(ExtMachInst machInst, IntRegIndex _dest, uint64_t _imm);
248};
249}};
250
251def template ImmOpConstructor {{
252 %(class_name)s::%(class_name)s(ExtMachInst machInst, uint64_t _imm)
253 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _imm)
254 {
255 %(constructor)s;
256 if (!(condCode == COND_AL || condCode == COND_UC)) {
257 for (int x = 0; x < _numDestRegs; x++) {
258 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
259 }
260 }
261 }
262}};
263
264def template RegImmOpDeclare {{
265class %(class_name)s : public %(base_class)s
266{
267 protected:
268 public:
269 // Constructor
270 %(class_name)s(ExtMachInst machInst, IntRegIndex _dest, uint64_t _imm);
271 Fault execute(ExecContext *, Trace::InstRecord *) const;
271 Fault execute(ExecContext *, Trace::InstRecord *) const override;
272};
273}};
274
275def template RegImmOpConstructor {{
276 %(class_name)s::%(class_name)s(ExtMachInst machInst,
277 IntRegIndex _dest, uint64_t _imm)
278 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _dest, _imm)
279 {
280 %(constructor)s;
281 if (!(condCode == COND_AL || condCode == COND_UC)) {
282 for (int x = 0; x < _numDestRegs; x++) {
283 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
284 }
285 }
286 }
287}};
288
289def template RegRegOpDeclare {{
290class %(class_name)s : public %(base_class)s
291{
292 protected:
293 public:
294 // Constructor
295 %(class_name)s(ExtMachInst machInst,
296 IntRegIndex _dest, IntRegIndex _op1);
272};
273}};
274
275def template RegImmOpConstructor {{
276 %(class_name)s::%(class_name)s(ExtMachInst machInst,
277 IntRegIndex _dest, uint64_t _imm)
278 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _dest, _imm)
279 {
280 %(constructor)s;
281 if (!(condCode == COND_AL || condCode == COND_UC)) {
282 for (int x = 0; x < _numDestRegs; x++) {
283 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
284 }
285 }
286 }
287}};
288
289def template RegRegOpDeclare {{
290class %(class_name)s : public %(base_class)s
291{
292 protected:
293 public:
294 // Constructor
295 %(class_name)s(ExtMachInst machInst,
296 IntRegIndex _dest, IntRegIndex _op1);
297 Fault execute(ExecContext *, Trace::InstRecord *) const;
297 Fault execute(ExecContext *, Trace::InstRecord *) const override;
298};
299}};
300
301def template RegRegOpConstructor {{
302 %(class_name)s::%(class_name)s(ExtMachInst machInst,
303 IntRegIndex _dest, IntRegIndex _op1)
304 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _dest, _op1)
305 {
306 %(constructor)s;
307 if (!(condCode == COND_AL || condCode == COND_UC)) {
308 for (int x = 0; x < _numDestRegs; x++) {
309 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
310 }
311 }
312 }
313}};
314
315def template RegRegRegImmOpDeclare {{
316class %(class_name)s : public %(base_class)s
317{
318 protected:
319 public:
320 // Constructor
321 %(class_name)s(ExtMachInst machInst,
322 IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2,
323 uint64_t _imm);
298};
299}};
300
301def template RegRegOpConstructor {{
302 %(class_name)s::%(class_name)s(ExtMachInst machInst,
303 IntRegIndex _dest, IntRegIndex _op1)
304 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _dest, _op1)
305 {
306 %(constructor)s;
307 if (!(condCode == COND_AL || condCode == COND_UC)) {
308 for (int x = 0; x < _numDestRegs; x++) {
309 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
310 }
311 }
312 }
313}};
314
315def template RegRegRegImmOpDeclare {{
316class %(class_name)s : public %(base_class)s
317{
318 protected:
319 public:
320 // Constructor
321 %(class_name)s(ExtMachInst machInst,
322 IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2,
323 uint64_t _imm);
324 Fault execute(ExecContext *, Trace::InstRecord *) const;
324 Fault execute(ExecContext *, Trace::InstRecord *) const override;
325};
326}};
327
328def template RegRegRegImmOpConstructor {{
329 %(class_name)s::%(class_name)s(ExtMachInst machInst,
330 IntRegIndex _dest,
331 IntRegIndex _op1,
332 IntRegIndex _op2,
333 uint64_t _imm)
334 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
335 _dest, _op1, _op2, _imm)
336 {
337 %(constructor)s;
338 if (!(condCode == COND_AL || condCode == COND_UC)) {
339 for (int x = 0; x < _numDestRegs; x++) {
340 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
341 }
342 }
343 }
344}};
345
346def template RegRegRegRegOpDeclare {{
347class %(class_name)s : public %(base_class)s
348{
349 protected:
350 public:
351 // Constructor
352 %(class_name)s(ExtMachInst machInst,
353 IntRegIndex _dest, IntRegIndex _op1,
354 IntRegIndex _op2, IntRegIndex _op3);
325};
326}};
327
328def template RegRegRegImmOpConstructor {{
329 %(class_name)s::%(class_name)s(ExtMachInst machInst,
330 IntRegIndex _dest,
331 IntRegIndex _op1,
332 IntRegIndex _op2,
333 uint64_t _imm)
334 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
335 _dest, _op1, _op2, _imm)
336 {
337 %(constructor)s;
338 if (!(condCode == COND_AL || condCode == COND_UC)) {
339 for (int x = 0; x < _numDestRegs; x++) {
340 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
341 }
342 }
343 }
344}};
345
346def template RegRegRegRegOpDeclare {{
347class %(class_name)s : public %(base_class)s
348{
349 protected:
350 public:
351 // Constructor
352 %(class_name)s(ExtMachInst machInst,
353 IntRegIndex _dest, IntRegIndex _op1,
354 IntRegIndex _op2, IntRegIndex _op3);
355 Fault execute(ExecContext *, Trace::InstRecord *) const;
355 Fault execute(ExecContext *, Trace::InstRecord *) const override;
356};
357}};
358
359def template RegRegRegRegOpConstructor {{
360 %(class_name)s::%(class_name)s(ExtMachInst machInst,
361 IntRegIndex _dest,
362 IntRegIndex _op1,
363 IntRegIndex _op2,
364 IntRegIndex _op3)
365 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
366 _dest, _op1, _op2, _op3)
367 {
368 %(constructor)s;
369 if (!(condCode == COND_AL || condCode == COND_UC)) {
370 for (int x = 0; x < _numDestRegs; x++) {
371 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
372 }
373 }
374 }
375}};
376
377def template RegRegRegOpDeclare {{
378class %(class_name)s : public %(base_class)s
379{
380 protected:
381 public:
382 // Constructor
383 %(class_name)s(ExtMachInst machInst,
384 IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2);
356};
357}};
358
359def template RegRegRegRegOpConstructor {{
360 %(class_name)s::%(class_name)s(ExtMachInst machInst,
361 IntRegIndex _dest,
362 IntRegIndex _op1,
363 IntRegIndex _op2,
364 IntRegIndex _op3)
365 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
366 _dest, _op1, _op2, _op3)
367 {
368 %(constructor)s;
369 if (!(condCode == COND_AL || condCode == COND_UC)) {
370 for (int x = 0; x < _numDestRegs; x++) {
371 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
372 }
373 }
374 }
375}};
376
377def template RegRegRegOpDeclare {{
378class %(class_name)s : public %(base_class)s
379{
380 protected:
381 public:
382 // Constructor
383 %(class_name)s(ExtMachInst machInst,
384 IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2);
385 Fault execute(ExecContext *, Trace::InstRecord *) const;
385 Fault execute(ExecContext *, Trace::InstRecord *) const override;
386};
387}};
388
389def template RegRegRegOpConstructor {{
390 %(class_name)s::%(class_name)s(ExtMachInst machInst,
391 IntRegIndex _dest,
392 IntRegIndex _op1,
393 IntRegIndex _op2)
394 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
395 _dest, _op1, _op2)
396 {
397 %(constructor)s;
398 if (!(condCode == COND_AL || condCode == COND_UC)) {
399 for (int x = 0; x < _numDestRegs; x++) {
400 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
401 }
402 }
403 }
404}};
405
406def template RegRegImmOpDeclare {{
407class %(class_name)s : public %(base_class)s
408{
409 protected:
410 public:
411 // Constructor
412 %(class_name)s(ExtMachInst machInst,
413 IntRegIndex _dest, IntRegIndex _op1,
414 uint64_t _imm);
386};
387}};
388
389def template RegRegRegOpConstructor {{
390 %(class_name)s::%(class_name)s(ExtMachInst machInst,
391 IntRegIndex _dest,
392 IntRegIndex _op1,
393 IntRegIndex _op2)
394 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
395 _dest, _op1, _op2)
396 {
397 %(constructor)s;
398 if (!(condCode == COND_AL || condCode == COND_UC)) {
399 for (int x = 0; x < _numDestRegs; x++) {
400 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
401 }
402 }
403 }
404}};
405
406def template RegRegImmOpDeclare {{
407class %(class_name)s : public %(base_class)s
408{
409 protected:
410 public:
411 // Constructor
412 %(class_name)s(ExtMachInst machInst,
413 IntRegIndex _dest, IntRegIndex _op1,
414 uint64_t _imm);
415 Fault execute(ExecContext *, Trace::InstRecord *) const;
415 Fault execute(ExecContext *, Trace::InstRecord *) const override;
416};
417}};
418
419def template RegRegImmOpConstructor {{
420 %(class_name)s::%(class_name)s(ExtMachInst machInst,
421 IntRegIndex _dest,
422 IntRegIndex _op1,
423 uint64_t _imm)
424 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
425 _dest, _op1, _imm)
426 {
427 %(constructor)s;
428 if (!(condCode == COND_AL || condCode == COND_UC)) {
429 for (int x = 0; x < _numDestRegs; x++) {
430 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
431 }
432 }
433 }
434}};
435
436def template MiscRegRegImmOpDeclare {{
437class %(class_name)s : public %(base_class)s
438{
439 protected:
440 public:
441 // Constructor
442 %(class_name)s(ExtMachInst machInst,
443 MiscRegIndex _dest, IntRegIndex _op1,
444 uint64_t _imm);
416};
417}};
418
419def template RegRegImmOpConstructor {{
420 %(class_name)s::%(class_name)s(ExtMachInst machInst,
421 IntRegIndex _dest,
422 IntRegIndex _op1,
423 uint64_t _imm)
424 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
425 _dest, _op1, _imm)
426 {
427 %(constructor)s;
428 if (!(condCode == COND_AL || condCode == COND_UC)) {
429 for (int x = 0; x < _numDestRegs; x++) {
430 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
431 }
432 }
433 }
434}};
435
436def template MiscRegRegImmOpDeclare {{
437class %(class_name)s : public %(base_class)s
438{
439 protected:
440 public:
441 // Constructor
442 %(class_name)s(ExtMachInst machInst,
443 MiscRegIndex _dest, IntRegIndex _op1,
444 uint64_t _imm);
445 Fault execute(ExecContext *, Trace::InstRecord *) const;
445 Fault execute(ExecContext *, Trace::InstRecord *) const override;
446};
447}};
448
449def template MiscRegRegImmOpConstructor {{
450 %(class_name)s::%(class_name)s(ExtMachInst machInst,
451 MiscRegIndex _dest,
452 IntRegIndex _op1,
453 uint64_t _imm)
454 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
455 _dest, _op1, _imm)
456 {
457 %(constructor)s;
458 if (!(condCode == COND_AL || condCode == COND_UC)) {
459 for (int x = 0; x < _numDestRegs; x++) {
460 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
461 }
462 }
463 }
464}};
465
466def template RegMiscRegImmOpDeclare {{
467class %(class_name)s : public %(base_class)s
468{
469 protected:
470 public:
471 // Constructor
472 %(class_name)s(ExtMachInst machInst,
473 IntRegIndex _dest, MiscRegIndex _op1,
474 uint64_t _imm);
446};
447}};
448
449def template MiscRegRegImmOpConstructor {{
450 %(class_name)s::%(class_name)s(ExtMachInst machInst,
451 MiscRegIndex _dest,
452 IntRegIndex _op1,
453 uint64_t _imm)
454 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
455 _dest, _op1, _imm)
456 {
457 %(constructor)s;
458 if (!(condCode == COND_AL || condCode == COND_UC)) {
459 for (int x = 0; x < _numDestRegs; x++) {
460 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
461 }
462 }
463 }
464}};
465
466def template RegMiscRegImmOpDeclare {{
467class %(class_name)s : public %(base_class)s
468{
469 protected:
470 public:
471 // Constructor
472 %(class_name)s(ExtMachInst machInst,
473 IntRegIndex _dest, MiscRegIndex _op1,
474 uint64_t _imm);
475 Fault execute(ExecContext *, Trace::InstRecord *) const;
475 Fault execute(ExecContext *, Trace::InstRecord *) const override;
476};
477}};
478
479def template RegMiscRegImmOpConstructor {{
480 %(class_name)s::%(class_name)s(ExtMachInst machInst,
481 IntRegIndex _dest,
482 MiscRegIndex _op1,
483 uint64_t _imm)
484 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
485 _dest, _op1, _imm)
486 {
487 %(constructor)s;
488 if (!(condCode == COND_AL || condCode == COND_UC)) {
489 for (int x = 0; x < _numDestRegs; x++) {
490 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
491 }
492 }
493 }
494}};
495
496def template RegImmImmOpDeclare {{
497class %(class_name)s : public %(base_class)s
498{
499 protected:
500 public:
501 // Constructor
502 %(class_name)s(ExtMachInst machInst,
503 IntRegIndex _dest, uint64_t _imm1, uint64_t _imm2);
476};
477}};
478
479def template RegMiscRegImmOpConstructor {{
480 %(class_name)s::%(class_name)s(ExtMachInst machInst,
481 IntRegIndex _dest,
482 MiscRegIndex _op1,
483 uint64_t _imm)
484 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
485 _dest, _op1, _imm)
486 {
487 %(constructor)s;
488 if (!(condCode == COND_AL || condCode == COND_UC)) {
489 for (int x = 0; x < _numDestRegs; x++) {
490 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
491 }
492 }
493 }
494}};
495
496def template RegImmImmOpDeclare {{
497class %(class_name)s : public %(base_class)s
498{
499 protected:
500 public:
501 // Constructor
502 %(class_name)s(ExtMachInst machInst,
503 IntRegIndex _dest, uint64_t _imm1, uint64_t _imm2);
504 Fault execute(ExecContext *, Trace::InstRecord *) const;
504 Fault execute(ExecContext *, Trace::InstRecord *) const override;
505};
506}};
507
508def template RegImmImmOpConstructor {{
509 %(class_name)s::%(class_name)s(ExtMachInst machInst,
510 IntRegIndex _dest,
511 uint64_t _imm1,
512 uint64_t _imm2)
513 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
514 _dest, _imm1, _imm2)
515 {
516 %(constructor)s;
517 if (!(condCode == COND_AL || condCode == COND_UC)) {
518 for (int x = 0; x < _numDestRegs; x++) {
519 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
520 }
521 }
522 }
523}};
524
525def template RegRegImmImmOpDeclare {{
526class %(class_name)s : public %(base_class)s
527{
528 protected:
529 public:
530 // Constructor
531 %(class_name)s(ExtMachInst machInst,
532 IntRegIndex _dest, IntRegIndex _op1,
533 uint64_t _imm1, uint64_t _imm2);
505};
506}};
507
508def template RegImmImmOpConstructor {{
509 %(class_name)s::%(class_name)s(ExtMachInst machInst,
510 IntRegIndex _dest,
511 uint64_t _imm1,
512 uint64_t _imm2)
513 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
514 _dest, _imm1, _imm2)
515 {
516 %(constructor)s;
517 if (!(condCode == COND_AL || condCode == COND_UC)) {
518 for (int x = 0; x < _numDestRegs; x++) {
519 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
520 }
521 }
522 }
523}};
524
525def template RegRegImmImmOpDeclare {{
526class %(class_name)s : public %(base_class)s
527{
528 protected:
529 public:
530 // Constructor
531 %(class_name)s(ExtMachInst machInst,
532 IntRegIndex _dest, IntRegIndex _op1,
533 uint64_t _imm1, uint64_t _imm2);
534 Fault execute(ExecContext *, Trace::InstRecord *) const;
534 Fault execute(ExecContext *, Trace::InstRecord *) const override;
535};
536}};
537
538def template RegRegImmImmOpConstructor {{
539 %(class_name)s::%(class_name)s(ExtMachInst machInst,
540 IntRegIndex _dest,
541 IntRegIndex _op1,
542 uint64_t _imm1,
543 uint64_t _imm2)
544 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
545 _dest, _op1, _imm1, _imm2)
546 {
547 %(constructor)s;
548 if (!(condCode == COND_AL || condCode == COND_UC)) {
549 for (int x = 0; x < _numDestRegs; x++) {
550 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
551 }
552 }
553 }
554}};
555
556def template RegImmRegOpDeclare {{
557class %(class_name)s : public %(base_class)s
558{
559 protected:
560 public:
561 // Constructor
562 %(class_name)s(ExtMachInst machInst,
563 IntRegIndex _dest, uint64_t _imm, IntRegIndex _op1);
535};
536}};
537
538def template RegRegImmImmOpConstructor {{
539 %(class_name)s::%(class_name)s(ExtMachInst machInst,
540 IntRegIndex _dest,
541 IntRegIndex _op1,
542 uint64_t _imm1,
543 uint64_t _imm2)
544 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
545 _dest, _op1, _imm1, _imm2)
546 {
547 %(constructor)s;
548 if (!(condCode == COND_AL || condCode == COND_UC)) {
549 for (int x = 0; x < _numDestRegs; x++) {
550 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
551 }
552 }
553 }
554}};
555
556def template RegImmRegOpDeclare {{
557class %(class_name)s : public %(base_class)s
558{
559 protected:
560 public:
561 // Constructor
562 %(class_name)s(ExtMachInst machInst,
563 IntRegIndex _dest, uint64_t _imm, IntRegIndex _op1);
564 Fault execute(ExecContext *, Trace::InstRecord *) const;
564 Fault execute(ExecContext *, Trace::InstRecord *) const override;
565};
566}};
567
568def template RegImmRegOpConstructor {{
569 %(class_name)s::%(class_name)s(ExtMachInst machInst,
570 IntRegIndex _dest,
571 uint64_t _imm,
572 IntRegIndex _op1)
573 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
574 _dest, _imm, _op1)
575 {
576 %(constructor)s;
577 if (!(condCode == COND_AL || condCode == COND_UC)) {
578 for (int x = 0; x < _numDestRegs; x++) {
579 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
580 }
581 }
582 }
583}};
584
585def template RegImmRegShiftOpDeclare {{
586class %(class_name)s : public %(base_class)s
587{
588 protected:
589 public:
590 // Constructor
591 %(class_name)s(ExtMachInst machInst,
592 IntRegIndex _dest, uint64_t _imm, IntRegIndex _op1,
593 int32_t _shiftAmt, ArmShiftType _shiftType);
565};
566}};
567
568def template RegImmRegOpConstructor {{
569 %(class_name)s::%(class_name)s(ExtMachInst machInst,
570 IntRegIndex _dest,
571 uint64_t _imm,
572 IntRegIndex _op1)
573 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
574 _dest, _imm, _op1)
575 {
576 %(constructor)s;
577 if (!(condCode == COND_AL || condCode == COND_UC)) {
578 for (int x = 0; x < _numDestRegs; x++) {
579 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
580 }
581 }
582 }
583}};
584
585def template RegImmRegShiftOpDeclare {{
586class %(class_name)s : public %(base_class)s
587{
588 protected:
589 public:
590 // Constructor
591 %(class_name)s(ExtMachInst machInst,
592 IntRegIndex _dest, uint64_t _imm, IntRegIndex _op1,
593 int32_t _shiftAmt, ArmShiftType _shiftType);
594 Fault execute(ExecContext *, Trace::InstRecord *) const;
594 Fault execute(ExecContext *, Trace::InstRecord *) const override;
595};
596}};
597
598def template RegImmRegShiftOpConstructor {{
599 %(class_name)s::%(class_name)s(ExtMachInst machInst,
600 IntRegIndex _dest,
601 uint64_t _imm,
602 IntRegIndex _op1,
603 int32_t _shiftAmt,
604 ArmShiftType _shiftType)
605 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
606 _dest, _imm, _op1, _shiftAmt, _shiftType)
607 {
608 %(constructor)s;
609 if (!(condCode == COND_AL || condCode == COND_UC)) {
610 for (int x = 0; x < _numDestRegs; x++) {
611 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
612 }
613 }
614 }
615}};
616
617def template MiscRegRegImmMemOpDeclare {{
618 class %(class_name)s : public %(base_class)s
619 {
620 protected:
621 public:
622 // Constructor
623 %(class_name)s(ExtMachInst machInst,
624 MiscRegIndex _dest, IntRegIndex _op1,
625 uint64_t _imm);
595};
596}};
597
598def template RegImmRegShiftOpConstructor {{
599 %(class_name)s::%(class_name)s(ExtMachInst machInst,
600 IntRegIndex _dest,
601 uint64_t _imm,
602 IntRegIndex _op1,
603 int32_t _shiftAmt,
604 ArmShiftType _shiftType)
605 : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
606 _dest, _imm, _op1, _shiftAmt, _shiftType)
607 {
608 %(constructor)s;
609 if (!(condCode == COND_AL || condCode == COND_UC)) {
610 for (int x = 0; x < _numDestRegs; x++) {
611 _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
612 }
613 }
614 }
615}};
616
617def template MiscRegRegImmMemOpDeclare {{
618 class %(class_name)s : public %(base_class)s
619 {
620 protected:
621 public:
622 // Constructor
623 %(class_name)s(ExtMachInst machInst,
624 MiscRegIndex _dest, IntRegIndex _op1,
625 uint64_t _imm);
626 Fault execute(ExecContext *, Trace::InstRecord *) const;
627 Fault initiateAcc(ExecContext *, Trace::InstRecord *) const;
628 Fault completeAcc(PacketPtr, ExecContext *, Trace::InstRecord *) const;
626 Fault execute(ExecContext *, Trace::InstRecord *) const override;
627 Fault initiateAcc(ExecContext *, Trace::InstRecord *) const override;
628 Fault completeAcc(PacketPtr, ExecContext *,
629 Trace::InstRecord *) const override;
629 };
630}};
631
632def template Mcr15Execute {{
633 Fault %(class_name)s::execute(ExecContext *xc,
634 Trace::InstRecord *traceData) const
635 {
636 Addr EA;
637 Fault fault = NoFault;
638
639 %(op_decl)s;
640 %(op_rd)s;
641 %(ea_code)s;
642
643 if (%(predicate_test)s) {
644 if (fault == NoFault) {
645 %(memacc_code)s;
646 }
647
648 if (fault == NoFault) {
649 Addr op_size = xc->tcBase()->getSystemPtr()->cacheLineSize();
650 EA &= ~(op_size - 1);
651 fault = xc->writeMem(NULL, op_size, EA, memAccessFlags, NULL);
652 }
653 } else {
654 xc->setPredicate(false);
655 }
656
657 return fault;
658 }
659}};
660
661def template Mcr15InitiateAcc {{
662 Fault %(class_name)s::initiateAcc(ExecContext *xc,
663 Trace::InstRecord *traceData) const
664 {
665 Addr EA;
666 Fault fault = NoFault;
667
668 %(op_decl)s;
669 %(op_rd)s;
670 %(ea_code)s;
671
672 if (%(predicate_test)s) {
673 if (fault == NoFault) {
674 %(memacc_code)s;
675 }
676
677 if (fault == NoFault) {
678 Addr op_size = xc->tcBase()->getSystemPtr()->cacheLineSize();
679 EA &= ~(op_size - 1);
680 fault = xc->writeMem(NULL, op_size, EA, memAccessFlags, NULL);
681 }
682 } else {
683 xc->setPredicate(false);
684 }
685
686 return fault;
687 }
688}};
689
690def template Mcr15CompleteAcc {{
691 Fault %(class_name)s::completeAcc(PacketPtr pkt,
692 ExecContext *xc,
693 Trace::InstRecord *traceData) const
694 {
695 return NoFault;
696 }
697}};
630 };
631}};
632
633def template Mcr15Execute {{
634 Fault %(class_name)s::execute(ExecContext *xc,
635 Trace::InstRecord *traceData) const
636 {
637 Addr EA;
638 Fault fault = NoFault;
639
640 %(op_decl)s;
641 %(op_rd)s;
642 %(ea_code)s;
643
644 if (%(predicate_test)s) {
645 if (fault == NoFault) {
646 %(memacc_code)s;
647 }
648
649 if (fault == NoFault) {
650 Addr op_size = xc->tcBase()->getSystemPtr()->cacheLineSize();
651 EA &= ~(op_size - 1);
652 fault = xc->writeMem(NULL, op_size, EA, memAccessFlags, NULL);
653 }
654 } else {
655 xc->setPredicate(false);
656 }
657
658 return fault;
659 }
660}};
661
662def template Mcr15InitiateAcc {{
663 Fault %(class_name)s::initiateAcc(ExecContext *xc,
664 Trace::InstRecord *traceData) const
665 {
666 Addr EA;
667 Fault fault = NoFault;
668
669 %(op_decl)s;
670 %(op_rd)s;
671 %(ea_code)s;
672
673 if (%(predicate_test)s) {
674 if (fault == NoFault) {
675 %(memacc_code)s;
676 }
677
678 if (fault == NoFault) {
679 Addr op_size = xc->tcBase()->getSystemPtr()->cacheLineSize();
680 EA &= ~(op_size - 1);
681 fault = xc->writeMem(NULL, op_size, EA, memAccessFlags, NULL);
682 }
683 } else {
684 xc->setPredicate(false);
685 }
686
687 return fault;
688 }
689}};
690
691def template Mcr15CompleteAcc {{
692 Fault %(class_name)s::completeAcc(PacketPtr pkt,
693 ExecContext *xc,
694 Trace::InstRecord *traceData) const
695 {
696 return NoFault;
697 }
698}};