void getEffects(const Abi& abi, const Vinstr& i, RegSet& uses, RegSet& across, RegSet& defs) { uses = defs = across = RegSet(); switch (i.op) { case Vinstr::mccall: case Vinstr::call: case Vinstr::callm: case Vinstr::callr: defs = abi.all() - abi.calleeSaved; switch (arch()) { case Arch::ARM: defs.add(PhysReg(arm::rLinkReg)); defs.remove(PhysReg(arm::rVmFp)); break; case Arch::X64: defs.remove(reg::rbp); break; } break; case Vinstr::bindcall: defs = abi.all(); switch (arch()) { case Arch::ARM: break; case Arch::X64: defs.remove(x64::rVmTl); break; } break; case Vinstr::contenter: case Vinstr::callstub: defs = abi.all(); switch (arch()) { case Arch::ARM: defs.remove(PhysReg(arm::rVmFp)); break; case Arch::X64: defs -= reg::rbp | x64::rVmTl; break; } break; case Vinstr::cqo: uses = RegSet(reg::rax); defs = reg::rax | reg::rdx; break; case Vinstr::idiv: uses = defs = reg::rax | reg::rdx; break; case Vinstr::shlq: case Vinstr::sarq: across = RegSet(reg::rcx); break; // arm instrs case Vinstr::hostcall: defs = (abi.all() - abi.calleeSaved) | RegSet(PhysReg(arm::rHostCallReg)); break; case Vinstr::vcall: case Vinstr::vinvoke: case Vinstr::vcallstub: always_assert(false && "Unsupported instruction in vxls"); default: break; } }
void RegAlloc::reset() { TRACE(1, ">>> regalloc reset! <<<\n"); m_epoch = 0; m_contToRegMap.clear(); // m_info is sparse. for (int i = 0; i < kMaxRegs; ++i) { m_info[i].m_epoch = 0; m_info[i].m_pReg = PhysReg(i); m_info[i].m_cont = RegContent(); m_info[i].m_type = KindOfInvalid; m_info[i].m_state = RegInfo::INVALID; } RegSet all = m_allRegs; PhysReg pr; for (int i = 0; all.findFirst(pr); i++) { all.remove(pr); physRegToInfo(pr)->m_pReg = PhysReg(pr); stateTransition(physRegToInfo(pr), RegInfo::FREE); // Put the most favorable register last, so it is picked first. m_lru[(m_numRegs - 1) - i] = pr; } m_branchSynced = false; verify(); }
void getEffects(const Abi& abi, const Vinstr& i, RegSet& uses, RegSet& across, RegSet& defs) { uses = defs = across = RegSet(); switch (i.op) { case Vinstr::mccall: case Vinstr::call: case Vinstr::callm: case Vinstr::callr: defs = abi.all() - (abi.calleeSaved | rvmfp()); switch (arch()) { case Arch::ARM: defs.add(PhysReg(arm::rLinkReg)); break; case Arch::X64: break; case Arch::PPC64: not_implemented(); break; } break; case Vinstr::bindcall: defs = abi.all(); switch (arch()) { case Arch::ARM: break; case Arch::X64: defs.remove(rvmtl()); break; case Arch::PPC64: not_implemented(); break; } break; case Vinstr::contenter: case Vinstr::callarray: defs = abi.all() - RegSet(rvmfp()); switch (arch()) { case Arch::ARM: break; case Arch::X64: defs.remove(rvmtl()); break; case Arch::PPC64: not_implemented(); break; } break; case Vinstr::callfaststub: defs = abi.all() - abi.calleeSaved - abi.gpUnreserved; break; case Vinstr::cqo: uses = RegSet(reg::rax); defs = reg::rax | reg::rdx; break; case Vinstr::idiv: uses = defs = reg::rax | reg::rdx; break; case Vinstr::shlq: case Vinstr::sarq: across = RegSet(reg::rcx); break; // arm instrs case Vinstr::hostcall: defs = (abi.all() - abi.calleeSaved) | RegSet(PhysReg(arm::rHostCallReg)); break; case Vinstr::vcall: case Vinstr::vinvoke: case Vinstr::vcallarray: always_assert(false && "Unsupported instruction in vxls"); default: break; } }