ETISS 0.11.2
ExtendableTranslatingInstructionSetSimulator(version0.11.2)
Loading...
Searching...
No Matches
RV64IMACFD_tum_semihostingInstr.cpp
Go to the documentation of this file.
1// clang-format off
9#include "RV64IMACFDArch.h"
10#include "RV64IMACFDFuncs.h"
11
12using namespace etiss;
13using namespace etiss::instr;
14
15// EBREAK ----------------------------------------------------------------------
18 "ebreak",
19 (uint32_t) 0x100073,
20 (uint32_t) 0xffffffff,
22 {
23
24// -----------------------------------------------------------------------------
25
26// -----------------------------------------------------------------------------
27
28// -----------------------------------------------------------------------------
29// NOLINTBEGIN(clang-diagnostic-unused-but-set-variable)
30
31// NOLINTEND(clang-diagnostic-unused-but-set-variable)
32// -----------------------------------------------------------------------------
33
34 {
36
37 cp.code() = std::string("//EBREAK\n");
38
39// -----------------------------------------------------------------------------
40cp.code() += "etiss_coverage_count(1, 183);\n";
41{ // block
42cp.code() += "etiss_coverage_count(1, 1169);\n";
43cp.code() += "{ // block\n";
44cp.code() += "cpu->nextPc = " + std::to_string(ic.current_address_ + 4) + "ULL;\n";
45cp.code() += "etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";
46cp.code() += "} // block\n";
47} // block
48{ // block
49cp.code() += "etiss_coverage_count(1, 2263);\n";
50cp.code() += "{ // block\n";
51cp.code() += "etiss_coverage_count(1, 2192);\n";
52cp.code() += "if (etiss_semihost_enabled()) { // conditional\n";
53cp.code() += "etiss_coverage_count(1, 2193);\n";
54{ // block
55cp.code() += "etiss_coverage_count(1, 2258);\n";
56cp.code() += "{ // block\n";
57cp.code() += "etiss_uint32 mem_val_0;\n";
58cp.code() += "cpu->exception |= (*(system->dread))(system->handle, cpu, " + std::to_string(ic.current_address_ - 4ULL) + "ULL, (etiss_uint8*)&mem_val_0, 4);\n";
59cp.code() += "if (cpu->exception) { // conditional\n";
60{ // procedure
61cp.code() += "{ // procedure\n";
62cp.code() += "RV64IMACFD_translate_exc_code(cpu, system, plugin_pointers, cpu->exception);\n";
63cp.code() += "goto instr_exit_" + std::to_string(ic.current_address_) + ";\n";
64cp.code() += "} // procedure\n";
65} // procedure
66cp.code() += "} // conditional\n";
67cp.code() += "etiss_uint32 pre = (etiss_uint32)(mem_val_0);\n";
68cp.code() += "etiss_coverage_count(6, 2202, 2201, 2199, 2198, 2196, 2197);\n";
69cp.code() += "etiss_uint32 mem_val_1;\n";
70cp.code() += "cpu->exception |= (*(system->dread))(system->handle, cpu, " + std::to_string(ic.current_address_ + 0LL) + "LL, (etiss_uint8*)&mem_val_1, 4);\n";
71cp.code() += "if (cpu->exception) { // conditional\n";
72{ // procedure
73cp.code() += "{ // procedure\n";
74cp.code() += "RV64IMACFD_translate_exc_code(cpu, system, plugin_pointers, cpu->exception);\n";
75cp.code() += "goto instr_exit_" + std::to_string(ic.current_address_) + ";\n";
76cp.code() += "} // procedure\n";
77} // procedure
78cp.code() += "} // conditional\n";
79cp.code() += "etiss_uint32 ebreak = (etiss_uint32)(mem_val_1);\n";
80cp.code() += "etiss_coverage_count(6, 2211, 2210, 2208, 2207, 2205, 2206);\n";
81cp.code() += "etiss_uint32 mem_val_2;\n";
82cp.code() += "cpu->exception |= (*(system->dread))(system->handle, cpu, " + std::to_string(ic.current_address_ + 4ULL) + "ULL, (etiss_uint8*)&mem_val_2, 4);\n";
83cp.code() += "if (cpu->exception) { // conditional\n";
84{ // procedure
85cp.code() += "{ // procedure\n";
86cp.code() += "RV64IMACFD_translate_exc_code(cpu, system, plugin_pointers, cpu->exception);\n";
87cp.code() += "goto instr_exit_" + std::to_string(ic.current_address_) + ";\n";
88cp.code() += "} // procedure\n";
89} // procedure
90cp.code() += "} // conditional\n";
91cp.code() += "etiss_uint32 post = (etiss_uint32)(mem_val_2);\n";
92cp.code() += "etiss_coverage_count(6, 2220, 2219, 2217, 2216, 2214, 2215);\n";
93cp.code() += "etiss_coverage_count(1, 2221);\n";
94cp.code() += "if (pre == 32509971ULL && ebreak == 1048691ULL && post == 1081102355ULL) { // conditional\n";
95cp.code() += "etiss_coverage_count(11, 2232, 2228, 2224, 2222, 2223, 2227, 2225, 2226, 2231, 2229, 2230);\n";
96{ // block
97cp.code() += "etiss_coverage_count(1, 2253);\n";
98cp.code() += "{ // block\n";
99cp.code() += "etiss_uint64 operation = *((RV64IMACFD*)cpu)->X[10ULL];\n";
100cp.code() += "etiss_coverage_count(3, 2237, 2236, 2235);\n";
101cp.code() += "etiss_uint64 parameter = *((RV64IMACFD*)cpu)->X[11ULL];\n";
102cp.code() += "etiss_coverage_count(3, 2242, 2241, 2240);\n";
103cp.code() += "*((RV64IMACFD*)cpu)->X[10ULL] = (etiss_int64)(etiss_semihost(cpu, system, plugin_pointers, 64ULL, operation, parameter));\n";
104cp.code() += "etiss_coverage_count(7, 2252, 2245, 2244, 2251, 2249, 2247, 2248);\n";
105cp.code() += "} // block\n";
106} // block
107cp.code() += "} // conditional\n";
108cp.code() += "else { // conditional\n";
109{ // block
110cp.code() += "etiss_coverage_count(1, 2257);\n";
111cp.code() += "{ // block\n";
112{ // procedure
113cp.code() += "{ // procedure\n";
114cp.code() += "RV64IMACFD_raise(cpu, system, plugin_pointers, 0LL, 3LL);\n";
115cp.code() += "etiss_coverage_count(2, 2256, 2254);\n";
116cp.code() += "goto instr_exit_" + std::to_string(ic.current_address_) + ";\n";
117cp.code() += "} // procedure\n";
118} // procedure
119cp.code() += "} // block\n";
120} // block
121cp.code() += "} // conditional\n";
122cp.code() += "} // block\n";
123} // block
124cp.code() += "} // conditional\n";
125cp.code() += "else { // conditional\n";
126{ // block
127cp.code() += "etiss_coverage_count(1, 2262);\n";
128cp.code() += "{ // block\n";
129{ // procedure
130cp.code() += "{ // procedure\n";
131cp.code() += "RV64IMACFD_raise(cpu, system, plugin_pointers, 0LL, 3LL);\n";
132cp.code() += "etiss_coverage_count(2, 2261, 2259);\n";
133cp.code() += "goto instr_exit_" + std::to_string(ic.current_address_) + ";\n";
134cp.code() += "} // procedure\n";
135} // procedure
136cp.code() += "} // block\n";
137} // block
138cp.code() += "} // conditional\n";
139cp.code() += "} // block\n";
140} // block
141cp.code() += "instr_exit_" + std::to_string(ic.current_address_) + ":\n";
142cp.code() += "cpu->instructionPointer = cpu->nextPc;\n";
143// -----------------------------------------------------------------------------
144 cp.getAffectedRegisters().add("instructionPointer", 32);
145 }
146 {
148
149 cp.code() = std::string("//EBREAK\n");
150
151// -----------------------------------------------------------------------------
152cp.code() += "if (cpu->return_pending || cpu->exception || cpu->nextPc != " + std::to_string(ic.current_address_ + 4) + "ULL) return cpu->exception;\n";
153// -----------------------------------------------------------------------------
154 }
155
156 return true;
157 },
158 0,
159 [] (BitArray & ba, Instruction & instr)
160 {
161// -----------------------------------------------------------------------------
162
163// -----------------------------------------------------------------------------
164
165 std::stringstream ss;
166// -----------------------------------------------------------------------------
167ss << "ebreak" << " # " << ba << (" []");
168// -----------------------------------------------------------------------------
169 return ss.str();
170 }
171);
172// clang-format on
etiss::instr::InstructionGroup ISA32_RV64IMACFD("ISA32_RV64IMACFD", 32)
static InstructionDefinition ebreak_(ISA32_RV64IMACFD, "ebreak",(uint32_t) 0x100073,(uint32_t) 0xffffffff, [](BitArray &ba, etiss::CodeSet &cs, InstructionContext &ic) { { CodePart &cp=cs.append(CodePart::INITIALREQUIRED);cp.code()=std::string("//EBREAK\n");cp.code()+="etiss_coverage_count(1, 183);\n";{ cp.code()+="etiss_coverage_count(1, 1169);\n";cp.code()+="{ // block\n";cp.code()+="cpu->nextPc = "+std::to_string(ic.current_address_+4)+"ULL;\n";cp.code()+="etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";cp.code()+="} // block\n";} { cp.code()+="etiss_coverage_count(1, 2263);\n";cp.code()+="{ // block\n";cp.code()+="etiss_coverage_count(1, 2192);\n";cp.code()+="if (etiss_semihost_enabled()) { // conditional\n";cp.code()+="etiss_coverage_count(1, 2193);\n";{ cp.code()+="etiss_coverage_count(1, 2258);\n";cp.code()+="{ // block\n";cp.code()+="etiss_uint32 mem_val_0;\n";cp.code()+="cpu->exception |= (*(system->dread))(system->handle, cpu, "+std::to_string(ic.current_address_ - 4ULL)+"ULL, (etiss_uint8*)&mem_val_0, 4);\n";cp.code()+="if (cpu->exception) { // conditional\n";{ cp.code()+="{ // procedure\n";cp.code()+="RV64IMACFD_translate_exc_code(cpu, system, plugin_pointers, cpu->exception);\n";cp.code()+="goto instr_exit_"+std::to_string(ic.current_address_)+";\n";cp.code()+="} // procedure\n";} cp.code()+="} // conditional\n";cp.code()+="etiss_uint32 pre = (etiss_uint32)(mem_val_0);\n";cp.code()+="etiss_coverage_count(6, 2202, 2201, 2199, 2198, 2196, 2197);\n";cp.code()+="etiss_uint32 mem_val_1;\n";cp.code()+="cpu->exception |= (*(system->dread))(system->handle, cpu, "+std::to_string(ic.current_address_+0LL)+"LL, (etiss_uint8*)&mem_val_1, 4);\n";cp.code()+="if (cpu->exception) { // conditional\n";{ cp.code()+="{ // procedure\n";cp.code()+="RV64IMACFD_translate_exc_code(cpu, system, plugin_pointers, cpu->exception);\n";cp.code()+="goto instr_exit_"+std::to_string(ic.current_address_)+";\n";cp.code()+="} // procedure\n";} cp.code()+="} // conditional\n";cp.code()+="etiss_uint32 ebreak = (etiss_uint32)(mem_val_1);\n";cp.code()+="etiss_coverage_count(6, 2211, 2210, 2208, 2207, 2205, 2206);\n";cp.code()+="etiss_uint32 mem_val_2;\n";cp.code()+="cpu->exception |= (*(system->dread))(system->handle, cpu, "+std::to_string(ic.current_address_+4ULL)+"ULL, (etiss_uint8*)&mem_val_2, 4);\n";cp.code()+="if (cpu->exception) { // conditional\n";{ cp.code()+="{ // procedure\n";cp.code()+="RV64IMACFD_translate_exc_code(cpu, system, plugin_pointers, cpu->exception);\n";cp.code()+="goto instr_exit_"+std::to_string(ic.current_address_)+";\n";cp.code()+="} // procedure\n";} cp.code()+="} // conditional\n";cp.code()+="etiss_uint32 post = (etiss_uint32)(mem_val_2);\n";cp.code()+="etiss_coverage_count(6, 2220, 2219, 2217, 2216, 2214, 2215);\n";cp.code()+="etiss_coverage_count(1, 2221);\n";cp.code()+="if (pre == 32509971ULL && ebreak == 1048691ULL && post == 1081102355ULL) { // conditional\n";cp.code()+="etiss_coverage_count(11, 2232, 2228, 2224, 2222, 2223, 2227, 2225, 2226, 2231, 2229, 2230);\n";{ cp.code()+="etiss_coverage_count(1, 2253);\n";cp.code()+="{ // block\n";cp.code()+="etiss_uint64 operation = *((RV64IMACFD*)cpu)->X[10ULL];\n";cp.code()+="etiss_coverage_count(3, 2237, 2236, 2235);\n";cp.code()+="etiss_uint64 parameter = *((RV64IMACFD*)cpu)->X[11ULL];\n";cp.code()+="etiss_coverage_count(3, 2242, 2241, 2240);\n";cp.code()+="*((RV64IMACFD*)cpu)->X[10ULL] = (etiss_int64)(etiss_semihost(cpu, system, plugin_pointers, 64ULL, operation, parameter));\n";cp.code()+="etiss_coverage_count(7, 2252, 2245, 2244, 2251, 2249, 2247, 2248);\n";cp.code()+="} // block\n";} cp.code()+="} // conditional\n";cp.code()+="else { // conditional\n";{ cp.code()+="etiss_coverage_count(1, 2257);\n";cp.code()+="{ // block\n";{ cp.code()+="{ // procedure\n";cp.code()+="RV64IMACFD_raise(cpu, system, plugin_pointers, 0LL, 3LL);\n";cp.code()+="etiss_coverage_count(2, 2256, 2254);\n";cp.code()+="goto instr_exit_"+std::to_string(ic.current_address_)+";\n";cp.code()+="} // procedure\n";} cp.code()+="} // block\n";} cp.code()+="} // conditional\n";cp.code()+="} // block\n";} cp.code()+="} // conditional\n";cp.code()+="else { // conditional\n";{ cp.code()+="etiss_coverage_count(1, 2262);\n";cp.code()+="{ // block\n";{ cp.code()+="{ // procedure\n";cp.code()+="RV64IMACFD_raise(cpu, system, plugin_pointers, 0LL, 3LL);\n";cp.code()+="etiss_coverage_count(2, 2261, 2259);\n";cp.code()+="goto instr_exit_"+std::to_string(ic.current_address_)+";\n";cp.code()+="} // procedure\n";} cp.code()+="} // block\n";} cp.code()+="} // conditional\n";cp.code()+="} // block\n";} cp.code()+="instr_exit_"+std::to_string(ic.current_address_)+":\n";cp.code()+="cpu->instructionPointer = cpu->nextPc;\n";cp.getAffectedRegisters().add("instructionPointer", 32);} { CodePart &cp=cs.append(CodePart::APPENDEDRETURNINGREQUIRED);cp.code()=std::string("//EBREAK\n");cp.code()+="if (cpu->return_pending || cpu->exception || cpu->nextPc != "+std::to_string(ic.current_address_+4)+"ULL) return cpu->exception;\n";} return true;}, 0, [](BitArray &ba, Instruction &instr) { std::stringstream ss;ss<< "ebreak"<< " # "<< ba<<(" []");return ss.str();})
Contains a small code snipped.
Definition CodePart.h:348
@ APPENDEDRETURNINGREQUIRED
Definition CodePart.h:364
std::string & code()
Definition CodePart.h:378
RegisterSet & getAffectedRegisters()
Definition CodePart.h:376
A set of CodeParts.
Definition CodePart.h:399
void append(const CodePart &part, CodePart::TYPE type)
Definition CodePart.h:412
void add(const RegisterPart &rp)
add a registerPart to the set or just its relevant bits if a register with the same name is already p...
Definition CodePart.h:184
stores a bit vector
this class contains parameters that persist in between instruction lookpus/translation within a trans...
uint64_t current_address_
start address of current instruction
holds information and translation callbacks for an instruction.
forwards: include/jit/*
Definition Benchmark.h:17