gem5 v24.0.0.0
Loading...
Searching...
No Matches
integer.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2009 The University of Edinburgh
3 * Copyright (c) 2021 IBM Corporation
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met: redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer;
10 * redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution;
13 * neither the name of the copyright holders nor the names of its
14 * contributors may be used to endorse or promote products derived from
15 * this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
31
32namespace gem5
33{
34
35using namespace PowerISA;
36
37std::string
39{
40 std::stringstream ss;
41 bool printDest = true;
42 bool printSrcs = true;
43 bool printSecondSrc = true;
44
45 // Generate the correct mnemonic
46 std::string myMnemonic(mnemonic);
47
48 // Special cases
49 if (myMnemonic == "mtcrf" ||
50 myMnemonic == "mtxer" ||
51 myMnemonic == "mtlr" ||
52 myMnemonic == "mtctr" ||
53 myMnemonic == "mttar" ||
54 myMnemonic == "mttb" ||
55 myMnemonic == "mttbu") {
56 printDest = false;
57 } else if (myMnemonic == "mfcr" ||
58 myMnemonic == "mfxer" ||
59 myMnemonic == "mflr" ||
60 myMnemonic == "mfctr" ||
61 myMnemonic == "mftar" ||
62 myMnemonic == "mftb" ||
63 myMnemonic == "mftbu") {
64 printSrcs = false;
65 }
66
67 // Additional characters depending on isa bits being set
68 if (oe)
69 myMnemonic = myMnemonic + "o";
70 if (rc)
71 myMnemonic = myMnemonic + ".";
72 ccprintf(ss, "%-10s ", myMnemonic);
73
74 // Print the first destination only
75 if (_numDestRegs > 0 && printDest)
77
78 // Print the (possibly) two source registers
79 if (_numSrcRegs > 0 && printSrcs) {
80 if (_numDestRegs > 0 && printDest)
81 ss << ", ";
83 if (_numSrcRegs > 1 && printSecondSrc) {
84 ss << ", ";
86 }
87 }
88
89 return ss.str();
90}
91
92
93std::string
95{
96 std::stringstream ss;
97
98 ccprintf(ss, "%-10s ", mnemonic);
99
100 // Print the first destination only
101 if (_numDestRegs > 0)
103
104 // Print the source register
105 if (_numSrcRegs > 0) {
106 if (_numDestRegs > 0)
107 ss << ", ";
108 printReg(ss, srcRegIdx(0));
109 }
110
111 // Print the immediate value last
112 ss << ", " << (int32_t)si;
113
114 return ss.str();
115}
116
117
118std::string
120 Addr pc, const loader::SymbolTable *symtab) const
121{
122 std::stringstream ss;
123 bool printSecondSrc = true;
124 bool printThirdSrc = false;
125
126 // Generate the correct mnemonic
127 std::string myMnemonic(mnemonic);
128
129 // Special cases
130 if (myMnemonic == "addme" ||
131 myMnemonic == "addze" ||
132 myMnemonic == "subfme" ||
133 myMnemonic == "subfze" ||
134 myMnemonic == "neg") {
135 printSecondSrc = false;
136 } else if (myMnemonic == "maddhd" ||
137 myMnemonic == "maddhdu" ||
138 myMnemonic == "maddld") {
139 printThirdSrc = true;
140 }
141
142 // Additional characters depending on isa bits being set
143 if (oe)
144 myMnemonic = myMnemonic + "o";
145 if (rc)
146 myMnemonic = myMnemonic + ".";
147 ccprintf(ss, "%-10s ", myMnemonic);
148
149 // Print the first destination only
150 if (_numDestRegs > 0)
152
153 // Print the first source register
154 if (_numSrcRegs > 0) {
155 if (_numDestRegs > 0)
156 ss << ", ";
157 printReg(ss, srcRegIdx(0));
158
159 // Print the second source register
160 if (_numSrcRegs > 1 && printSecondSrc) {
161 ss << ", ";
162 printReg(ss, srcRegIdx(1));
163
164 // Print the third source register
165 if (_numSrcRegs > 2 && printThirdSrc) {
166 ss << ", ";
167 printReg(ss, srcRegIdx(2));
168 }
169 }
170 }
171
172 return ss.str();
173}
174
175
176std::string
178 Addr pc, const loader::SymbolTable *symtab) const
179{
180 std::stringstream ss;
181 bool negateImm = false;
182
183 // Generate the correct mnemonic
184 std::string myMnemonic(mnemonic);
185
186 // Special cases
187 if (myMnemonic == "addi") {
188 if (_numSrcRegs == 0) {
189 myMnemonic = "li";
190 } else if (si < 0) {
191 myMnemonic = "subi";
192 negateImm = true;
193 }
194 } else if (myMnemonic == "addis") {
195 if (_numSrcRegs == 0) {
196 myMnemonic = "lis";
197 } else if (si < 0) {
198 myMnemonic = "subis";
199 negateImm = true;
200 }
201 } else if (myMnemonic == "addic" && si < 0) {
202 myMnemonic = "subic";
203 negateImm = true;
204 } else if (myMnemonic == "addic_") {
205 if (si < 0) {
206 myMnemonic = "subic.";
207 negateImm = true;
208 } else {
209 myMnemonic = "addic.";
210 }
211 }
212
213 ccprintf(ss, "%-10s ", myMnemonic);
214
215 // Print the first destination only
216 if (_numDestRegs > 0)
218
219 // Print the source register
220 if (_numSrcRegs > 0) {
221 if (_numDestRegs > 0)
222 ss << ", ";
223 printReg(ss, srcRegIdx(0));
224 }
225
226 // Print the immediate value
227 if (negateImm)
228 ss << ", " << -si;
229 else
230 ss << ", " << si;
231
232 return ss.str();
233}
234
235
236std::string
238 Addr pc, const loader::SymbolTable *symtab) const
239{
240 std::stringstream ss;
241 bool printSrcs = true;
242 bool printDisp = true;
243 bool negateDisp = false;
244
245 // Generate the correct mnemonic
246 std::string myMnemonic(mnemonic);
247
248 // Special cases
249 if (myMnemonic == "addpcis") {
250 printSrcs = false;
251 if (d == 0) {
252 myMnemonic = "lnia";
253 printDisp = false;
254 } else if (d < 0) {
255 myMnemonic = "subpcis";
256 negateDisp = true;
257 }
258 }
259
260 ccprintf(ss, "%-10s ", myMnemonic);
261
262 // Print the first destination only
263 if (_numDestRegs > 0)
265
266 // Print the source register
267 if (_numSrcRegs > 0 && printSrcs) {
268 if (_numDestRegs > 0)
269 ss << ", ";
270 printReg(ss, srcRegIdx(0));
271 }
272
273 // Print the displacement
274 if (printDisp)
275 ss << ", " << (negateDisp ? -d : d);
276
277 return ss.str();
278}
279
280
281std::string
283 Addr pc, const loader::SymbolTable *symtab) const
284{
285 std::stringstream ss;
286 bool printSecondSrc = true;
287
288 // Generate the correct mnemonic
289 std::string myMnemonic(mnemonic);
290
291 // Special cases
292 if (myMnemonic == "or" && srcRegIdx(0) == srcRegIdx(1)) {
293 myMnemonic = "mr";
294 printSecondSrc = false;
295 } else if (myMnemonic == "extsb" ||
296 myMnemonic == "extsh" ||
297 myMnemonic == "extsw" ||
298 myMnemonic == "cntlzw" ||
299 myMnemonic == "cntlzd" ||
300 myMnemonic == "cnttzw" ||
301 myMnemonic == "cnttzd") {
302 printSecondSrc = false;
303 }
304
305 // Additional characters depending on isa bits being set
306 if (rc)
307 myMnemonic = myMnemonic + ".";
308 ccprintf(ss, "%-10s ", myMnemonic);
309
310 // Print the first destination only
311 if (_numDestRegs > 0)
313
314 // Print the first source register
315 if (_numSrcRegs > 0) {
316 if (_numDestRegs > 0)
317 ss << ", ";
318 printReg(ss, srcRegIdx(0));
319
320 // Print the second source register
321 if (printSecondSrc) {
322
323 // If the instruction updates the CR, the destination register
324 // Ra is read and thus, it becomes the second source register
325 // due to its higher precedence over Rb. In this case, it must
326 // be skipped.
327 if (rc) {
328 if (_numSrcRegs > 2) {
329 ss << ", ";
330 printReg(ss, srcRegIdx(2));
331 }
332 } else {
333 if (_numSrcRegs > 1) {
334 ss << ", ";
335 printReg(ss, srcRegIdx(1));
336 }
337 }
338 }
339 }
340
341 return ss.str();
342}
343
344
345std::string
347 Addr pc, const loader::SymbolTable *symtab) const
348{
349 std::stringstream ss;
350 bool printRegs = true;
351
352 // Generate the correct mnemonic
353 std::string myMnemonic(mnemonic);
354
355 // Special cases
356 if (myMnemonic == "ori" &&
357 destRegIdx(0).index() == 0 && srcRegIdx(0).index() == 0) {
358 myMnemonic = "nop";
359 printRegs = false;
360 } else if (myMnemonic == "xori" &&
361 destRegIdx(0).index() == 0 && srcRegIdx(0).index() == 0) {
362 myMnemonic = "xnop";
363 printRegs = false;
364 } else if (myMnemonic == "andi_") {
365 myMnemonic = "andi.";
366 } else if (myMnemonic == "andis_") {
367 myMnemonic = "andis.";
368 }
369
370 ccprintf(ss, "%-10s ", myMnemonic);
371
372 if (printRegs) {
373
374 // Print the first destination only
375 if (_numDestRegs > 0)
377
378 // Print the source register
379 if (_numSrcRegs > 0) {
380 if (_numDestRegs > 0)
381 ss << ", ";
382 printReg(ss, srcRegIdx(0));
383 }
384
385 // Print the immediate value
386 ss << ", " << ui;
387 }
388
389 return ss.str();
390}
391
392
393std::string
395 Addr pc, const loader::SymbolTable *symtab) const
396{
397 std::stringstream ss;
398 bool printFieldPrefix = false;
399 bool printLength = true;
400
401 // Generate the correct mnemonic
402 std::string myMnemonic(mnemonic);
403
404 // Special cases
405 if (myMnemonic == "cmp" ||
406 myMnemonic == "cmpl") {
407 myMnemonic += l ? "d" : "w";
408 printFieldPrefix = true;
409 printLength = false;
410 }
411
412 ccprintf(ss, "%-10s ", myMnemonic);
413
414 // Print the first destination only
415 if (printFieldPrefix) {
416 if (bf > 0)
417 ss << "cr" << (int) bf;
418 } else {
419 ss << (int) bf;
420 }
421
422 // Print the length
423 if (printLength) {
424 if (!printFieldPrefix || bf > 0)
425 ss << ", ";
426 ss << (int) l;
427 }
428
429 // Print the first source register
430 if (_numSrcRegs > 0) {
431 if (!printFieldPrefix || bf > 0 || printLength)
432 ss << ", ";
433 printReg(ss, srcRegIdx(0));
434
435 // Print the second source register
436 if (_numSrcRegs > 1) {
437 ss << ", ";
438 printReg(ss, srcRegIdx(1));
439 }
440 }
441
442 return ss.str();
443}
444
445
446std::string
448 Addr pc, const loader::SymbolTable *symtab) const
449{
450 std::stringstream ss;
451 bool printFieldPrefix = false;
452 bool printLength = true;
453
454 // Generate the correct mnemonic
455 std::string myMnemonic(mnemonic);
456
457 // Special cases
458 if (myMnemonic == "cmpi") {
459 myMnemonic = l ? "cmpdi" : "cmpwi";
460 printFieldPrefix = true;
461 printLength = false;
462 }
463
464 ccprintf(ss, "%-10s ", myMnemonic);
465
466 // Print the first destination only
467 if (printFieldPrefix) {
468 if (bf > 0)
469 ss << "cr" << (int) bf;
470 } else {
471 ss << (int) bf;
472 }
473
474 // Print the length
475 if (printLength) {
476 if (!printFieldPrefix || bf > 0)
477 ss << ", ";
478 ss << (int) l;
479 }
480
481 // Print the first source register
482 if (_numSrcRegs > 0) {
483 if (!printFieldPrefix || bf > 0 || printLength)
484 ss << ", ";
485 printReg(ss, srcRegIdx(0));
486 }
487
488 // Print the immediate value
489 ss << ", " << si;
490
491 return ss.str();
492}
493
494
495std::string
497 Addr pc, const loader::SymbolTable *symtab) const
498{
499 std::stringstream ss;
500 bool printFieldPrefix = false;
501 bool printLength = true;
502
503 // Generate the correct mnemonic
504 std::string myMnemonic(mnemonic);
505
506 // Special cases
507 if (myMnemonic == "cmpli") {
508 myMnemonic = l ? "cmpldi" : "cmplwi";
509 printFieldPrefix = true;
510 printLength = false;
511 }
512
513 ccprintf(ss, "%-10s ", myMnemonic);
514
515 // Print the first destination only
516 if (printFieldPrefix) {
517 if (bf > 0)
518 ss << "cr" << (int) bf;
519 } else {
520 ss << (int) bf;
521 }
522
523 // Print the length
524 if (printLength) {
525 if (!printFieldPrefix || bf > 0)
526 ss << ", ";
527 ss << (int) l;
528 }
529
530 // Print the first source register
531 if (_numSrcRegs > 0) {
532 if (!printFieldPrefix || bf > 0 || printLength)
533 ss << ", ";
534 printReg(ss, srcRegIdx(0));
535 }
536
537 // Print the immediate value
538 ss << ", " << ui;
539
540 return ss.str();
541}
542
543
544std::string
546 Addr pc, const loader::SymbolTable *symtab) const
547{
548 std::stringstream ss;
549 bool printSecondSrc = true;
550 bool printShift = false;
551
552 // Generate the correct mnemonic
553 std::string myMnemonic(mnemonic);
554
555 // Special cases
556 if (myMnemonic == "srawi") {
557 printSecondSrc = false;
558 printShift = true;
559 }
560
561 // Additional characters depending on isa bits being set
562 if (rc)
563 myMnemonic = myMnemonic + ".";
564 ccprintf(ss, "%-10s ", myMnemonic);
565
566 // Print the first destination only
567 if (_numDestRegs > 0)
569
570 // Print the first source register
571 if (_numSrcRegs > 0) {
572 if (_numDestRegs > 0)
573 ss << ", ";
574 printReg(ss, srcRegIdx(0));
575
576 // Print the second source register
577 if (printSecondSrc) {
578
579 // If the instruction updates the CR, the destination register
580 // Ra is read and thus, it becomes the second source register
581 // due to its higher precedence over Rb. In this case, it must
582 // be skipped.
583 if (rc) {
584 if (_numSrcRegs > 2) {
585 ss << ", ";
586 printReg(ss, srcRegIdx(2));
587 }
588 } else {
589 if (_numSrcRegs > 1) {
590 ss << ", ";
591 printReg(ss, srcRegIdx(1));
592 }
593 }
594 }
595 }
596
597 // Print the shift value
598 if (printShift)
599 ss << ", " << (int) sh;
600
601 return ss.str();
602}
603
604
605std::string
607 Addr pc, const loader::SymbolTable *symtab) const
608{
609 std::stringstream ss;
610 bool printSecondSrc = true;
611 bool printShift = false;
612
613 // Generate the correct mnemonic
614 std::string myMnemonic(mnemonic);
615
616 // Special cases
617 if (myMnemonic == "sradi" ||
618 myMnemonic == "extswsli") {
619 printSecondSrc = false;
620 printShift = true;
621 }
622
623 // Additional characters depending on isa bits being set
624 if (rc)
625 myMnemonic = myMnemonic + ".";
626 ccprintf(ss, "%-10s ", myMnemonic);
627
628 // Print the first destination only
629 if (_numDestRegs > 0)
631
632 // Print the first source register
633 if (_numSrcRegs > 0) {
634 if (_numDestRegs > 0)
635 ss << ", ";
636 printReg(ss, srcRegIdx(0));
637
638 // Print the second source register
639 if (printSecondSrc) {
640
641 // If the instruction updates the CR, the destination register
642 // Ra is read and thus, it becomes the second source register
643 // due to its higher precedence over Rb. In this case, it must
644 // be skipped.
645 if (rc) {
646 if (_numSrcRegs > 2) {
647 ss << ", ";
648 printReg(ss, srcRegIdx(2));
649 }
650 } else {
651 if (_numSrcRegs > 1) {
652 ss << ", ";
653 printReg(ss, srcRegIdx(1));
654 }
655 }
656 }
657 }
658
659 // Print the shift value
660 if (printShift)
661 ss << ", " << (int) sh;
662
663 return ss.str();
664}
665
666
667std::string
669 Addr pc, const loader::SymbolTable *symtab) const
670{
671 std::stringstream ss;
672 bool printSecondSrc = true;
673 bool printShift = true;
674 bool printMaskBeg = true;
675 bool printMaskEnd = true;
676
677 // Generate the correct mnemonic
678 std::string myMnemonic(mnemonic);
679
680 // Special cases
681 if (myMnemonic == "rlwinm") {
682 if (mb == 0 && me == 31) {
683 myMnemonic = "rotlwi";
684 printMaskBeg = false;
685 printMaskEnd = false;
686 } else if (sh == 0 && me == 31) {
687 myMnemonic = "clrlwi";
688 printShift = false;
689 printMaskEnd = false;
690 }
691 printSecondSrc = false;
692 } else if (myMnemonic == "rlwnm") {
693 if (mb == 0 && me == 31) {
694 myMnemonic = "rotlw";
695 printMaskBeg = false;
696 printMaskEnd = false;
697 }
698 printShift = false;
699 } else if (myMnemonic == "rlwimi") {
700 printSecondSrc = false;
701 }
702
703 // Additional characters depending on isa bits being set
704 if (rc)
705 myMnemonic = myMnemonic + ".";
706 ccprintf(ss, "%-10s ", myMnemonic);
707
708 // Print the first destination only
709 if (_numDestRegs > 0)
711
712 // Print the first source register
713 if (_numSrcRegs > 0) {
714 if (_numDestRegs > 0)
715 ss << ", ";
716 printReg(ss, srcRegIdx(0));
717
718 // Print the second source register
719 if (printSecondSrc) {
720
721 // If the instruction updates the CR, the destination register
722 // Ra is read and thus, it becomes the second source register
723 // due to its higher precedence over Rb. In this case, it must
724 // be skipped.
725 if (rc) {
726 if (_numSrcRegs > 2) {
727 ss << ", ";
728 printReg(ss, srcRegIdx(2));
729 }
730 } else {
731 if (_numSrcRegs > 1) {
732 ss << ", ";
733 printReg(ss, srcRegIdx(1));
734 }
735 }
736 }
737 }
738
739 // Print the shift value
740 if (printShift)
741 ss << ", " << (int) sh;
742
743 // Print the mask bounds
744 if (printMaskBeg)
745 ss << ", " << (int) mb;
746 if (printMaskEnd)
747 ss << ", " << (int) me;
748
749 return ss.str();
750}
751
752std::string
754 Addr pc, const loader::SymbolTable *symtab) const
755{
756 std::stringstream ss;
757 bool printSecondSrc = false;
758 bool printShift = true;
759 bool printMaskBeg = true;
760
761 // Generate the correct mnemonic
762 std::string myMnemonic(mnemonic);
763
764 // Special cases
765 if (myMnemonic == "rldicl") {
766 if (mb == 0) {
767 myMnemonic = "rotldi";
768 printMaskBeg = false;
769 } else if (sh == 0) {
770 myMnemonic = "clrldi";
771 printShift = false;
772 }
773 } else if (myMnemonic == "rldcl") {
774 if (mb == 0) {
775 myMnemonic = "rotld";
776 printMaskBeg = false;
777 }
778 printSecondSrc = true;
779 printShift = false;
780 } else if (myMnemonic == "rldcr") {
781 printSecondSrc = true;
782 printShift = false;
783 }
784
785 // Additional characters depending on isa bits being set
786 if (rc)
787 myMnemonic = myMnemonic + ".";
788 ccprintf(ss, "%-10s ", myMnemonic);
789
790 // Print the first destination only
791 if (_numDestRegs > 0)
793
794 // Print the first source register
795 if (_numSrcRegs > 0) {
796 if (_numDestRegs > 0)
797 ss << ", ";
798 printReg(ss, srcRegIdx(0));
799
800 // Print the second source register
801 if (printSecondSrc) {
802
803 // If the instruction updates the CR, the destination register
804 // Ra is read and thus, it becomes the second source register
805 // due to its higher precedence over Rb. In this case, it must
806 // be skipped.
807 if (rc) {
808 if (_numSrcRegs > 2) {
809 ss << ", ";
810 printReg(ss, srcRegIdx(2));
811 }
812 } else {
813 if (_numSrcRegs > 1) {
814 ss << ", ";
815 printReg(ss, srcRegIdx(1));
816 }
817 }
818 }
819 }
820
821 // Print the shift amount
822 if (printShift)
823 ss << ", " << (int) sh;
824
825 // Print the mask bound
826 if (printMaskBeg)
827 ss << ", " << (int) mb;
828
829 return ss.str();
830}
831
832
833std::string
835 Addr pc, const loader::SymbolTable *symtab) const
836{
837 std::string ext;
838 std::stringstream ss;
839 bool printSrcs = true;
840 bool printCond = false;
841
842 // Generate the correct mnemonic
843 std::string myMnemonic(mnemonic);
844
845 // Special cases
846 if (myMnemonic == "tw" &&
847 (srcRegIdx(0).index() == 0) && (srcRegIdx(1).index() == 0)) {
848 myMnemonic = "trap";
849 printSrcs = false;
850 } else {
851 ext = suffix();
852 if (!ext.empty() &&
853 (myMnemonic == "tw" || myMnemonic == "td")) {
854 myMnemonic += ext;
855 } else {
856 printCond = true;
857 }
858 }
859
860 ccprintf(ss, "%-10s ", myMnemonic);
861
862 // Print the trap condition
863 if (printCond)
864 ss << (int) to;
865
866 // Print the source registers
867 if (printSrcs) {
868 if (_numSrcRegs > 0) {
869 if (printCond)
870 ss << ", ";
871 printReg(ss, srcRegIdx(0));
872 }
873
874 if (_numSrcRegs > 1) {
875 ss << ", ";
876 printReg(ss, srcRegIdx(1));
877 }
878 }
879
880 return ss.str();
881}
882
883
884std::string
886 Addr pc, const loader::SymbolTable *symtab) const
887{
888 std::string ext;
889 std::stringstream ss;
890 bool printCond = false;
891
892 // Generate the correct mnemonic
893 std::string myMnemonic(mnemonic);
894
895 // Special cases
896 ext = suffix();
897 if (!ext.empty()) {
898 if (myMnemonic == "twi") {
899 myMnemonic = "tw" + ext + "i";
900 } else if (myMnemonic == "tdi") {
901 myMnemonic = "td" + ext + "i";
902 } else {
903 printCond = true;
904 }
905 } else {
906 printCond = true;
907 }
908
909 ccprintf(ss, "%-10s ", myMnemonic);
910
911 // Print the trap condition
912 if (printCond)
913 ss << (int) to;
914
915 // Print the source registers
916 if (_numSrcRegs > 0) {
917 if (printCond)
918 ss << ", ";
919 printReg(ss, srcRegIdx(0));
920 }
921
922 // Print the immediate value
923 ss << ", " << si;
924
925 return ss.str();
926}
927
928} // namespace gem5
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition integer.cc:119
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition integer.cc:394
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition integer.cc:753
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition integer.cc:606
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition integer.cc:237
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition integer.cc:177
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition integer.cc:496
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition integer.cc:447
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition integer.cc:346
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition integer.cc:94
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition integer.cc:885
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition integer.cc:282
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition integer.cc:38
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition integer.cc:668
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition integer.cc:545
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition integer.cc:834
std::string suffix() const
Definition integer.hh:751
void printReg(std::ostream &os, RegId reg) const
Print a register name for disassembly given the unique dependence tag number (FP or int).
uint8_t _numSrcRegs
See numSrcRegs().
uint8_t _numDestRegs
See numDestRegs().
const RegId & destRegIdx(int i) const
Return logical index (architectural reg num) of i'th destination reg.
const char * mnemonic
Base mnemonic (e.g., "add").
const RegId & srcRegIdx(int i) const
Return logical index (architectural reg num) of i'th source reg.
Bitfield< 21 > ss
Definition misc_types.hh:60
Bitfield< 12 > ext
Bitfield< 4 > pc
Bitfield< 30, 0 > index
Copyright (c) 2024 - Pranith Kumar Copyright (c) 2020 Inria All rights reserved.
Definition binary32.hh:36
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition types.hh:147
void ccprintf(cp::Print &print)
Definition cprintf.hh:130

Generated on Tue Jun 18 2024 16:23:57 for gem5 by doxygen 1.11.0