misc.isa revision 10037
1// -*- mode:c++ -*-
2
3// Copyright (c) 2010-2013 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        %(BasicExecDeclare)s
48};
49}};
50
51def template MrsConstructor {{
52    inline %(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        %(BasicExecDeclare)s
77};
78}};
79
80def template MrsBankedRegConstructor {{
81    inline %(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        %(BasicExecDeclare)s
108};
109}};
110
111def template MsrBankedRegConstructor {{
112    inline %(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        %(BasicExecDeclare)s
136};
137}};
138
139def template MsrRegConstructor {{
140    inline %(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        %(BasicExecDeclare)s
162};
163}};
164
165def template MsrImmConstructor {{
166    inline %(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, IntRegIndex _op1,
187                       IntRegIndex _dest, IntRegIndex _dest2, uint32_t imm);
188        %(BasicExecDeclare)s
189};
190}};
191
192def template MrrcOpConstructor {{
193    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
194                                          IntRegIndex 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                       IntRegIndex _dest, uint32_t imm);
218        %(BasicExecDeclare)s
219};
220}};
221
222def template McrrOpConstructor {{
223    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
224                                          IntRegIndex op1,
225                                          IntRegIndex op2,
226                                          IntRegIndex 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        %(BasicExecDeclare)s
248};
249}};
250
251def template ImmOpConstructor {{
252    inline %(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        %(BasicExecDeclare)s
272};
273}};
274
275def template RegImmOpConstructor {{
276    inline %(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        %(BasicExecDeclare)s
298};
299}};
300
301def template RegRegOpConstructor {{
302    inline %(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        %(BasicExecDeclare)s
325};
326}};
327
328def template RegRegRegImmOpConstructor {{
329    inline %(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        %(BasicExecDeclare)s
356};
357}};
358
359def template RegRegRegRegOpConstructor {{
360    inline %(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        %(BasicExecDeclare)s
386};
387}};
388
389def template RegRegRegOpConstructor {{
390    inline %(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        %(BasicExecDeclare)s
416};
417}};
418
419def template RegRegImmOpConstructor {{
420    inline %(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 RegImmImmOpDeclare {{
437class %(class_name)s : public %(base_class)s
438{
439  protected:
440    public:
441        // Constructor
442        %(class_name)s(ExtMachInst machInst,
443                       IntRegIndex _dest, uint64_t _imm1, uint64_t _imm2);
444        %(BasicExecDeclare)s
445};
446}};
447
448def template RegImmImmOpConstructor {{
449    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
450                                          IntRegIndex _dest,
451                                          uint64_t _imm1,
452                                          uint64_t _imm2)
453        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
454                         _dest, _imm1, _imm2)
455    {
456        %(constructor)s;
457        if (!(condCode == COND_AL || condCode == COND_UC)) {
458            for (int x = 0; x < _numDestRegs; x++) {
459                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
460            }
461        }
462    }
463}};
464
465def template RegRegImmImmOpDeclare {{
466class %(class_name)s : public %(base_class)s
467{
468  protected:
469    public:
470        // Constructor
471        %(class_name)s(ExtMachInst machInst,
472                       IntRegIndex _dest, IntRegIndex _op1,
473                       uint64_t _imm1, uint64_t _imm2);
474        %(BasicExecDeclare)s
475};
476}};
477
478def template RegRegImmImmOpConstructor {{
479    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
480                                          IntRegIndex _dest,
481                                          IntRegIndex _op1,
482                                          uint64_t _imm1,
483                                          uint64_t _imm2)
484        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
485                         _dest, _op1, _imm1, _imm2)
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 RegImmRegOpDeclare {{
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 _imm, IntRegIndex _op1);
504        %(BasicExecDeclare)s
505};
506}};
507
508def template RegImmRegOpConstructor {{
509    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
510                                          IntRegIndex _dest,
511                                          uint64_t _imm,
512                                          IntRegIndex _op1)
513        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
514                         _dest, _imm, _op1)
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 RegImmRegShiftOpDeclare {{
526class %(class_name)s : public %(base_class)s
527{
528  protected:
529    public:
530        // Constructor
531        %(class_name)s(ExtMachInst machInst,
532                       IntRegIndex _dest, uint64_t _imm, IntRegIndex _op1,
533                       int32_t _shiftAmt, ArmShiftType _shiftType);
534        %(BasicExecDeclare)s
535};
536}};
537
538def template RegImmRegShiftOpConstructor {{
539    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
540                                          IntRegIndex _dest,
541                                          uint64_t _imm,
542                                          IntRegIndex _op1,
543                                          int32_t _shiftAmt,
544                                          ArmShiftType _shiftType)
545        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
546                         _dest, _imm, _op1, _shiftAmt, _shiftType)
547    {
548        %(constructor)s;
549        if (!(condCode == COND_AL || condCode == COND_UC)) {
550            for (int x = 0; x < _numDestRegs; x++) {
551                _srcRegIdx[_numSrcRegs++] = _destRegIdx[x];
552            }
553        }
554    }
555}};
556
557