| 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_;
|
|
|
|
|