5#ifndef RUNTIME_VM_SIMULATOR_RISCV_H_
6#define RUNTIME_VM_SIMULATOR_RISCV_H_
8#ifndef RUNTIME_VM_SIMULATOR_H_
9#error Do not include simulator_riscv.h directly; use simulator.h.
19class SimulatorSetjmpBuffer;
38 PreservedRegisters preserved;
39 PrepareCall(&preserved);
49 PreservedRegisters preserved;
50 PrepareCall(&preserved);
57 PreservedRegisters preserved;
58 PrepareCall(&preserved);
66 PreservedRegisters preserved;
67 PrepareCall(&preserved);
71 return get_fregd(
FA0);
77 PreservedRegisters preserved;
78 PrepareCall(&preserved);
83 return get_fregd(
FA0);
86 PreservedRegisters preserved;
87 PrepareCall(&preserved);
91 return get_fregd(
FA0);
94 PreservedRegisters preserved;
95 PrepareCall(&preserved);
98 return get_fregd(
FA0);
102 PreservedRegisters preserved;
103 SavePreservedRegisters(&preserved);
107 return get_fregs(
FA0);
113 PreservedRegisters preserved;
114 PrepareCall(&preserved);
115 set_fregs(
FA0, arg0);
116 set_fregs(
FA1, arg1);
117 set_fregs(
FA2, arg2);
119 return get_fregs(
FA0);
122 PreservedRegisters preserved;
123 PrepareCall(&preserved);
125 set_fregs(
FA0, arg1);
127 return get_fregs(
FA0);
130 PreservedRegisters preserved;
131 PrepareCall(&preserved);
132 set_fregd(
FA0, arg0);
134 return get_fregs(
FA0);
146 bool fp_return =
false,
147 bool fp_args =
false);
186 struct PreservedRegisters {
190 void PrepareCall(PreservedRegisters* preserved);
191 void ClobberVolatileRegisters();
192 void SavePreservedRegisters(PreservedRegisters* preserved);
193 void CheckPreservedRegisters(PreservedRegisters* preserved);
194 void RunCall(intx_t
function, PreservedRegisters* preserved);
196 void Interpret(
Instr instr);
197 void Interpret(
CInstr instr);
198 void InterpretLUI(
Instr instr);
199 void InterpretAUIPC(
Instr instr);
200 void InterpretJAL(
Instr instr);
201 void InterpretJALR(
Instr instr);
202 void InterpretBRANCH(
Instr instr);
203 void InterpretLOAD(
Instr instr);
204 void InterpretSTORE(
Instr instr);
205 void InterpretOPIMM(
Instr instr);
206 void InterpretOPIMM32(
Instr instr);
207 void InterpretOP(
Instr instr);
208 void InterpretOP_0(
Instr instr);
209 void InterpretOP_SUB(
Instr instr);
210 void InterpretOP_MULDIV(
Instr instr);
211 void InterpretOP_SHADD(
Instr instr);
212 void InterpretOP_MINMAXCLMUL(
Instr instr);
213 void InterpretOP_ROTATE(
Instr instr);
214 void InterpretOP_BCLRBEXT(
Instr instr);
215 void InterpretOP32(
Instr instr);
216 void InterpretOP32_0(
Instr instr);
217 void InterpretOP32_SUB(
Instr instr);
218 void InterpretOP32_MULDIV(
Instr instr);
219 void InterpretOP32_SHADD(
Instr instr);
220 void InterpretOP32_ADDUW(
Instr instr);
221 void InterpretOP32_ROTATE(
Instr instr);
222 void InterpretMISCMEM(
Instr instr);
223 void InterpretSYSTEM(
Instr instr);
224 void InterpretECALL(
Instr instr);
225 void InterpretEBREAK(
Instr instr);
226 void InterpretEBREAK(
CInstr instr);
227 void InterpretAMO(
Instr instr);
228 void InterpretAMO32(
Instr instr);
229 void InterpretAMO64(
Instr instr);
230 template <
typename type>
231 void InterpretLR(
Instr instr);
232 template <
typename type>
233 void InterpretSC(
Instr instr);
234 template <
typename type>
235 void InterpretAMOSWAP(
Instr instr);
236 template <
typename type>
237 void InterpretAMOADD(
Instr instr);
238 template <
typename type>
239 void InterpretAMOXOR(
Instr instr);
240 template <
typename type>
241 void InterpretAMOAND(
Instr instr);
242 template <
typename type>
243 void InterpretAMOOR(
Instr instr);
244 template <
typename type>
245 void InterpretAMOMIN(
Instr instr);
246 template <
typename type>
247 void InterpretAMOMAX(
Instr instr);
248 template <
typename type>
249 void InterpretAMOMINU(
Instr instr);
250 template <
typename type>
251 void InterpretAMOMAXU(
Instr instr);
252 void InterpretLOADFP(
Instr instr);
253 void InterpretSTOREFP(
Instr instr);
254 void InterpretFMADD(
Instr instr);
255 void InterpretFMSUB(
Instr instr);
256 void InterpretFNMADD(
Instr instr);
257 void InterpretFNMSUB(
Instr instr);
258 void InterpretOPFP(
Instr instr);
259 DART_NORETURN
void IllegalInstruction(
Instr instr);
260 DART_NORETURN
void IllegalInstruction(
CInstr instr);
262 template <
typename type>
264 template <
typename type>
267 intx_t CSRRead(uint16_t csr);
268 void CSRWrite(uint16_t csr, intx_t value);
269 void CSRSet(uint16_t csr, intx_t mask);
270 void CSRClear(uint16_t csr, intx_t mask);
272 uintx_t get_xreg(
Register rs)
const {
return xregs_[rs]; }
273 void set_xreg(
Register rd, uintx_t value) {
279 double get_fregd(
FRegister rs)
const {
return fregs_[rs]; }
280 void set_fregd(
FRegister rd,
double value) { fregs_[rd] =
value; }
282 static constexpr uint64_t kNaNBox = 0xFFFFFFFF00000000;
285 uint64_t bits64 = bit_cast<uint64_t>(fregs_[rs]);
286 if ((bits64 & kNaNBox) != kNaNBox) {
289 return bit_cast<float>(0x7fc00000);
291 uint32_t bits32 =
static_cast<uint32_t
>(bits64);
292 return bit_cast<float>(bits32);
294 void set_fregs(
FRegister rd,
float value) {
295 uint32_t bits32 = bit_cast<uint32_t>(value);
296 uint64_t bits64 =
static_cast<uint64_t
>(bits32);
298 fregs_[rd] = bit_cast<double>(bits64);
303 static constexpr uword kBadLR = -1;
308 static constexpr uword kEndSimulatingPC = -2;
316 uintx_t reserved_address_;
317 uintx_t reserved_value_;
326 uword overflow_stack_limit_;
331 static bool IsIllegalAddress(
uword addr) {
return addr < 64 * 1024; }
335 void ExecuteNoTrace();
339 bool IsTracingExecution()
const;
344 last_setjmp_buffer_ =
buffer;
double CallD(intx_t function, double arg0, double arg1=0.0, double arg2=0.0)
double CallD(intx_t function, intx_t arg0, intx_t arg1=0)
double CallD(intx_t function, float arg0)
uintx_t get_register(Register rs) const
float CallF(intx_t function, float arg0, float arg1=0.0f, float arg2=0.0f)
static uword RedirectExternalReference(uword function, CallKind call_kind, int argument_count)
void JumpToFrame(uword pc, uword sp, uword fp, Thread *thread)
friend class SimulatorSetjmpBuffer
float CallF(intx_t function, double arg0)
static Simulator * Current()
uint64_t get_icount() const
intx_t CallI(intx_t function, double arg0, double arg1=0.0)
int64_t Call(intx_t entry, intx_t parameter0, intx_t parameter1, intx_t parameter2, intx_t parameter3, bool fp_return=false, bool fp_args=false)
uword overflow_stack_limit() const
intx_t CallX(intx_t function, intx_t arg0=0, intx_t arg1=0, intx_t arg2=0, intx_t arg3=0)
uword stack_limit() const
static constexpr uword kSimulatorStackUnderflowSize
float CallF(intx_t function, intx_t arg0, intx_t arg1=0)
intx_t CallI(intx_t function, float arg0, float arg1=0.0f)
float CallF(intx_t function, intx_t arg0, float arg1)
double CallD(intx_t function, intx_t arg0, double arg1)
static uword FunctionForRedirect(uword redirect)
static const uint8_t buffer[]
Dart_NativeFunction function
const int kNumberOfFpuRegisters