| Index: src/mips/simulator-mips.h
|
| diff --git a/src/mips/simulator-mips.h b/src/mips/simulator-mips.h
|
| index 2785f913c9feda3e2a1585e95bf8723bc500901d..69a0785851f12a606c1fbf2fb47699e846c9c346 100644
|
| --- a/src/mips/simulator-mips.h
|
| +++ b/src/mips/simulator-mips.h
|
| @@ -184,6 +184,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();
|
|
|
| @@ -216,6 +253,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);
|
| void set_fcsr_rounding_mode(FPURoundingMode mode);
|
| @@ -296,6 +337,9 @@ class Simulator {
|
| // Helpers for data value tracing.
|
| enum TraceType { BYTE, HALF, WORD, DWORD, FLOAT, DOUBLE, FLOAT_DOUBLE };
|
|
|
| + // MSA Data Format
|
| + enum MSADataFormat { MSA_VECT = 0, MSA_BYTE, MSA_HALF, MSA_WORD, MSA_DWORD };
|
| +
|
| // Read and write memory.
|
| inline uint32_t ReadBU(int32_t addr);
|
| inline int32_t ReadB(int32_t addr);
|
| @@ -316,6 +360,8 @@ class Simulator {
|
|
|
| void TraceRegWr(int32_t value, TraceType t = WORD);
|
| void TraceRegWr(int64_t value, TraceType t = DWORD);
|
| + template <typename T>
|
| + void TraceMSARegWr(T* value, TraceType t);
|
| void TraceMemWr(int32_t addr, int32_t value, TraceType t = WORD);
|
| void TraceMemRd(int32_t addr, int32_t value, TraceType t = WORD);
|
| void TraceMemWr(int32_t addr, int64_t value, TraceType t = DWORD);
|
| @@ -355,6 +401,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();
|
| +
|
| inline int32_t rs_reg() const { return instr_.RsValue(); }
|
| inline int32_t rs() const { return get_register(rs_reg()); }
|
| inline uint32_t rs_u() const {
|
| @@ -372,6 +431,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(int32_t rd_reg, int32_t alu_out) {
|
| set_register(rd_reg, alu_out);
|
| @@ -483,7 +545,9 @@ class Simulator {
|
| // Coprocessor Registers.
|
| // Note: FP32 mode uses only the lower 32-bit part of each element,
|
| // the upper 32-bit is unpredictable.
|
| - 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_;
|
|
|
|
|