[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 2/2] mips: Optimize calli
From: |
Paul Cercueil |
Subject: |
[PATCH 2/2] mips: Optimize calli |
Date: |
Sat, 27 Aug 2022 16:49:50 +0100 |
Instead of doing:
LUI t9, 0x1afe
ORI t9, t9, 0xbce0
JALR t9
NOP
When possible, it will now emit:
LUI t9, 0x1afe
JAL 0x1afebce0
ORI t9, t9, 0xbce0
Signed-off-by: Paul Cercueil <paul@crapouillou.net>
---
lib/jit_mips-cpu.c | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/lib/jit_mips-cpu.c b/lib/jit_mips-cpu.c
index 0625589..4bd3dd1 100644
--- a/lib/jit_mips-cpu.c
+++ b/lib/jit_mips-cpu.c
@@ -2931,6 +2931,32 @@ _callr(jit_state_t *_jit, jit_int32_t r0)
static void
_calli(jit_state_t *_jit, jit_word_t i0)
{
+ if (((_jit->pc.w + sizeof(jit_int32_t)) & 0xf0000000) == (i0 &
0xf0000000)) {
+ if (can_sign_extend_short_p(i0)) {
+ JAL((i0 & ~0xf0000000) >> 2);
+ addiu(_T9_REGNO, _ZERO_REGNO, i0);
+ return;
+ }
+
+ if (can_zero_extend_short_p(i0)) {
+ JAL((i0 & ~0xf0000000) >> 2);
+ ORI(_T9_REGNO, _ZERO_REGNO, i0);
+ return;
+ }
+
+ if (can_sign_extend_int_p(i0)) {
+ if (i0 & 0xffff) {
+ LUI(_T9_REGNO, i0 >> 16);
+ JAL((i0 & ~0xf0000000) >> 2);
+ ORI(_T9_REGNO, _T9_REGNO, i0);
+ } else {
+ JAL((i0 & ~0xf0000000) >> 2);
+ LUI(_T9_REGNO, i0 >> 16);
+ }
+ return;
+ }
+ }
+
movi(_T9_REGNO, i0);
JALR(_T9_REGNO);
NOP(1);
--
2.35.1