Index: src/mips/simulator-mips.h |
diff --git a/src/mips/simulator-mips.h b/src/mips/simulator-mips.h |
index 2785f913c9feda3e2a1585e95bf8723bc500901d..3abf8e828b68231ecd2c88354c9f433c83bade81 100644 |
--- a/src/mips/simulator-mips.h |
+++ b/src/mips/simulator-mips.h |
@@ -184,6 +184,54 @@ 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 |
+ }; |
+ |
+ const uint32_t kMsaI8Mask = ((3U << 24) | ((1 << 6) - 1)); |
Ilija.Pavlovic1
2017/04/20 13:13:46
Should be these const definitions placed in consta
dusan.simicic
2017/04/20 15:57:42
I see now that same mask constants are defined als
|
+ const uint32_t kMsaI5Mask = ((7U << 23) | ((1 << 6) - 1)); |
+ const uint32_t kMsaMI10Mask = (15U << 2); |
+ const uint32_t kMsaBITMask = ((7U << 23) | ((1 << 6) - 1)); |
+ const uint32_t kMsaELMMask = (15U << 22); |
+ const uint32_t kMsa3RMask = ((7U << 23) | ((1 << 6) - 1)); |
+ const uint32_t kMsa3RFMask = ((15U << 22) | ((1 << 6) - 1)); |
+ const uint32_t kMsaVECMask = (23U << 21); |
+ const uint32_t kMsa2RMask = (7U << 18); |
+ const uint32_t kMsa2RFMask = (15U << 17); |
+ |
explicit Simulator(Isolate* isolate); |
~Simulator(); |
@@ -216,6 +264,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 +348,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 +371,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 +412,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 +442,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 +556,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_; |