Patchwork [03/13] tcg: add temp_sync()

login
register
mail settings
Submitter Aurelien Jarno
Date Sept. 27, 2012, 5:15 p.m.
Message ID <1348766113-18373-4-git-send-email-aurelien@aurel32.net>
Download mbox | patch
Permalink /patch/187433/
State New
Headers show

Comments

Aurelien Jarno - Sept. 27, 2012, 5:15 p.m.
Add a new function temp_sync() to synchronize the canonical location
of a temp with the value in the corresponding register, but without
freeing the associated register. Rewrite temp_save() to call
temp_sync() followed by temp_dead().

Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 tcg/tcg.c |   33 +++++++++++++++++++--------------
 1 file changed, 19 insertions(+), 14 deletions(-)
Richard Henderson - Sept. 27, 2012, 6:30 p.m.
On 09/27/2012 10:15 AM, Aurelien Jarno wrote:
> Add a new function temp_sync() to synchronize the canonical location
> of a temp with the value in the corresponding register, but without
> freeing the associated register. Rewrite temp_save() to call
> temp_sync() followed by temp_dead().
> 
> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>

Reviewed-by: Richard Henderson <rth@twiddle.net>

>          case TEMP_VAL_REG:
> +            tcg_reg_sync(s, ts->reg);
>              break;
>          case TEMP_VAL_CONST:
> +            ts->reg = tcg_reg_alloc(s, tcg_target_available_regs[ts->type],
> +                                    allocated_regs);
> +            ts->val_type = TEMP_VAL_REG;
> +            s->reg_to_temp[ts->reg] = temp;
> +            ts->mem_coherent = 0;
> +            tcg_out_movi(s, ts->type, ts->reg, ts->val);
> +            tcg_reg_sync(s, ts->reg);
>              break;

Fallthru from TEMP_VAL_CONST into TEMP_VAL_REG?


r~
Aurelien Jarno - Sept. 27, 2012, 8:02 p.m.
On Thu, Sep 27, 2012 at 11:30:14AM -0700, Richard Henderson wrote:
> On 09/27/2012 10:15 AM, Aurelien Jarno wrote:
> > Add a new function temp_sync() to synchronize the canonical location
> > of a temp with the value in the corresponding register, but without
> > freeing the associated register. Rewrite temp_save() to call
> > temp_sync() followed by temp_dead().
> > 
> > Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
> 
> Reviewed-by: Richard Henderson <rth@twiddle.net>
> 
> >          case TEMP_VAL_REG:
> > +            tcg_reg_sync(s, ts->reg);
> >              break;
> >          case TEMP_VAL_CONST:
> > +            ts->reg = tcg_reg_alloc(s, tcg_target_available_regs[ts->type],
> > +                                    allocated_regs);
> > +            ts->val_type = TEMP_VAL_REG;
> > +            s->reg_to_temp[ts->reg] = temp;
> > +            ts->mem_coherent = 0;
> > +            tcg_out_movi(s, ts->type, ts->reg, ts->val);
> > +            tcg_reg_sync(s, ts->reg);
> >              break;
> 
> Fallthru from TEMP_VAL_CONST into TEMP_VAL_REG?
> 

Good catch. It was refactoring from temp_save, and I didn't see it.

Patch

diff --git a/tcg/tcg.c b/tcg/tcg.c
index 2ac7097..fb2223f 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -1545,31 +1545,28 @@  static inline void temp_dead(TCGContext *s, int temp)
     }
 }
 
-/* save a temporary to memory. 'allocated_regs' is used in case a
+/* sync a temporary to memory. 'allocated_regs' is used in case a
    temporary registers needs to be allocated to store a constant. */
-static void temp_save(TCGContext *s, int temp, TCGRegSet allocated_regs)
+static inline void temp_sync(TCGContext *s, int temp, TCGRegSet allocated_regs)
 {
     TCGTemp *ts;
-    int reg;
 
     ts = &s->temps[temp];
     if (!ts->fixed_reg) {
         switch(ts->val_type) {
         case TEMP_VAL_REG:
-            tcg_reg_free(s, ts->reg);
-            break;
-        case TEMP_VAL_DEAD:
-            ts->val_type = TEMP_VAL_MEM;
+            tcg_reg_sync(s, ts->reg);
             break;
         case TEMP_VAL_CONST:
-            reg = tcg_reg_alloc(s, tcg_target_available_regs[ts->type], 
-                                allocated_regs);
-            if (!ts->mem_allocated) 
-                temp_allocate_frame(s, temp);
-            tcg_out_movi(s, ts->type, reg, ts->val);
-            tcg_out_st(s, ts->type, reg, ts->mem_reg, ts->mem_offset);
-            ts->val_type = TEMP_VAL_MEM;
+            ts->reg = tcg_reg_alloc(s, tcg_target_available_regs[ts->type],
+                                    allocated_regs);
+            ts->val_type = TEMP_VAL_REG;
+            s->reg_to_temp[ts->reg] = temp;
+            ts->mem_coherent = 0;
+            tcg_out_movi(s, ts->type, ts->reg, ts->val);
+            tcg_reg_sync(s, ts->reg);
             break;
+        case TEMP_VAL_DEAD:
         case TEMP_VAL_MEM:
             break;
         default:
@@ -1578,6 +1575,14 @@  static void temp_save(TCGContext *s, int temp, TCGRegSet allocated_regs)
     }
 }
 
+/* save a temporary to memory. 'allocated_regs' is used in case a
+   temporary registers needs to be allocated to store a constant. */
+static inline void temp_save(TCGContext *s, int temp, TCGRegSet allocated_regs)
+{
+    temp_sync(s, temp, allocated_regs);
+    temp_dead(s, temp);
+}
+
 /* save globals to their canonical location and assume they can be
    modified be the following code. 'allocated_regs' is used in case a
    temporary registers needs to be allocated to store a constant. */