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:
Richard Henderson 2018-03-03 17:09:33 -05:00 committed by Lioncash
parent f50e6cfa11
commit 9a85cb0a26
No known key found for this signature in database
GPG key ID: 4E3C3CC1031BA9C7

View file

@ -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) {