Chromium Code Reviews| Index: src/mips64/simulator-mips64.h |
| diff --git a/src/mips64/simulator-mips64.h b/src/mips64/simulator-mips64.h |
| index 6c41ae111a3ede3659d6f362a280df1a3c3a5a44..6d3038643fd6dede9700bc0295eab8e132d4360c 100644 |
| --- a/src/mips64/simulator-mips64.h |
| +++ b/src/mips64/simulator-mips64.h |
| @@ -193,6 +193,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(); |
| @@ -226,6 +263,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); |
|
ivica.bogosavljevic
2017/05/15 15:05:36
Can we have
T get_msa_register(int wreg) since it
dusan.simicic
2017/05/16 13:12:41
No, because "value" is pointer to int[8|16|32|64]_
|
| + 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); |
| @@ -315,6 +356,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); |
| @@ -340,6 +384,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); |
| @@ -373,6 +419,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(); |
| @@ -393,6 +452,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); |
| @@ -512,7 +574,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_; |