23 std::list<CodePart>::const_iterator iter = parts.begin();
24 while (iter != parts.end())
29 if (iter->fullRegistersDependency())
37 ignored.
intersect(iter->getAffectedRegisters());
41 ignored.
merge(iter->getAffectedRegisters());
43 ignored.
applyShadow(iter->getRegisterDependencies());
45 code = iter->getCode() +
"\n" + code;
50 if (!iter->getAffectedRegisters().maskedBy(ignored))
53 if (iter->fullRegistersDependency())
61 ignored.
intersect(iter->getAffectedRegisters());
65 ignored.
merge(iter->getAffectedRegisters());
67 ignored.
applyShadow(iter->getRegisterDependencies());
70 code = iter->getCode() +
"\n" + code;
108void CodeBlock::toCode(std::stringstream &out,
const std::string &funcname, std::set<std::string> *fileglobalcode)
115 if (fileglobalcode->find(*iter) == fileglobalcode->end())
118 fileglobalcode->insert(*iter);
130 out <<
"etiss_uint32 " << funcname
131 <<
"(ETISS_CPU * const cpu, ETISS_System * const system, void * const * const plugin_pointers) {\n"
132 " const etiss_uint64 blockglobal_startaddr = 0x"
135 " const etiss_uint64 blockglobal_jumpaddr = cpu->instructionPointer - blockglobal_startaddr;\n";
142 out <<
"\n\tswitch(blockglobal_jumpaddr){\n";
143 std::list<std::string> cases;
148 etiss::uint64 last = 0;
150 for (
auto iter =
lines_.rbegin(); iter !=
lines_.rend(); iter++)
153 if (last > iter->getAddress())
159 std::stringstream lss;
160 lss <<
" case " << (iter->getAddress() -
startindex_) <<
":\n";
162 lss << iter->getCodeSet().toString(ignored, ok);
164 cases.push_front(lss.str());
167 for (
auto iter = cases.begin(); iter != cases.end(); iter++)
169 out <<
"\n\t break;\n"
171 "\t\treturn ETISS_RETURNCODE_ILLEGALJUMP;\n"
173 "\treturn ETISS_RETURNCODE_NOERROR;\n"
classes to hold code and additional information used for optimization of instruction translations
void toCode(std::stringstream &out, const std::string &funcname, std::set< std::string > *fileglobalcode)
std::set< std::string > functionglobal_code
std::vector< Line > lines_
etiss::uint64 startindex_
std::set< std::string > fileglobal_code
std::string toString(RegisterSet &ignored, bool &ok) const
writes the contained CodeParts as needed with respect to the given RegisterSet of bits that are not r...
std::list< CodePart > appretreq_parts_
std::list< CodePart > midopt_parts_
std::list< CodePart > pindbgretreq_parts_
std::list< CodePart > appreq_parts_
std::list< CodePart > inireq_parts_
static void writeCodeParts(std::string &code, const std::list< CodePart > &parts, bool required, RegisterSet &ignored, bool intersect)
std::list< CodePart > appopt_parts_
void applyShadow(const RegisterSet &rs)
any register bits set in the passed RegisterSet won't be set in this RegisterSet
void merge(const RegisterSet &rs)
any register bits set in the passed RegisterSet will be set in this RegisterSet (plus previously set ...
void intersect(const RegisterSet &rs)
only register bits set in this AND the passed RegisterSet remain set in this RegisterSet
void log(Verbosity level, std::string msg)
write log message at the given level.