Index: src/mips64/simulator-mips64.h |
diff --git a/src/mips64/simulator-mips64.h b/src/mips64/simulator-mips64.h |
index a9e0d3d11871f9b554d61f7f733e097fd9c14036..40980ca4f494027c0f13bd87b49ddf4d297d0111 100644 |
--- a/src/mips64/simulator-mips64.h |
+++ b/src/mips64/simulator-mips64.h |
@@ -189,6 +189,43 @@ class Simulator { |
kNumFPURegisters |
}; |
+ // MSA registers |
+ enum MSARegister { |
+ w0, |
+ w1, |
+ w2, |
+ w3, |
+ w4, |
+ w5, |
+ w6, |
+ w7, |
+ w8, |
+ w9, |
+ w10, |
+ w11, |
+ w12, |
+ w13, |
+ w14, |
+ w15, |
+ w16, |
+ w17, |
+ w18, |
+ w19, |
+ w20, |
+ w21, |
+ w22, |
+ w23, |
+ w24, |
+ w25, |
+ w26, |
+ w27, |
+ w28, |
+ w29, |
+ w30, |
+ w31, |
+ kNumMSARegisters |
+ }; |
+ |
explicit Simulator(Isolate* isolate); |
~Simulator(); |
@@ -222,6 +259,10 @@ class Simulator { |
int32_t get_fpu_register_hi_word(int fpureg) const; |
float get_fpu_register_float(int fpureg) const; |
double get_fpu_register_double(int fpureg) const; |
+ template <typename T> |
+ void get_msa_register(int wreg, T* value); |
+ template <typename T> |
+ void set_msa_register(int wreg, const T* value); |
void set_fcsr_bit(uint32_t cc, bool value); |
bool test_fcsr_bit(uint32_t cc); |
bool set_fcsr_round_error(double original, double rounded); |
@@ -311,6 +352,9 @@ class Simulator { |
WORD_DWORD |
}; |
+ // MSA Data Format |
+ enum MSADataFormat { MSA_VECT = 0, MSA_BYTE, MSA_HALF, MSA_WORD, MSA_DWORD }; |
+ |
// Read and write memory. |
inline uint32_t ReadBU(int64_t addr); |
inline int32_t ReadB(int64_t addr); |
@@ -336,6 +380,8 @@ class Simulator { |
inline void DieOrDebug(); |
void TraceRegWr(int64_t value, TraceType t = DWORD); |
+ template <typename T> |
+ void TraceMSARegWr(T* value, TraceType t); |
void TraceMemWr(int64_t addr, int64_t value, TraceType t); |
void TraceMemRd(int64_t addr, int64_t value, TraceType t = DWORD); |
@@ -369,6 +415,19 @@ class Simulator { |
void DecodeTypeRegisterLRsType(); |
+ int DecodeMsaDataFormat(); |
+ void DecodeTypeMsaI8(); |
+ void DecodeTypeMsaI5(); |
+ void DecodeTypeMsaI10(); |
+ void DecodeTypeMsaELM(); |
+ void DecodeTypeMsaBIT(); |
+ void DecodeTypeMsaMI10(); |
+ void DecodeTypeMsa3R(); |
+ void DecodeTypeMsa3RF(); |
+ void DecodeTypeMsaVec(); |
+ void DecodeTypeMsa2R(); |
+ void DecodeTypeMsa2RF(); |
+ |
// Executing is handled based on the instruction type. |
void DecodeTypeRegister(); |
@@ -389,6 +448,9 @@ class Simulator { |
inline int32_t fd_reg() const { return instr_.FdValue(); } |
inline int32_t sa() const { return instr_.SaValue(); } |
inline int32_t lsa_sa() const { return instr_.LsaSaValue(); } |
+ inline int32_t ws_reg() const { return instr_.WsValue(); } |
+ inline int32_t wt_reg() const { return instr_.WtValue(); } |
+ inline int32_t wd_reg() const { return instr_.WdValue(); } |
inline void SetResult(const int32_t rd_reg, const int64_t alu_out) { |
set_register(rd_reg, alu_out); |
@@ -508,7 +570,9 @@ class Simulator { |
// Registers. |
int64_t registers_[kNumSimuRegisters]; |
// Coprocessor Registers. |
- int64_t FPUregisters_[kNumFPURegisters]; |
+ // Note: FPUregisters_[] array is increased to 64 * 8B = 32 * 16B in |
+ // order to support MSA registers |
+ int64_t FPUregisters_[kNumFPURegisters * 2]; |
// FPU control register. |
uint32_t FCSR_; |