bool emit(Venv& env, const fallbackcc& i) { auto const jcc = emitSmashableJcc(*env.cb, env.meta, env.cb->frontier(), i.cc); env.stubs.push_back({nullptr, jcc, i}); registerFallbackJump(env, jcc, i.cc); return true; }
bool emit(Venv& env, const fallbackcc& i) { auto const jcc = emitSmashableJcc(*env.cb, env.meta, env.cb->frontier(), i.cc); env.stubs.push_back({nullptr, jcc, i}); mcg->tx().getSrcRec(i.target)->registerFallbackJump(jcc, i.cc, env.meta); return true; }
bool emit(Venv& env, const bindjcc& i) { auto const jcc = emitSmashableJcc(*env.cb, env.meta, env.cb->frontier(), i.cc); env.stubs.push_back({nullptr, jcc, i}); setJmpTransID(env, jcc); return true; }
void Vgen::emit(jcc i) { assertx(i.cc != CC_None); if (i.targets[1] != i.targets[0]) { if (next == i.targets[1]) { // the taken branch is the fall-through block, invert the branch. i = jcc{ccNegate(i.cc), i.sf, {i.targets[1], i.targets[0]}}; } jccs.push_back({a->frontier(), i.targets[1]}); // B.cond range is +/- 1MB but this uses BR emitSmashableJcc(*codeBlock, env.meta, kEndOfTargetChain, i.cc); } emit(jmp{i.targets[0]}); }