void IRTranslator::translateMIterInit(const NormalizedInstruction& i) { HHIR_EMIT(MIterInit, i.imm[0].u_IVA, i.offset() + i.imm[1].u_BA, i.imm[2].u_IVA, instrJmpFlags(i)); }
void IRTranslator::translateFCallArray(const NormalizedInstruction& i) { const Offset pcOffset = i.offset(); SrcKey next = i.nextSk(); const Offset after = next.offset(); HHIR_EMIT(FCallArray, pcOffset, after, jit::callDestroysLocals(i, m_hhbcTrans.curFunc())); }
void IRTranslator::translateMIterNextK(const NormalizedInstruction& i) { HHIR_EMIT(MIterNextK, i.imm[0].u_IVA, i.offset() + i.imm[1].u_BA, i.imm[2].u_IVA, i.imm[3].u_IVA); }
void IRTranslator::translateInstr(const NormalizedInstruction& ni) { auto& ht = m_hhbcTrans; ht.setBcOff(ni.source.offset(), ni.breaksTracelet && !m_hhbcTrans.isInlining()); FTRACE(1, "\n{:-^60}\n", folly::format("Translating {}: {} with stack:\n{}", ni.offset(), ni.toString(), ht.showStack())); // When profiling, we disable type predictions to avoid side exits assert(IMPLIES(JIT::tx->mode() == TransProfile, !ni.outputPredicted)); if (ni.guardedThis) { // Task #2067635: This should really generate an AssertThis ht.setThisAvailable(); } if (moduleEnabled(HPHP::Trace::stats, 2)) { ht.emitIncStat(Stats::opcodeToIRPreStatCounter(ni.op()), 1, false); } if (RuntimeOption::EnableInstructionCounts || moduleEnabled(HPHP::Trace::stats, 3)) { // If the instruction takes a slow exit, the exit trace will // decrement the post counter for that opcode. ht.emitIncStat(Stats::opcodeToIRPostStatCounter(ni.op()), 1, true); } ht.emitRB(RBTypeBytecodeStart, ni.source, 2); auto pc = reinterpret_cast<const Op*>(ni.pc()); for (auto i = 0, num = instrNumPops(pc); i < num; ++i) { auto const type = flavorToType(instrInputFlavor(pc, i)); if (type != Type::Gen) m_hhbcTrans.assertTypeStack(i, type); } if (RuntimeOption::EvalHHIRGenerateAsserts >= 2) { ht.emitDbgAssertRetAddr(); } if (instrMustInterp(ni) || ni.interp) { interpretInstr(ni); } else { translateInstrWork(ni); } passPredictedAndInferredTypes(ni); }
void IRTranslator::translateDecodeCufIter(const NormalizedInstruction& i) { HHIR_EMIT(DecodeCufIter, i.imm[0].u_IVA, i.offset() + i.imm[1].u_BA, instrJmpFlags(i)); }
void IRTranslator::translateIterBreak(const NormalizedInstruction& i) { assert(i.endsRegion); HHIR_EMIT(IterBreak, i.immVec, i.offset() + i.imm[1].u_BA, i.endsRegion); }
void IRTranslator::translateJmpNS(const NormalizedInstruction& i) { HHIR_EMIT(JmpNS, i.offset() + i.imm[0].u_BA, instrJmpFlags(i)); }
void IRTranslator::translateAsyncESuspend(const NormalizedInstruction& i) { HHIR_EMIT(AsyncESuspend, i.offset() + i.imm[0].u_BA, i.imm[1].u_IVA); }
void IRTranslator::translateCreateCont(const NormalizedInstruction& i) { HHIR_EMIT(CreateCont, i.offset() + i.imm[0].u_BA); }
void IRTranslator::translateJmpNS(const NormalizedInstruction& i) { HHIR_EMIT(Jmp, i.offset() + i.imm[0].u_BA, i.breaksTracelet, true); }