backend\A64\constant_pool.cpp: Correct offset calculation

This commit is contained in:
SachinVin 2020-02-16 20:36:00 +05:30
parent c99ad2a4f3
commit f7fd0cff8f

View File

@ -33,22 +33,25 @@ void ConstantPool::EmitPatchLDR(Arm64Gen::ARM64Reg Rt, u64 lower, u64 upper) {
code.BRK(0x42); code.BRK(0x42);
return; return;
} }
DEBUG_ASSERT((offset & 3) == 0);
code.LDR(Rt, offset); code.LDR(Rt, offset / 4);
} }
void ConstantPool::PatchPool() { void ConstantPool::PatchPool() {
u8* pool_ptr = code.GetWritableCodePtr(); u8* pool_ptr = code.GetWritableCodePtr();
for (PatchInfo patch : patch_info) { for (PatchInfo patch : patch_info) {
std::memcpy(pool_ptr, &std::get<0>(patch.constant), sizeof(u64)); auto iter = constant_info.find(patch.constant);
std::memcpy(pool_ptr + sizeof(u64), &std::get<1>(patch.constant), sizeof(u64)); if (iter == constant_info.end()) {
constant_info.emplace(patch.constant, pool_ptr); std::memcpy(pool_ptr, &std::get<0>(patch.constant), sizeof(u64));
std::memcpy(pool_ptr + sizeof(u64), &std::get<1>(patch.constant), sizeof(u64));
iter = constant_info.emplace(patch.constant, pool_ptr).first;
pool_ptr += align_size;
}
code.SetCodePtr(patch.ptr); code.SetCodePtr(patch.ptr);
size_t offset = reinterpret_cast<size_t>(pool_ptr) - reinterpret_cast<size_t>(code.GetCodePtr());
code.LDR(patch.Rt, offset);
pool_ptr += align_size; const s32 offset = reinterpret_cast<size_t>(iter->second) - reinterpret_cast<size_t>(code.GetCodePtr());
DEBUG_ASSERT((offset & 3) == 0);
code.LDR(patch.Rt, offset / 4);
} }
patch_info.clear(); patch_info.clear();
code.SetCodePtr(pool_ptr); code.SetCodePtr(pool_ptr);