* [Qemu-devel] [PATCH] tcg/aarch64: Use ADR for shorter jumps
@ 2017-07-12 22:14 Pranith Kumar
2017-07-12 23:08 ` Richard Henderson
0 siblings, 1 reply; 3+ messages in thread
From: Pranith Kumar @ 2017-07-12 22:14 UTC (permalink / raw)
To: alex.bennee; +Cc: qemu-devel, rth
Use ADR instruction for shorter jumps.
I was going through rth's email and realized that I should have done
this the first time.
Signed-off-by: Pranith Kumar <bobby.prani@gmail.com>
---
tcg/aarch64/tcg-target.inc.c | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/tcg/aarch64/tcg-target.inc.c b/tcg/aarch64/tcg-target.inc.c
index 04bc369a92..5121ebc1a1 100644
--- a/tcg/aarch64/tcg-target.inc.c
+++ b/tcg/aarch64/tcg-target.inc.c
@@ -886,12 +886,16 @@ void aarch64_tb_set_jmp_target(uintptr_t jmp_addr, uintptr_t addr)
i1 = I3206_B | ((offset >> 2) & 0x3ffffff);
i2 = NOP;
} else {
- offset = (addr >> 12) - (jmp_addr >> 12);
+ if (offset == sextract64(offset, 0, 21)) {
+ i1 = I3406_ADR;
+ i2 = NOP;
+ } else {
+ offset = (addr >> 12) - (jmp_addr >> 12);
- /* patch ADRP */
- i1 = I3406_ADRP | (offset & 3) << 29 | (offset & 0x1ffffc) << (5 - 2) | rd;
- /* patch ADDI */
- i2 = I3401_ADDI | rt << 31 | (addr & 0xfff) << 10 | rd << 5 | rd;
+ i1 = I3406_ADRP;
+ i2 = I3401_ADDI | rt << 31 | (addr & 0xfff) << 10 | rd << 5 | rd;
+ }
+ i1 |= (offset & 3) << 29 | (offset & 0x1ffffc) << (5 - 2) | rd;
}
pair = (uint64_t)i2 << 32 | i1;
atomic_set((uint64_t *)jmp_addr, pair);
--
2.13.0
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [Qemu-devel] [PATCH] tcg/aarch64: Use ADR for shorter jumps
2017-07-12 22:14 [Qemu-devel] [PATCH] tcg/aarch64: Use ADR for shorter jumps Pranith Kumar
@ 2017-07-12 23:08 ` Richard Henderson
2017-07-13 0:14 ` Pranith Kumar
0 siblings, 1 reply; 3+ messages in thread
From: Richard Henderson @ 2017-07-12 23:08 UTC (permalink / raw)
To: Pranith Kumar, alex.bennee; +Cc: qemu-devel
On 07/12/2017 12:14 PM, Pranith Kumar wrote:
> Use ADR instruction for shorter jumps.
>
> I was going through rth's email and realized that I should have done
> this the first time.
>
> Signed-off-by: Pranith Kumar <bobby.prani@gmail.com>
> ---
> tcg/aarch64/tcg-target.inc.c | 14 +++++++++-----
> 1 file changed, 9 insertions(+), 5 deletions(-)
>
> diff --git a/tcg/aarch64/tcg-target.inc.c b/tcg/aarch64/tcg-target.inc.c
> index 04bc369a92..5121ebc1a1 100644
> --- a/tcg/aarch64/tcg-target.inc.c
> +++ b/tcg/aarch64/tcg-target.inc.c
> @@ -886,12 +886,16 @@ void aarch64_tb_set_jmp_target(uintptr_t jmp_addr, uintptr_t addr)
> i1 = I3206_B | ((offset >> 2) & 0x3ffffff);
> i2 = NOP;
> } else {
> - offset = (addr >> 12) - (jmp_addr >> 12);
> + if (offset == sextract64(offset, 0, 21)) {
> + i1 = I3406_ADR;
> + i2 = NOP;
> + } else {
This is dead code because it is covered by the direct jump above.
B has a 26-bit range, whereas ADR has a 21-bit range.
r~
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [Qemu-devel] [PATCH] tcg/aarch64: Use ADR for shorter jumps
2017-07-12 23:08 ` Richard Henderson
@ 2017-07-13 0:14 ` Pranith Kumar
0 siblings, 0 replies; 3+ messages in thread
From: Pranith Kumar @ 2017-07-13 0:14 UTC (permalink / raw)
To: Richard Henderson; +Cc: Alex Bennée, qemu-devel
On Wed, Jul 12, 2017 at 7:08 PM, Richard Henderson <rth@twiddle.net> wrote:
> On 07/12/2017 12:14 PM, Pranith Kumar wrote:
>>
>> Use ADR instruction for shorter jumps.
>>
>> I was going through rth's email and realized that I should have done
>> this the first time.
>>
>> Signed-off-by: Pranith Kumar <bobby.prani@gmail.com>
>> ---
>> tcg/aarch64/tcg-target.inc.c | 14 +++++++++-----
>> 1 file changed, 9 insertions(+), 5 deletions(-)
>>
>> diff --git a/tcg/aarch64/tcg-target.inc.c b/tcg/aarch64/tcg-target.inc.c
>> index 04bc369a92..5121ebc1a1 100644
>> --- a/tcg/aarch64/tcg-target.inc.c
>> +++ b/tcg/aarch64/tcg-target.inc.c
>> @@ -886,12 +886,16 @@ void aarch64_tb_set_jmp_target(uintptr_t jmp_addr,
>> uintptr_t addr)
>> i1 = I3206_B | ((offset >> 2) & 0x3ffffff);
>> i2 = NOP;
>> } else {
>> - offset = (addr >> 12) - (jmp_addr >> 12);
>> + if (offset == sextract64(offset, 0, 21)) {
>> + i1 = I3406_ADR;
>> + i2 = NOP;
>> + } else {
>
>
> This is dead code because it is covered by the direct jump above.
> B has a 26-bit range, whereas ADR has a 21-bit range.
Hmm, yep. And I guess it doesn't make sense to use ADR for short jumps
because this will be a 2 instruction jump vs 1 instruction for direct
branch.
Thanks,
--
Pranith
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2017-07-13 0:15 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-07-12 22:14 [Qemu-devel] [PATCH] tcg/aarch64: Use ADR for shorter jumps Pranith Kumar
2017-07-12 23:08 ` Richard Henderson
2017-07-13 0:14 ` Pranith Kumar
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).