mem.isa revision 7639:8c09b7ff5b57
1// -*- mode:c++ -*-
2
3// Copyright (c) 2010 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// Copyright (c) 2007-2008 The Florida State University
16// All rights reserved.
17//
18// Redistribution and use in source and binary forms, with or without
19// modification, are permitted provided that the following conditions are
20// met: redistributions of source code must retain the above copyright
21// notice, this list of conditions and the following disclaimer;
22// redistributions in binary form must reproduce the above copyright
23// notice, this list of conditions and the following disclaimer in the
24// documentation and/or other materials provided with the distribution;
25// neither the name of the copyright holders nor the names of its
26// contributors may be used to endorse or promote products derived from
27// this software without specific prior written permission.
28//
29// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
30// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
31// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
32// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
33// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
34// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
35// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
36// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
37// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
38// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
39// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
40//
41// Authors: Stephen Hines
42
43
44def template SwapExecute {{
45    Fault %(class_name)s::execute(%(CPU_exec_context)s *xc,
46                                  Trace::InstRecord *traceData) const
47    {
48        Addr EA;
49        Fault fault = NoFault;
50
51        %(op_decl)s;
52        uint64_t memData = 0;
53        %(op_rd)s;
54        %(ea_code)s;
55
56        if (%(predicate_test)s)
57        {
58            %(preacc_code)s;
59
60            if (fault == NoFault) {
61                fault = xc->write((uint%(mem_acc_size)d_t&)Mem,
62                        EA, memAccessFlags, &memData);
63            }
64
65            if (fault == NoFault) {
66                %(postacc_code)s;
67            }
68
69            if (fault == NoFault) {
70                %(op_wb)s;
71            }
72        } else {
73            xc->setPredicate(false);
74        }
75
76        if (fault == NoFault && machInst.itstateMask != 0) {
77            xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate);
78        }
79
80        return fault;
81    }
82}};
83
84def template SwapInitiateAcc {{
85    Fault %(class_name)s::initiateAcc(%(CPU_exec_context)s *xc,
86                                      Trace::InstRecord *traceData) const
87    {
88        Addr EA;
89        Fault fault = NoFault;
90
91        %(op_decl)s;
92        uint64_t memData = 0;
93        %(op_rd)s;
94        %(ea_code)s;
95
96        if (%(predicate_test)s)
97        {
98            %(preacc_code)s;
99
100            if (fault == NoFault) {
101                fault = xc->write((uint%(mem_acc_size)d_t&)Mem, EA,
102                                  memAccessFlags, &memData);
103            }
104
105            if (fault == NoFault) {
106                %(op_wb)s;
107            }
108        } else {
109            xc->setPredicate(false);
110        }
111
112        if (fault == NoFault && machInst.itstateMask != 0) {
113            xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate);
114        }
115
116        return fault;
117    }
118}};
119
120def template SwapCompleteAcc {{
121    Fault %(class_name)s::completeAcc(PacketPtr pkt,
122                                      %(CPU_exec_context)s *xc,
123                                      Trace::InstRecord *traceData) const
124    {
125        Fault fault = NoFault;
126
127        %(op_decl)s;
128        %(op_rd)s;
129
130        if (%(predicate_test)s)
131        {
132            // ARM instructions will not have a pkt if the predicate is false
133            uint64_t memData = pkt->get<typeof(Mem)>();
134
135            %(postacc_code)s;
136
137            if (fault == NoFault) {
138                %(op_wb)s;
139            }
140        }
141
142        if (fault == NoFault && machInst.itstateMask != 0) {
143            xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate);
144        }
145
146        return fault;
147    }
148}};
149
150def template LoadExecute {{
151    Fault %(class_name)s::execute(%(CPU_exec_context)s *xc,
152                                  Trace::InstRecord *traceData) const
153    {
154        Addr EA;
155        Fault fault = NoFault;
156
157        %(op_decl)s;
158        %(op_rd)s;
159        %(ea_code)s;
160
161        if (%(predicate_test)s)
162        {
163            if (fault == NoFault) {
164                fault = xc->read(EA, (uint%(mem_acc_size)d_t&)Mem, memAccessFlags);
165                %(memacc_code)s;
166            }
167
168            if (fault == NoFault) {
169                %(op_wb)s;
170            }
171        } else {
172            xc->setPredicate(false);
173        }
174
175        if (fault == NoFault && machInst.itstateMask != 0) {
176            xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate);
177        }
178
179        return fault;
180    }
181}};
182
183def template NeonLoadExecute {{
184    template <class Element>
185    Fault %(class_name)s<Element>::execute(
186            %(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const
187    {
188        Addr EA;
189        Fault fault = NoFault;
190
191        %(op_decl)s;
192        %(mem_decl)s;
193        %(op_rd)s;
194        %(ea_code)s;
195
196        MemUnion memUnion;
197        uint8_t *dataPtr = memUnion.bytes;
198
199        if (%(predicate_test)s)
200        {
201            if (fault == NoFault) {
202                fault = xc->readBytes(EA, dataPtr, %(size)d, memAccessFlags);
203                %(memacc_code)s;
204            }
205
206            if (fault == NoFault) {
207                %(op_wb)s;
208            }
209        }
210
211        if (fault == NoFault && machInst.itstateMask != 0) {
212            xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate);
213        }
214
215        return fault;
216    }
217}};
218
219def template StoreExecute {{
220    Fault %(class_name)s::execute(%(CPU_exec_context)s *xc,
221                                  Trace::InstRecord *traceData) const
222    {
223        Addr EA;
224        Fault fault = NoFault;
225
226        %(op_decl)s;
227        %(op_rd)s;
228        %(ea_code)s;
229
230        if (%(predicate_test)s)
231        {
232            if (fault == NoFault) {
233                %(memacc_code)s;
234            }
235
236            if (fault == NoFault) {
237                fault = xc->write((uint%(mem_acc_size)d_t&)Mem, EA,
238                                  memAccessFlags, NULL);
239            }
240
241            if (fault == NoFault) {
242                %(op_wb)s;
243            }
244        } else {
245            xc->setPredicate(false);
246        }
247
248        if (fault == NoFault && machInst.itstateMask != 0) {
249            xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate);
250        }
251
252        return fault;
253    }
254}};
255
256def template NeonStoreExecute {{
257    template <class Element>
258    Fault %(class_name)s<Element>::execute(
259            %(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const
260    {
261        Addr EA;
262        Fault fault = NoFault;
263
264        %(op_decl)s;
265        %(mem_decl)s;
266        %(op_rd)s;
267        %(ea_code)s;
268
269        MemUnion memUnion;
270        uint8_t *dataPtr = memUnion.bytes;
271
272        if (%(predicate_test)s)
273        {
274            if (fault == NoFault) {
275                %(memacc_code)s;
276            }
277
278            if (fault == NoFault) {
279                fault = xc->writeBytes(dataPtr, %(size)d, EA,
280                                       memAccessFlags, NULL);
281            }
282
283            if (fault == NoFault) {
284                %(op_wb)s;
285            }
286        }
287
288        if (fault == NoFault && machInst.itstateMask != 0) {
289            xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate);
290        }
291
292        return fault;
293    }
294}};
295
296def template StoreExExecute {{
297    Fault %(class_name)s::execute(%(CPU_exec_context)s *xc,
298                                  Trace::InstRecord *traceData) const
299    {
300        Addr EA;
301        Fault fault = NoFault;
302
303        %(op_decl)s;
304        %(op_rd)s;
305        %(ea_code)s;
306
307        if (%(predicate_test)s)
308        {
309            if (fault == NoFault) {
310                %(memacc_code)s;
311            }
312
313            uint64_t writeResult;
314
315            if (fault == NoFault) {
316                fault = xc->write((uint%(mem_acc_size)d_t&)Mem, EA,
317                                  memAccessFlags, &writeResult);
318            }
319
320            if (fault == NoFault) {
321                %(postacc_code)s;
322            }
323
324            if (fault == NoFault) {
325                %(op_wb)s;
326            }
327        } else {
328            xc->setPredicate(false);
329        }
330
331        if (fault == NoFault && machInst.itstateMask != 0) {
332            xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate);
333        }
334
335        return fault;
336    }
337}};
338
339def template StoreExInitiateAcc {{
340    Fault %(class_name)s::initiateAcc(%(CPU_exec_context)s *xc,
341                                      Trace::InstRecord *traceData) const
342    {
343        Addr EA;
344        Fault fault = NoFault;
345
346        %(op_decl)s;
347        %(op_rd)s;
348        %(ea_code)s;
349
350        if (%(predicate_test)s)
351        {
352            if (fault == NoFault) {
353                %(memacc_code)s;
354            }
355
356            if (fault == NoFault) {
357                fault = xc->write((uint%(mem_acc_size)d_t&)Mem, EA,
358                                  memAccessFlags, NULL);
359            }
360
361            // Need to write back any potential address register update
362            if (fault == NoFault) {
363                %(op_wb)s;
364            }
365        } else {
366            xc->setPredicate(false);
367        }
368
369        if (fault == NoFault && machInst.itstateMask != 0) {
370            xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate);
371        }
372
373        return fault;
374    }
375}};
376
377def template StoreInitiateAcc {{
378    Fault %(class_name)s::initiateAcc(%(CPU_exec_context)s *xc,
379                                      Trace::InstRecord *traceData) const
380    {
381        Addr EA;
382        Fault fault = NoFault;
383
384        %(op_decl)s;
385        %(op_rd)s;
386        %(ea_code)s;
387
388        if (%(predicate_test)s)
389        {
390            if (fault == NoFault) {
391                %(memacc_code)s;
392            }
393
394            if (fault == NoFault) {
395                fault = xc->write((uint%(mem_acc_size)d_t&)Mem, EA,
396                                  memAccessFlags, NULL);
397            }
398
399            // Need to write back any potential address register update
400            if (fault == NoFault) {
401                %(op_wb)s;
402            }
403        } else {
404            xc->setPredicate(false);
405        }
406
407        if (fault == NoFault && machInst.itstateMask != 0) {
408            xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate);
409        }
410
411        return fault;
412    }
413}};
414
415def template NeonStoreInitiateAcc {{
416    template <class Element>
417    Fault %(class_name)s<Element>::initiateAcc(
418            %(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const
419    {
420        Addr EA;
421        Fault fault = NoFault;
422
423        %(op_decl)s;
424        %(mem_decl)s;
425        %(op_rd)s;
426        %(ea_code)s;
427
428        if (%(predicate_test)s)
429        {
430            MemUnion memUnion;
431            if (fault == NoFault) {
432                %(memacc_code)s;
433            }
434
435            if (fault == NoFault) {
436                fault = xc->writeBytes(memUnion.bytes, %(size)d, EA,
437                                       memAccessFlags, NULL);
438            }
439
440            // Need to write back any potential address register update
441            if (fault == NoFault) {
442                %(op_wb)s;
443            }
444        }
445
446        if (fault == NoFault && machInst.itstateMask != 0) {
447            xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate);
448        }
449
450        return fault;
451    }
452}};
453
454def template LoadInitiateAcc {{
455    Fault %(class_name)s::initiateAcc(%(CPU_exec_context)s *xc,
456                                      Trace::InstRecord *traceData) const
457    {
458        Addr EA;
459        Fault fault = NoFault;
460
461        %(op_src_decl)s;
462        %(op_rd)s;
463        %(ea_code)s;
464
465        if (%(predicate_test)s)
466        {
467            if (fault == NoFault) {
468                fault = xc->read(EA, (uint%(mem_acc_size)d_t &)Mem, memAccessFlags);
469            }
470        } else {
471            xc->setPredicate(false);
472            if (fault == NoFault && machInst.itstateMask != 0) {
473                xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate);
474            }
475        }
476
477        return fault;
478    }
479}};
480
481def template NeonLoadInitiateAcc {{
482    template <class Element>
483    Fault %(class_name)s<Element>::initiateAcc(
484            %(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const
485    {
486        Addr EA;
487        Fault fault = NoFault;
488
489        %(op_src_decl)s;
490        %(op_rd)s;
491        %(ea_code)s;
492
493        if (%(predicate_test)s)
494        {
495            if (fault == NoFault) {
496                fault = xc->readBytes(EA, NULL, %(size)d, memAccessFlags);
497            }
498        } else if (fault == NoFault && machInst.itstateMask != 0) {
499            xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate);
500        }
501
502        return fault;
503    }
504}};
505
506def template LoadCompleteAcc {{
507    Fault %(class_name)s::completeAcc(PacketPtr pkt,
508                                      %(CPU_exec_context)s *xc,
509                                      Trace::InstRecord *traceData) const
510    {
511        Fault fault = NoFault;
512
513        %(op_decl)s;
514        %(op_rd)s;
515
516        if (%(predicate_test)s)
517        {
518            // ARM instructions will not have a pkt if the predicate is false
519            Mem = pkt->get<typeof(Mem)>();
520
521            if (fault == NoFault) {
522                %(memacc_code)s;
523            }
524
525            if (fault == NoFault) {
526                %(op_wb)s;
527            }
528        }
529
530        if (fault == NoFault && machInst.itstateMask != 0) {
531            xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate);
532        }
533
534        return fault;
535    }
536}};
537
538def template NeonLoadCompleteAcc {{
539    template <class Element>
540    Fault %(class_name)s<Element>::completeAcc(
541            PacketPtr pkt, %(CPU_exec_context)s *xc,
542            Trace::InstRecord *traceData) const
543    {
544        Fault fault = NoFault;
545
546        %(mem_decl)s;
547        %(op_decl)s;
548        %(op_rd)s;
549
550        if (%(predicate_test)s)
551        {
552            // ARM instructions will not have a pkt if the predicate is false
553            MemUnion &memUnion = *(MemUnion *)pkt->getPtr<uint8_t>();
554
555            if (fault == NoFault) {
556                %(memacc_code)s;
557            }
558
559            if (fault == NoFault) {
560                %(op_wb)s;
561            }
562        }
563
564        if (fault == NoFault && machInst.itstateMask != 0) {
565            xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate);
566        }
567
568        return fault;
569    }
570}};
571
572def template StoreCompleteAcc {{
573    Fault %(class_name)s::completeAcc(PacketPtr pkt,
574                                      %(CPU_exec_context)s *xc,
575                                      Trace::InstRecord *traceData) const
576    {
577        Fault fault = NoFault;
578
579        %(op_decl)s;
580        %(op_rd)s;
581
582        if (%(predicate_test)s)
583        {
584            if (fault == NoFault) {
585                %(op_wb)s;
586            }
587        }
588
589        if (fault == NoFault && machInst.itstateMask != 0) {
590            xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate);
591        }
592
593        return fault;
594    }
595}};
596
597def template NeonStoreCompleteAcc {{
598    template <class Element>
599    Fault %(class_name)s<Element>::completeAcc(
600            PacketPtr pkt, %(CPU_exec_context)s *xc,
601            Trace::InstRecord *traceData) const
602    {
603        Fault fault = NoFault;
604
605        %(op_decl)s;
606        %(op_rd)s;
607
608        if (%(predicate_test)s)
609        {
610            if (fault == NoFault) {
611                %(op_wb)s;
612            }
613        }
614
615        if (fault == NoFault && machInst.itstateMask != 0) {
616            xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate);
617        }
618
619        return fault;
620    }
621}};
622
623def template StoreExCompleteAcc {{
624    Fault %(class_name)s::completeAcc(PacketPtr pkt,
625                                      %(CPU_exec_context)s *xc,
626                                      Trace::InstRecord *traceData) const
627    {
628        Fault fault = NoFault;
629
630        %(op_decl)s;
631        %(op_rd)s;
632
633        if (%(predicate_test)s)
634        {
635            uint64_t writeResult = pkt->req->getExtraData();
636            %(postacc_code)s;
637
638            if (fault == NoFault) {
639                %(op_wb)s;
640            }
641        }
642
643        if (fault == NoFault && machInst.itstateMask != 0) {
644            xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate);
645        }
646
647        return fault;
648    }
649}};
650
651def template RfeDeclare {{
652    /**
653     * Static instruction class for "%(mnemonic)s".
654     */
655    class %(class_name)s : public %(base_class)s
656    {
657      public:
658
659        /// Constructor.
660        %(class_name)s(ExtMachInst machInst,
661                uint32_t _base, int _mode, bool _wb);
662
663        %(BasicExecDeclare)s
664
665        %(InitiateAccDeclare)s
666
667        %(CompleteAccDeclare)s
668    };
669}};
670
671def template SrsDeclare {{
672    /**
673     * Static instruction class for "%(mnemonic)s".
674     */
675    class %(class_name)s : public %(base_class)s
676    {
677      public:
678
679        /// Constructor.
680        %(class_name)s(ExtMachInst machInst,
681                uint32_t _regMode, int _mode, bool _wb);
682
683        %(BasicExecDeclare)s
684
685        %(InitiateAccDeclare)s
686
687        %(CompleteAccDeclare)s
688    };
689}};
690
691def template SwapDeclare {{
692    /**
693     * Static instruction class for "%(mnemonic)s".
694     */
695    class %(class_name)s : public %(base_class)s
696    {
697      public:
698
699        /// Constructor.
700        %(class_name)s(ExtMachInst machInst,
701                uint32_t _dest, uint32_t _op1, uint32_t _base);
702
703        %(BasicExecDeclare)s
704
705        %(InitiateAccDeclare)s
706
707        %(CompleteAccDeclare)s
708    };
709}};
710
711def template LoadStoreDImmDeclare {{
712    /**
713     * Static instruction class for "%(mnemonic)s".
714     */
715    class %(class_name)s : public %(base_class)s
716    {
717      public:
718
719        /// Constructor.
720        %(class_name)s(ExtMachInst machInst,
721                uint32_t _dest, uint32_t _dest2,
722                uint32_t _base, bool _add, int32_t _imm);
723
724        %(BasicExecDeclare)s
725
726        %(InitiateAccDeclare)s
727
728        %(CompleteAccDeclare)s
729    };
730}};
731
732def template StoreExDImmDeclare {{
733    /**
734     * Static instruction class for "%(mnemonic)s".
735     */
736    class %(class_name)s : public %(base_class)s
737    {
738      public:
739
740        /// Constructor.
741        %(class_name)s(ExtMachInst machInst,
742                uint32_t _result, uint32_t _dest, uint32_t _dest2,
743                uint32_t _base, bool _add, int32_t _imm);
744
745        %(BasicExecDeclare)s
746
747        %(InitiateAccDeclare)s
748
749        %(CompleteAccDeclare)s
750    };
751}};
752
753def template LoadStoreImmDeclare {{
754    /**
755     * Static instruction class for "%(mnemonic)s".
756     */
757    class %(class_name)s : public %(base_class)s
758    {
759      public:
760
761        /// Constructor.
762        %(class_name)s(ExtMachInst machInst,
763                uint32_t _dest, uint32_t _base, bool _add, int32_t _imm);
764
765        %(BasicExecDeclare)s
766
767        %(InitiateAccDeclare)s
768
769        %(CompleteAccDeclare)s
770    };
771}};
772
773def template StoreExImmDeclare {{
774    /**
775     * Static instruction class for "%(mnemonic)s".
776     */
777    class %(class_name)s : public %(base_class)s
778    {
779      public:
780
781        /// Constructor.
782        %(class_name)s(ExtMachInst machInst,
783                uint32_t _result, uint32_t _dest, uint32_t _base,
784                bool _add, int32_t _imm);
785
786        %(BasicExecDeclare)s
787
788        %(InitiateAccDeclare)s
789
790        %(CompleteAccDeclare)s
791    };
792}};
793
794def template LoadStoreDRegDeclare {{
795    /**
796     * Static instruction class for "%(mnemonic)s".
797     */
798    class %(class_name)s : public %(base_class)s
799    {
800      public:
801
802        /// Constructor.
803        %(class_name)s(ExtMachInst machInst,
804                uint32_t _dest, uint32_t _dest2,
805                uint32_t _base, bool _add,
806                int32_t _shiftAmt, uint32_t _shiftType,
807                uint32_t _index);
808
809        %(BasicExecDeclare)s
810
811        %(InitiateAccDeclare)s
812
813        %(CompleteAccDeclare)s
814    };
815}};
816
817def template LoadStoreRegDeclare {{
818    /**
819     * Static instruction class for "%(mnemonic)s".
820     */
821    class %(class_name)s : public %(base_class)s
822    {
823      public:
824
825        /// Constructor.
826        %(class_name)s(ExtMachInst machInst,
827                uint32_t _dest, uint32_t _base, bool _add,
828                int32_t _shiftAmt, uint32_t _shiftType,
829                uint32_t _index);
830
831        %(BasicExecDeclare)s
832
833        %(InitiateAccDeclare)s
834
835        %(CompleteAccDeclare)s
836    };
837}};
838
839def template InitiateAccDeclare {{
840    Fault initiateAcc(%(CPU_exec_context)s *, Trace::InstRecord *) const;
841}};
842
843def template CompleteAccDeclare {{
844    Fault completeAcc(PacketPtr,  %(CPU_exec_context)s *, Trace::InstRecord *) const;
845}};
846
847def template RfeConstructor {{
848    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
849            uint32_t _base, int _mode, bool _wb)
850         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
851                 (IntRegIndex)_base, (AddrMode)_mode, _wb)
852    {
853        %(constructor)s;
854    }
855}};
856
857def template SrsConstructor {{
858    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
859            uint32_t _regMode, int _mode, bool _wb)
860         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
861                 (OperatingMode)_regMode, (AddrMode)_mode, _wb)
862    {
863        %(constructor)s;
864    }
865}};
866
867def template SwapConstructor {{
868    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
869            uint32_t _dest, uint32_t _op1, uint32_t _base)
870         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
871                 (IntRegIndex)_dest, (IntRegIndex)_op1, (IntRegIndex)_base)
872    {
873        %(constructor)s;
874    }
875}};
876
877def template LoadStoreDImmConstructor {{
878    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
879            uint32_t _dest, uint32_t _dest2,
880            uint32_t _base, bool _add, int32_t _imm)
881         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
882                 (IntRegIndex)_dest, (IntRegIndex)_dest2,
883                 (IntRegIndex)_base, _add, _imm)
884    {
885        %(constructor)s;
886    }
887}};
888
889def template StoreExDImmConstructor {{
890    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
891            uint32_t _result, uint32_t _dest, uint32_t _dest2,
892            uint32_t _base, bool _add, int32_t _imm)
893         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
894                 (IntRegIndex)_result,
895                 (IntRegIndex)_dest, (IntRegIndex)_dest2,
896                 (IntRegIndex)_base, _add, _imm)
897    {
898        %(constructor)s;
899    }
900}};
901
902def template LoadStoreImmConstructor {{
903    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
904            uint32_t _dest, uint32_t _base, bool _add, int32_t _imm)
905         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
906                 (IntRegIndex)_dest, (IntRegIndex)_base, _add, _imm)
907    {
908        %(constructor)s;
909    }
910}};
911
912def template StoreExImmConstructor {{
913    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
914            uint32_t _result, uint32_t _dest, uint32_t _base,
915            bool _add, int32_t _imm)
916         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
917                 (IntRegIndex)_result, (IntRegIndex)_dest,
918                 (IntRegIndex)_base, _add, _imm)
919    {
920        %(constructor)s;
921    }
922}};
923
924def template LoadStoreDRegConstructor {{
925    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
926            uint32_t _dest, uint32_t _dest2, uint32_t _base, bool _add,
927            int32_t _shiftAmt, uint32_t _shiftType, uint32_t _index)
928         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
929                 (IntRegIndex)_dest, (IntRegIndex)_dest2,
930                 (IntRegIndex)_base, _add,
931                 _shiftAmt, (ArmShiftType)_shiftType,
932                 (IntRegIndex)_index)
933    {
934        %(constructor)s;
935    }
936}};
937
938def template LoadStoreRegConstructor {{
939    inline %(class_name)s::%(class_name)s(ExtMachInst machInst,
940            uint32_t _dest, uint32_t _base, bool _add,
941            int32_t _shiftAmt, uint32_t _shiftType, uint32_t _index)
942         : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
943                 (IntRegIndex)_dest, (IntRegIndex)_base, _add,
944                 _shiftAmt, (ArmShiftType)_shiftType,
945                 (IntRegIndex)_index)
946    {
947        %(constructor)s;
948    }
949}};
950