Index: runtime/vm/simulator_mips.h |
diff --git a/runtime/vm/simulator_mips.h b/runtime/vm/simulator_mips.h |
deleted file mode 100644 |
index 00d93ec16dd698e7ae0be2e2da60047286c803c3..0000000000000000000000000000000000000000 |
--- a/runtime/vm/simulator_mips.h |
+++ /dev/null |
@@ -1,257 +0,0 @@ |
-// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-// Declares a Simulator for MIPS instructions if we are not generating a native |
-// MIPS binary. This Simulator allows us to run and debug MIPS code generation |
-// on regular desktop machines. |
-// Dart calls into generated code by "calling" the InvokeDartCode stub, |
-// which will start execution in the Simulator or forwards to the real entry |
-// on a MIPS HW platform. |
- |
-#ifndef RUNTIME_VM_SIMULATOR_MIPS_H_ |
-#define RUNTIME_VM_SIMULATOR_MIPS_H_ |
- |
-#ifndef RUNTIME_VM_SIMULATOR_H_ |
-#error Do not include simulator_mips.h directly; use simulator.h. |
-#endif |
- |
-#include "vm/constants_mips.h" |
- |
-namespace dart { |
- |
-class Isolate; |
-class Mutex; |
-class RawObject; |
-class SimulatorSetjmpBuffer; |
-class Thread; |
- |
-class Simulator { |
- public: |
- static const uword kSimulatorStackUnderflowSize = 64; |
- |
- Simulator(); |
- ~Simulator(); |
- |
- // The currently executing Simulator instance, which is associated to the |
- // current isolate |
- static Simulator* Current(); |
- |
- // Accessors for register state. |
- void set_register(Register reg, int32_t value); |
- int32_t get_register(Register reg) const; |
- |
- // Accessors for floating point register state. |
- void set_fregister(FRegister freg, int32_t value); |
- void set_fregister_float(FRegister freg, float value); |
- void set_fregister_double(FRegister freg, double value); |
- void set_fregister_long(FRegister freg, int64_t value); |
- |
- int32_t get_fregister(FRegister freg) const; |
- float get_fregister_float(FRegister freg) const; |
- double get_fregister_double(FRegister freg) const; |
- int64_t get_fregister_long(FRegister freg) const; |
- |
- void set_dregister_bits(DRegister freg, int64_t value); |
- void set_dregister(DRegister freg, double value); |
- |
- int64_t get_dregister_bits(DRegister freg) const; |
- double get_dregister(DRegister freg) const; |
- |
- int32_t get_sp() const { return get_register(SPREG); } |
- |
- // Accessor for the pc. |
- void set_pc(int32_t value) { pc_ = value; } |
- int32_t get_pc() const { return pc_; } |
- |
- // Accessors for hi, lo registers. |
- void set_hi_register(int32_t value) { hi_reg_ = value; } |
- void set_lo_register(int32_t value) { lo_reg_ = value; } |
- int32_t get_hi_register() const { return hi_reg_; } |
- int32_t get_lo_register() const { return lo_reg_; } |
- |
- int32_t get_fcsr_condition_bit(int32_t cc) const { |
- if (cc == 0) { |
- return 23; |
- } else { |
- return 24 + cc; |
- } |
- } |
- |
- void set_fcsr_bit(uint32_t cc, bool value) { |
- if (value) { |
- fcsr_ |= (1 << cc); |
- } else { |
- fcsr_ &= ~(1 << cc); |
- } |
- } |
- |
- bool test_fcsr_bit(uint32_t cc) { return fcsr_ & (1 << cc); } |
- |
- // Accessors to the internal simulator stack base and top. |
- uword StackBase() const { return reinterpret_cast<uword>(stack_); } |
- uword StackTop() const; |
- |
- // Accessor to the instruction counter. |
- uint64_t get_icount() const { return icount_; } |
- |
- // The thread's top_exit_frame_info refers to a Dart frame in the simulator |
- // stack. The simulator's top_exit_frame_info refers to a C++ frame in the |
- // native stack. |
- uword top_exit_frame_info() const { return top_exit_frame_info_; } |
- void set_top_exit_frame_info(uword value) { top_exit_frame_info_ = value; } |
- |
- // Call on program start. |
- static void InitOnce(); |
- |
- // Dart generally calls into generated code with 4 parameters. This is a |
- // convenience function, which sets up the simulator state and grabs the |
- // result on return. When fp_return is true the return value is the D0 |
- // floating point register. Otherwise, the return value is V1:V0. |
- int64_t Call(int32_t entry, |
- int32_t parameter0, |
- int32_t parameter1, |
- int32_t parameter2, |
- int32_t parameter3, |
- bool fp_return = false, |
- bool fp_args = false); |
- |
- // Implementation of atomic compare and exchange in the same synchronization |
- // domain as other synchronization primitive instructions (e.g. ldrex, strex). |
- static uword CompareExchange(uword* address, |
- uword compare_value, |
- uword new_value); |
- static uint32_t CompareExchangeUint32(uint32_t* address, |
- uint32_t compare_value, |
- uint32_t new_value); |
- |
- // Runtime and native call support. |
- enum CallKind { |
- kRuntimeCall, |
- kLeafRuntimeCall, |
- kLeafFloatRuntimeCall, |
- kBootstrapNativeCall, |
- kNativeCall |
- }; |
- static uword RedirectExternalReference(uword function, |
- CallKind call_kind, |
- int argument_count); |
- |
- static uword FunctionForRedirect(uword redirect); |
- |
- void JumpToFrame(uword pc, uword sp, uword fp, Thread* thread); |
- |
- private: |
- // A pc value used to signal the simulator to stop execution. Generally |
- // the ra is set to this value on transition from native C code to |
- // simulated execution, so that the simulator can "return" to the native |
- // C code. |
- static const uword kEndSimulatingPC = -1; |
- |
- // Special registers for the results of div, divu. |
- int32_t hi_reg_; |
- int32_t lo_reg_; |
- |
- int32_t registers_[kNumberOfCpuRegisters]; |
- int32_t fregisters_[kNumberOfFRegisters]; |
- int32_t fcsr_; |
- uword pc_; |
- |
- // Simulator support. |
- char* stack_; |
- uint64_t icount_; |
- bool delay_slot_; |
- SimulatorSetjmpBuffer* last_setjmp_buffer_; |
- uword top_exit_frame_info_; |
- |
- // Registered breakpoints. |
- Instr* break_pc_; |
- int32_t break_instr_; |
- |
- // Illegal memory access support. |
- static bool IsIllegalAddress(uword addr) { return addr < 64 * 1024; } |
- void HandleIllegalAccess(uword addr, Instr* instr); |
- |
- // Read and write memory. |
- void UnalignedAccess(const char* msg, uword addr, Instr* instr); |
- |
- // Handles a legal instruction that the simulator does not implement. |
- void UnimplementedInstruction(Instr* instr); |
- |
- void set_pc(uword value) { pc_ = value; } |
- |
- void Format(Instr* instr, const char* format); |
- |
- inline int8_t ReadB(uword addr); |
- inline uint8_t ReadBU(uword addr); |
- inline int16_t ReadH(uword addr, Instr* instr); |
- inline uint16_t ReadHU(uword addr, Instr* instr); |
- inline intptr_t ReadW(uword addr, Instr* instr); |
- |
- inline void WriteB(uword addr, uint8_t value); |
- inline void WriteH(uword addr, uint16_t value, Instr* isntr); |
- inline void WriteW(uword addr, intptr_t value, Instr* instr); |
- |
- inline double ReadD(uword addr, Instr* instr); |
- inline void WriteD(uword addr, double value, Instr* instr); |
- |
- // We keep track of 16 exclusive access address tags across all threads. |
- // Since we cannot simulate a native context switch, which clears |
- // the exclusive access state of the local monitor, we associate the thread |
- // requesting exclusive access to the address tag. |
- // Multiple threads requesting exclusive access (using the LL instruction) |
- // to the same address will result in multiple address tags being created for |
- // the same address, one per thread. |
- // At any given time, each thread is associated to at most one address tag. |
- static Mutex* exclusive_access_lock_; |
- static const int kNumAddressTags = 16; |
- static struct AddressTag { |
- Thread* thread; |
- uword addr; |
- } exclusive_access_state_[kNumAddressTags]; |
- static int next_address_tag_; |
- |
- // Synchronization primitives support. |
- void ClearExclusive(); |
- intptr_t ReadExclusiveW(uword addr, Instr* instr); |
- intptr_t WriteExclusiveW(uword addr, intptr_t value, Instr* instr); |
- |
- // Set access to given address to 'exclusive state' for current thread. |
- static void SetExclusiveAccess(uword addr); |
- |
- // Returns true if the current thread has exclusive access to given address, |
- // returns false otherwise. In either case, set access to given address to |
- // 'open state' for all threads. |
- // If given addr is NULL, set access to 'open state' for current |
- // thread (CLREX). |
- static bool HasExclusiveAccessAndOpen(uword addr); |
- |
- void DoBranch(Instr* instr, bool taken, bool likely); |
- void DoBreak(Instr* instr); |
- |
- void DecodeSpecial(Instr* instr); |
- void DecodeSpecial2(Instr* instr); |
- void DecodeRegImm(Instr* instr); |
- void DecodeCop1(Instr* instr); |
- void InstructionDecode(Instr* instr); |
- |
- void Execute(); |
- void ExecuteDelaySlot(); |
- |
- // Returns true if tracing of executed instructions is enabled. |
- bool IsTracingExecution() const; |
- |
- // Longjmp support for exceptions. |
- SimulatorSetjmpBuffer* last_setjmp_buffer() { return last_setjmp_buffer_; } |
- void set_last_setjmp_buffer(SimulatorSetjmpBuffer* buffer) { |
- last_setjmp_buffer_ = buffer; |
- } |
- |
- friend class SimulatorDebugger; |
- friend class SimulatorSetjmpBuffer; |
- DISALLOW_COPY_AND_ASSIGN(Simulator); |
-}; |
- |
-} // namespace dart |
- |
-#endif // RUNTIME_VM_SIMULATOR_MIPS_H_ |