mirror of
https://github.com/yuzu-emu/unicorn
synced 2024-11-25 08:49:16 +00:00
tcg/aarch64: Use ADR in tcg_out_movi
The new placement of the TB means that we can use one insn to load the return value for exit_tb returning the TB pointer. Backports commit cc74d332ff9a78684374847375ef63fc4bd10436 from qemu
This commit is contained in:
parent
f50e6cfa11
commit
9a85cb0a26
1 changed files with 6 additions and 1 deletions
|
@ -620,7 +620,12 @@ static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd,
|
||||||
/* Look for host pointer values within 4G of the PC. This happens
|
/* Look for host pointer values within 4G of the PC. This happens
|
||||||
often when loading pointers to QEMU's own data structures. */
|
often when loading pointers to QEMU's own data structures. */
|
||||||
if (type == TCG_TYPE_I64) {
|
if (type == TCG_TYPE_I64) {
|
||||||
tcg_target_long disp = (value >> 12) - ((intptr_t)s->code_ptr >> 12);
|
tcg_target_long disp = value - (intptr_t)s->code_ptr;
|
||||||
|
if (disp == sextract64(disp, 0, 21)) {
|
||||||
|
tcg_out_insn(s, 3406, ADR, rd, disp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
disp = (value >> 12) - ((intptr_t)s->code_ptr >> 12);
|
||||||
if (disp == sextract64(disp, 0, 21)) {
|
if (disp == sextract64(disp, 0, 21)) {
|
||||||
tcg_out_insn(s, 3406, ADRP, rd, disp);
|
tcg_out_insn(s, 3406, ADRP, rd, disp);
|
||||||
if (value & 0xfff) {
|
if (value & 0xfff) {
|
||||||
|
|
Loading…
Reference in a new issue