mirror of
https://github.com/FEX-Emu/FEX.git
synced 2026-10-11 10:00:23 +02:00
Arm64Emitter: Changes LoadConstant to support Pad and byte width
Instead of just a trivial pad being on or off, support a tri-state on/off/auto where on will always pad, off will never pad, and auto will pad only if code caching is enabled. Further augment this by allowing a byte-width to be passed in, which can be used with pointers to force a 48-bit VA width to only ever pad to three instructions, reducing the common worst-case situation from 4 instructions to 3. This works because we're not going to expose a VA width larger than 47-bit to the guest. Fixes the handful of use-cases that explicitly chose their NOP padding, and a bug in Arm64Relocations.cpp where it was incorrectly asking to not receive padding even though it requires it.
This commit is contained in:
4 files changed
+35
-11
No files matched your search
@@ -622,8 +622,9 @@ bool CodeCache::ApplyCodeRelocations(uint64_t GuestEntry, std::span<std::byte> C
|
||||
if (Pointer == ~0ULL) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Emitter.LoadConstant(ARMEmitter::Size::i64Bit, ARMEmitter::Register(Reloc.NamedThunkMove.RegisterIndex), Pointer, true);
|
||||
// Pointers are required to fit within 48-bit VA space.
|
||||
Emitter.LoadConstant(ARMEmitter::Size::i64Bit, ARMEmitter::Register(Reloc.NamedThunkMove.RegisterIndex), Pointer,
|
||||
CPU::Arm64Emitter::PadType::DOPAD, 6);
|
||||
break;
|
||||
}
|
||||
case FEXCore::CPU::RelocationTypes::RELOC_GUEST_RIP_LITERAL: {
|
||||
@@ -632,7 +633,9 @@ bool CodeCache::ApplyCodeRelocations(uint64_t GuestEntry, std::span<std::byte> C
|
||||
}
|
||||
case FEXCore::CPU::RelocationTypes::RELOC_GUEST_RIP_MOVE: {
|
||||
uint64_t Pointer = Reloc.GuestRIP.GuestRIP + GuestEntry;
|
||||
Emitter.LoadConstant(ARMEmitter::Size::i64Bit, ARMEmitter::Register(Reloc.GuestRIP.RegisterIndex), Pointer, true);
|
||||
// Pointers are required to fit within 48-bit VA space.
|
||||
Emitter.LoadConstant(ARMEmitter::Size::i64Bit, ARMEmitter::Register(Reloc.GuestRIP.RegisterIndex), Pointer,
|
||||
CPU::Arm64Emitter::PadType::DOPAD, 6);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user