[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 09/12] target-arm: optimize thumb push/pop ops
From: |
Juha.Riihimaki |
Subject: |
[Qemu-devel] [PATCH 09/12] target-arm: optimize thumb push/pop ops |
Date: |
Wed, 21 Oct 2009 12:18:05 +0200 |
Thumb push/pop instructions can be slightly optimized by loading the
register offset constant into a variable outside the register loop and
using the preloaded variable inside the loop instead of reloading the
offset value to a temporary variable on each loop iteration. This
causes less TCG ops to be generated for a Thumb push/pop instruction.
Signed-off-by: Juha Riihimäki <address@hidden>
---
diff --git a/target-arm/translate.c b/target-arm/translate.c
index abb3105..99a9ffd 100644
--- a/target-arm/translate.c
+++ b/target-arm/translate.c
@@ -8589,6 +8589,7 @@ static void disas_thumb_insn(CPUState *env,
DisasContext *s)
if ((insn & (1 << 11)) == 0) {
tcg_gen_addi_i32(addr, addr, -offset);
}
+ tmp2 = tcg_const_i32(4);
for (i = 0; i < 8; i++) {
if (insn & (1 << i)) {
if (insn & (1 << 11)) {
@@ -8601,7 +8602,7 @@ static void disas_thumb_insn(CPUState *env,
DisasContext *s)
gen_st32(tmp, addr, IS_USER(s));
}
/* advance to the next address. */
- tcg_gen_addi_i32(addr, addr, 4);
+ tcg_gen_add_i32(addr, addr, tmp2);
}
}
TCGV_UNUSED(tmp);
@@ -8616,8 +8617,9 @@ static void disas_thumb_insn(CPUState *env,
DisasContext *s)
tmp = load_reg(s, 14);
gen_st32(tmp, addr, IS_USER(s));
}
- tcg_gen_addi_i32(addr, addr, 4);
+ tcg_gen_add_i32(addr, addr, tmp2);
}
+ tcg_temp_free_i32(tmp2);
if ((insn & (1 << 11)) == 0) {
tcg_gen_addi_i32(addr, addr, -offset);
}
translate.c.tpushpop.diff
Description: translate.c.tpushpop.diff
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemu-devel] [PATCH 09/12] target-arm: optimize thumb push/pop ops,
Juha.Riihimaki <=