gem5 [DEVELOP-FOR-25.1]
Loading...
Searching...
No Matches
sve.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2017-2019,2025 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions are
16 * met: redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer;
18 * redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution;
21 * neither the name of the copyright holders nor the names of its
22 * contributors may be used to endorse or promote products derived from
23 * this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 */
37
38// TODO: add support for suffixes of register specifiers in disasm strings.
39
40#include "arch/arm/insts/sve.hh"
41
42namespace gem5
43{
44
45namespace ArmISA {
46
47const char*
49{
50 switch (pt) {
52 return "m";
54 return "z";
55 default:
56 return "";
57 }
58}
59
60std::string
62 const loader::SymbolTable *symtab) const
63{
64 std::stringstream ss;
65 printMnemonic(ss, "", false);
67 ccprintf(ss, ", ");
69 ccprintf(ss, ", ");
71 return ss.str();
72}
73
74std::string
76 const loader::SymbolTable *symtab) const
77{
78 std::stringstream ss;
79 printMnemonic(ss, "", false);
81 ccprintf(ss, ", ");
82 printVecPredReg(ss, op1, true);
83 ccprintf(ss, ", ");
84 if (imm == 0) {
85 ccprintf(ss, "VLx2");
86 } else {
87 ccprintf(ss, "VLx4");
88 }
89 return ss.str();
90}
91
92std::string
94 Addr pc, const loader::SymbolTable *symtab) const
95{
96 std::stringstream ss;
97 printMnemonic(ss, "", false);
98 if (destIsVec) {
99 printVecReg(ss, dest, true);
100 } else {
102 }
103 ccprintf(ss, ", ");
104 uint8_t opWidth = 64;
106 ccprintf(ss, ", ");
107 if (srcIs32b)
108 opWidth = 32;
109 printIntReg(ss, dest, opWidth);
110 return ss.str();
111}
112
113std::string
115 Addr pc, const loader::SymbolTable *symtab) const
116{
117 std::stringstream ss;
118 printMnemonic(ss, "", false);
119 printVecReg(ss, dest, true);
120 ccprintf(ss, ", #%d, #%d", imm1, imm2);
121 return ss.str();
122}
123
124std::string
126 Addr pc, const loader::SymbolTable *symtab) const
127{
128 std::stringstream ss;
129 printMnemonic(ss, "", false);
130 printVecReg(ss, dest, true);
131 ccprintf(ss, ", #%d, ", imm1);
133 return ss.str();
134}
135
136std::string
138 Addr pc, const loader::SymbolTable *symtab) const
139{
140 std::stringstream ss;
141 printMnemonic(ss, "", false);
142 printVecReg(ss, dest, true);
143 ccprintf(ss, ", ");
145 ccprintf(ss, ", #%d", imm2);
146 return ss.str();
147}
148
149std::string
151 Addr pc, const loader::SymbolTable *symtab) const
152{
153 std::stringstream ss;
154 printMnemonic(ss, "", false);
155 printVecReg(ss, dest, true);
156 ccprintf(ss, ", ");
158 ccprintf(ss, ", ");
160 return ss.str();
161}
162
163std::string
165 Addr pc, const loader::SymbolTable *symtab) const
166{
167 std::stringstream ss;
168 printMnemonic(ss, "", false);
170 ccprintf(ss, ", ");
171 uint8_t opWidth;
172 if (srcIs32b)
173 opWidth = 32;
174 else
175 opWidth = 64;
176 printIntReg(ss, op1, opWidth);
177 ccprintf(ss, ", ");
178 printIntReg(ss, op2, opWidth);
179 return ss.str();
180}
181
182std::string
184 const loader::SymbolTable *symtab) const
185{
186 std::stringstream ss;
187 printMnemonic(ss, "", false);
188 ccprintf(ss, "{");
190 ccprintf(ss, ", ");
192 ccprintf(ss, "}, ");
193 uint8_t opWidth;
194 if (srcIs32b) {
195 opWidth = 32;
196 } else {
197 opWidth = 64;
198 }
199 printIntReg(ss, op1, opWidth);
200 ccprintf(ss, ", ");
201 printIntReg(ss, op2, opWidth);
202 return ss.str();
203}
204
205std::string
207 const loader::SymbolTable *symtab) const
208{
209 std::stringstream ss;
210 printMnemonic(ss, "", false);
211 printVecPredReg(ss, dest, true);
212 ccprintf(ss, ", ");
213 uint8_t opWidth;
214 if (srcIs32b) {
215 opWidth = 32;
216 } else {
217 opWidth = 64;
218 }
219 printIntReg(ss, op1, opWidth);
220 ccprintf(ss, ", ");
221 printIntReg(ss, op2, opWidth);
222 ccprintf(ss, ", ");
223 if (imm == 0) {
224 ccprintf(ss, "VLx2");
225 } else {
226 ccprintf(ss, "VLx4");
227 }
228 return ss.str();
229}
230
231std::string
233 const loader::SymbolTable *symtab) const
234{
235 std::stringstream ss;
236 printMnemonic(ss, "", false);
238 ss << ", ";
240 ss << ", ";
242 ss << ", ";
244 ss << ", ";
245 ccprintf(ss, "#%d", imm);
246 return ss.str();
247}
248
249std::string
251 const loader::SymbolTable *symtab) const
252{
253 std::stringstream ss;
254 printMnemonic(ss, "", false);
256 ss << ", ";
257 printVecPredReg(ss, op1, true);
258 ss << "[";
259 ccprintf(ss, "%d", imm);
260 ss << "]";
261 return ss.str();
262}
263
264std::string
266 const loader::SymbolTable *symtab) const
267{
268 std::stringstream ss;
269 printMnemonic(ss, "", false);
270 ss << "{";
272 ss << ", ";
274 ss << "}, ";
275 printVecPredReg(ss, op1, true);
276 ss << "[";
277 ccprintf(ss, "%d", imm);
278 ss << "]";
279 return ss.str();
280}
281
282std::string
284 Addr pc, const loader::SymbolTable *symtab) const
285{
286 std::stringstream ss;
287 printMnemonic(ss, "", false);
289 ccprintf(ss, ", ");
291 return ss.str();
292}
293
294std::string
296 Addr pc, const loader::SymbolTable *symtab) const
297{
298 std::stringstream ss;
299 printMnemonic(ss, "", false);
300 printVecReg(ss, dest, true);
301 ccprintf(ss, ", ");
303 ccprintf(ss, "/m, ");
304 printVecReg(ss, op1, true);
305 return ss.str();
306}
307
308std::string
310 Addr pc, const loader::SymbolTable *symtab) const
311{
312 std::stringstream ss;
313 printMnemonic(ss, "", false);
314 printVecReg(ss, dest, true);
315 ccprintf(ss, ", ");
316 printVecReg(ss, op1, true);
317 return ss.str();
318}
319
320std::string
322 Addr pc, const loader::SymbolTable *symtab) const
323{
324 std::stringstream ss;
325 printMnemonic(ss, "", false);
326 printVecReg(ss, dest, true);
327 ccprintf(ss, ", #");
328 ss << imm;
329 return ss.str();
330}
331
332std::string
334 Addr pc, const loader::SymbolTable *symtab) const
335{
336 std::stringstream ss;
337 printMnemonic(ss, "", false);
338 printVecReg(ss, dest, true);
339 ccprintf(ss, ", ");
341 ccprintf(ss, (isMerging ? "/m" : "/z"));
342 ccprintf(ss, ", #");
343 ss << imm;
344 return ss.str();
345}
346
347std::string
349 Addr pc, const loader::SymbolTable *symtab) const
350{
351 std::stringstream ss;
352 printMnemonic(ss, "", false);
353 printVecReg(ss, dest, true);
354 ccprintf(ss, ", ");
355 printVecReg(ss, op1, true);
356 ccprintf(ss, ", #");
357 ss << imm;
358 return ss.str();
359}
360
361std::string
363 Addr pc, const loader::SymbolTable *symtab) const
364{
365 std::stringstream ss;
366 printMnemonic(ss, "", false);
367 printVecReg(ss, dest, true);
368 ccprintf(ss, ", ");
370 ccprintf(ss, "/m, ");
371 printVecReg(ss, dest, true);
372 ccprintf(ss, ", #");
373 ss << imm;
374 return ss.str();
375}
376
377std::string
379 Addr pc, const loader::SymbolTable *symtab) const
380{
381 std::stringstream ss;
382 printMnemonic(ss, "", false);
383 printVecReg(ss, dest, true);
384 ccprintf(ss, ", ");
385 printVecReg(ss, dest, true);
386 ccprintf(ss, ", #");
387 ss << imm;
388 return ss.str();
389}
390
391std::string
393 Addr pc, const loader::SymbolTable *symtab) const
394{
395 std::stringstream ss;
396 printMnemonic(ss, "", false);
397 printVecReg(ss, dest, true);
398 ccprintf(ss, ", ");
400 ccprintf(ss, "/m, ");
401 printVecReg(ss, dest, true);
402 ccprintf(ss, ", ");
403 printVecReg(ss, op2, true);
404 return ss.str();
405}
406
407std::string
409 Addr pc, const loader::SymbolTable *symtab) const
410{
411 std::stringstream ss;
412 printMnemonic(ss, "", false);
413 printVecReg(ss, dest, true);
414 ccprintf(ss, ", ");
418 }
419 ccprintf(ss, ", ");
420 printVecReg(ss, op1, true);
421 ccprintf(ss, ", ");
422 printVecReg(ss, op2, true);
423 return ss.str();
424}
425
426std::string
428 Addr pc, const loader::SymbolTable *symtab) const
429{
430 std::stringstream ss;
431 printMnemonic(ss, "", false);
432 printVecReg(ss, dest, true);
433 ccprintf(ss, ", ");
434 printVecReg(ss, op1, true);
435 ccprintf(ss, ", ");
436 printVecReg(ss, op2, true);
437 return ss.str();
438}
439
440std::string
442 Addr pc, const loader::SymbolTable *symtab) const
443{
444 std::stringstream ss;
445 printMnemonic(ss, "", false);
446 printVecReg(ss, dest, true);
447 ccprintf(ss, ", ");
448 printVecReg(ss, op1, true);
449 ccprintf(ss, ", ");
450 printVecReg(ss, op2, true);
451 ccprintf(ss, "[");
452 ss << (uint64_t)index;
453 ccprintf(ss, "]");
454 return ss.str();
455}
456
457std::string
459 Addr pc, const loader::SymbolTable *symtab) const
460{
461 std::stringstream ss;
462 printMnemonic(ss, "", false);
464 ccprintf(ss, ", ");
466 if (isSel) {
467 ccprintf(ss, ", ");
468 } else {
469 ccprintf(ss, "/z, ");
470 }
472 ccprintf(ss, ", ");
474 return ss.str();
475}
476
477std::string
479 Addr pc, const loader::SymbolTable *symtab) const
480{
481 std::stringstream ss;
482 printMnemonic(ss, "", false);
484 ccprintf(ss, ", ");
486 ccprintf(ss, ", ");
488 return ss.str();
489}
490
491std::string
493{
494 std::stringstream ss;
495 printMnemonic(ss, "", false);
497 ccprintf(ss, ", ");
499 ccprintf(ss, "/z, ");
500 printVecReg(ss, op1, true);
501 ccprintf(ss, ", ");
502 printVecReg(ss, op2, true);
503 return ss.str();
504}
505
506std::string
508 Addr pc, const loader::SymbolTable *symtab) const
509{
510 std::stringstream ss;
511 printMnemonic(ss, "", false);
513 ccprintf(ss, ", ");
515 ccprintf(ss, "/z, ");
516 printVecReg(ss, op1, true);
517 ccprintf(ss, ", #");
518 ss << imm;
519 return ss.str();
520}
521
522std::string
524 Addr pc, const loader::SymbolTable *symtab) const
525{
526 std::stringstream ss;
527 printMnemonic(ss, "", false);
528 printVecReg(ss, dest, true);
529 ccprintf(ss, ", ");
531 ccprintf(ss, "/m, ");
532 printVecReg(ss, op1, true);
533 ccprintf(ss, ", ");
534 printVecReg(ss, op2, true);
535 return ss.str();
536}
537
538std::string
540 Addr pc, const loader::SymbolTable *symtab) const
541{
542 std::stringstream ss;
543 printMnemonic(ss, "", false);
544 printVecReg(ss, dest, true);
545 ccprintf(ss, ", ");
546 printVecReg(ss, op1, true);
547 ccprintf(ss, ", ");
548 printVecReg(ss, op2, true);
549 return ss.str();
550}
551
552std::string
554 Addr pc, const loader::SymbolTable *symtab) const
555{
556 std::stringstream ss;
557 printMnemonic(ss, "", false);
558 printVecReg(ss, dest, true);
559 ccprintf(ss, ", ");
560 printVecReg(ss, dest, true);
561 ccprintf(ss, ", ");
562 printVecReg(ss, op2, true);
563 ccprintf(ss, ", #");
564 ss << imm;
565 return ss.str();
566}
567
568std::string
570 const loader::SymbolTable *symtab) const
571{
572 std::stringstream ss;
573 printMnemonic(ss, "", false);
574 printVecReg(ss, dest, true);
575 ccprintf(ss, ", ");
576 printVecReg(ss, op1, true);
577 ccprintf(ss, ", ");
578 printVecReg(ss, op2, true);
579 ccprintf(ss, "[");
580 ss << (uint64_t)index;
581 ccprintf(ss, "]");
582 return ss.str();
583}
584
585std::string
587 Addr pc, const loader::SymbolTable *symtab) const
588{
589 std::stringstream ss;
590 printMnemonic(ss, "", false);
592 ccprintf(ss, ", ");
594 ccprintf(ss, ", ");
595 printVecReg(ss, op1, true);
596 return ss.str();
597}
598
599std::string
601 Addr pc, const loader::SymbolTable *symtab) const
602{
603 std::stringstream ss;
604 printMnemonic(ss, "", false);
606 ccprintf(ss, ", ");
608 ccprintf(ss, ", ");
610 ccprintf(ss, ", ");
611 printVecReg(ss, op1, true);
612 return ss.str();
613}
614
615std::string
617 Addr pc, const loader::SymbolTable *symtab) const
618{
619 std::stringstream ss;
620 printMnemonic(ss, "", false);
622 if (imm != 0x1f) {
623 ccprintf(ss, ", ");
625 }
626 return ss.str();
627}
628
629std::string
631 const loader::SymbolTable *symtab) const
632{
633 std::stringstream ss;
634 printMnemonic(ss, "", false);
635 printVecPredReg(ss, dest, true);
636 return ss.str();
637}
638
639std::string
641 Addr pc, const loader::SymbolTable *symtab) const
642{
643 std::stringstream ss;
644 printMnemonic(ss, "", false);
646 ccprintf(ss, ", ");
648 ccprintf(ss, "/z, ");
649 printVecReg(ss, op1, true);
650 ccprintf(ss, ", ");
651 if (op2IsWide) {
652 printVecReg(ss, op2, true);
653 } else {
654 printVecReg(ss, op2, true);
655 }
656 return ss.str();
657}
658
659std::string
661 Addr pc, const loader::SymbolTable *symtab) const
662{
663 std::stringstream ss;
664 printMnemonic(ss, "", false);
666 ccprintf(ss, "/z, ");
668 ccprintf(ss, ", ");
669 printVecReg(ss, op1, true);
670 ccprintf(ss, ", #");
671 ss << imm;
672 return ss.str();
673}
674
675std::string
677{
678 std::stringstream ss;
679 printMnemonic(ss, "", false);
680 printVecReg(ss, dest, true);
681 ccprintf(ss, ", [");
682 printVecReg(ss, op1, true);
683 ccprintf(ss, ", ");
684 printVecReg(ss, op2, true);
686 ccprintf(ss, ", sxtw");
688 ccprintf(ss, ", uxtw");
689 } else if (mult != 1) {
690 ccprintf(ss, ", lsl");
691 }
692 if (mult != 1) {
693 ss << __builtin_ctz(mult);
694 }
695 ccprintf(ss, "]");
696 return ss.str();
697}
698
699std::string
701 Addr pc, const loader::SymbolTable *symtab) const
702{
703 static const char suffix[9] =
704 {'\0', 'b', 'h', '\0', 'w', '\0', '\0', '\0', 'd'};
705 std::stringstream ss;
706 ss << " " << mnemonic << suffix[esize] << " ";
707 if (dstIsVec) {
708 printVecReg(ss, dest, true);
709 } else {
710 if (dstIs32b) {
711 printIntReg(ss, dest, 32);
712 } else {
713 printIntReg(ss, dest, 64);
714 }
715 }
716 if (pattern != 0x1f) {
717 ccprintf(ss, ", ");
719 if (imm != 1) {
720 ccprintf(ss, ", mul #");
721 ss << std::to_string(imm);
722 }
723 }
724 return ss.str();
725}
726
727std::string
729 Addr pc, const loader::SymbolTable *symtab) const
730{
731 std::stringstream ss;
732 printMnemonic(ss, "", false);
734 ccprintf(ss, ", ");
736 ccprintf(ss, isMerging ? "/m, " : "/z, ");
738 return ss.str();
739}
740
741std::string
743 Addr pc, const loader::SymbolTable *symtab) const
744{
745 std::stringstream ss;
746 printMnemonic(ss, "", false);
748 ccprintf(ss, ", ");
750 ccprintf(ss, "/z, ");
752 ccprintf(ss, ", ");
754 return ss.str();
755}
756
757std::string
759 Addr pc, const loader::SymbolTable *symtab) const
760{
761 std::stringstream ss;
762 printMnemonic(ss, "", false);
763 if (scalar)
765 else if (simdFp)
767 else
768 printVecReg(ss, dest, true);
769 ccprintf(ss, ", ");
771 if (conditional) {
772 ccprintf(ss, ", ");
773 if (scalar)
775 else
776 printVecReg(ss, dest, true);
777 }
778 ccprintf(ss, ", ");
779 printVecReg(ss, op1, true);
780 return ss.str();
781}
782
783std::string
785 Addr pc, const loader::SymbolTable *symtab) const
786{
787 std::stringstream ss;
788 printMnemonic(ss, "", false);
789 printVecReg(ss, dest, true);
790 ccprintf(ss, ", ");
792 ccprintf(ss, ", ");
793 printVecReg(ss, op1, true);
794 return ss.str();
795}
796
797std::string
799{
800 std::stringstream ss;
801 printMnemonic(ss, "", false);
802 printVecReg(ss, dest, true);
803 ccprintf(ss, ", { ");
804 printVecReg(ss, op1, true);
805 ccprintf(ss, " }, ");
806 printVecReg(ss, op2, true);
807 return ss.str();
808}
809
810std::string
812 const loader::SymbolTable *symtab) const
813{
814 std::stringstream ss;
815 printMnemonic(ss, "", false);
816 printVecReg(ss, dest, true);
817 ccprintf(ss, ", { ");
818 printVecReg(ss, op1, true);
819 ccprintf(ss, ", ");
820 printVecReg(ss, op2, true);
821 ccprintf(ss, " }, ");
822 printVecReg(ss, op3, true);
823 return ss.str();
824}
825
826std::string
828 Addr pc, const loader::SymbolTable *symtab) const
829{
830 std::stringstream ss;
831 printMnemonic(ss, "", false);
833 ccprintf(ss, ", ");
835 return ss.str();
836}
837
838std::string
840 Addr pc, const loader::SymbolTable *symtab) const
841{
842 std::stringstream ss;
843 printMnemonic(ss, "", false);
845 ccprintf(ss, ", ");
847 return ss.str();
848}
849
850std::string
852 Addr pc, const loader::SymbolTable *symtab) const
853{
854 std::stringstream ss;
855 printMnemonic(ss, "", false);
857 return ss.str();
858}
859
860std::string
862 Addr pc, const loader::SymbolTable *symtab) const
863{
864 std::stringstream ss;
865 printMnemonic(ss, "", false);
867 ccprintf(ss, ", ");
869 ccprintf(ss, "/z, ");
870 return ss.str();
871}
872
873std::string
875 Addr pc, const loader::SymbolTable *symtab) const
876{
877 std::stringstream ss;
878 printMnemonic(ss, "", false);
880 return ss.str();
881}
882
883std::string
885 Addr pc, const loader::SymbolTable *symtab) const
886{
887 std::stringstream ss;
888 printMnemonic(ss, "", false);
889 return ss.str();
890}
891
892std::string
894 Addr pc, const loader::SymbolTable *symtab) const
895{
896 std::stringstream ss;
897 printMnemonic(ss, "", false);
898 printVecReg(ss, dest, true);
899 ccprintf(ss, ", ");
900 printVecReg(ss, dest, true);
901 ccprintf(ss, ", ");
902 printVecReg(ss, op1, true);
903 ccprintf(ss, ", #");
904 ss << imm;
905 return ss.str();
906}
907
908std::string
910 Addr pc, const loader::SymbolTable *symtab) const
911{
912 std::stringstream ss;
913 printMnemonic(ss, "", false);
914 printVecReg(ss, dest, true);
915 ccprintf(ss, ", ");
916 printVecReg(ss, op1, true);
917 ccprintf(ss, "[");
918 ss << (uint64_t)imm;
919 ccprintf(ss, "]");
920 return ss.str();
921}
922
923std::string
925 Addr pc, const loader::SymbolTable *symtab) const
926{
927 std::stringstream ss;
928 printMnemonic(ss, "", false);
929 printVecReg(ss, dest, true);
930 ccprintf(ss, ", ");
931 if (simdFp) {
933 } else {
935 }
936 return ss.str();
937}
938
939std::string
941 Addr pc, const loader::SymbolTable *symtab) const
942{
943 std::stringstream ss;
944 printMnemonic(ss, "", false);
945 printVecReg(ss, dest, true);
946 ccprintf(ss, ", ");
947 printVecReg(ss, op1, true);
948 ccprintf(ss, ", ");
949 printVecReg(ss, op2, true);
950 ccprintf(ss, "[");
951 ccprintf(ss, "%lu", imm);
952 ccprintf(ss, "]");
953 return ss.str();
954}
955
956std::string
958 Addr pc, const loader::SymbolTable *symtab) const
959{
960 std::stringstream ss;
961 printMnemonic(ss, "", false);
962 printVecReg(ss, dest, true);
963 ccprintf(ss, ", ");
964 printVecReg(ss, op1, true);
965 ccprintf(ss, ", ");
966 printVecReg(ss, op2, true);
967 return ss.str();
968}
969
970std::string
972 Addr pc, const loader::SymbolTable *symtab) const
973{
974 std::stringstream ss;
975 printMnemonic(ss, "", false);
976 printVecReg(ss, dest, true);
977 ccprintf(ss, ", ");
979 ccprintf(ss, "/m, ");
980 printVecReg(ss, op1, true);
981 ccprintf(ss, ", ");
982 printVecReg(ss, op2, true);
983 ccprintf(ss, ", #");
984 const char *rotstr[4] = {"0", "90", "180", "270"};
985 ccprintf(ss, rotstr[rot]);
986
987 return ss.str();
988}
989
990std::string
992 Addr pc, const loader::SymbolTable *symtab) const
993{
994 std::stringstream ss;
995 printMnemonic(ss, "", false);
996 printVecReg(ss, dest, true);
997 ccprintf(ss, ", ");
998 printVecReg(ss, op1, true);
999 ccprintf(ss, ", ");
1000 printVecReg(ss, op2, true);
1001 ccprintf(ss, ", #");
1002 const char* rotstr[4] = {"0", "90", "180", "270"};
1003 ccprintf(ss, rotstr[rot]);
1004
1005 return ss.str();
1006}
1007
1008std::string
1010 Addr pc, const loader::SymbolTable *symtab) const
1011{
1012 std::stringstream ss;
1013 printMnemonic(ss, "", false);
1014 printVecReg(ss, dest, true);
1015 ccprintf(ss, ", ");
1016 printVecReg(ss, op1, true);
1017 ccprintf(ss, ", ");
1018 printVecReg(ss, op2, true);
1019 ccprintf(ss, "[");
1020 ss << (uint64_t)imm;
1021 ccprintf(ss, "], #");
1022 const char* rotstr[4] = {"0", "90", "180", "270"};
1023 ccprintf(ss, rotstr[rot]);
1024 return ss.str();
1025}
1026
1027std::string
1029 Addr pc, const loader::SymbolTable *symtab) const
1030{
1031 std::stringstream ss;
1032 printMnemonic(ss, "", false);
1033 printVecReg(ss, dest, true);
1034 ss << ", ";
1035 printVecReg(ss, op1, true);
1036 ss << ", ";
1037 printVecReg(ss, op2, true);
1038 return ss.str();
1039}
1040
1041std::string
1043 const loader::SymbolTable *symtab) const
1044{
1045 std::stringstream ss;
1046 printMnemonic(ss, "", false);
1048 ccprintf(ss, ", ");
1049 printVecReg(ss, op1, true);
1050 ccprintf(ss, ", #");
1051 ss << imm;
1052 return ss.str();
1053}
1054
1055std::string
1057 const loader::SymbolTable *symtab) const
1058{
1059 std::stringstream ss;
1060 printMnemonic(ss, "", false);
1061 printVecReg(ss, dest, true);
1062 ccprintf(ss, ", ");
1064 ccprintf(ss, ", #");
1065 ss << imm;
1066 return ss.str();
1067}
1068
1069std::string
1071 const loader::SymbolTable *symtab) const
1072{
1073 std::stringstream ss;
1074 printMnemonic(ss, "", false);
1075 printVecReg(ss, dest, true);
1076 ccprintf(ss, ", {");
1077 printVecReg(ss, op1, true);
1078 ccprintf(ss, ", ");
1079 printVecReg(ss, op2, true);
1080 ccprintf(ss, "}");
1081 return ss.str();
1082}
1083
1084std::string
1086 Addr pc, const loader::SymbolTable *symtab) const
1087{
1088 std::stringstream ss;
1089 printMnemonic(ss, "", false);
1090 printVecReg(ss, dest, true);
1091 ccprintf(ss, ", {");
1092 printVecReg(ss, op1, true);
1093 ccprintf(ss, ", ");
1094 printVecReg(ss, op2, true);
1095 ccprintf(ss, "}, #");
1096 ss << imm;
1097 return ss.str();
1098}
1099
1100std::string
1102{
1103 switch (imm) {
1104 case 0x0:
1105 return "POW2";
1106 case 0x1:
1107 case 0x2:
1108 case 0x3:
1109 case 0x4:
1110 case 0x5:
1111 case 0x6:
1112 case 0x7:
1113 return "VL" + std::to_string(imm);
1114 case 0x8:
1115 case 0x9:
1116 case 0xa:
1117 case 0xb:
1118 case 0xc:
1119 case 0xd:
1120 return "VL" + std::to_string(1 << ((imm & 0x7) + 3));
1121 case 0x1d:
1122 return "MUL4";
1123 case 0x1e:
1124 return "MUL3";
1125 case 0x1f:
1126 return "ALL";
1127 default:
1128 return "#" + std::to_string(imm);
1129 }
1130}
1131
1132unsigned int
1133sveDecodePredCount(uint8_t imm, unsigned int num_elems)
1134{
1135 assert(num_elems > 0);
1136
1137 switch (imm) {
1138 case 0x0:
1139 // POW2
1140 return 1 << (31 - __builtin_clz((uint32_t) num_elems));
1141 case 0x1:
1142 case 0x2:
1143 case 0x3:
1144 case 0x4:
1145 case 0x5:
1146 case 0x6:
1147 case 0x7:
1148 // VL1, VL2, VL3, VL4, VL5, VL6, VL7
1149 return (num_elems >= imm) ? imm : 0;
1150 case 0x8:
1151 case 0x9:
1152 case 0xa:
1153 case 0xb:
1154 case 0xc:
1155 case 0xd:
1156 // VL8, VL16, VL32, VL64, VL128, VL256
1157 {
1158 unsigned int pcount = 1 << ((imm & 0x7) + 3);
1159 return (num_elems >= pcount) ? pcount : 0;
1160 }
1161 case 0x1d:
1162 // MUL4
1163 return num_elems - (num_elems % 4);
1164 case 0x1e:
1165 // MUL3
1166 return num_elems - (num_elems % 3);
1167 case 0x1f:
1168 // ALL
1169 return num_elems;
1170 default:
1171 return 0;
1172 }
1173}
1174
1175uint64_t
1176sveExpandFpImmAddSub(uint8_t imm, uint8_t size)
1177{
1178 static constexpr uint16_t fpOne16 = 0x3c00;
1179 static constexpr uint16_t fpPointFive16 = 0x3800;
1180 static constexpr uint32_t fpOne32 = 0x3f800000;
1181 static constexpr uint32_t fpPointFive32 = 0x3f000000;
1182 static constexpr uint64_t fpOne64 = 0x3ff0000000000000;
1183 static constexpr uint64_t fpPointFive64 = 0x3fe0000000000000;
1184
1185 switch (size) {
1186 case 0x1:
1187 return imm ? fpOne16 : fpPointFive16;
1188 case 0x2:
1189 return imm ? fpOne32 : fpPointFive32;
1190 case 0x3:
1191 return imm ? fpOne64 : fpPointFive64;
1192 default:
1193 panic("Unsupported size");
1194 }
1195}
1196
1197uint64_t
1198sveExpandFpImmMaxMin(uint8_t imm, uint8_t size)
1199{
1200 static constexpr uint16_t fpOne16 = 0x3c00;
1201 static constexpr uint32_t fpOne32 = 0x3f800000;
1202 static constexpr uint64_t fpOne64 = 0x3ff0000000000000;
1203
1204 switch (size) {
1205 case 0x1:
1206 return imm ? fpOne16 : 0x0;
1207 case 0x2:
1208 return imm ? fpOne32 : 0x0;
1209 case 0x3:
1210 return imm ? fpOne64 : 0x0;
1211 default:
1212 panic("Unsupported size");
1213 }
1214}
1215
1216uint64_t
1217sveExpandFpImmMul(uint8_t imm, uint8_t size)
1218{
1219 static constexpr uint16_t fpTwo16 = 0x4000;
1220 static constexpr uint16_t fpPointFive16 = 0x3800;
1221 static constexpr uint32_t fpTwo32 = 0x40000000;
1222 static constexpr uint32_t fpPointFive32 = 0x3f000000;
1223 static constexpr uint64_t fpTwo64 = 0x4000000000000000;
1224 static constexpr uint64_t fpPointFive64 = 0x3fe0000000000000;
1225
1226 switch (size) {
1227 case 0x1:
1228 return imm ? fpTwo16 : fpPointFive16;
1229 case 0x2:
1230 return imm ? fpTwo32 : fpPointFive32;
1231 case 0x3:
1232 return imm ? fpTwo64 : fpPointFive64;
1233 default:
1234 panic("Unsupported size");
1235 }
1236}
1237
1238void
1240 unsigned pred_width, unsigned vl, unsigned regidx)
1241{
1242 uint8_t tail_zero = bits(pred, 3, 0);
1243 unsigned elem_cnt = 0;
1244 unsigned count = 0;
1245 bool invert = bits(pred, 15);
1246 pred_mask.reset();
1247
1248 if ((tail_zero & 0x1) == 0x1) {
1249 elem_cnt = pred_width;
1250 count = bits(pred, 14, 1) & (elem_cnt * 4 - 1);
1251 auto auxMask = pred_mask.as<uint8_t>();
1252 for (unsigned e = 0; e < elem_cnt; e++) {
1253 bool pbit = ((e + regidx * elem_cnt) < count) ? true : false;
1254 if (invert) {
1255 pbit = !pbit;
1256 }
1257 auxMask[e] = pbit;
1258 }
1259 } else if ((tail_zero & 0x2) == 0x2) {
1260 elem_cnt = pred_width / 2;
1261 count = bits(pred, 14, 2) & (elem_cnt * 4 - 1);
1262 auto auxMask = pred_mask.as<uint16_t>();
1263 for (unsigned e = 0; e < elem_cnt; e++) {
1264 bool pbit = ((e + regidx * elem_cnt) < count) ? true : false;
1265 if (invert) {
1266 pbit = !pbit;
1267 }
1268 auxMask[e] = pbit;
1269 }
1270 } else if ((tail_zero & 0x4) == 0x4) {
1271 elem_cnt = pred_width / 4;
1272 count = bits(pred, 14, 3) & (elem_cnt * 4 - 1);
1273 auto auxMask = pred_mask.as<uint32_t>();
1274 for (unsigned e = 0; e < elem_cnt; e++) {
1275 bool pbit = ((e + regidx * elem_cnt) < count) ? true : false;
1276 if (invert) {
1277 pbit = !pbit;
1278 }
1279 auxMask[e] = pbit;
1280 }
1281 } else if ((tail_zero & 0x8) == 0x8) {
1282 elem_cnt = pred_width / 8;
1283 count = bits(pred, 14, 4) & (elem_cnt * 4 - 1);
1284 auto auxMask = pred_mask.as<uint64_t>();
1285 for (unsigned e = 0; e < elem_cnt; e++) {
1286 bool pbit = ((e + regidx * elem_cnt) < count) ? true : false;
1287 if (invert) {
1288 pbit = !pbit;
1289 }
1290 auxMask[e] = pbit;
1291 }
1292 }
1293}
1294
1295uint16_t
1296sveEncodePredCount(int esize, int elements, int count_in, bool invert_in)
1297{
1298 uint16_t count = count_in;
1299 uint16_t invert = invert_in;
1300
1301 if (count_in == 0) {
1302 return 0;
1303 }
1304
1305 if (invert_in) {
1306 count = elements - count;
1307 } else if (count == elements) {
1308 count = 0;
1309 invert = true;
1310 }
1311 uint16_t inv = invert ? 0x1 : 0x0;
1312
1313 uint16_t pred = 0;
1314 if (esize == 1) {
1315 pred = inv << 15 | ((count & 0x3FFF) << 1) | 0x1;
1316 } else if (esize == 2) {
1317 pred = inv << 15 | ((count & 0x1FFF) << 2) | 0x2;
1318 } else if (esize == 4) {
1319 pred = inv << 15 | ((count & 0x0FFF) << 3) | 0x4;
1320 } else if (esize == 8) {
1321 pred = inv << 15 | ((count & 0x07FF) << 4) | 0x8;
1322 }
1323 return pred;
1324}
1325
1326} // namespace ArmISA
1327} // namespace gem5
void printMnemonic(std::ostream &os, const std::string &suffix="", bool withPred=true, bool withCond64=false, ConditionCode cond64=COND_UC) const
void printVecPredReg(std::ostream &os, RegIndex reg_idx, bool is_png=false) const
void printVecReg(std::ostream &os, RegIndex reg_idx, bool isSveVecReg=false) const
void printIntReg(std::ostream &os, RegIndex reg_idx, uint8_t opWidth=0) const
Print a register name for disassembly given the unique dependence tag number (FP or int).
void printFloatReg(std::ostream &os, RegIndex reg_idx) const
SveAdrOffsetFormat offsetFormat
Definition sve.hh:787
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:676
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:408
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:392
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:441
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:909
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:362
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:348
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:893
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:427
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:378
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:1028
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:507
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:492
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:283
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:1009
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:971
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:991
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:940
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:957
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:700
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:114
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:125
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:137
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:150
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:660
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:640
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:1085
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:1070
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:600
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:728
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:742
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:250
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:265
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:478
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:93
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:75
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:61
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:458
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:1042
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:1056
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:839
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:874
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:851
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:861
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:232
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:616
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:630
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:586
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:758
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:798
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:811
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:569
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:553
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:523
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:539
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:295
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:784
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:924
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:309
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:333
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:321
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:827
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:884
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:164
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:183
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition sve.cc:206
const char * mnemonic
Base mnemonic (e.g., "add").
constexpr T bits(T val, unsigned first, unsigned last)
Extract the bitfield from position 'first' to 'last' (inclusive) from 'val' and right justify it.
Definition bitfield.hh:79
#define panic(...)
This implements a cprintf based panic() function.
Definition logging.hh:220
Bitfield< 7, 0 > imm
Definition types.hh:132
void sveCounterToPredicate(VecPredRegContainer &pred_mask, uint16_t pred, unsigned pred_width, unsigned vl, unsigned regidx)
Decocde predicate-as-counter to predicate-as-mask.
Definition sve.cc:1239
uint64_t sveExpandFpImmAddSub(uint8_t imm, uint8_t size)
Expand 1-bit floating-point immediate to 0.5 or 1.0 (FADD, FSUB, FSUBR).
Definition sve.cc:1176
unsigned int sveDecodePredCount(uint8_t imm, unsigned int num_elems)
Returns the actual number of elements active for PTRUE(S) instructions.
Definition sve.cc:1133
Bitfield< 9 > e
Definition misc_types.hh:65
const char * svePredTypeToStr(SvePredType pt)
Returns the specifier for the predication type pt as a string.
Definition sve.cc:48
uint16_t sveEncodePredCount(int esize, int elements, int count_in, bool invert_in)
Encode predicate-as-mark to predicate-as-counter.
Definition sve.cc:1296
std::string sveDisasmPredCountImm(uint8_t imm)
Returns the symbolic name associated with pattern imm for PTRUE(S) instructions.
Definition sve.cc:1101
VecPredReg::Container VecPredRegContainer
Definition vec.hh:71
uint64_t sveExpandFpImmMul(uint8_t imm, uint8_t size)
Expand 1-bit floating-point immediate to 0.5 or 2.0 (FMUL).
Definition sve.cc:1217
uint64_t sveExpandFpImmMaxMin(uint8_t imm, uint8_t size)
Expand 1-bit floating-point immediate to 0.0 or 1.0 (FMAX, FMAXNM, FMIN, FMINNM).
Definition sve.cc:1198
Bitfield< 21 > ss
Definition misc_types.hh:60
Bitfield< 4 > pc
Bitfield< 27, 24 > pred
Definition types.hh:91
Bitfield< 57, 41 > vl
Definition types.hh:63
Bitfield< 23 > inv
Definition misc.hh:843
Copyright (c) 2024 Arm Limited All rights reserved.
Definition binary32.hh:36
Bitfield< 8 > pt
Definition x86_cpu.cc:127
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 Mon Oct 27 2025 04:12:54 for gem5 by doxygen 1.14.0