gem5 v25.0.0.1
Loading...
Searching...
No Matches
vector.hh
Go to the documentation of this file.
1/*
2 * Copyright (c) 2022 PLCT Lab
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;
9 * redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution;
12 * neither the name of the copyright holders nor the names of its
13 * contributors may be used to endorse or promote products derived from
14 * this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#ifndef __ARCH_RISCV_INSTS_VECTOR_HH__
30#define __ARCH_RISCV_INSTS_VECTOR_HH__
31
32#include <string>
33
34#include "arch/riscv/faults.hh"
36#include "arch/riscv/isa.hh"
38#include "arch/riscv/utility.hh"
39#include "cpu/exec_context.hh"
40#include "cpu/static_inst.hh"
41
42namespace gem5
43{
44
45namespace RiscvISA
46{
47
48float
49getVflmul(uint32_t vlmul_encoding);
50
51inline uint32_t
52getSew(uint32_t vsew)
53{
54 assert(vsew <= 3);
55 return (8 << vsew);
56}
57
58uint32_t
59getVlmax(VTYPE vtype, uint32_t vlen);
60
61inline uint32_t
62get_emul(uint32_t eew, uint32_t sew, float vflmul, bool is_mask_ldst)
63{
64 eew = is_mask_ldst ? 1 : eew;
65 float vemul = is_mask_ldst ? 1 : (float)eew / sew * vflmul;
66 uint32_t emul = vemul < 1 ? 1 : vemul;
67 return emul;
68}
69
74{
75 protected:
76 uint64_t bit30;
77 uint64_t bit31;
78 uint64_t zimm10;
79 uint64_t zimm11;
80 uint64_t uimm;
81 uint32_t elen;
82 uint32_t vlen;
83 VConfOp(const char *mnem, ExtMachInst _extMachInst,
84 uint32_t _elen, uint32_t _vlen, OpClass __opClass)
85 : RiscvStaticInst(mnem, _extMachInst, __opClass),
86 bit30(_extMachInst.bit30), bit31(_extMachInst.bit31),
87 zimm10(_extMachInst.zimm_vsetivli),
88 zimm11(_extMachInst.zimm_vsetvli),
89 uimm(_extMachInst.uimm_vsetivli),
90 elen(_elen),
91 vlen(_vlen)
92 {
93 this->flags[IsVector] = true;
94 }
95
96 std::string generateDisassembly(
97 Addr pc, const loader::SymbolTable *symtab) const override;
98
99 std::string generateZimmDisassembly() const;
100};
101
102inline uint8_t checked_vtype(bool vill, uint8_t vtype) {
103 panic_if(vill, "vill has been set");
104 const uint8_t vsew = bits(vtype, 5, 3);
105 panic_if(vsew >= 0b100, "vsew: %#x not supported", vsew);
106 const uint8_t vlmul = bits(vtype, 2, 0);
107 panic_if(vlmul == 0b100, "vlmul: %#x not supported", vlmul);
108 return vtype;
109}
110
112{
113 protected:
114 uint32_t vl;
115 uint8_t vtype;
116 uint32_t elen;
117 uint32_t vlen;
118 VectorNonSplitInst(const char* mnem, ExtMachInst _machInst,
119 OpClass __opClass, uint32_t _elen, uint32_t _vlen)
120 : RiscvStaticInst(mnem, _machInst, __opClass),
121 vl(_machInst.vl),
122 vtype(_machInst.vtype8),
123 elen(_elen),
124 vlen(_vlen)
125 {
126 this->flags[IsVector] = true;
127 }
128
129 std::string generateDisassembly(
130 Addr pc, const loader::SymbolTable *symtab) const override;
131};
132
134{
135 protected:
136 uint32_t vl;
137 uint8_t vtype;
138 uint32_t elen;
139 uint32_t vlen;
140 int oldDstIdx = -1;
141 int vmsrcIdx = -1;
142 const uint8_t vsew;
143 const int8_t vlmul;
144 const uint32_t sew;
145 const float vflmul;
146
147 VectorMacroInst(const char* mnem, ExtMachInst _machInst,
148 OpClass __opClass, uint32_t _elen, uint32_t _vlen)
149 : RiscvMacroInst(mnem, _machInst, __opClass),
150 vl(_machInst.vl),
151 vtype(_machInst.vtype8),
152 elen(_elen),
153 vlen(_vlen),
154 vsew(_machInst.vtype8.vsew),
155 vlmul(vtype_vlmul(_machInst.vtype8)),
156 sew((8 << vsew)),
157 vflmul(vlmul < 0 ? (1.0 / (1 << (-vlmul))) : (1 << vlmul))
158 {
159 this->flags[IsVector] = true;
160 }
161};
162
164{
165protected:
166 uint32_t microVl;
167 uint32_t microIdx;
168 uint8_t vtype;
169 uint32_t elen;
170 uint32_t vlen;
171 int oldDstIdx = -1;
172 int vmsrcIdx = -1;
173 const uint8_t vsew;
174 const int8_t vlmul;
175 const uint32_t sew;
176 const float vflmul;
177
178 VectorMicroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
179 uint32_t _microVl, uint32_t _microIdx, uint32_t _elen, uint32_t _vlen)
180 : RiscvMicroInst(mnem, _machInst, __opClass),
181 microVl(_microVl),
182 microIdx(_microIdx),
183 vtype(_machInst.vtype8),
184 elen(_elen),
185 vlen(_vlen),
186 vsew(_machInst.vtype8.vsew),
187 vlmul(vtype_vlmul(_machInst.vtype8)),
188 sew((8 << vsew)),
189 vflmul(vlmul < 0 ? (1.0 / (1 << (-vlmul))) : (1 << vlmul))
190 {
191 this->flags[IsVector] = true;
192 }
193};
194
196{
197protected:
199public:
201 : RiscvMicroInst("vnop", _machInst, No_OpClass)
202 , fault(fault)
203 {}
204
206 const override
207 {
208 return fault;
209 }
210
211 std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab)
212 const override
213 {
214 std::stringstream ss;
215 ss << mnemonic;
216 return ss.str();
217 }
218};
219
221{
222protected:
223 VectorArithMicroInst(const char *mnem, ExtMachInst _machInst,
224 OpClass __opClass, uint32_t _microVl,
225 uint32_t _microIdx, uint32_t _elen, uint32_t _vlen)
226 : VectorMicroInst(mnem, _machInst, __opClass, _microVl, _microIdx,
227 _elen, _vlen)
228 {}
229
230 std::string generateDisassembly(
231 Addr pc, const loader::SymbolTable *symtab) const override;
232};
233
235{
236 protected:
237 VectorArithMacroInst(const char* mnem, ExtMachInst _machInst,
238 OpClass __opClass, uint32_t _elen, uint32_t _vlen)
239 : VectorMacroInst(mnem, _machInst, __opClass, _elen, _vlen)
240 {
241 this->flags[IsVector] = true;
242 }
243 std::string generateDisassembly(
244 Addr pc, const loader::SymbolTable *symtab) const override;
245};
246
248{
249protected:
250 VectorVMUNARY0MicroInst(const char *mnem, ExtMachInst _machInst,
251 OpClass __opClass, uint32_t _microVl,
252 uint32_t _microIdx, uint32_t _elen, uint32_t _vlen)
253 : VectorMicroInst(mnem, _machInst, __opClass, _microVl, _microIdx,
254 _elen, _vlen)
255 {}
256
257 std::string generateDisassembly(
258 Addr pc, const loader::SymbolTable *symtab) const override;
259};
260
262{
263 protected:
264 VectorVMUNARY0MacroInst(const char* mnem, ExtMachInst _machInst,
265 OpClass __opClass, uint32_t _elen, uint32_t _vlen)
266 : VectorMacroInst(mnem, _machInst, __opClass, _elen, _vlen)
267 {
268 this->flags[IsVector] = true;
269 }
270
271 std::string generateDisassembly(
272 Addr pc, const loader::SymbolTable *symtab) const override;
273};
274
276{
277 protected:
278 VectorSlideMacroInst(const char* mnem, ExtMachInst _machInst,
279 OpClass __opClass, uint32_t _elen, uint32_t _vlen)
280 : VectorMacroInst(mnem, _machInst, __opClass, _elen, _vlen)
281 {
282 this->flags[IsVector] = true;
283 }
284
285 std::string generateDisassembly(
286 Addr pc, const loader::SymbolTable *symtab) const override;
287};
288
290{
291 protected:
292 uint32_t vdIdx;
293 uint32_t vs2Idx;
294 uint32_t vs3Idx;
295 VectorSlideMicroInst(const char *mnem, ExtMachInst _machInst,
296 OpClass __opClass, uint32_t _microVl,
297 uint32_t _microIdx, uint32_t _vdIdx, uint32_t _vs2Idx,
298 uint32_t _vs3Idx, uint32_t _elen, uint32_t _vlen)
299 : VectorMicroInst(mnem, _machInst, __opClass, _microVl, _microIdx,
300 _elen, _vlen)
301 , vdIdx(_vdIdx), vs2Idx(_vs2Idx), vs3Idx(_vs3Idx)
302 {}
303
304 std::string generateDisassembly(
305 Addr pc, const loader::SymbolTable *symtab) const override;
306};
307
309{
310 protected:
311 uint32_t offset; // Used to calculate EA.
313 const uint8_t veew;
314 const uint32_t eew;
315
316 VectorMemMicroInst(const char* mnem, ExtMachInst _machInst,
317 OpClass __opClass, uint32_t _microVl,
318 uint32_t _microIdx, uint32_t _offset, uint32_t _elen,
319 uint32_t _vlen)
320 : VectorMicroInst(mnem, _machInst, __opClass, _microVl, _microIdx,
321 _elen, _vlen)
322 , offset(_offset)
323 , memAccessFlags(0)
324 , veew(_machInst.width)
325 , eew(width_EEW(veew))
326 {}
327};
328
330{
331 protected:
332 const uint8_t veew;
333 const uint32_t eew;
334 VectorMemMacroInst(const char* mnem, ExtMachInst _machInst,
335 OpClass __opClass, uint32_t _elen, uint32_t _vlen)
336 : VectorMacroInst(mnem, _machInst, __opClass, _elen, _vlen)
337 , veew(_machInst.width)
338 , eew(width_EEW(veew))
339 {}
340};
341
343{
344 protected:
345 VleMacroInst(const char* mnem, ExtMachInst _machInst,
346 OpClass __opClass, uint32_t _elen, uint32_t _vlen)
347 : VectorMemMacroInst(mnem, _machInst, __opClass, _elen, _vlen)
348 {}
349
350 std::string generateDisassembly(
351 Addr pc, const loader::SymbolTable *symtab) const override;
352};
353
355{
356 protected:
357 VseMacroInst(const char* mnem, ExtMachInst _machInst,
358 OpClass __opClass, uint32_t _elen, uint32_t _vlen)
359 : VectorMemMacroInst(mnem, _machInst, __opClass, _elen, _vlen)
360 {}
361
362 std::string generateDisassembly(
363 Addr pc, const loader::SymbolTable *symtab) const override;
364};
365
367{
368 public:
369 mutable bool trimVl;
370 mutable uint32_t faultIdx;
371
372 protected:
374
375 VleMicroInst(const char *mnem, ExtMachInst _machInst,OpClass __opClass,
376 uint32_t _microVl, uint32_t _microIdx, uint32_t _elen,
377 uint32_t _vlen)
378 : VectorMicroInst(mnem, _machInst, __opClass, _microVl, _microIdx,
379 _elen, _vlen)
380 , trimVl(false), faultIdx(_microVl)
381 {
382 this->flags[IsLoad] = true;
383 }
384
385 std::string generateDisassembly(
386 Addr pc, const loader::SymbolTable *symtab) const override;
387};
388
390{
391 protected:
393
394 VseMicroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
395 uint32_t _microVl, uint32_t _microIdx, uint32_t _elen,
396 uint32_t _vlen)
397 : VectorMicroInst(mnem, _machInst, __opClass, _microVl, _microIdx,
398 _elen, _vlen)
399 {
400 this->flags[IsStore] = true;
401 }
402
403 std::string generateDisassembly(
404 Addr pc, const loader::SymbolTable *symtab) const override;
405};
406
408{
409 protected:
410 VlWholeMacroInst(const char *mnem, ExtMachInst _machInst,
411 OpClass __opClass, uint32_t _elen, uint32_t _vlen)
412 : VectorMemMacroInst(mnem, _machInst, __opClass, _elen, _vlen)
413 {}
414
415 std::string generateDisassembly(
416 Addr pc, const loader::SymbolTable *symtab) const override;
417};
418
420{
421 protected:
423
424 VlWholeMicroInst(const char *mnem, ExtMachInst _machInst,
425 OpClass __opClass, uint32_t _microVl, uint32_t _microIdx,
426 uint32_t _elen, uint32_t _vlen)
427 : VectorMicroInst(mnem, _machInst, __opClass, _microVl, _microIdx,
428 _elen, _vlen)
429 {}
430
431 std::string generateDisassembly(
432 Addr pc, const loader::SymbolTable *symtab) const override;
433};
434
436{
437 protected:
438 VsWholeMacroInst(const char *mnem, ExtMachInst _machInst,
439 OpClass __opClass, uint32_t _elen, uint32_t _vlen)
440 : VectorMemMacroInst(mnem, _machInst, __opClass, _elen, _vlen)
441 {}
442
443 std::string generateDisassembly(
444 Addr pc, const loader::SymbolTable *symtab) const override;
445};
446
448{
449 protected:
451
452 VsWholeMicroInst(const char *mnem, ExtMachInst _machInst,
453 OpClass __opClass, uint32_t _microVl,
454 uint32_t _microIdx, uint32_t _elen, uint32_t _vlen)
455 : VectorMicroInst(mnem, _machInst, __opClass , _microVl,
456 _microIdx, _elen, _vlen)
457 {}
458
459 std::string generateDisassembly(
460 Addr pc, const loader::SymbolTable *symtab) const override;
461};
462
464{
465 protected:
466 const bool has_rs2;
467 VlElementMacroInst(const char* mnem, ExtMachInst _machInst,
468 OpClass __opClass, bool _has_rs2, uint32_t _elen,
469 uint32_t _vlen)
470 : VectorMemMacroInst(mnem, _machInst, __opClass, _elen, _vlen),
471 has_rs2(_has_rs2)
472 {}
473
474 std::string generateDisassembly(
475 Addr pc, const loader::SymbolTable *symtab) const override;
476};
477
479{
480 protected:
481 uint32_t regIdx;
482 const bool has_rs2;
483 VlElementMicroInst(const char *mnem, ExtMachInst _machInst,
484 OpClass __opClass, uint32_t _regIdx,
485 uint32_t _microIdx, uint32_t _microVl,
486 uint32_t _offset, bool _has_rs2, uint32_t _elen,
487 uint32_t _vlen)
488 : VectorMemMicroInst(mnem, _machInst, __opClass, _microVl,
489 _microIdx, _offset, _elen, _vlen)
490 , regIdx(_regIdx),
491 has_rs2(_has_rs2)
492 {}
493
494 std::string generateDisassembly(
495 Addr pc, const loader::SymbolTable *symtab) const override;
496};
497
499{
500 protected:
501 const bool has_rs2;
502 VsElementMacroInst(const char* mnem, ExtMachInst _machInst,
503 OpClass __opClass, bool _has_rs2, uint32_t _elen,
504 uint32_t _vlen)
505 : VectorMemMacroInst(mnem, _machInst, __opClass, _elen, _vlen),
506 has_rs2(_has_rs2)
507 {}
508
509 std::string generateDisassembly(
510 Addr pc, const loader::SymbolTable *symtab) const override;
511};
512
514{
515 protected:
516 uint32_t regIdx;
517 const bool has_rs2;
518 VsElementMicroInst(const char *mnem, ExtMachInst _machInst,
519 OpClass __opClass, uint32_t _regIdx,
520 uint32_t _microIdx, uint32_t _microVl,
521 uint32_t _offset, bool _has_rs2, uint32_t _elen,
522 uint32_t _vlen)
523 : VectorMemMicroInst(mnem, _machInst, __opClass, _microVl,
524 _microIdx, _offset, _elen, _vlen)
525 , regIdx(_regIdx),
526 has_rs2(_has_rs2)
527 {}
528
529 std::string generateDisassembly(
530 Addr pc, const loader::SymbolTable *symtab) const override;
531};
532
534{
535 protected:
536 VlIndexMacroInst(const char* mnem, ExtMachInst _machInst,
537 OpClass __opClass, uint32_t _elen, uint32_t _vlen)
538 : VectorMemMacroInst(mnem, _machInst, __opClass, _elen, _vlen)
539 {}
540
541 std::string generateDisassembly(
542 Addr pc, const loader::SymbolTable *symtab) const override;
543};
544
546{
547 protected:
548 uint32_t vdRegIdx;
549 uint32_t vdElemIdx;
550 uint32_t vs2RegIdx;
551 uint32_t vs2ElemIdx;
552 VlIndexMicroInst(const char *mnem, ExtMachInst _machInst,
553 OpClass __opClass, uint32_t _vdRegIdx, uint32_t _vdElemIdx,
554 uint32_t _vs2RegIdx, uint32_t _vs2ElemIdx, uint32_t _elen,
555 uint32_t _vlen)
556 : VectorMemMicroInst(mnem, _machInst, __opClass, 1,
557 0, 0, _elen, _vlen)
558 , vdRegIdx(_vdRegIdx), vdElemIdx(_vdElemIdx)
559 , vs2RegIdx(_vs2RegIdx), vs2ElemIdx(_vs2ElemIdx)
560 {}
561
562 std::string generateDisassembly(
563 Addr pc, const loader::SymbolTable *symtab) const override;
564};
565
567{
568 protected:
569 VsIndexMacroInst(const char* mnem, ExtMachInst _machInst,
570 OpClass __opClass, uint32_t _elen, uint32_t _vlen)
571 : VectorMemMacroInst(mnem, _machInst, __opClass, _elen, _vlen)
572 {}
573
574 std::string generateDisassembly(
575 Addr pc, const loader::SymbolTable *symtab) const override;
576};
577
579{
580 protected:
581 uint32_t vs3RegIdx;
582 uint32_t vs3ElemIdx;
583 uint32_t vs2RegIdx;
584 uint32_t vs2ElemIdx;
585 VsIndexMicroInst(const char *mnem, ExtMachInst _machInst,
586 OpClass __opClass, uint32_t _vs3RegIdx,
587 uint32_t _vs3ElemIdx, uint32_t _vs2RegIdx,
588 uint32_t _vs2ElemIdx, uint32_t _elen, uint32_t _vlen)
589 : VectorMemMicroInst(mnem, _machInst, __opClass, 1, 0, 0, _elen,
590 _vlen),
591 vs3RegIdx(_vs3RegIdx), vs3ElemIdx(_vs3ElemIdx),
592 vs2RegIdx(_vs2RegIdx), vs2ElemIdx(_vs2ElemIdx)
593 {}
594
595 std::string generateDisassembly(
596 Addr pc, const loader::SymbolTable *symtab) const override;
597};
598
600{
601 protected:
602 VMvWholeMacroInst(const char* mnem, ExtMachInst _machInst,
603 OpClass __opClass, uint32_t _elen, uint32_t _vlen)
604 : VectorArithMacroInst(mnem, _machInst, __opClass, _elen, _vlen)
605 {}
606
607 std::string generateDisassembly(
608 Addr pc, const loader::SymbolTable *symtab) const override;
609};
610
612{
613 protected:
614 VMvWholeMicroInst(const char *mnem, ExtMachInst _machInst,
615 OpClass __opClass, uint32_t _microVl,
616 uint32_t _microIdx, uint32_t _elen, uint32_t _vlen)
617 : VectorArithMicroInst(mnem, _machInst, __opClass, _microVl, _microIdx,
618 _elen, _vlen)
619 {}
620
621 std::string generateDisassembly(
622 Addr pc, const loader::SymbolTable *symtab) const override;
623};
624
625
627{
628 private:
631
632 public:
633 size_t elemSize;
634 VMaskMergeMicroInst(ExtMachInst extMachInst, uint8_t _dstReg,
635 uint8_t _numSrcs, uint32_t _elen, uint32_t _vlen,
636 size_t _elemSize);
637 Fault execute(ExecContext *, trace::InstRecord *) const override;
638 std::string generateDisassembly(Addr,
639 const loader::SymbolTable *) const override;
640};
641
643{
644 private:
645 bool* vxsat;
646 public:
647 VxsatMicroInst(bool* Vxsat, ExtMachInst extMachInst, uint32_t _elen,
648 uint32_t _vlen)
649 : VectorArithMicroInst("vxsat_micro", extMachInst, SimdMiscOp, 0, 0,
650 _elen, _vlen)
651 {
652 vxsat = Vxsat;
653 }
654 Fault execute(ExecContext *, trace::InstRecord *) const override;
655 std::string generateDisassembly(Addr, const loader::SymbolTable *)
656 const override;
657};
658
660{
661 private:
665
666 public:
667 VlFFTrimVlMicroOp(ExtMachInst _machInst, uint32_t _microVl,
668 uint32_t _microIdx, uint32_t _elen, uint32_t _vlen,
669 std::vector<StaticInstPtr>& _microops);
670 uint32_t calcVl() const;
671 Fault execute(ExecContext *, trace::InstRecord *) const override;
672 std::unique_ptr<PCStateBase> branchTarget(ThreadContext *) const override;
673 std::string generateDisassembly(Addr, const loader::SymbolTable *)
674 const override;
675};
676
678{
679 protected:
680 VlSegMacroInst(const char* mnem, ExtMachInst _machInst,
681 OpClass __opClass, uint32_t _elen, uint32_t _vlen)
682 : VectorMemMacroInst(mnem, _machInst, __opClass, _elen, _vlen)
683 {}
684
685 std::string generateDisassembly(
686 Addr pc, const loader::SymbolTable *symtab) const override;
687};
688
690{
691 protected:
693 uint8_t regIdx;
694 mutable bool trimVl;
695 mutable uint32_t faultIdx;
696
697 VlSegMicroInst(const char *mnem, ExtMachInst _machInst,
698 OpClass __opClass, uint32_t _microVl,
699 uint32_t _microIdx, uint32_t _numMicroops,
700 uint32_t _field, uint32_t _numFields,
701 uint32_t _elen, uint32_t _vlen)
702 : VectorMicroInst(mnem, _machInst, __opClass, _microVl,
703 _microIdx, _elen, _vlen)
704 , trimVl(false), faultIdx(_microVl)
705 {
706 this->flags[IsLoad] = true;
707 }
708
709 std::string generateDisassembly(
710 Addr pc, const loader::SymbolTable *symtab) const override;
711};
712
714{
715 private:
718 uint32_t numSrcs;
719 uint32_t numMicroops;
720 uint32_t field;
722 uint32_t micro_vl;
723
724 public:
725 VlSegDeIntrlvMicroInst(ExtMachInst extMachInst, uint32_t _micro_vl,
726 uint32_t _dstReg, uint32_t _numSrcs,
727 uint32_t _microIdx, uint32_t _numMicroops,
728 uint32_t _field, uint32_t _elen, uint32_t _vlen,
729 uint32_t _sizeOfElement);
730
731 Fault execute(ExecContext *, trace::InstRecord *) const override;
732
733 std::string generateDisassembly(Addr,
734 const loader::SymbolTable *) const override;
735};
736
738{
739 protected:
740 VsSegMacroInst(const char* mnem, ExtMachInst _machInst,
741 OpClass __opClass, uint32_t _elen, uint32_t _vlen)
742 : VectorMemMacroInst(mnem, _machInst, __opClass, _elen, _vlen)
743 {}
744
745 std::string generateDisassembly(
746 Addr pc, const loader::SymbolTable *symtab) const override;
747};
748
750{
751 protected:
753 uint8_t regIdx;
754
755 VsSegMicroInst(const char *mnem, ExtMachInst _machInst,
756 OpClass __opClass, uint32_t _microVl,
757 uint32_t _microIdx, uint32_t _numMicroops,
758 uint32_t _field, uint32_t _numFields,
759 uint32_t _elen, uint32_t _vlen)
760 : VectorMicroInst(mnem, _machInst, __opClass, _microVl,
761 _microIdx, _elen, _vlen)
762 {
763 this->flags[IsStore] = true;
764 }
765
766 std::string generateDisassembly(
767 Addr pc, const loader::SymbolTable *symtab) const override;
768};
769
771{
772 private:
775 uint32_t numSrcs;
776 uint32_t numMicroops;
777 uint32_t field;
779 uint32_t micro_vl;
780
781 public:
782 VsSegIntrlvMicroInst(ExtMachInst extMachInst, uint32_t _micro_vl,
783 uint32_t _dstReg, uint32_t _numSrcs,
784 uint32_t _microIdx, uint32_t _numMicroops,
785 uint32_t _field, uint32_t _elen, uint32_t _vlen,
786 uint32_t _sizeOfElement);
787
788 Fault execute(ExecContext *, trace::InstRecord *) const override;
789
790 std::string generateDisassembly(Addr,
791 const loader::SymbolTable *) const override;
792};
793
795{
796 private:
799
800 public:
801 VCpyVsMicroInst(ExtMachInst _machInst, uint32_t _microIdx,
802 uint8_t _vsRegIdx, uint32_t _elen, uint32_t _vlen);
803 Fault execute(ExecContext *, trace::InstRecord *) const override;
804 std::string generateDisassembly(
805 Addr pc, const loader::SymbolTable *symtab) const override;
806};
807
809{
810 private:
813 const bool hasVdOffset;
814 const bool copyVs;
815
816 public:
817 VPinVdMicroInst(ExtMachInst _machInst, uint32_t _microIdx,
818 uint32_t _numVdPins, uint32_t _elen, uint32_t _vlen,
819 bool _hasVdOffset=false, bool _copyVs = false,
820 uint32_t _vsIdx = 0);
821 Fault execute(ExecContext *, trace::InstRecord *) const override;
822 std::string generateDisassembly(
823 Addr pc, const loader::SymbolTable *symtab) const override;
824};
825
826} // namespace RiscvISA
827} // namespace gem5
828
829
830#endif // __ARCH_RISCV_INSTS_VECTOR_HH__
The ExecContext is an abstract base class the provides the interface used by the ISA to manipulate th...
Register ID: describe an architectural register with its class and index.
Definition reg_class.hh:94
gem5::Flags< FlagsType > Flags
Definition request.hh:102
RiscvMacroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass)
RiscvMicroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass)
RiscvStaticInst(const char *_mnemonic, ExtMachInst _machInst, OpClass __opClass)
VConfOp(const char *mnem, ExtMachInst _extMachInst, uint32_t _elen, uint32_t _vlen, OpClass __opClass)
Definition vector.hh:83
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:79
std::string generateZimmDisassembly() const
Definition vector.cc:94
VCpyVsMicroInst(ExtMachInst _machInst, uint32_t _microIdx, uint8_t _vsRegIdx, uint32_t _elen, uint32_t _vlen)
Definition vector.cc:842
Fault execute(ExecContext *, trace::InstRecord *) const override
Definition vector.cc:862
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:883
std::string generateDisassembly(Addr, const loader::SymbolTable *) const override
Internal function to generate disassembly string.
Definition vector.cc:485
VMaskMergeMicroInst(ExtMachInst extMachInst, uint8_t _dstReg, uint8_t _numSrcs, uint32_t _elen, uint32_t _vlen, size_t _elemSize)
Definition vector.cc:426
Fault execute(ExecContext *, trace::InstRecord *) const override
Definition vector.cc:450
RegId srcRegIdxArr[NumVecInternalRegs]
Definition vector.hh:629
VMvWholeMacroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:602
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:407
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:417
VMvWholeMicroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _microVl, uint32_t _microIdx, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:614
Fault execute(ExecContext *, trace::InstRecord *) const override
Definition vector.cc:925
VPinVdMicroInst(ExtMachInst _machInst, uint32_t _microIdx, uint32_t _numVdPins, uint32_t _elen, uint32_t _vlen, bool _hasVdOffset=false, bool _copyVs=false, uint32_t _vsIdx=0)
Definition vector.cc:892
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:958
VectorArithMacroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:237
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:156
VectorArithMicroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _microVl, uint32_t _microIdx, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:223
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:141
VectorMacroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:147
VectorMemMacroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:334
VectorMemMicroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _microVl, uint32_t _microIdx, uint32_t _offset, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:316
VectorMicroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _microVl, uint32_t _microIdx, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:178
VectorNonSplitInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:118
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:131
VectorNopMicroInst(ExtMachInst _machInst, const Fault &fault=NoFault)
Definition vector.hh:200
Fault execute(ExecContext *xc, trace::InstRecord *traceData) const override
Definition vector.hh:205
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.hh:211
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:205
VectorSlideMacroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:278
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:189
VectorSlideMicroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _microVl, uint32_t _microIdx, uint32_t _vdIdx, uint32_t _vs2Idx, uint32_t _vs3Idx, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:295
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:180
VectorVMUNARY0MacroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:264
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:171
VectorVMUNARY0MicroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _microVl, uint32_t _microIdx, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:250
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:300
VlElementMacroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, bool _has_rs2, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:467
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:314
VlElementMicroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _regIdx, uint32_t _microIdx, uint32_t _microVl, uint32_t _offset, bool _has_rs2, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:483
Fault execute(ExecContext *, trace::InstRecord *) const override
Definition vector.cc:555
std::string generateDisassembly(Addr, const loader::SymbolTable *) const override
Internal function to generate disassembly string.
Definition vector.cc:594
VlFFTrimVlMicroOp(ExtMachInst _machInst, uint32_t _microVl, uint32_t _microIdx, uint32_t _elen, uint32_t _vlen, std::vector< StaticInstPtr > &_microops)
Definition vector.cc:516
std::unique_ptr< PCStateBase > branchTarget(ThreadContext *) const override
Return the target address for an indirect branch (jump).
Definition vector.cc:583
std::vector< StaticInstPtr > & microops
Definition vector.hh:664
VlIndexMacroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:536
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:358
VlIndexMicroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _vdRegIdx, uint32_t _vdElemIdx, uint32_t _vs2RegIdx, uint32_t _vs2ElemIdx, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:552
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:369
Fault execute(ExecContext *, trace::InstRecord *) const override
Definition vector.cc:670
RegId srcRegIdxArr[NumVecInternalRegs]
Definition vector.hh:716
std::string generateDisassembly(Addr, const loader::SymbolTable *) const override
Internal function to generate disassembly string.
Definition vector.cc:721
VlSegDeIntrlvMicroInst(ExtMachInst extMachInst, uint32_t _micro_vl, uint32_t _dstReg, uint32_t _numSrcs, uint32_t _microIdx, uint32_t _numMicroops, uint32_t _field, uint32_t _elen, uint32_t _vlen, uint32_t _sizeOfElement)
Definition vector.cc:628
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:602
VlSegMacroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:680
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:614
Request::Flags memAccessFlags
Definition vector.hh:692
VlSegMicroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _microVl, uint32_t _microIdx, uint32_t _numMicroops, uint32_t _field, uint32_t _numFields, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:697
VlWholeMacroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:410
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:272
VlWholeMicroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _microVl, uint32_t _microIdx, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:424
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:231
VleMacroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:345
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:262
Request::Flags memAccessFlags
Definition vector.hh:373
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:219
VleMicroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _microVl, uint32_t _microIdx, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:375
VsElementMacroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, bool _has_rs2, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:502
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:330
VsElementMicroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _regIdx, uint32_t _microIdx, uint32_t _microVl, uint32_t _offset, bool _has_rs2, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:518
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:343
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:383
VsIndexMacroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:569
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:394
VsIndexMicroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _vs3RegIdx, uint32_t _vs3ElemIdx, uint32_t _vs2RegIdx, uint32_t _vs2ElemIdx, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:585
VsSegIntrlvMicroInst(ExtMachInst extMachInst, uint32_t _micro_vl, uint32_t _dstReg, uint32_t _numSrcs, uint32_t _microIdx, uint32_t _numMicroops, uint32_t _field, uint32_t _elen, uint32_t _vlen, uint32_t _sizeOfElement)
Definition vector.cc:757
std::string generateDisassembly(Addr, const loader::SymbolTable *) const override
Internal function to generate disassembly string.
Definition vector.cc:830
RegId srcRegIdxArr[NumVecInternalRegs]
Definition vector.hh:773
Fault execute(ExecContext *, trace::InstRecord *) const override
Definition vector.cc:791
VsSegMacroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:740
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:733
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:745
VsSegMicroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _microVl, uint32_t _microIdx, uint32_t _numMicroops, uint32_t _field, uint32_t _numFields, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:755
Request::Flags memAccessFlags
Definition vector.hh:752
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:291
VsWholeMacroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:438
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:252
VsWholeMicroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _microVl, uint32_t _microIdx, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:452
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:281
VseMacroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:357
VseMicroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _microVl, uint32_t _microIdx, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:394
Request::Flags memAccessFlags
Definition vector.hh:392
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Definition vector.cc:241
Fault execute(ExecContext *, trace::InstRecord *) const override
Definition vector.cc:499
VxsatMicroInst(bool *Vxsat, ExtMachInst extMachInst, uint32_t _elen, uint32_t _vlen)
Definition vector.hh:647
std::string generateDisassembly(Addr, const loader::SymbolTable *) const override
Internal function to generate disassembly string.
Definition vector.cc:508
const char * mnemonic
Base mnemonic (e.g., "add").
std::bitset< Num_Flags > flags
Flag values for this instruction.
ThreadContext is the external interface to all thread state for anything outside of the CPU.
STL vector class.
Definition stl.hh:37
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_if(cond,...)
Conditional panic macro that checks the supplied condition and only panics if the condition is true a...
Definition logging.hh:246
float getVflmul(uint32_t vlmul_encoding)
This function translates the 3-bit value of vlmul bits to the corresponding lmul value as specified i...
Definition vector.cc:62
Bitfield< 40 > vill
Definition types.hh:64
Bitfield< 14, 12 > width
Definition types.hh:166
const int NumVecInternalRegs
Definition vector.hh:55
Bitfield< 5, 3 > vsew
Definition vector.hh:81
uint8_t checked_vtype(bool vill, uint8_t vtype)
Definition vector.hh:102
Bitfield< 29, 20 > zimm_vsetivli
Definition types.hh:179
uint32_t getVlmax(VTYPE vtype, uint32_t vlen)
Definition vector.cc:70
uint32_t get_emul(uint32_t eew, uint32_t sew, float vflmul, bool is_mask_ldst)
Definition vector.hh:62
Bitfield< 19, 15 > uimm_vsetivli
Definition types.hh:180
Bitfield< 30, 20 > zimm_vsetvli
Definition types.hh:176
int64_t vtype_vlmul(const uint64_t vtype)
Definition utility.hh:270
Bitfield< 2, 0 > vlmul
Definition vector.hh:82
Bitfield< 11, 8 > ss
Bitfield< 4 > pc
Bitfield< 7, 0 > vtype8
Definition vector.hh:78
uint64_t width_EEW(uint64_t width)
Definition utility.hh:289
uint32_t getSew(uint32_t vsew)
Definition vector.hh:52
Copyright (c) 2024 Arm Limited All rights reserved.
Definition binary32.hh:36
std::shared_ptr< FaultBase > Fault
Definition types.hh:249
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition types.hh:147
static const OpClass SimdMiscOp
Definition op_class.hh:72
constexpr decltype(nullptr) NoFault
Definition types.hh:253

Generated on Sat Oct 18 2025 08:06:41 for gem5 by doxygen 1.14.0