72 uint32_t sew =
getSew(vtype.vsew);
74 uint32_t vlmax = (vlen/sew) *
getVflmul(vtype.vlmul);
101 bool frac_lmul =
bits(zimm, 2);
102 int sew = 1 << (
bits(zimm, 5, 3) + 3);
103 int lmul =
bits(zimm, 1, 0);
104 auto vta =
bits(zimm, 6) == 1 ?
"ta" :
"tu";
105 auto vma =
bits(zimm, 7) == 1 ?
"ma" :
"mu";
108 std::string lmul_str =
"";
120 panic(
"Unsupport fractional LMUL");
122 s <<
", m" << lmul_str;
124 s <<
", m" << (1 << lmul);
126 s <<
", " <<
vta <<
", " <<
vma;
134 std::stringstream
ss;
144 std::stringstream
ss;
159 std::stringstream
ss;
174 std::stringstream
ss;
183 std::stringstream
ss;
192 std::stringstream
ss;
208 std::stringstream
ss;
222 std::stringstream
ss;
223 unsigned vlenb =
vlen >> 3;
234 std::stringstream
ss;
235 unsigned vlenb =
vlen >> 3;
244 std::stringstream
ss;
245 unsigned vlenb =
vlen >> 3;
255 std::stringstream
ss;
256 unsigned vlenb =
vlen >> 3;
265 std::stringstream
ss;
275 std::stringstream
ss;
284 std::stringstream
ss;
294 std::stringstream
ss;
303 std::stringstream
ss;
317 std::stringstream
ss;
333 std::stringstream
ss;
346 std::stringstream
ss;
361 std::stringstream
ss;
372 std::stringstream
ss;
386 std::stringstream
ss;
397 std::stringstream
ss;
410 std::stringstream
ss;
420 std::stringstream
ss;
427 uint8_t _dstReg, uint8_t _numSrcs, uint32_t _elen, uint32_t _vlen,
444 for (uint8_t
i=0;
i<_numSrcs;
i++) {
454 auto Vd = tmp_d0.
as<uint8_t>();
455 uint32_t vlenb =
vlen >> 3;
456 const uint32_t elems_per_vreg = vlenb /
elemSize;
457 size_t bit_cnt = elems_per_vreg;
465 auto s = tmp_s.
as<uint8_t>();
466 if (elems_per_vreg < 8) {
467 const uint32_t
m = (1 << elems_per_vreg) - 1;
468 const uint32_t
mask =
m << (
i * elems_per_vreg % 8);
470 Vd[bit_cnt/8] ^= Vd[bit_cnt/8] &
mask;
471 Vd[bit_cnt/8] |=
s[bit_cnt/8] &
mask;
472 bit_cnt += elems_per_vreg;
474 const uint32_t byte_offset = elems_per_vreg / 8;
475 memcpy(Vd +
i * byte_offset,
s +
i * byte_offset, byte_offset);
488 std::stringstream
ss;
493 unsigned vlenb =
vlen >> 3;
511 std::stringstream
ss;
517 uint32_t _microIdx, uint32_t _elen, uint32_t _vlen,
520 _microVl, _microIdx, _elen, _vlen),
534 this->
flags[IsControl] =
true;
535 this->
flags[IsIndirectControl] =
true;
536 this->
flags[IsInteger] =
true;
537 this->
flags[IsUncondControl] =
true;
558 bool set_dirty =
false;
559 bool check_vill =
false;
561 if (update_fault !=
NoFault) {
return update_fault; }
566 uint32_t new_vl =
calcVl();
570 RegVal final_val = new_vl;
582std::unique_ptr<PCStateBase>
587 uint32_t new_vl =
calcVl();
590 return std::unique_ptr<PCStateBase>{pc_ptr};
597 std::stringstream
ss;
605 std::stringstream
ss;
617 std::stringstream
ss;
629 uint32_t _micro_vl, uint32_t _dstReg,
630 uint32_t _numSrcs, uint32_t _microIdx,
631 uint32_t _numMicroops, uint32_t _field, uint32_t _elen,
632 uint32_t _vlen, uint32_t _sizeOfElement)
653 for (uint32_t
i=0;
i < _numSrcs;
i++) {
658 if (!extMachInst.vtype8.vta
659 || (!extMachInst.vm && !extMachInst.vtype8.vma)) {
663 if (!extMachInst.vm) {
673 auto Vd = tmp_d0.
as<uint8_t>();
674 const uint32_t elems_per_vreg =
micro_vl;
676 auto s = tmp_s.
as<uint8_t>();
684 v0 = tmp_v0.
as<uint8_t>();
699 s = tmp_s.
as<uint8_t>();
701 while (
index < (
i + 1) * elems_per_vreg)
703 size_t ei = elem + micro_vlmax *
microIdx;
724 std::stringstream
ss;
736 std::stringstream
ss;
748 std::stringstream
ss;
758 uint32_t _micro_vl, uint32_t _dstReg,
759 uint32_t _numSrcs, uint32_t _microIdx,
760 uint32_t _numMicroops, uint32_t _field, uint32_t _elen,
761 uint32_t _vlen, uint32_t _sizeOfElement)
784 for (uint8_t
i=0;
i<_numSrcs;
i++) {
794 const uint32_t elems_per_vreg =
micro_vl;
796 auto Vd = tmp_d0.
as<uint8_t>();
799 auto s = tmp_s.as<uint8_t>();
801 s = tmp_s.as<uint8_t>();
803 uint32_t indexVd = 0;
807 while (indexVd < elems_per_vreg) {
809 s = tmp_s.as<uint8_t>();
833 std::stringstream
ss;
843 uint8_t _vsRegIdx, uint32_t _elen,
846 _microIdx, _elen, _vlen)
864 bool set_dirty =
true;
865 bool check_vill =
false;
867 if (update_fault !=
NoFault) {
return update_fault; }
886 std::stringstream
ss;
893 uint32_t _numVdPins, uint32_t _elen,
894 uint32_t _vlen,
bool _hasVdOffset,
895 bool _copyVs, uint32_t _vsIdx)
897 _microIdx, _elen, _vlen)
911 if (!_machInst.vtype8.vta || (!_machInst.vm && !_machInst.vtype8.vma)
927 bool set_dirty =
true;
928 bool check_vill =
false;
930 if (update_fault !=
NoFault) {
return update_fault; }
961 std::stringstream
ss;
The ExecContext is an abstract base class the provides the interface used by the ISA to manipulate th...
virtual void * getWritableRegOperand(const StaticInst *si, int idx)=0
virtual ThreadContext * tcBase() const =0
Returns a pointer to the ThreadContext.
virtual RegVal readMiscReg(int misc_reg)=0
Reads a miscellaneous register, handling any architectural side effects due to reading that register.
virtual void setMiscReg(int misc_reg, RegVal val)=0
Sets a miscellaneous register, handling any architectural side effects due to writing that register.
virtual const PCStateBase & pcState() const =0
virtual RegVal getRegOperand(const StaticInst *si, int idx)=0
virtual PCStateBase * clone() const =0
Register ID: describe an architectural register with its class and index.
void setNumPinnedWrites(int num_writes)
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateZimmDisassembly() const
VCpyVsMicroInst(ExtMachInst _machInst, uint32_t _microIdx, uint8_t _vsRegIdx, uint32_t _elen, uint32_t _vlen)
Fault execute(ExecContext *, trace::InstRecord *) const override
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr, const loader::SymbolTable *) const override
Internal function to generate disassembly string.
VMaskMergeMicroInst(ExtMachInst extMachInst, uint8_t _dstReg, uint8_t _numSrcs, uint32_t _elen, uint32_t _vlen, size_t _elemSize)
Fault execute(ExecContext *, trace::InstRecord *) const override
RegId srcRegIdxArr[NumVecInternalRegs]
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Fault execute(ExecContext *, trace::InstRecord *) const override
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)
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
VectorArithMicroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _microVl, uint32_t _microIdx, uint32_t _elen, uint32_t _vlen)
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
VectorMicroInst(const char *mnem, ExtMachInst _machInst, OpClass __opClass, uint32_t _microVl, uint32_t _microIdx, uint32_t _elen, uint32_t _vlen)
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Fault execute(ExecContext *, trace::InstRecord *) const override
std::string generateDisassembly(Addr, const loader::SymbolTable *) const override
Internal function to generate disassembly string.
VlFFTrimVlMicroOp(ExtMachInst _machInst, uint32_t _microVl, uint32_t _microIdx, uint32_t _elen, uint32_t _vlen, std::vector< StaticInstPtr > &_microops)
std::unique_ptr< PCStateBase > branchTarget(ThreadContext *) const override
Return the target address for an indirect branch (jump).
std::vector< StaticInstPtr > & microops
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Fault execute(ExecContext *, trace::InstRecord *) const override
RegId srcRegIdxArr[NumVecInternalRegs]
std::string generateDisassembly(Addr, const loader::SymbolTable *) const override
Internal function to generate disassembly string.
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)
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
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)
std::string generateDisassembly(Addr, const loader::SymbolTable *) const override
Internal function to generate disassembly string.
RegId srcRegIdxArr[NumVecInternalRegs]
Fault execute(ExecContext *, trace::InstRecord *) const override
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
std::string generateDisassembly(Addr pc, const loader::SymbolTable *symtab) const override
Internal function to generate disassembly string.
Fault execute(ExecContext *, trace::InstRecord *) const override
std::string generateDisassembly(Addr, const loader::SymbolTable *) const override
Internal function to generate disassembly string.
void setDestRegIdx(int i, const RegId &val)
void setRegIdxArrays(RegIdArrayPtr src, RegIdArrayPtr dest)
Set the pointers which point to the arrays of source and destination register indices.
std::array< uint8_t, MiscRegClass+1 > _numTypedDestRegs
RegId(StaticInst::*)[] RegIdArrayPtr
uint8_t _numSrcRegs
See numSrcRegs().
uint8_t _numDestRegs
See numDestRegs().
const RegId & destRegIdx(int i) const
Return logical index (architectural reg num) of i'th destination reg.
void setSrcRegIdx(int i, const RegId &val)
const char * mnemonic
Base mnemonic (e.g., "add").
std::bitset< Num_Flags > flags
Flag values for this instruction.
const RegId & srcRegIdx(int i) const
Return logical index (architectural reg num) of i'th source reg.
ThreadContext is the external interface to all thread state for anything outside of the CPU.
virtual const PCStateBase & pcState() const =0
void set(uint8_t val)
Set the container.
VecElem * as()
View interposers.
void setData(std::array< T, N > d)
constexpr T bits(T val, unsigned first, unsigned last)
Extract the bitfield from position 'first' to 'last' (inclusive) from 'val' and right justify it.
constexpr uint64_t sext(uint64_t val)
Sign-extend an N-bit value to 64 bits.
#define panic(...)
This implements a cprintf based panic() function.
float getVflmul(uint32_t vlmul_encoding)
This function translates the 3-bit value of vlmul bits to the corresponding lmul value as specified i...
const int VecMemInternalReg0
Fault updateVPUStatus(ExecContext *xc, ExtMachInst machInst, bool set_dirty, bool check_vill)
int elem_mask(const T *vs, const int index)
uint32_t getVlmax(VTYPE vtype, uint32_t vlen)
std::string registerName(RegId reg)
constexpr RegClass vecRegClass
uint64_t width_EEW(uint64_t width)
uint32_t getSew(uint32_t vsew)
constexpr RegClass miscRegClass(MiscRegClass, MiscRegClassName, NUM_MISCREGS, debug::MiscRegs)
Copyright (c) 2024 Arm Limited All rights reserved.
std::shared_ptr< FaultBase > Fault
static const OpClass SimdAddOp
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
static const OpClass SimdMiscOp
static const OpClass SimdConfigOp
constexpr decltype(nullptr) NoFault
@ VecRegClass
Vector Register.