Patchwork [09/12] target-arm: optimize thumb push/pop ops

login
register
mail settings
Submitter Juha.Riihimaki@nokia.com
Date Oct. 21, 2009, 10:18 a.m.
Message ID <F4B6A51F-96B8-47F0-8571-51CF0D320AC9@nokia.com>
Download mbox | patch
Permalink /patch/36526/
State New
Headers show

Comments

Juha.Riihimaki@nokia.com - Oct. 21, 2009, 10:18 a.m.
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 <juha.riihimaki@nokia.com>
---
                      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);
              }

Patch

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