StoreImmPatcher::StoreImmPatcher(X64Assembler& as, uint64_t initial, register_name_t reg, int32_t offset, register_name_t base) { is32 = deltaFits(initial, sz::dword); if (is32) { as.store_imm64_disp_reg64(initial, offset, base); } else { as.mov_imm64_reg(initial, reg); as.store_reg64_disp_reg64(reg, offset, base); } m_addr = as.code.frontier - (is32 ? 4 : 8); ASSERT((is32 ? (uint64_t)*(int32_t*)m_addr : *(uint64_t*)m_addr) == initial); }
StoreImmPatcher::StoreImmPatcher(X64Assembler& as, uint64_t initial, RegNumber reg, int32_t offset, RegNumber base) { m_is32 = deltaFits(initial, sz::dword); if (m_is32) { as.store_imm64_disp_reg64(initial, offset, base); } else { as.mov_imm64_reg(initial, reg); as.store_reg64_disp_reg64(reg, offset, base); } m_addr = as.frontier() - (m_is32 ? 4 : 8); assert((m_is32 ? (uint64_t)*(int32_t*)m_addr : *(uint64_t*)m_addr) == initial); }
StoreImmPatcher::StoreImmPatcher(CodeBlock& cb, uint64_t initial, RegNumber reg, int32_t offset, RegNumber base) { X64Assembler as { cb }; m_is32 = deltaFits(initial, sz::dword); if (m_is32) { as.store_imm64_disp_reg64(initial, offset, base); m_addr = cb.frontier() - 4; } else { as.mov_imm64_reg(initial, reg); m_addr = cb.frontier() - 8; as.store_reg64_disp_reg64(reg, offset, base); } assert((m_is32 ? (uint64_t)*(int32_t*)m_addr : *(uint64_t*)m_addr) == initial); }