gem5  v22.1.0.0
sve.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017-2019 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 
42 namespace gem5
43 {
44 
45 namespace ArmISA {
46 
47 const char*
49 {
50  switch (pt) {
51  case SvePredType::MERGE:
52  return "m";
53  case SvePredType::ZERO:
54  return "z";
55  default:
56  return "";
57  }
58 }
59 
60 std::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 
74 std::string
76  Addr pc, const loader::SymbolTable *symtab) const
77 {
78  std::stringstream ss;
79  printMnemonic(ss, "", false);
80  if (destIsVec) {
81  printVecReg(ss, dest, true);
82  } else {
84  }
85  ccprintf(ss, ", ");
86  uint8_t opWidth = 64;
88  ccprintf(ss, ", ");
89  if (srcIs32b)
90  opWidth = 32;
91  printIntReg(ss, dest, opWidth);
92  return ss.str();
93 }
94 
95 std::string
97  Addr pc, const loader::SymbolTable *symtab) const
98 {
99  std::stringstream ss;
100  printMnemonic(ss, "", false);
101  printVecReg(ss, dest, true);
102  ccprintf(ss, ", #%d, #%d", imm1, imm2);
103  return ss.str();
104 }
105 
106 std::string
108  Addr pc, const loader::SymbolTable *symtab) const
109 {
110  std::stringstream ss;
111  printMnemonic(ss, "", false);
112  printVecReg(ss, dest, true);
113  ccprintf(ss, ", #%d, ", imm1);
114  printIntReg(ss, op2);
115  return ss.str();
116 }
117 
118 std::string
120  Addr pc, const loader::SymbolTable *symtab) const
121 {
122  std::stringstream ss;
123  printMnemonic(ss, "", false);
124  printVecReg(ss, dest, true);
125  ccprintf(ss, ", ");
126  printIntReg(ss, op1);
127  ccprintf(ss, ", #%d", imm2);
128  return ss.str();
129 }
130 
131 std::string
133  Addr pc, const loader::SymbolTable *symtab) const
134 {
135  std::stringstream ss;
136  printMnemonic(ss, "", false);
137  printVecReg(ss, dest, true);
138  ccprintf(ss, ", ");
139  printIntReg(ss, op1);
140  ccprintf(ss, ", ");
141  printIntReg(ss, op2);
142  return ss.str();
143 }
144 
145 std::string
147  Addr pc, const loader::SymbolTable *symtab) const
148 {
149  std::stringstream ss;
150  printMnemonic(ss, "", false);
152  ccprintf(ss, ", ");
153  uint8_t opWidth;
154  if (srcIs32b)
155  opWidth = 32;
156  else
157  opWidth = 64;
158  printIntReg(ss, op1, opWidth);
159  ccprintf(ss, ", ");
160  printIntReg(ss, op2, opWidth);
161  return ss.str();
162 }
163 
164 std::string
166  Addr pc, const loader::SymbolTable *symtab) const
167 {
168  std::stringstream ss;
169  printMnemonic(ss, "", false);
170  printIntReg(ss, op1);
171  ccprintf(ss, ", ");
172  printIntReg(ss, op2);
173  return ss.str();
174 }
175 
176 std::string
178  Addr pc, const loader::SymbolTable *symtab) const
179 {
180  std::stringstream ss;
181  printMnemonic(ss, "", false);
182  printVecReg(ss, dest, true);
183  ccprintf(ss, ", ");
185  ccprintf(ss, "/m, ");
186  printVecReg(ss, op1, true);
187  return ss.str();
188 }
189 
190 std::string
192  Addr pc, const loader::SymbolTable *symtab) const
193 {
194  std::stringstream ss;
195  printMnemonic(ss, "", false);
196  printVecReg(ss, dest, true);
197  ccprintf(ss, ", ");
198  printVecReg(ss, op1, true);
199  return ss.str();
200 }
201 
202 std::string
204  Addr pc, const loader::SymbolTable *symtab) const
205 {
206  std::stringstream ss;
207  printMnemonic(ss, "", false);
208  printVecReg(ss, dest, true);
209  ccprintf(ss, ", #");
210  ss << imm;
211  return ss.str();
212 }
213 
214 std::string
216  Addr pc, const loader::SymbolTable *symtab) const
217 {
218  std::stringstream ss;
219  printMnemonic(ss, "", false);
220  printVecReg(ss, dest, true);
221  ccprintf(ss, ", ");
223  ccprintf(ss, (isMerging ? "/m" : "/z"));
224  ccprintf(ss, ", #");
225  ss << imm;
226  return ss.str();
227 }
228 
229 std::string
231  Addr pc, const loader::SymbolTable *symtab) const
232 {
233  std::stringstream ss;
234  printMnemonic(ss, "", false);
235  printVecReg(ss, dest, true);
236  ccprintf(ss, ", ");
238  ccprintf(ss, ", #");
239  ss << imm;
240  return ss.str();
241 }
242 
243 std::string
245  Addr pc, const loader::SymbolTable *symtab) const
246 {
247  std::stringstream ss;
248  printMnemonic(ss, "", false);
249  printVecReg(ss, dest, true);
250  ccprintf(ss, ", ");
252  ccprintf(ss, "/m, ");
253  printVecReg(ss, dest, true);
254  ccprintf(ss, ", #");
255  ss << imm;
256  return ss.str();
257 }
258 
259 std::string
261  Addr pc, const loader::SymbolTable *symtab) const
262 {
263  std::stringstream ss;
264  printMnemonic(ss, "", false);
265  printVecReg(ss, dest, true);
266  ccprintf(ss, ", ");
267  printVecReg(ss, dest, true);
268  ccprintf(ss, ", #");
269  ss << imm;
270  return ss.str();
271 }
272 
273 std::string
275  Addr pc, const loader::SymbolTable *symtab) const
276 {
277  std::stringstream ss;
278  printMnemonic(ss, "", false);
279  printVecReg(ss, dest, true);
280  ccprintf(ss, ", ");
282  ccprintf(ss, "/m, ");
283  printVecReg(ss, dest, true);
284  ccprintf(ss, ", ");
285  printVecReg(ss, op2, true);
286  return ss.str();
287 }
288 
289 std::string
291  Addr pc, const loader::SymbolTable *symtab) const
292 {
293  std::stringstream ss;
294  printMnemonic(ss, "", false);
295  printVecReg(ss, dest, true);
296  ccprintf(ss, ", ");
300  }
301  ccprintf(ss, ", ");
302  printVecReg(ss, op1, true);
303  ccprintf(ss, ", ");
304  printVecReg(ss, op2, true);
305  return ss.str();
306 }
307 
308 std::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  ccprintf(ss, ", ");
318  printVecReg(ss, op2, true);
319  return ss.str();
320 }
321 
322 std::string
324  Addr pc, const loader::SymbolTable *symtab) const
325 {
326  std::stringstream ss;
327  printMnemonic(ss, "", false);
328  printVecReg(ss, dest, true);
329  ccprintf(ss, ", ");
330  printVecReg(ss, op1, true);
331  ccprintf(ss, ", ");
332  printVecReg(ss, op2, true);
333  ccprintf(ss, "[");
334  ss << (uint64_t)index;
335  ccprintf(ss, "]");
336  return ss.str();
337 }
338 
339 std::string
341  Addr pc, const loader::SymbolTable *symtab) const
342 {
343  std::stringstream ss;
344  printMnemonic(ss, "", false);
345  printVecReg(ss, dest, true);
346  ccprintf(ss, ", ");
348  if (isSel) {
349  ccprintf(ss, ", ");
350  } else {
351  ccprintf(ss, "/z, ");
352  }
354  ccprintf(ss, ", ");
356  return ss.str();
357 }
358 
359 std::string
361  Addr pc, const loader::SymbolTable *symtab) const
362 {
363  std::stringstream ss;
364  printMnemonic(ss, "", false);
366  ccprintf(ss, ", ");
368  ccprintf(ss, ", ");
370  return ss.str();
371 }
372 
373 std::string
375 {
376  std::stringstream ss;
377  printMnemonic(ss, "", false);
379  ccprintf(ss, ", ");
381  ccprintf(ss, "/z, ");
382  printVecReg(ss, op1, true);
383  ccprintf(ss, ", ");
384  printVecReg(ss, op2, true);
385  return ss.str();
386 }
387 
388 std::string
390  Addr pc, const loader::SymbolTable *symtab) const
391 {
392  std::stringstream ss;
393  printMnemonic(ss, "", false);
395  ccprintf(ss, ", ");
397  ccprintf(ss, "/z, ");
398  printVecReg(ss, op1, true);
399  ccprintf(ss, ", #");
400  ss << imm;
401  return ss.str();
402 }
403 
404 std::string
406  Addr pc, const loader::SymbolTable *symtab) const
407 {
408  std::stringstream ss;
409  printMnemonic(ss, "", false);
410  printVecReg(ss, dest, true);
411  ccprintf(ss, ", ");
413  ccprintf(ss, "/m, ");
414  printVecReg(ss, op1, true);
415  ccprintf(ss, ", ");
416  printVecReg(ss, op2, true);
417  return ss.str();
418 }
419 
420 std::string
422  Addr pc, const loader::SymbolTable *symtab) const
423 {
424  std::stringstream ss;
425  printMnemonic(ss, "", false);
426  printVecReg(ss, dest, true);
427  ccprintf(ss, ", ");
428  printVecReg(ss, dest, true);
429  ccprintf(ss, ", ");
430  printVecReg(ss, op2, true);
431  ccprintf(ss, ", #");
432  ss << imm;
433  return ss.str();
434 }
435 
436 std::string
438  Addr pc, const loader::SymbolTable *symtab) const
439 {
440  std::stringstream ss;
441  printMnemonic(ss, "", false);
443  ccprintf(ss, ", ");
445  ccprintf(ss, ", ");
446  printVecReg(ss, op1, true);
447  return ss.str();
448 }
449 
450 std::string
452  Addr pc, const loader::SymbolTable *symtab) const
453 {
454  std::stringstream ss;
455  printMnemonic(ss, "", false);
457  ccprintf(ss, ", ");
459  ccprintf(ss, ", ");
461  ccprintf(ss, ", ");
462  printVecReg(ss, op1, true);
463  return ss.str();
464 }
465 
466 std::string
468  Addr pc, const loader::SymbolTable *symtab) const
469 {
470  std::stringstream ss;
471  printMnemonic(ss, "", false);
473  if (imm != 0x1f) {
474  ccprintf(ss, ", ");
476  }
477  return ss.str();
478 }
479 
480 std::string
482  Addr pc, const loader::SymbolTable *symtab) const
483 {
484  std::stringstream ss;
485  printMnemonic(ss, "", false);
487  ccprintf(ss, ", ");
489  ccprintf(ss, "/z, ");
490  printVecReg(ss, op1, true);
491  ccprintf(ss, ", ");
492  if (op2IsWide) {
493  printVecReg(ss, op2, true);
494  } else {
495  printVecReg(ss, op2, true);
496  }
497  return ss.str();
498 }
499 
500 std::string
502  Addr pc, const loader::SymbolTable *symtab) const
503 {
504  std::stringstream ss;
505  printMnemonic(ss, "", false);
507  ccprintf(ss, "/z, ");
509  ccprintf(ss, ", ");
510  printVecReg(ss, op1, true);
511  ccprintf(ss, ", #");
512  ss << imm;
513  return ss.str();
514 }
515 
516 std::string
518 {
519  std::stringstream ss;
520  printMnemonic(ss, "", false);
521  printVecReg(ss, dest, true);
522  ccprintf(ss, ", [");
523  printVecReg(ss, op1, true);
524  ccprintf(ss, ", ");
525  printVecReg(ss, op2, true);
527  ccprintf(ss, ", sxtw");
529  ccprintf(ss, ", uxtw");
530  } else if (mult != 1) {
531  ccprintf(ss, ", lsl");
532  }
533  if (mult != 1) {
534  ss << __builtin_ctz(mult);
535  }
536  ccprintf(ss, "]");
537  return ss.str();
538 }
539 
540 std::string
542  Addr pc, const loader::SymbolTable *symtab) const
543 {
544  static const char suffix[9] =
545  {'\0', 'b', 'h', '\0', 'w', '\0', '\0', '\0', 'd'};
546  std::stringstream ss;
547  ss << " " << mnemonic << suffix[esize] << " ";
548  if (dstIsVec) {
549  printVecReg(ss, dest, true);
550  } else {
551  if (dstIs32b) {
552  printIntReg(ss, dest, 32);
553  } else {
554  printIntReg(ss, dest, 64);
555  }
556  }
557  if (pattern != 0x1f) {
558  ccprintf(ss, ", ");
560  if (imm != 1) {
561  ccprintf(ss, ", mul #");
562  ss << std::to_string(imm);
563  }
564  }
565  return ss.str();
566 }
567 
568 std::string
570  Addr pc, const loader::SymbolTable *symtab) const
571 {
572  std::stringstream ss;
573  printMnemonic(ss, "", false);
575  ccprintf(ss, ", ");
577  ccprintf(ss, isMerging ? "/m, " : "/z, ");
579  return ss.str();
580 }
581 
582 std::string
584  Addr pc, const loader::SymbolTable *symtab) const
585 {
586  std::stringstream ss;
587  printMnemonic(ss, "", false);
589  ccprintf(ss, ", ");
591  ccprintf(ss, "/z, ");
593  ccprintf(ss, ", ");
595  return ss.str();
596 }
597 
598 std::string
600  Addr pc, const loader::SymbolTable *symtab) const
601 {
602  std::stringstream ss;
603  printMnemonic(ss, "", false);
604  if (scalar)
606  else if (simdFp)
608  else
609  printVecReg(ss, dest, true);
610  ccprintf(ss, ", ");
612  if (conditional) {
613  ccprintf(ss, ", ");
614  if (scalar)
616  else
617  printVecReg(ss, dest, true);
618  }
619  ccprintf(ss, ", ");
620  printVecReg(ss, op1, true);
621  return ss.str();
622 }
623 
624 std::string
626  Addr pc, const loader::SymbolTable *symtab) const
627 {
628  std::stringstream ss;
629  printMnemonic(ss, "", false);
631  ccprintf(ss, ", ");
633  ccprintf(ss, ", ");
635  return ss.str();
636 }
637 
638 std::string
640 {
641  std::stringstream ss;
642  printMnemonic(ss, "", false);
643  printVecReg(ss, dest, true);
644  ccprintf(ss, ", { ");
645  printVecReg(ss, op1, true);
646  ccprintf(ss, " }, ");
647  printVecReg(ss, op2, true);
648  return ss.str();
649 }
650 
651 std::string
653  Addr pc, const loader::SymbolTable *symtab) const
654 {
655  std::stringstream ss;
656  printMnemonic(ss, "", false);
658  ccprintf(ss, ", ");
660  return ss.str();
661 }
662 
663 std::string
665  Addr pc, const loader::SymbolTable *symtab) const
666 {
667  std::stringstream ss;
668  printMnemonic(ss, "", false);
670  ccprintf(ss, ", ");
672  return ss.str();
673 }
674 
675 std::string
677  Addr pc, const loader::SymbolTable *symtab) const
678 {
679  std::stringstream ss;
680  printMnemonic(ss, "", false);
682  return ss.str();
683 }
684 
685 std::string
687  Addr pc, const loader::SymbolTable *symtab) const
688 {
689  std::stringstream ss;
690  printMnemonic(ss, "", false);
692  ccprintf(ss, ", ");
694  ccprintf(ss, "/z, ");
695  return ss.str();
696 }
697 
698 std::string
700  Addr pc, const loader::SymbolTable *symtab) const
701 {
702  std::stringstream ss;
703  printMnemonic(ss, "", false);
705  return ss.str();
706 }
707 
708 std::string
710  Addr pc, const loader::SymbolTable *symtab) const
711 {
712  std::stringstream ss;
713  printMnemonic(ss, "", false);
714  return ss.str();
715 }
716 
717 std::string
719  Addr pc, const loader::SymbolTable *symtab) const
720 {
721  std::stringstream ss;
722  printMnemonic(ss, "", false);
723  printVecReg(ss, dest, true);
724  ccprintf(ss, ", ");
725  printVecReg(ss, dest, true);
726  ccprintf(ss, ", ");
727  printVecReg(ss, op1, true);
728  ccprintf(ss, ", #");
729  ss << imm;
730  return ss.str();
731 }
732 
733 std::string
735  Addr pc, const loader::SymbolTable *symtab) const
736 {
737  std::stringstream ss;
738  printMnemonic(ss, "", false);
739  printVecReg(ss, dest, true);
740  ccprintf(ss, ", ");
741  printVecReg(ss, op1, true);
742  ccprintf(ss, "[");
743  ss << imm;
744  ccprintf(ss, "]");
745  return ss.str();
746 }
747 
748 std::string
750  Addr pc, const loader::SymbolTable *symtab) const
751 {
752  std::stringstream ss;
753  printMnemonic(ss, "", false);
754  printVecReg(ss, dest, true);
755  ccprintf(ss, ", ");
756  if (simdFp) {
757  printFloatReg(ss, op1);
758  } else {
759  printIntReg(ss, op1);
760  }
761  return ss.str();
762 }
763 
764 std::string
766  Addr pc, const loader::SymbolTable *symtab) const
767 {
768  std::stringstream ss;
769  printMnemonic(ss, "", false);
770  printVecReg(ss, dest, true);
771  ccprintf(ss, ", ");
772  printVecReg(ss, op1, true);
773  ccprintf(ss, ", ");
774  printVecReg(ss, op2, true);
775  ccprintf(ss, "[");
776  ccprintf(ss, "%lu", imm);
777  ccprintf(ss, "]");
778  return ss.str();
779 }
780 
781 std::string
783  Addr pc, const loader::SymbolTable *symtab) const
784 {
785  std::stringstream ss;
786  printMnemonic(ss, "", false);
787  printVecReg(ss, dest, true);
788  ccprintf(ss, ", ");
789  printVecReg(ss, op1, true);
790  ccprintf(ss, ", ");
791  printVecReg(ss, op2, true);
792  return ss.str();
793 }
794 
795 std::string
797  Addr pc, const loader::SymbolTable *symtab) const
798 {
799  std::stringstream ss;
800  printMnemonic(ss, "", false);
802  ccprintf(ss, ", ");
804  ccprintf(ss, "/m, ");
806  ccprintf(ss, ", ");
808  ccprintf(ss, ", #");
809  const char* rotstr[4] = {"0", "90", "180", "270"};
810  ccprintf(ss, rotstr[rot]);
811 
812  return ss.str();
813 }
814 
815 std::string
817  Addr pc, const loader::SymbolTable *symtab) const
818 {
819  std::stringstream ss;
820  printMnemonic(ss, "", false);
822  ccprintf(ss, ", ");
824  ccprintf(ss, ", ");
826  ccprintf(ss, "[");
827  ss << imm;
828  ccprintf(ss, "], #");
829  const char* rotstr[4] = {"0", "90", "180", "270"};
830  ccprintf(ss, rotstr[rot]);
831  return ss.str();
832 }
833 
834 std::string
836 {
837  switch (imm) {
838  case 0x0:
839  return "POW2";
840  case 0x1:
841  case 0x2:
842  case 0x3:
843  case 0x4:
844  case 0x5:
845  case 0x6:
846  case 0x7:
847  return "VL" + std::to_string(imm);
848  case 0x8:
849  case 0x9:
850  case 0xa:
851  case 0xb:
852  case 0xc:
853  case 0xd:
854  return "VL" + std::to_string(1 << ((imm & 0x7) + 3));
855  case 0x1d:
856  return "MUL4";
857  case 0x1e:
858  return "MUL3";
859  case 0x1f:
860  return "ALL";
861  default:
862  return "#" + std::to_string(imm);
863  }
864 }
865 
866 unsigned int
867 sveDecodePredCount(uint8_t imm, unsigned int num_elems)
868 {
869  assert(num_elems > 0);
870 
871  switch (imm) {
872  case 0x0:
873  // POW2
874  return 1 << (31 - __builtin_clz((uint32_t) num_elems));
875  case 0x1:
876  case 0x2:
877  case 0x3:
878  case 0x4:
879  case 0x5:
880  case 0x6:
881  case 0x7:
882  // VL1, VL2, VL3, VL4, VL5, VL6, VL7
883  return (num_elems >= imm) ? imm : 0;
884  case 0x8:
885  case 0x9:
886  case 0xa:
887  case 0xb:
888  case 0xc:
889  case 0xd:
890  // VL8, VL16, VL32, VL64, VL128, VL256
891  {
892  unsigned int pcount = 1 << ((imm & 0x7) + 3);
893  return (num_elems >= pcount) ? pcount : 0;
894  }
895  case 0x1d:
896  // MUL4
897  return num_elems - (num_elems % 4);
898  case 0x1e:
899  // MUL3
900  return num_elems - (num_elems % 3);
901  case 0x1f:
902  // ALL
903  return num_elems;
904  default:
905  return 0;
906  }
907 }
908 
909 uint64_t
910 sveExpandFpImmAddSub(uint8_t imm, uint8_t size)
911 {
912  static constexpr uint16_t fpOne16 = 0x3c00;
913  static constexpr uint16_t fpPointFive16 = 0x3800;
914  static constexpr uint32_t fpOne32 = 0x3f800000;
915  static constexpr uint32_t fpPointFive32 = 0x3f000000;
916  static constexpr uint64_t fpOne64 = 0x3ff0000000000000;
917  static constexpr uint64_t fpPointFive64 = 0x3fe0000000000000;
918 
919  switch (size) {
920  case 0x1:
921  return imm ? fpOne16 : fpPointFive16;
922  case 0x2:
923  return imm ? fpOne32 : fpPointFive32;
924  case 0x3:
925  return imm ? fpOne64 : fpPointFive64;
926  default:
927  panic("Unsupported size");
928  }
929 }
930 
931 uint64_t
932 sveExpandFpImmMaxMin(uint8_t imm, uint8_t size)
933 {
934  static constexpr uint16_t fpOne16 = 0x3c00;
935  static constexpr uint32_t fpOne32 = 0x3f800000;
936  static constexpr uint64_t fpOne64 = 0x3ff0000000000000;
937 
938  switch (size) {
939  case 0x1:
940  return imm ? fpOne16 : 0x0;
941  case 0x2:
942  return imm ? fpOne32 : 0x0;
943  case 0x3:
944  return imm ? fpOne64 : 0x0;
945  default:
946  panic("Unsupported size");
947  }
948 }
949 
950 uint64_t
951 sveExpandFpImmMul(uint8_t imm, uint8_t size)
952 {
953  static constexpr uint16_t fpTwo16 = 0x4000;
954  static constexpr uint16_t fpPointFive16 = 0x3800;
955  static constexpr uint32_t fpTwo32 = 0x40000000;
956  static constexpr uint32_t fpPointFive32 = 0x3f000000;
957  static constexpr uint64_t fpTwo64 = 0x4000000000000000;
958  static constexpr uint64_t fpPointFive64 = 0x3fe0000000000000;
959 
960  switch (size) {
961  case 0x1:
962  return imm ? fpTwo16 : fpPointFive16;
963  case 0x2:
964  return imm ? fpTwo32 : fpPointFive32;
965  case 0x3:
966  return imm ? fpTwo64 : fpPointFive64;
967  default:
968  panic("Unsupported size");
969  }
970 }
971 
972 } // namespace ArmISA
973 } // namespace gem5
void printMnemonic(std::ostream &os, const std::string &suffix="", bool withPred=true, bool withCond64=false, ConditionCode cond64=COND_UC) const
Definition: static_inst.cc:377
void printVecReg(std::ostream &os, RegIndex reg_idx, bool isSveVecReg=false) const
Definition: static_inst.cc:351
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).
Definition: static_inst.cc:299
void printFloatReg(std::ostream &os, RegIndex reg_idx) const
Definition: static_inst.cc:345
void printVecPredReg(std::ostream &os, RegIndex reg_idx) const
Definition: static_inst.cc:358
SveAdrOffsetFormat offsetFormat
Definition: sve.hh:598
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:517
@ SveAdrOffsetUnpackedUnsigned
Definition: sve.hh:592
@ SveAdrOffsetUnpackedSigned
Definition: sve.hh:591
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:290
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:274
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:323
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:734
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:244
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:230
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:718
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:260
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:389
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:374
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:165
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:816
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:796
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:765
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:782
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:541
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:96
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:107
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:119
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:132
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:501
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:481
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:451
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:583
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:360
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:340
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:664
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:699
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:686
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:467
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:437
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:599
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:639
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:421
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:405
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:177
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:625
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:749
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:191
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:215
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:203
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:652
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:709
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition: sve.cc:146
const char * mnemonic
Base mnemonic (e.g., "add").
Definition: static_inst.hh:259
#define panic(...)
This implements a cprintf based panic() function.
Definition: logging.hh:178
SvePredType
Definition: sve.hh:49
Bitfield< 7, 0 > imm
Definition: types.hh:132
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:910
unsigned int sveDecodePredCount(uint8_t imm, unsigned int num_elems)
Returns the actual number of elements active for PTRUE(S) instructions.
Definition: sve.cc:867
const char * svePredTypeToStr(SvePredType pt)
Returns the specifier for the predication type pt as a string.
Definition: sve.cc:48
std::string sveDisasmPredCountImm(uint8_t imm)
Returns the symbolic name associated with pattern imm for PTRUE(S) instructions.
Definition: sve.cc:835
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:951
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:932
Bitfield< 21 > ss
Definition: misc_types.hh:60
Bitfield< 4 > pc
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
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
const std::string to_string(sc_enc enc)
Definition: sc_fxdefs.cc:60

Generated on Wed Dec 21 2022 10:22:26 for gem5 by doxygen 1.9.1