All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator
@ 2012-10-09 19:55 Aurelien Jarno
  2012-10-09 19:55 ` [Qemu-devel] [PATCH v2 01/26] tcg: add temp_dead() Aurelien Jarno
                   ` (27 more replies)
  0 siblings, 28 replies; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 19:55 UTC (permalink / raw)
  To: qemu-devel; +Cc: Aurelien Jarno

This patch series rework the liveness analysis and register allocator
in order to generate more optimized code, by avoiding a lot of move
instructions. I have measured a 9% performance improvement in user mode
and 4% in system mode.

The idea behind this patch series is to free registers as soon as the
temps are not used anymore instead of waiting for a basic block end or
an op with side effects. In addition temps are copied to memory as soon
as they are not going to be written anymore, this way even globals can
be marked as "dead", avoiding moves to a new register when inputs and
outputs are aliased. Finally qemu_ld/st operations do not save back
globals to memory, but only copy them there. In case of an exception
the globals have the correct values, and otherwise they do not have
to be reloaded.

Overall this greatly reduces the number of moves emitted, and spread
them all over the TBs, increasing the performances on in-order CPUs.
This also reduces register spilling, especially on CPUs with few
registers.

In practice it means the liveness analysis is providing more
information to the register allocator, and especially when to the memory
version of a temp with the content of the associated register. This
means that the two are now quite linked, and that for some functions the
code exist in two versions, one used when the liveness analysis is
enabled which only does some checks with assert(), the other when it is
disabled. It might be possible to keep only one version, but it implies
de-optimizing the liveness analysis disabled case. In any case the
checks with assert() should be kept, as they are quite useful to make
sure nothing subtly breaks.

v1 -> v2
--------
 - patch 3: changed TEMP_VAL_CONST to fallthrough into TEMP_VAL_REG
 - patch 7: fixed ts->mem_coherent = 1 in const case
            factorized ots->fixed_reg & ts->val_type == TEMP_VAL_CONST 
            case in the first if block
            changed comments for the first block
 - patch 10: move wrong hunk to patch 7
 - patch 12: new patch
 - patch 14: should be considered as a new patch
 - patches 15-26: new patches

Aurelien Jarno (26):
  tcg: add temp_dead()
  tcg: add tcg_reg_sync()
  tcg: add temp_sync()
  tcg: sync output arguments on liveness request
  tcg: rework liveness analysis
  tcg: improve tcg_reg_alloc_movi()
  tcg: rewrite tcg_reg_alloc_mov()
  tcg: always mark dead input arguments as dead
  tcg: start with local temps in TEMP_VAL_MEM state
  tcg: don't explicitly save globals and temps
  tcg: fix some op flags
  tcg: forbid ld/st function to modify globals
  tcg: synchronize globals for ops with side effects
  tcg: rework TCG helper flags
  target-alpha: rename helper flags
  target-arm: rename helper flags
  target-cris: rename helper flags
  target-i386: rename helper flags
  target-microblaze: rename helper flags
  target-mips: rename helper flags
  target-ppc: rename helper flags
  target-s390x: rename helper flags
  target-sh4: rename helper flags
  target-sparc: rename helper flags
  target-xtensa: rename helper flags
  tcg: remove compatiblity call flags

 target-alpha/helper.h      |  176 ++++++++---------
 target-arm/helper.h        |   18 +-
 target-cris/helper.h       |   18 +-
 target-i386/helper.h       |    4 +-
 target-microblaze/helper.h |    6 +-
 target-mips/helper.h       |  106 +++++------
 target-ppc/helper.h        |   38 ++--
 target-s390x/helper.h      |   76 ++++----
 target-sh4/helper.h        |    6 +-
 target-sparc/helper.h      |   50 ++---
 target-xtensa/helper.h     |   16 +-
 tcg/README                 |   22 ++-
 tcg/optimize.c             |    3 +-
 tcg/tcg-op.h               |   18 +-
 tcg/tcg-opc.h              |   29 ++-
 tcg/tcg.c                  |  453 +++++++++++++++++++++++++++-----------------
 tcg/tcg.h                  |   29 ++-
 17 files changed, 597 insertions(+), 471 deletions(-)

-- 
1.7.10.4

^ permalink raw reply	[flat|nested] 54+ messages in thread

* [Qemu-devel] [PATCH v2 01/26] tcg: add temp_dead()
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
@ 2012-10-09 19:55 ` Aurelien Jarno
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 02/26] tcg: add tcg_reg_sync() Aurelien Jarno
                   ` (26 subsequent siblings)
  27 siblings, 0 replies; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 19:55 UTC (permalink / raw)
  To: qemu-devel; +Cc: Aurelien Jarno

A lot of code is duplicated to mark a temporary as dead. Replace it
by temp_dead(), which in addition marks the temp as saved in memory
for globals and local temps, instead of doing this a posteriori in
temp_save().

Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 tcg/tcg.c |   67 ++++++++++++++++++++++++++++---------------------------------
 1 file changed, 31 insertions(+), 36 deletions(-)

diff --git a/tcg/tcg.c b/tcg/tcg.c
index 32cd0c6..51a82dc 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -1517,6 +1517,24 @@ static int tcg_reg_alloc(TCGContext *s, TCGRegSet reg1, TCGRegSet reg2)
     tcg_abort();
 }
 
+/* mark a temporary as dead. */
+static inline void temp_dead(TCGContext *s, int temp)
+{
+    TCGTemp *ts;
+
+    ts = &s->temps[temp];
+    if (!ts->fixed_reg) {
+        if (ts->val_type == TEMP_VAL_REG) {
+            s->reg_to_temp[ts->reg] = -1;
+        }
+        if (temp < s->nb_globals || (ts->temp_local && ts->mem_allocated)) {
+            ts->val_type = TEMP_VAL_MEM;
+        } else {
+            ts->val_type = TEMP_VAL_DEAD;
+        }
+    }
+}
+
 /* save 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)
@@ -1574,10 +1592,7 @@ static void tcg_reg_alloc_bb_end(TCGContext *s, TCGRegSet allocated_regs)
         if (ts->temp_local) {
             temp_save(s, i, allocated_regs);
         } else {
-            if (ts->val_type == TEMP_VAL_REG) {
-                s->reg_to_temp[ts->reg] = -1;
-            }
-            ts->val_type = TEMP_VAL_DEAD;
+            temp_dead(s, i);
         }
     }
 
@@ -1626,8 +1641,7 @@ static void tcg_reg_alloc_mov(TCGContext *s, const TCGOpDef *def,
             if (ots->val_type == TEMP_VAL_REG)
                 s->reg_to_temp[ots->reg] = -1;
             reg = ts->reg;
-            s->reg_to_temp[reg] = -1;
-            ts->val_type = TEMP_VAL_DEAD;
+            temp_dead(s, args[1]);
         } else {
             if (ots->val_type == TEMP_VAL_REG) {
                 reg = ots->reg;
@@ -1754,14 +1768,8 @@ static void tcg_reg_alloc_op(TCGContext *s,
     } else {
         /* mark dead temporaries and free the associated registers */
         for(i = nb_oargs; i < nb_oargs + nb_iargs; i++) {
-            arg = args[i];
             if (IS_DEAD_ARG(i)) {
-                ts = &s->temps[arg];
-                if (!ts->fixed_reg) {
-                    if (ts->val_type == TEMP_VAL_REG)
-                        s->reg_to_temp[ts->reg] = -1;
-                    ts->val_type = TEMP_VAL_DEAD;
-                }
+                temp_dead(s, args[i]);
             }
         }
         
@@ -1801,11 +1809,12 @@ static void tcg_reg_alloc_op(TCGContext *s,
             tcg_regset_set_reg(allocated_regs, reg);
             /* if a fixed register is used, then a move will be done afterwards */
             if (!ts->fixed_reg) {
-                if (ts->val_type == TEMP_VAL_REG)
-                    s->reg_to_temp[ts->reg] = -1;
                 if (IS_DEAD_ARG(i)) {
-                    ts->val_type = TEMP_VAL_DEAD;
+                    temp_dead(s, args[i]);
                 } else {
+                    if (ts->val_type == TEMP_VAL_REG) {
+                        s->reg_to_temp[ts->reg] = -1;
+                    }
                     ts->val_type = TEMP_VAL_REG;
                     ts->reg = reg;
                     /* temp value is modified, so the value kept in memory is
@@ -1964,14 +1973,8 @@ static int tcg_reg_alloc_call(TCGContext *s, const TCGOpDef *def,
     
     /* mark dead temporaries and free the associated registers */
     for(i = nb_oargs; i < nb_iargs + nb_oargs; i++) {
-        arg = args[i];
         if (IS_DEAD_ARG(i)) {
-            ts = &s->temps[arg];
-            if (!ts->fixed_reg) {
-                if (ts->val_type == TEMP_VAL_REG)
-                    s->reg_to_temp[ts->reg] = -1;
-                ts->val_type = TEMP_VAL_DEAD;
-            }
+            temp_dead(s, args[i]);
         }
     }
     
@@ -2001,11 +2004,12 @@ static int tcg_reg_alloc_call(TCGContext *s, const TCGOpDef *def,
                 tcg_out_mov(s, ts->type, ts->reg, reg);
             }
         } else {
-            if (ts->val_type == TEMP_VAL_REG)
-                s->reg_to_temp[ts->reg] = -1;
             if (IS_DEAD_ARG(i)) {
-                ts->val_type = TEMP_VAL_DEAD;
+                temp_dead(s, args[i]);
             } else {
+                if (ts->val_type == TEMP_VAL_REG) {
+                    s->reg_to_temp[ts->reg] = -1;
+                }
                 ts->val_type = TEMP_VAL_REG;
                 ts->reg = reg;
                 ts->mem_coherent = 0;
@@ -2120,16 +2124,7 @@ static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf,
             args += args[0];
             goto next;
         case INDEX_op_discard:
-            {
-                TCGTemp *ts;
-                ts = &s->temps[args[0]];
-                /* mark the temporary as dead */
-                if (!ts->fixed_reg) {
-                    if (ts->val_type == TEMP_VAL_REG)
-                        s->reg_to_temp[ts->reg] = -1;
-                    ts->val_type = TEMP_VAL_DEAD;
-                }
-            }
+            temp_dead(s, args[0]);
             break;
         case INDEX_op_set_label:
             tcg_reg_alloc_bb_end(s, s->reserved_regs);
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [Qemu-devel] [PATCH v2 02/26] tcg: add tcg_reg_sync()
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
  2012-10-09 19:55 ` [Qemu-devel] [PATCH v2 01/26] tcg: add temp_dead() Aurelien Jarno
@ 2012-10-09 19:56 ` Aurelien Jarno
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 03/26] tcg: add temp_sync() Aurelien Jarno
                   ` (25 subsequent siblings)
  27 siblings, 0 replies; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 19:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Aurelien Jarno

Add a new function tcg_reg_sync() to synchronize the canonical location
of a temp with the value in the associated register, but without freeing
it. Rewrite tcg_reg_free() to first call tcg_reg_sync() and then to free
the register.

Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 tcg/tcg.c |   29 ++++++++++++++++++++---------
 1 file changed, 20 insertions(+), 9 deletions(-)

diff --git a/tcg/tcg.c b/tcg/tcg.c
index 51a82dc..2e37203 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -1470,22 +1470,33 @@ static void temp_allocate_frame(TCGContext *s, int temp)
     s->current_frame_offset += (tcg_target_long)sizeof(tcg_target_long);
 }
 
+/* sync register 'reg' by saving it to the corresponding temporary */
+static inline void tcg_reg_sync(TCGContext *s, int reg)
+{
+    TCGTemp *ts;
+    int temp;
+
+    temp = s->reg_to_temp[reg];
+    ts = &s->temps[temp];
+    assert(ts->val_type == TEMP_VAL_REG);
+    if (!ts->mem_coherent && !ts->fixed_reg) {
+        if (!ts->mem_allocated) {
+            temp_allocate_frame(s, temp);
+        }
+        tcg_out_st(s, ts->type, reg, ts->mem_reg, ts->mem_offset);
+    }
+    ts->mem_coherent = 1;
+}
+
 /* free register 'reg' by spilling the corresponding temporary if necessary */
 static void tcg_reg_free(TCGContext *s, int reg)
 {
-    TCGTemp *ts;
     int temp;
 
     temp = s->reg_to_temp[reg];
     if (temp != -1) {
-        ts = &s->temps[temp];
-        assert(ts->val_type == TEMP_VAL_REG);
-        if (!ts->mem_coherent) {
-            if (!ts->mem_allocated) 
-                temp_allocate_frame(s, temp);
-            tcg_out_st(s, ts->type, reg, ts->mem_reg, ts->mem_offset);
-        }
-        ts->val_type = TEMP_VAL_MEM;
+        tcg_reg_sync(s, reg);
+        s->temps[temp].val_type = TEMP_VAL_MEM;
         s->reg_to_temp[reg] = -1;
     }
 }
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [Qemu-devel] [PATCH v2 03/26] tcg: add temp_sync()
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
  2012-10-09 19:55 ` [Qemu-devel] [PATCH v2 01/26] tcg: add temp_dead() Aurelien Jarno
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 02/26] tcg: add tcg_reg_sync() Aurelien Jarno
@ 2012-10-09 19:56 ` Aurelien Jarno
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 04/26] tcg: sync output arguments on liveness request Aurelien Jarno
                   ` (24 subsequent siblings)
  27 siblings, 0 replies; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 19:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Aurelien Jarno

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().

Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 tcg/tcg.c |   34 +++++++++++++++++++---------------
 1 file changed, 19 insertions(+), 15 deletions(-)

diff --git a/tcg/tcg.c b/tcg/tcg.c
index 2e37203..653ad72 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -1546,31 +1546,27 @@ 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_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);
+            /* fallthrough*/
         case TEMP_VAL_REG:
-            tcg_reg_free(s, ts->reg);
+            tcg_reg_sync(s, ts->reg);
             break;
         case TEMP_VAL_DEAD:
-            ts->val_type = TEMP_VAL_MEM;
-            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;
-            break;
         case TEMP_VAL_MEM:
             break;
         default:
@@ -1579,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. */
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [Qemu-devel] [PATCH v2 04/26] tcg: sync output arguments on liveness request
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
                   ` (2 preceding siblings ...)
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 03/26] tcg: add temp_sync() Aurelien Jarno
@ 2012-10-09 19:56 ` Aurelien Jarno
  2012-10-10 16:22   ` Richard Henderson
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 05/26] tcg: rework liveness analysis Aurelien Jarno
                   ` (23 subsequent siblings)
  27 siblings, 1 reply; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 19:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Aurelien Jarno

Synchronize an output argument when requested by the liveness analysis.
This is needed so that the temp can be declared dead later.

For that, add a new op_sync_args table in which each bit tells if the
corresponding output argument needs to be synchronized with the memory.
Pass it to the tcg_reg_alloc_* functions, and honor this bit. We need to
synchronize the argument before marking it as dead, and we have to make
sure all the infos about the temp are correctly filled.

At the same time change some types from unsigned int to uint16_t when
passing op_dead_args.

Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 tcg/tcg.c |   97 ++++++++++++++++++++++++++++++++++++++-----------------------
 tcg/tcg.h |    3 ++
 2 files changed, 64 insertions(+), 36 deletions(-)

diff --git a/tcg/tcg.c b/tcg/tcg.c
index 653ad72..76cca27 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -1222,13 +1222,15 @@ static void tcg_liveness_analysis(TCGContext *s)
     TCGArg *args;
     const TCGOpDef *def;
     uint8_t *dead_temps;
-    unsigned int dead_args;
+    uint16_t dead_args;
+    uint8_t sync_args;
     
     gen_opc_ptr++; /* skip end */
 
     nb_ops = gen_opc_ptr - gen_opc_buf;
 
     s->op_dead_args = tcg_malloc(nb_ops * sizeof(uint16_t));
+    s->op_sync_args = tcg_malloc(nb_ops * sizeof(uint8_t));
     
     dead_temps = tcg_malloc(s->nb_temps);
     memset(dead_temps, 1, s->nb_temps);
@@ -1265,6 +1267,7 @@ static void tcg_liveness_analysis(TCGContext *s)
 
                     /* output args are dead */
                     dead_args = 0;
+                    sync_args = 0;
                     for(i = 0; i < nb_oargs; i++) {
                         arg = args[i];
                         if (dead_temps[arg]) {
@@ -1289,6 +1292,7 @@ static void tcg_liveness_analysis(TCGContext *s)
                         }
                     }
                     s->op_dead_args[op_index] = dead_args;
+                    s->op_sync_args[op_index] = sync_args;
                 }
                 args--;
             }
@@ -1331,6 +1335,7 @@ static void tcg_liveness_analysis(TCGContext *s)
 
                 /* output args are dead */
                 dead_args = 0;
+                sync_args = 0;
                 for(i = 0; i < nb_oargs; i++) {
                     arg = args[i];
                     if (dead_temps[arg]) {
@@ -1356,6 +1361,7 @@ static void tcg_liveness_analysis(TCGContext *s)
                     dead_temps[arg] = 0;
                 }
                 s->op_dead_args[op_index] = dead_args;
+                s->op_sync_args[op_index] = sync_args;
             }
             break;
         }
@@ -1374,6 +1380,8 @@ static void tcg_liveness_analysis(TCGContext *s)
 
     s->op_dead_args = tcg_malloc(nb_ops * sizeof(uint16_t));
     memset(s->op_dead_args, 0, nb_ops * sizeof(uint16_t));
+    s->op_sync_args = tcg_malloc(nb_ops * sizeof(uint8_t));
+    memset(s->op_sync_args, 0, nb_ops * sizeof(uint8_t));
 }
 #endif
 
@@ -1615,8 +1623,10 @@ static void tcg_reg_alloc_bb_end(TCGContext *s, TCGRegSet allocated_regs)
 }
 
 #define IS_DEAD_ARG(n) ((dead_args >> (n)) & 1)
+#define NEED_SYNC_ARG(n) ((sync_args >> (n)) & 1)
 
-static void tcg_reg_alloc_movi(TCGContext *s, const TCGArg *args)
+static void tcg_reg_alloc_movi(TCGContext *s, const TCGArg *args,
+                               uint16_t dead_args, uint8_t sync_args)
 {
     TCGTemp *ots;
     tcg_target_ulong val;
@@ -1635,11 +1645,14 @@ static void tcg_reg_alloc_movi(TCGContext *s, const TCGArg *args)
         ots->val_type = TEMP_VAL_CONST;
         ots->val = val;
     }
+    if (NEED_SYNC_ARG(0)) {
+        temp_sync(s, args[0], s->reserved_regs);
+    }
 }
 
 static void tcg_reg_alloc_mov(TCGContext *s, const TCGOpDef *def,
-                              const TCGArg *args,
-                              unsigned int dead_args)
+                              const TCGArg *args, uint16_t dead_args,
+                              uint8_t sync_args)
 {
     TCGTemp *ts, *ots;
     int reg;
@@ -1684,6 +1697,9 @@ static void tcg_reg_alloc_mov(TCGContext *s, const TCGOpDef *def,
                 s->reg_to_temp[ots->reg] = -1;
             ots->val_type = TEMP_VAL_CONST;
             ots->val = ts->val;
+            if (NEED_SYNC_ARG(0)) {
+                temp_sync(s, args[0], s->reserved_regs);
+            }
             return;
         }
     } else {
@@ -1693,12 +1709,16 @@ static void tcg_reg_alloc_mov(TCGContext *s, const TCGOpDef *def,
     ots->reg = reg;
     ots->val_type = TEMP_VAL_REG;
     ots->mem_coherent = 0;
+
+    if (NEED_SYNC_ARG(0)) {
+        tcg_reg_sync(s, reg);
+    }
 }
 
 static void tcg_reg_alloc_op(TCGContext *s, 
                              const TCGOpDef *def, TCGOpcode opc,
-                             const TCGArg *args,
-                             unsigned int dead_args)
+                             const TCGArg *args, uint16_t dead_args,
+                             uint8_t sync_args)
 {
     TCGRegSet allocated_regs;
     int i, k, nb_iargs, nb_oargs, reg;
@@ -1824,19 +1844,15 @@ static void tcg_reg_alloc_op(TCGContext *s,
             tcg_regset_set_reg(allocated_regs, reg);
             /* if a fixed register is used, then a move will be done afterwards */
             if (!ts->fixed_reg) {
-                if (IS_DEAD_ARG(i)) {
-                    temp_dead(s, args[i]);
-                } else {
-                    if (ts->val_type == TEMP_VAL_REG) {
-                        s->reg_to_temp[ts->reg] = -1;
-                    }
-                    ts->val_type = TEMP_VAL_REG;
-                    ts->reg = reg;
-                    /* temp value is modified, so the value kept in memory is
-                       potentially not the same */
-                    ts->mem_coherent = 0;
-                    s->reg_to_temp[reg] = arg;
-               }
+                if (ts->val_type == TEMP_VAL_REG) {
+                    s->reg_to_temp[ts->reg] = -1;
+                }
+                ts->val_type = TEMP_VAL_REG;
+                ts->reg = reg;
+                /* temp value is modified, so the value kept in memory is
+                   potentially not the same */
+                ts->mem_coherent = 0;
+                s->reg_to_temp[reg] = arg;
             }
         oarg_end:
             new_args[i] = reg;
@@ -1853,6 +1869,12 @@ static void tcg_reg_alloc_op(TCGContext *s,
         if (ts->fixed_reg && ts->reg != reg) {
             tcg_out_mov(s, ts->type, ts->reg, reg);
         }
+        if (NEED_SYNC_ARG(i)) {
+            tcg_reg_sync(s, reg);
+        }
+        if (IS_DEAD_ARG(i)) {
+            temp_dead(s, args[i]);
+        }
     }
 }
 
@@ -1864,7 +1886,7 @@ static void tcg_reg_alloc_op(TCGContext *s,
 
 static int tcg_reg_alloc_call(TCGContext *s, const TCGOpDef *def,
                               TCGOpcode opc, const TCGArg *args,
-                              unsigned int dead_args)
+                              uint16_t dead_args, uint8_t sync_args)
 {
     int nb_iargs, nb_oargs, flags, nb_regs, i, reg, nb_params;
     TCGArg arg, func_arg;
@@ -2019,16 +2041,18 @@ static int tcg_reg_alloc_call(TCGContext *s, const TCGOpDef *def,
                 tcg_out_mov(s, ts->type, ts->reg, reg);
             }
         } else {
+            if (ts->val_type == TEMP_VAL_REG) {
+                s->reg_to_temp[ts->reg] = -1;
+            }
+            ts->val_type = TEMP_VAL_REG;
+            ts->reg = reg;
+            ts->mem_coherent = 0;
+            s->reg_to_temp[reg] = arg;
+            if (NEED_SYNC_ARG(i)) {
+                tcg_reg_sync(s, reg);
+            }
             if (IS_DEAD_ARG(i)) {
                 temp_dead(s, args[i]);
-            } else {
-                if (ts->val_type == TEMP_VAL_REG) {
-                    s->reg_to_temp[ts->reg] = -1;
-                }
-                ts->val_type = TEMP_VAL_REG;
-                ts->reg = reg;
-                ts->mem_coherent = 0;
-                s->reg_to_temp[reg] = arg;
             }
         }
     }
@@ -2059,7 +2083,6 @@ static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf,
     TCGOpcode opc;
     int op_index;
     const TCGOpDef *def;
-    unsigned int dead_args;
     const TCGArg *args;
 
 #ifdef DEBUG_DISAS
@@ -2120,12 +2143,13 @@ static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf,
         switch(opc) {
         case INDEX_op_mov_i32:
         case INDEX_op_mov_i64:
-            dead_args = s->op_dead_args[op_index];
-            tcg_reg_alloc_mov(s, def, args, dead_args);
+            tcg_reg_alloc_mov(s, def, args, s->op_dead_args[op_index],
+                              s->op_sync_args[op_index]);
             break;
         case INDEX_op_movi_i32:
         case INDEX_op_movi_i64:
-            tcg_reg_alloc_movi(s, args);
+            tcg_reg_alloc_movi(s, args, s->op_dead_args[op_index],
+                               s->op_sync_args[op_index]);
             break;
         case INDEX_op_debug_insn_start:
             /* debug instruction */
@@ -2146,8 +2170,9 @@ static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf,
             tcg_out_label(s, args[0], s->code_ptr);
             break;
         case INDEX_op_call:
-            dead_args = s->op_dead_args[op_index];
-            args += tcg_reg_alloc_call(s, def, opc, args, dead_args);
+            args += tcg_reg_alloc_call(s, def, opc, args,
+                                       s->op_dead_args[op_index],
+                                       s->op_sync_args[op_index]);
             goto next;
         case INDEX_op_end:
             goto the_end;
@@ -2159,8 +2184,8 @@ static inline int tcg_gen_code_common(TCGContext *s, uint8_t *gen_code_buf,
             /* Note: in order to speed up the code, it would be much
                faster to have specialized register allocator functions for
                some common argument patterns */
-            dead_args = s->op_dead_args[op_index];
-            tcg_reg_alloc_op(s, def, opc, args, dead_args);
+            tcg_reg_alloc_op(s, def, opc, args, s->op_dead_args[op_index],
+                             s->op_sync_args[op_index]);
             break;
         }
         args += def->nb_args;
diff --git a/tcg/tcg.h b/tcg/tcg.h
index 7bafe0e..73d3769 100644
--- a/tcg/tcg.h
+++ b/tcg/tcg.h
@@ -381,6 +381,9 @@ struct TCGContext {
     /* liveness analysis */
     uint16_t *op_dead_args; /* for each operation, each bit tells if the
                                corresponding argument is dead */
+    uint8_t *op_sync_args;  /* for each operation, each bit tells if the
+                               corresponding output argument needs to be
+                               sync to memory. */
     
     /* tells in which temporary a given register is. It does not take
        into account fixed registers */
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [Qemu-devel] [PATCH v2 05/26] tcg: rework liveness analysis
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
                   ` (3 preceding siblings ...)
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 04/26] tcg: sync output arguments on liveness request Aurelien Jarno
@ 2012-10-09 19:56 ` Aurelien Jarno
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 06/26] tcg: improve tcg_reg_alloc_movi() Aurelien Jarno
                   ` (22 subsequent siblings)
  27 siblings, 0 replies; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 19:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Aurelien Jarno

Rework the liveness analysis by tracking temps that need to go back to
memory in addition to dead temps tracking. This allows to mark output
arguments as "need sync", and to synchronize them back to memory as soon
as they are not written anymore. This way even arguments mapping to
globals can be marked as "dead", avoiding moves to a new register when
input and outputs are aliased.

In addition it means that registers are freed as soon as temps are not
used anymore, instead of waiting for a basic block end or an op with side
effects. This reduces register spilling especially on CPUs with few
registers, and spread the mov over all the TB, increasing the
performances on in-order CPUs.

Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 tcg/tcg.c |   64 +++++++++++++++++++++++++++++++++++--------------------------
 1 file changed, 37 insertions(+), 27 deletions(-)

diff --git a/tcg/tcg.c b/tcg/tcg.c
index 76cca27..400581f 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -1184,31 +1184,27 @@ static inline void tcg_set_nop(TCGContext *s, uint16_t *opc_ptr,
     }
 }
 
-/* liveness analysis: end of function: globals are live, temps are
-   dead. */
-/* XXX: at this stage, not used as there would be little gains because
-   most TBs end with a conditional jump. */
-static inline void tcg_la_func_end(TCGContext *s, uint8_t *dead_temps)
+/* liveness analysis: end of function: all temps are dead, and globals
+   should be in memory. */
+static inline void tcg_la_func_end(TCGContext *s, uint8_t *dead_temps,
+                                   uint8_t *mem_temps)
 {
-    memset(dead_temps, 0, s->nb_globals);
-    memset(dead_temps + s->nb_globals, 1, s->nb_temps - s->nb_globals);
+    memset(dead_temps, 1, s->nb_temps);
+    memset(mem_temps, 1, s->nb_globals);
+    memset(mem_temps + s->nb_globals, 0, s->nb_temps - s->nb_globals);
 }
 
-/* liveness analysis: end of basic block: globals are live, temps are
-   dead, local temps are live. */
-static inline void tcg_la_bb_end(TCGContext *s, uint8_t *dead_temps)
+/* liveness analysis: end of basic block: all temps are dead, globals
+   and local temps should be in memory. */
+static inline void tcg_la_bb_end(TCGContext *s, uint8_t *dead_temps,
+                                 uint8_t *mem_temps)
 {
     int i;
-    TCGTemp *ts;
 
-    memset(dead_temps, 0, s->nb_globals);
-    ts = &s->temps[s->nb_globals];
+    memset(dead_temps, 1, s->nb_temps);
+    memset(mem_temps, 1, s->nb_globals);
     for(i = s->nb_globals; i < s->nb_temps; i++) {
-        if (ts->temp_local)
-            dead_temps[i] = 0;
-        else
-            dead_temps[i] = 1;
-        ts++;
+        mem_temps[i] = s->temps[i].temp_local;
     }
 }
 
@@ -1221,7 +1217,7 @@ static void tcg_liveness_analysis(TCGContext *s)
     TCGOpcode op;
     TCGArg *args;
     const TCGOpDef *def;
-    uint8_t *dead_temps;
+    uint8_t *dead_temps, *mem_temps;
     uint16_t dead_args;
     uint8_t sync_args;
     
@@ -1233,7 +1229,8 @@ static void tcg_liveness_analysis(TCGContext *s)
     s->op_sync_args = tcg_malloc(nb_ops * sizeof(uint8_t));
     
     dead_temps = tcg_malloc(s->nb_temps);
-    memset(dead_temps, 1, s->nb_temps);
+    mem_temps = tcg_malloc(s->nb_temps);
+    tcg_la_func_end(s, dead_temps, mem_temps);
 
     args = gen_opparam_ptr;
     op_index = nb_ops - 1;
@@ -1257,8 +1254,9 @@ static void tcg_liveness_analysis(TCGContext *s)
                 if (call_flags & TCG_CALL_PURE) {
                     for(i = 0; i < nb_oargs; i++) {
                         arg = args[i];
-                        if (!dead_temps[arg])
+                        if (!dead_temps[arg] || mem_temps[arg]) {
                             goto do_not_remove_call;
+                        }
                     }
                     tcg_set_nop(s, gen_opc_buf + op_index, 
                                 args - 1, nb_args);
@@ -1273,12 +1271,17 @@ static void tcg_liveness_analysis(TCGContext *s)
                         if (dead_temps[arg]) {
                             dead_args |= (1 << i);
                         }
+                        if (mem_temps[arg]) {
+                            sync_args |= (1 << i);
+                        }
                         dead_temps[arg] = 1;
+                        mem_temps[arg] = 0;
                     }
                     
                     if (!(call_flags & TCG_CALL_CONST)) {
-                        /* globals are live (they may be used by the call) */
-                        memset(dead_temps, 0, s->nb_globals);
+                        /* globals should go back to memory */
+                        memset(dead_temps, 1, s->nb_globals);
+                        memset(mem_temps, 1, s->nb_globals);
                     }
 
                     /* input args are live */
@@ -1308,6 +1311,7 @@ static void tcg_liveness_analysis(TCGContext *s)
             args--;
             /* mark the temporary as dead */
             dead_temps[args[0]] = 1;
+            mem_temps[args[0]] = 0;
             break;
         case INDEX_op_end:
             break;
@@ -1323,8 +1327,9 @@ static void tcg_liveness_analysis(TCGContext *s)
             if (!(def->flags & TCG_OPF_SIDE_EFFECTS) && nb_oargs != 0) {
                 for(i = 0; i < nb_oargs; i++) {
                     arg = args[i];
-                    if (!dead_temps[arg])
+                    if (!dead_temps[arg] || mem_temps[arg]) {
                         goto do_not_remove;
+                    }
                 }
                 tcg_set_nop(s, gen_opc_buf + op_index, args, def->nb_args);
 #ifdef CONFIG_PROFILER
@@ -1341,15 +1346,20 @@ static void tcg_liveness_analysis(TCGContext *s)
                     if (dead_temps[arg]) {
                         dead_args |= (1 << i);
                     }
+                    if (mem_temps[arg]) {
+                        sync_args |= (1 << i);
+                    }
                     dead_temps[arg] = 1;
+                    mem_temps[arg] = 0;
                 }
 
                 /* if end of basic block, update */
                 if (def->flags & TCG_OPF_BB_END) {
-                    tcg_la_bb_end(s, dead_temps);
+                    tcg_la_bb_end(s, dead_temps, mem_temps);
                 } else if (def->flags & TCG_OPF_CALL_CLOBBER) {
-                    /* globals are live */
-                    memset(dead_temps, 0, s->nb_globals);
+                    /* globals should go back to memory */
+                    memset(dead_temps, 1, s->nb_globals);
+                    memset(mem_temps, 1, s->nb_globals);
                 }
 
                 /* input args are live */
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [Qemu-devel] [PATCH v2 06/26] tcg: improve tcg_reg_alloc_movi()
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
                   ` (4 preceding siblings ...)
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 05/26] tcg: rework liveness analysis Aurelien Jarno
@ 2012-10-09 19:56 ` Aurelien Jarno
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 07/26] tcg: rewrite tcg_reg_alloc_mov() Aurelien Jarno
                   ` (21 subsequent siblings)
  27 siblings, 0 replies; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 19:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Aurelien Jarno

Now that the liveness analysis might mark some output temps as dead, call
temp_dead() if needed.

Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 tcg/tcg.c |    3 +++
 1 file changed, 3 insertions(+)

diff --git a/tcg/tcg.c b/tcg/tcg.c
index 400581f..328df56 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -1658,6 +1658,9 @@ static void tcg_reg_alloc_movi(TCGContext *s, const TCGArg *args,
     if (NEED_SYNC_ARG(0)) {
         temp_sync(s, args[0], s->reserved_regs);
     }
+    if (IS_DEAD_ARG(0)) {
+        temp_dead(s, args[0]);
+    }
 }
 
 static void tcg_reg_alloc_mov(TCGContext *s, const TCGOpDef *def,
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [Qemu-devel] [PATCH v2 07/26] tcg: rewrite tcg_reg_alloc_mov()
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
                   ` (5 preceding siblings ...)
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 06/26] tcg: improve tcg_reg_alloc_movi() Aurelien Jarno
@ 2012-10-09 19:56 ` Aurelien Jarno
  2012-10-10 16:27   ` Richard Henderson
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 08/26] tcg: always mark dead input arguments as dead Aurelien Jarno
                   ` (20 subsequent siblings)
  27 siblings, 1 reply; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 19:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Aurelien Jarno

Now that the liveness analysis provides more information, rewrite
tcg_reg_alloc_mov(). This changes the behaviour about propagating
constants and memory accesses. We now take the assumption that once
a value is loaded into a register (from memory or from a constant),
it's better to keep it there than to reload it later. This assumption
is now always almost correct given that we are now sure the
corresponding temp is going to be used later (otherwise it would have
been synchronized and marked as dead already). The assumption is wrong
if one of the op after clobbers some registers including the one
of the holding the temp (this can be avoided by allocating clobbered
registers last, which is what most TCG target do), or in case of lack
of available register.

Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 tcg/tcg.c |  108 +++++++++++++++++++++++++++++++++++--------------------------
 1 file changed, 62 insertions(+), 46 deletions(-)

diff --git a/tcg/tcg.c b/tcg/tcg.c
index 328df56..e320022 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -1667,64 +1667,80 @@ static void tcg_reg_alloc_mov(TCGContext *s, const TCGOpDef *def,
                               const TCGArg *args, uint16_t dead_args,
                               uint8_t sync_args)
 {
+    TCGRegSet allocated_regs;
     TCGTemp *ts, *ots;
-    int reg;
-    const TCGArgConstraint *arg_ct;
+    const TCGArgConstraint *arg_ct, *oarg_ct;
 
+    tcg_regset_set(allocated_regs, s->reserved_regs);
     ots = &s->temps[args[0]];
     ts = &s->temps[args[1]];
-    arg_ct = &def->args_ct[0];
+    oarg_ct = &def->args_ct[0];
+    arg_ct = &def->args_ct[1];
+
+    /* If the source value is not in a register, and we're going to be
+       forced to have it in a register in order to perform the copy,
+       then copy the SOURCE value into its own register first.  That way
+       we don't have to reload SOURCE the next time it is used. */
+    if (((NEED_SYNC_ARG(0) || ots->fixed_reg) && ts->val_type != TEMP_VAL_REG)
+        || ts->val_type == TEMP_VAL_MEM) {
+        ts->reg = tcg_reg_alloc(s, arg_ct->u.regs, allocated_regs);
+        if (ts->val_type == TEMP_VAL_MEM) {
+            tcg_out_ld(s, ts->type, ts->reg, ts->mem_reg, ts->mem_offset);
+            ts->mem_coherent = 1;
+        } else if (ts->val_type == TEMP_VAL_CONST) {
+            tcg_out_movi(s, ts->type, ts->reg, ts->val);
+        }
+        s->reg_to_temp[ts->reg] = args[1];
+        ts->val_type = TEMP_VAL_REG;
+    }
 
-    /* XXX: always mark arg dead if IS_DEAD_ARG(1) */
-    if (ts->val_type == TEMP_VAL_REG) {
-        if (IS_DEAD_ARG(1) && !ts->fixed_reg && !ots->fixed_reg) {
-            /* the mov can be suppressed */
-            if (ots->val_type == TEMP_VAL_REG)
-                s->reg_to_temp[ots->reg] = -1;
-            reg = ts->reg;
+    if (IS_DEAD_ARG(0) && !ots->fixed_reg) {
+        /* mov to a non-saved dead register makes no sense (even with
+           liveness analysis disabled). */
+        assert(NEED_SYNC_ARG(0));
+        /* The code above should have moved the temp to a register. */
+        assert(ts->val_type == TEMP_VAL_REG);
+        if (!ots->mem_allocated) {
+            temp_allocate_frame(s, args[0]);
+        }
+        tcg_out_st(s, ots->type, ts->reg, ots->mem_reg, ots->mem_offset);
+        if (IS_DEAD_ARG(1)) {
             temp_dead(s, args[1]);
-        } else {
-            if (ots->val_type == TEMP_VAL_REG) {
-                reg = ots->reg;
-            } else {
-                reg = tcg_reg_alloc(s, arg_ct->u.regs, s->reserved_regs);
-            }
-            if (ts->reg != reg) {
-                tcg_out_mov(s, ots->type, reg, ts->reg);
-            }
         }
-    } else if (ts->val_type == TEMP_VAL_MEM) {
+        temp_dead(s, args[0]);
+    } else if (ts->val_type == TEMP_VAL_CONST) {
+        /* propagate constant */
         if (ots->val_type == TEMP_VAL_REG) {
-            reg = ots->reg;
-        } else {
-            reg = tcg_reg_alloc(s, arg_ct->u.regs, s->reserved_regs);
+            s->reg_to_temp[ots->reg] = -1;
         }
-        tcg_out_ld(s, ts->type, reg, ts->mem_reg, ts->mem_offset);
-    } else if (ts->val_type == TEMP_VAL_CONST) {
-        if (ots->fixed_reg) {
-            reg = ots->reg;
-            tcg_out_movi(s, ots->type, reg, ts->val);
+        ots->val_type = TEMP_VAL_CONST;
+        ots->val = ts->val;
+    } else {
+        /* The code in the first if block should have moved the
+           temp to a register. */
+        assert(ts->val_type == TEMP_VAL_REG);
+        if (IS_DEAD_ARG(1) && !ts->fixed_reg && !ots->fixed_reg) {
+                /* the mov can be suppressed */
+                if (ots->val_type == TEMP_VAL_REG) {
+                    s->reg_to_temp[ots->reg] = -1;
+                }
+                ots->reg = ts->reg;
+                temp_dead(s, args[1]);
         } else {
-            /* propagate constant */
-            if (ots->val_type == TEMP_VAL_REG)
-                s->reg_to_temp[ots->reg] = -1;
-            ots->val_type = TEMP_VAL_CONST;
-            ots->val = ts->val;
-            if (NEED_SYNC_ARG(0)) {
-                temp_sync(s, args[0], s->reserved_regs);
+            if (ots->val_type != TEMP_VAL_REG) {
+                /* When allocating a new register, make sure to not spill the
+                   input one. */
+                tcg_regset_set_reg(allocated_regs, ts->reg);
+                ots->reg = tcg_reg_alloc(s, oarg_ct->u.regs, allocated_regs);
             }
-            return;
+            tcg_out_mov(s, ots->type, ots->reg, ts->reg);
+        }
+        ots->val_type = TEMP_VAL_REG;
+        ots->mem_coherent = 0;
+        s->reg_to_temp[ots->reg] = args[0];
+        if (NEED_SYNC_ARG(0)) {
+            tcg_reg_sync(s, ots->reg);
         }
-    } else {
-        tcg_abort();
-    }
-    s->reg_to_temp[reg] = args[0];
-    ots->reg = reg;
-    ots->val_type = TEMP_VAL_REG;
-    ots->mem_coherent = 0;
-
-    if (NEED_SYNC_ARG(0)) {
-        tcg_reg_sync(s, reg);
     }
 }
 
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [Qemu-devel] [PATCH v2 08/26] tcg: always mark dead input arguments as dead
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
                   ` (6 preceding siblings ...)
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 07/26] tcg: rewrite tcg_reg_alloc_mov() Aurelien Jarno
@ 2012-10-09 19:56 ` Aurelien Jarno
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 09/26] tcg: start with local temps in TEMP_VAL_MEM state Aurelien Jarno
                   ` (19 subsequent siblings)
  27 siblings, 0 replies; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 19:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Aurelien Jarno

Always mark dead input arguments as dead, even if the op is at the basic
block end. This will allow to check that all temps are correctly saved.

Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 tcg/tcg.c |   14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/tcg/tcg.c b/tcg/tcg.c
index e320022..5b99281 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -1827,16 +1827,16 @@ static void tcg_reg_alloc_op(TCGContext *s,
     iarg_end: ;
     }
     
+    /* mark dead temporaries and free the associated registers */
+    for (i = nb_oargs; i < nb_oargs + nb_iargs; i++) {
+        if (IS_DEAD_ARG(i)) {
+            temp_dead(s, args[i]);
+        }
+    }
+
     if (def->flags & TCG_OPF_BB_END) {
         tcg_reg_alloc_bb_end(s, allocated_regs);
     } else {
-        /* mark dead temporaries and free the associated registers */
-        for(i = nb_oargs; i < nb_oargs + nb_iargs; i++) {
-            if (IS_DEAD_ARG(i)) {
-                temp_dead(s, args[i]);
-            }
-        }
-        
         if (def->flags & TCG_OPF_CALL_CLOBBER) {
             /* XXX: permit generic clobber register list ? */ 
             for(reg = 0; reg < TCG_TARGET_NB_REGS; reg++) {
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [Qemu-devel] [PATCH v2 09/26] tcg: start with local temps in TEMP_VAL_MEM state
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
                   ` (7 preceding siblings ...)
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 08/26] tcg: always mark dead input arguments as dead Aurelien Jarno
@ 2012-10-09 19:56 ` Aurelien Jarno
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 10/26] tcg: don't explicitly save globals and temps Aurelien Jarno
                   ` (18 subsequent siblings)
  27 siblings, 0 replies; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 19:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Aurelien Jarno

Start with local temps in TEMP_VAL_MEM state, to make possible a later
check that all the temps are correctly saved back to memory.

Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 tcg/tcg.c |    6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/tcg/tcg.c b/tcg/tcg.c
index 5b99281..5262454 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -780,7 +780,11 @@ static void tcg_reg_alloc_start(TCGContext *s)
     }
     for(i = s->nb_globals; i < s->nb_temps; i++) {
         ts = &s->temps[i];
-        ts->val_type = TEMP_VAL_DEAD;
+        if (ts->temp_local) {
+            ts->val_type = TEMP_VAL_MEM;
+        } else {
+            ts->val_type = TEMP_VAL_DEAD;
+        }
         ts->mem_allocated = 0;
         ts->fixed_reg = 0;
     }
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [Qemu-devel] [PATCH v2 10/26] tcg: don't explicitly save globals and temps
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
                   ` (8 preceding siblings ...)
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 09/26] tcg: start with local temps in TEMP_VAL_MEM state Aurelien Jarno
@ 2012-10-09 19:56 ` Aurelien Jarno
  2012-10-10 16:55   ` Richard Henderson
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 11/26] tcg: fix some op flags Aurelien Jarno
                   ` (17 subsequent siblings)
  27 siblings, 1 reply; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 19:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Aurelien Jarno

The liveness analysis ensures that globals and temps are at the correct
state at a basic block end or with an op with side effects. Avoid
looping on all temps, this can be time consuming on targets with a lot
of globals. Keep an assert in debug mode.

Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 tcg/tcg.c |   12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/tcg/tcg.c b/tcg/tcg.c
index 5262454..3983ec3 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -1601,8 +1601,14 @@ static inline void temp_sync(TCGContext *s, int temp, TCGRegSet allocated_regs)
    temporary registers needs to be allocated to store a constant. */
 static inline void temp_save(TCGContext *s, int temp, TCGRegSet allocated_regs)
 {
+#ifdef USE_LIVENESS_ANALYSIS
+    /* The liveness analysis already ensures that globals are back
+       in memory. Keep an assert for safety. */
+    assert(s->temps[temp].val_type == TEMP_VAL_MEM || s->temps[temp].fixed_reg);
+#else
     temp_sync(s, temp, allocated_regs);
     temp_dead(s, temp);
+#endif
 }
 
 /* save globals to their canonical location and assume they can be
@@ -1629,7 +1635,13 @@ static void tcg_reg_alloc_bb_end(TCGContext *s, TCGRegSet allocated_regs)
         if (ts->temp_local) {
             temp_save(s, i, allocated_regs);
         } else {
+#ifdef USE_LIVENESS_ANALYSIS
+            /* The liveness analysis already ensures that temps are dead.
+               Keep an assert for safety. */
+            assert(ts->val_type == TEMP_VAL_DEAD);
+#else
             temp_dead(s, i);
+#endif
         }
     }
 
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [Qemu-devel] [PATCH v2 11/26] tcg: fix some op flags
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
                   ` (9 preceding siblings ...)
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 10/26] tcg: don't explicitly save globals and temps Aurelien Jarno
@ 2012-10-09 19:56 ` Aurelien Jarno
  2012-10-10 16:56   ` Richard Henderson
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 12/26] tcg: forbid ld/st function to modify globals Aurelien Jarno
                   ` (16 subsequent siblings)
  27 siblings, 1 reply; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 19:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Aurelien Jarno

Some branch related ops are marked with TCG_OPF_SIDE_EFFECTS, some other
not. In practice they don't need to, as they are all marked with
TCG_OPF_BB_END, which is handled specifically in all the code.

The call op is marked as TCG_OPF_SIDE_EFFECTS, which might be not true
as there is are specific flags (TCG_CALL_CONST and TCG_CALL_PURE) for
specifying that. On the other hand it always clobber arguments, so mark
it as such even if the call op is handled in a different code path.

Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 tcg/tcg-opc.h |   15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/tcg/tcg-opc.h b/tcg/tcg-opc.h
index 04cb7ca..2072281 100644
--- a/tcg/tcg-opc.h
+++ b/tcg/tcg-opc.h
@@ -37,8 +37,8 @@ DEF(nopn, 0, 0, 1, 0) /* variable number of parameters */
 DEF(discard, 1, 0, 0, 0)
 
 DEF(set_label, 0, 0, 1, TCG_OPF_BB_END)
-DEF(call, 0, 1, 2, TCG_OPF_SIDE_EFFECTS) /* variable number of parameters */
-DEF(br, 0, 0, 1, TCG_OPF_BB_END | TCG_OPF_SIDE_EFFECTS)
+DEF(call, 0, 1, 2, TCG_OPF_CALL_CLOBBER) /* variable number of parameters */
+DEF(br, 0, 0, 1, TCG_OPF_BB_END)
 
 #define IMPL(X) (X ? 0 : TCG_OPF_NOT_PRESENT)
 #if TCG_TARGET_REG_BITS == 32
@@ -81,12 +81,11 @@ DEF(rotl_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_rot_i32))
 DEF(rotr_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_rot_i32))
 DEF(deposit_i32, 1, 2, 2, IMPL(TCG_TARGET_HAS_deposit_i32))
 
-DEF(brcond_i32, 0, 2, 2, TCG_OPF_BB_END | TCG_OPF_SIDE_EFFECTS)
+DEF(brcond_i32, 0, 2, 2, TCG_OPF_BB_END)
 
 DEF(add2_i32, 2, 4, 0, IMPL(TCG_TARGET_REG_BITS == 32))
 DEF(sub2_i32, 2, 4, 0, IMPL(TCG_TARGET_REG_BITS == 32))
-DEF(brcond2_i32, 0, 4, 2,
-    TCG_OPF_BB_END | TCG_OPF_SIDE_EFFECTS | IMPL(TCG_TARGET_REG_BITS == 32))
+DEF(brcond2_i32, 0, 4, 2, TCG_OPF_BB_END | IMPL(TCG_TARGET_REG_BITS == 32))
 DEF(mulu2_i32, 2, 2, 0, IMPL(TCG_TARGET_REG_BITS == 32))
 DEF(setcond2_i32, 1, 4, 1, IMPL(TCG_TARGET_REG_BITS == 32))
 
@@ -141,7 +140,7 @@ DEF(rotl_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_rot_i64))
 DEF(rotr_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_rot_i64))
 DEF(deposit_i64, 1, 2, 2, IMPL64 | IMPL(TCG_TARGET_HAS_deposit_i64))
 
-DEF(brcond_i64, 0, 2, 2, TCG_OPF_BB_END | TCG_OPF_SIDE_EFFECTS | IMPL64)
+DEF(brcond_i64, 0, 2, 2, TCG_OPF_BB_END | IMPL64)
 DEF(ext8s_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ext8s_i64))
 DEF(ext16s_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ext16s_i64))
 DEF(ext32s_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ext32s_i64))
@@ -165,8 +164,8 @@ DEF(debug_insn_start, 0, 0, 2, 0)
 #else
 DEF(debug_insn_start, 0, 0, 1, 0)
 #endif
-DEF(exit_tb, 0, 0, 1, TCG_OPF_BB_END | TCG_OPF_SIDE_EFFECTS)
-DEF(goto_tb, 0, 0, 1, TCG_OPF_BB_END | TCG_OPF_SIDE_EFFECTS)
+DEF(exit_tb, 0, 0, 1, TCG_OPF_BB_END)
+DEF(goto_tb, 0, 0, 1, TCG_OPF_BB_END)
 /* Note: even if TARGET_LONG_BITS is not defined, the INDEX_op
    constants must be defined */
 #if TCG_TARGET_REG_BITS == 32
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [Qemu-devel] [PATCH v2 12/26] tcg: forbid ld/st function to modify globals
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
                   ` (10 preceding siblings ...)
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 11/26] tcg: fix some op flags Aurelien Jarno
@ 2012-10-09 19:56 ` Aurelien Jarno
  2012-10-10 16:57   ` Richard Henderson
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 13/26] tcg: synchronize globals for ops with side effects Aurelien Jarno
                   ` (15 subsequent siblings)
  27 siblings, 1 reply; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 19:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Aurelien Jarno

Mapping a memory address using a global and accessing it through
ld/st operations is currently broken. As it doesn't make any sense
to do that performance wise, let's forbid that.

Update the TCG documentation, and remove partial support for that.

Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 tcg/README    |    3 +++
 tcg/tcg-opc.h |   14 +++++++-------
 2 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/tcg/README b/tcg/README
index aa86992..9d1b100 100644
--- a/tcg/README
+++ b/tcg/README
@@ -349,6 +349,9 @@ st32_i64 t0, t1, offset
 write(t0, t1 + offset)
 Write 8, 16, 32 or 64 bits to host memory.
 
+All this opcodes assume that the pointed host memory doesn't correspond
+to a global. In the latter case the behaviour is unpredictable.
+
 ********* 64-bit target on 32-bit host support
 
 The following opcodes are internal to TCG.  Thus they are to be implemented by
diff --git a/tcg/tcg-opc.h b/tcg/tcg-opc.h
index 2072281..9651063 100644
--- a/tcg/tcg-opc.h
+++ b/tcg/tcg-opc.h
@@ -57,9 +57,9 @@ DEF(ld8s_i32, 1, 1, 1, 0)
 DEF(ld16u_i32, 1, 1, 1, 0)
 DEF(ld16s_i32, 1, 1, 1, 0)
 DEF(ld_i32, 1, 1, 1, 0)
-DEF(st8_i32, 0, 2, 1, TCG_OPF_SIDE_EFFECTS)
-DEF(st16_i32, 0, 2, 1, TCG_OPF_SIDE_EFFECTS)
-DEF(st_i32, 0, 2, 1, TCG_OPF_SIDE_EFFECTS)
+DEF(st8_i32, 0, 2, 1, 0)
+DEF(st16_i32, 0, 2, 1, 0)
+DEF(st_i32, 0, 2, 1, 0)
 /* arith */
 DEF(add_i32, 1, 2, 0, 0)
 DEF(sub_i32, 1, 2, 0, 0)
@@ -115,10 +115,10 @@ DEF(ld16s_i64, 1, 1, 1, IMPL64)
 DEF(ld32u_i64, 1, 1, 1, IMPL64)
 DEF(ld32s_i64, 1, 1, 1, IMPL64)
 DEF(ld_i64, 1, 1, 1, IMPL64)
-DEF(st8_i64, 0, 2, 1, TCG_OPF_SIDE_EFFECTS | IMPL64)
-DEF(st16_i64, 0, 2, 1, TCG_OPF_SIDE_EFFECTS | IMPL64)
-DEF(st32_i64, 0, 2, 1, TCG_OPF_SIDE_EFFECTS | IMPL64)
-DEF(st_i64, 0, 2, 1, TCG_OPF_SIDE_EFFECTS | IMPL64)
+DEF(st8_i64, 0, 2, 1, IMPL64)
+DEF(st16_i64, 0, 2, 1, IMPL64)
+DEF(st32_i64, 0, 2, 1, IMPL64)
+DEF(st_i64, 0, 2, 1, IMPL64)
 /* arith */
 DEF(add_i64, 1, 2, 0, IMPL64)
 DEF(sub_i64, 1, 2, 0, IMPL64)
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [Qemu-devel] [PATCH v2 13/26] tcg: synchronize globals for ops with side effects
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
                   ` (11 preceding siblings ...)
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 12/26] tcg: forbid ld/st function to modify globals Aurelien Jarno
@ 2012-10-09 19:56 ` Aurelien Jarno
  2012-10-10 17:01   ` Richard Henderson
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 14/26] tcg: rework TCG helper flags Aurelien Jarno
                   ` (14 subsequent siblings)
  27 siblings, 1 reply; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 19:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Aurelien Jarno

Operations with side effects (in practice qemu_ld/st ops), only need to
synchronize globals to make sure the CPU state is consistent in case of
exception.

Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 tcg/tcg.c |   33 ++++++++++++++++++++++++---------
 tcg/tcg.h |    4 ++--
 2 files changed, 26 insertions(+), 11 deletions(-)

diff --git a/tcg/tcg.c b/tcg/tcg.c
index 3983ec3..3f30fb1 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -1360,9 +1360,8 @@ static void tcg_liveness_analysis(TCGContext *s)
                 /* if end of basic block, update */
                 if (def->flags & TCG_OPF_BB_END) {
                     tcg_la_bb_end(s, dead_temps, mem_temps);
-                } else if (def->flags & TCG_OPF_CALL_CLOBBER) {
-                    /* globals should go back to memory */
-                    memset(dead_temps, 1, s->nb_globals);
+                } else if (def->flags & TCG_OPF_SIDE_EFFECTS) {
+                    /* globals should be synced to memory */
                     memset(mem_temps, 1, s->nb_globals);
                 }
 
@@ -1623,6 +1622,23 @@ static void save_globals(TCGContext *s, TCGRegSet allocated_regs)
     }
 }
 
+/* sync globals to their canonical location and assume they can be
+   read by the following code. 'allocated_regs' is used in case a
+   temporary registers needs to be allocated to store a constant. */
+static void sync_globals(TCGContext *s, TCGRegSet allocated_regs)
+{
+    int i;
+
+    for (i = 0; i < s->nb_globals; i++) {
+#ifdef USE_LIVENESS_ANALYSIS
+        assert(s->temps[i].val_type != TEMP_VAL_REG || s->temps[i].fixed_reg ||
+               s->temps[i].mem_coherent);
+#else
+        temp_sync(s, i, allocated_regs);
+#endif
+    }
+}
+
 /* at the end of a basic block, we assume all temporaries are dead and
    all globals are stored at their canonical location. */
 static void tcg_reg_alloc_bb_end(TCGContext *s, TCGRegSet allocated_regs)
@@ -1860,12 +1876,11 @@ static void tcg_reg_alloc_op(TCGContext *s,
                     tcg_reg_free(s, reg);
                 }
             }
-            /* XXX: for load/store we could do that only for the slow path
-               (i.e. when a memory callback is called) */
-            
-            /* store globals and free associated registers (we assume the insn
-               can modify any global. */
-            save_globals(s, allocated_regs);
+        }
+        if (def->flags & TCG_OPF_SIDE_EFFECTS) {
+            /* sync globals if the op has side effects and might trigger
+               an exception. */
+            sync_globals(s, allocated_regs);
         }
         
         /* satisfy the output constraints */
diff --git a/tcg/tcg.h b/tcg/tcg.h
index 73d3769..fb6d9ea 100644
--- a/tcg/tcg.h
+++ b/tcg/tcg.h
@@ -530,8 +530,8 @@ enum {
     TCG_OPF_BB_END       = 0x01,
     /* Instruction clobbers call registers and potentially update globals.  */
     TCG_OPF_CALL_CLOBBER = 0x02,
-    /* Instruction has side effects: it cannot be removed
-       if its outputs are not used.  */
+    /* Instruction has side effects: it cannot be removed if its outputs
+       are not used, and might trigger exceptions.  */
     TCG_OPF_SIDE_EFFECTS = 0x04,
     /* Instruction operands are 64-bits (otherwise 32-bits).  */
     TCG_OPF_64BIT        = 0x08,
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [Qemu-devel] [PATCH v2 14/26] tcg: rework TCG helper flags
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
                   ` (12 preceding siblings ...)
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 13/26] tcg: synchronize globals for ops with side effects Aurelien Jarno
@ 2012-10-09 19:56 ` Aurelien Jarno
  2012-10-09 20:04   ` Peter Maydell
  2012-10-10 17:11   ` Richard Henderson
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 15/26] target-alpha: rename " Aurelien Jarno
                   ` (13 subsequent siblings)
  27 siblings, 2 replies; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 19:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Aurelien Jarno

The current helper flags, TCG_CALL_CONST and TCG_CALL_PURE might be
confusing and doesn't provide enough granularity for some helpers (FP
helpers for example).

This patch changes them into the following helpers flags:
- TCG_CALL_NO_READ_GLOBALS means that the helper does not read globals,
  either directly or via an exception. They will not be saved to their
  canonical location before calling the helper.
- TCG_CALL_NO_WRITE_GLOBALS means that the helper does not modify any
  globals. They will only be saved to their canonical locations before
  calling helpers, but they won't be reloaded afterwise.
- TCG_CALL_NO_SIDE_EFFECTS means that the call to the function is
  removed if the return value is not used.

It provides convenience flags, to avoid helper definitions longer than
80 characters. It also provides compatibility flags, and updates the
documentation.

Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 tcg/README     |   19 ++++++++++++++-----
 tcg/optimize.c |    3 ++-
 tcg/tcg-op.h   |   18 ++++++++++--------
 tcg/tcg.c      |   24 ++++++++++++++++--------
 tcg/tcg.h      |   26 ++++++++++++++++++--------
 5 files changed, 60 insertions(+), 30 deletions(-)

diff --git a/tcg/README b/tcg/README
index 9d1b100..ec1ac79 100644
--- a/tcg/README
+++ b/tcg/README
@@ -77,11 +77,20 @@ destroyed, but local temporaries and globals are preserved.
 Using the tcg_gen_helper_x_y it is possible to call any function
 taking i32, i64 or pointer types. By default, before calling a helper,
 all globals are stored at their canonical location and it is assumed
-that the function can modify them. This can be overridden by the
-TCG_CALL_CONST function modifier. By default, the helper is allowed to
-modify the CPU state or raise an exception. This can be overridden by
-the TCG_CALL_PURE function modifier, in which case the call to the
-function is removed if the return value is not used.
+that the function can modify them. By default, the helper is allowed to
+modify the CPU state or raise an exception.
+
+This can be overridden using the following function modifiers:
+- TCG_CALL_NO_READ_GLOBALS means that the helper does not read globals,
+  either directly or via an exception. They will not be saved to their
+  canonical locations before calling the helper.
+- TCG_CALL_NO_WRITE_GLOBALS means that the helper does not modify any globals.
+  They will only be saved to their canonical location before calling helpers,
+  but they won't be reloaded afterwise.
+- TCG_CALL_NO_SIDE_EFFECTS means that the call to the function is removed if
+  the return value is not used.
+
+Note that TCG_CALL_NO_READ_GLOBALS implies TCG_CALL_NO_WRITE_GLOBALS.
 
 On some TCG targets (e.g. x86), several calling conventions are
 supported.
diff --git a/tcg/optimize.c b/tcg/optimize.c
index edb2b0e..720fb9d 100644
--- a/tcg/optimize.c
+++ b/tcg/optimize.c
@@ -760,7 +760,8 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr,
             break;
         case INDEX_op_call:
             nb_call_args = (args[0] >> 16) + (args[0] & 0xffff);
-            if (!(args[nb_call_args + 1] & (TCG_CALL_CONST | TCG_CALL_PURE))) {
+            if (!(args[nb_call_args + 1] & (TCG_CALL_NO_READ_GLOBALS |
+                                            TCG_CALL_NO_WRITE_GLOBALS))) {
                 for (i = 0; i < nb_globals; i++) {
                     reset_temp(i);
                 }
diff --git a/tcg/tcg-op.h b/tcg/tcg-op.h
index 5518458..f07e740 100644
--- a/tcg/tcg-op.h
+++ b/tcg/tcg-op.h
@@ -396,10 +396,10 @@ static inline void tcg_gen_helperN(void *func, int flags, int sizemask,
 }
 
 /* Note: Both tcg_gen_helper32() and tcg_gen_helper64() are currently
-   reserved for helpers in tcg-runtime.c. These helpers are all const
-   and pure, hence the call to tcg_gen_callN() with TCG_CALL_CONST |
-   TCG_CALL_PURE. This may need to be adjusted if these functions
-   start to be used with other helpers. */
+   reserved for helpers in tcg-runtime.c. These helpers all do not read
+   globals and do not have side effects, hence the call to tcg_gen_callN()
+   with TCG_CALL_NO_READ_GLOBALS | TCG_CALL_NO_SIDE_EFFECTS. This may need
+   to be adjusted if these functions start to be used with other helpers. */
 static inline void tcg_gen_helper32(void *func, int sizemask, TCGv_i32 ret,
                                     TCGv_i32 a, TCGv_i32 b)
 {
@@ -408,8 +408,9 @@ static inline void tcg_gen_helper32(void *func, int sizemask, TCGv_i32 ret,
     fn = tcg_const_ptr(func);
     args[0] = GET_TCGV_I32(a);
     args[1] = GET_TCGV_I32(b);
-    tcg_gen_callN(&tcg_ctx, fn, TCG_CALL_CONST | TCG_CALL_PURE, sizemask,
-                  GET_TCGV_I32(ret), 2, args);
+    tcg_gen_callN(&tcg_ctx, fn,
+                  TCG_CALL_NO_READ_GLOBALS | TCG_CALL_NO_SIDE_EFFECTS,
+                  sizemask, GET_TCGV_I32(ret), 2, args);
     tcg_temp_free_ptr(fn);
 }
 
@@ -421,8 +422,9 @@ static inline void tcg_gen_helper64(void *func, int sizemask, TCGv_i64 ret,
     fn = tcg_const_ptr(func);
     args[0] = GET_TCGV_I64(a);
     args[1] = GET_TCGV_I64(b);
-    tcg_gen_callN(&tcg_ctx, fn, TCG_CALL_CONST | TCG_CALL_PURE, sizemask,
-                  GET_TCGV_I64(ret), 2, args);
+    tcg_gen_callN(&tcg_ctx, fn,
+                  TCG_CALL_NO_READ_GLOBALS | TCG_CALL_NO_SIDE_EFFECTS,
+                  sizemask, GET_TCGV_I64(ret), 2, args);
     tcg_temp_free_ptr(fn);
 }
 
diff --git a/tcg/tcg.c b/tcg/tcg.c
index 3f30fb1..131cdd4 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -1255,7 +1255,7 @@ static void tcg_liveness_analysis(TCGContext *s)
 
                 /* pure functions can be removed if their result is not
                    used */
-                if (call_flags & TCG_CALL_PURE) {
+                if (call_flags & TCG_CALL_NO_SIDE_EFFECTS) {
                     for(i = 0; i < nb_oargs; i++) {
                         arg = args[i];
                         if (!dead_temps[arg] || mem_temps[arg]) {
@@ -1281,11 +1281,15 @@ static void tcg_liveness_analysis(TCGContext *s)
                         dead_temps[arg] = 1;
                         mem_temps[arg] = 0;
                     }
-                    
-                    if (!(call_flags & TCG_CALL_CONST)) {
+
+                    if (!(call_flags & TCG_CALL_NO_READ_GLOBALS)) {
+                        /* globals should be synced to memory */
+                        memset(mem_temps, 1, s->nb_globals);
+                    }
+                    if (!(call_flags & (TCG_CALL_NO_WRITE_GLOBALS |
+                                        TCG_CALL_NO_READ_GLOBALS))) {
                         /* globals should go back to memory */
                         memset(dead_temps, 1, s->nb_globals);
-                        memset(mem_temps, 1, s->nb_globals);
                     }
 
                     /* input args are live */
@@ -2081,10 +2085,14 @@ static int tcg_reg_alloc_call(TCGContext *s, const TCGOpDef *def,
             tcg_reg_free(s, reg);
         }
     }
-    
-    /* store globals and free associated registers (we assume the call
-       can modify any global. */
-    if (!(flags & TCG_CALL_CONST)) {
+
+    /* Save globals if they might be written by the helper, sync them if
+       they might be read. */
+    if (flags & TCG_CALL_NO_READ_GLOBALS) {
+        /* Nothing to do */
+    } else if (flags & TCG_CALL_NO_WRITE_GLOBALS) {
+        sync_globals(s, allocated_regs);
+    } else {
         save_globals(s, allocated_regs);
     }
 
diff --git a/tcg/tcg.h b/tcg/tcg.h
index fb6d9ea..a985b26 100644
--- a/tcg/tcg.h
+++ b/tcg/tcg.h
@@ -253,14 +253,24 @@ typedef int TCGv_i64;
 #define TCGV_UNUSED_I64(x) x = MAKE_TCGV_I64(-1)
 
 /* call flags */
-/* A pure function only reads its arguments and TCG global variables
-   and cannot raise exceptions. Hence a call to a pure function can be
-   safely suppressed if the return value is not used. */
-#define TCG_CALL_PURE           0x0010 
-/* A const function only reads its arguments and does not use TCG
-   global variables. Hence a call to such a function does not
-   save TCG global variables back to their canonical location. */
-#define TCG_CALL_CONST          0x0020
+/* Helper does not read globals (either directly or through an exception). It
+   implies TCG_CALL_NO_WRITE_GLOBALS. */
+#define TCG_CALL_NO_READ_GLOBALS    0x0010
+/* Helper does not write globals */
+#define TCG_CALL_NO_WRITE_GLOBALS   0x0020
+/* Helper can be safely suppressed if the return value is not used. */
+#define TCG_CALL_NO_SIDE_EFFECTS    0x0040
+
+/* convenience version of most used call flags */
+#define TCG_CALL_NO_RG          TCG_CALL_NO_READ_GLOBALS
+#define TCG_CALL_NO_WG          TCG_CALL_NO_WRITE_GLOBALS
+#define TCG_CALL_NO_SE          TCG_CALL_NO_SIDE_EFFECTS
+#define TCG_CALL_NO_RGSE        (TCG_CALL_NO_RG | TCG_CALL_NO_SE)
+#define TCG_CALL_NO_WGSE        (TCG_CALL_NO_WG | TCG_CALL_NO_SE)
+
+/* compatibility call flags, they should be eventually be removed */
+#define TCG_CALL_PURE           TCG_CALL_NO_SIDE_EFFECTS
+#define TCG_CALL_CONST          TCG_CALL_NO_READ_GLOBALS
 
 /* used to align parameters */
 #define TCG_CALL_DUMMY_TCGV     MAKE_TCGV_I32(-1)
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [Qemu-devel] [PATCH v2 15/26] target-alpha: rename helper flags
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
                   ` (13 preceding siblings ...)
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 14/26] tcg: rework TCG helper flags Aurelien Jarno
@ 2012-10-09 19:56 ` Aurelien Jarno
  2012-10-10 17:14   ` Richard Henderson
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 16/26] target-arm: " Aurelien Jarno
                   ` (12 subsequent siblings)
  27 siblings, 1 reply; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 19:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Aurelien Jarno, Richard Henderson

Rename helper flags to the new ones. This is purely a mechanical change,
it's possible to use better flags by looking at the helpers.

Cc: Richard Henderson <rth@twiddle.net>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 target-alpha/helper.h |  176 ++++++++++++++++++++++++-------------------------
 1 file changed, 88 insertions(+), 88 deletions(-)

diff --git a/target-alpha/helper.h b/target-alpha/helper.h
index a184def..92278c7 100644
--- a/target-alpha/helper.h
+++ b/target-alpha/helper.h
@@ -1,7 +1,7 @@
 #include "def-helper.h"
 
 DEF_HELPER_3(excp, noreturn, env, int, int)
-DEF_HELPER_FLAGS_1(load_pcc, TCG_CALL_CONST | TCG_CALL_PURE, i64, env)
+DEF_HELPER_FLAGS_1(load_pcc, TCG_CALL_NO_RGSE, i64, env)
 
 DEF_HELPER_3(addqv, i64, env, i64, i64)
 DEF_HELPER_3(addlv, i64, env, i64, i64)
@@ -9,89 +9,89 @@ DEF_HELPER_3(subqv, i64, env, i64, i64)
 DEF_HELPER_3(sublv, i64, env, i64, i64)
 DEF_HELPER_3(mullv, i64, env, i64, i64)
 DEF_HELPER_3(mulqv, i64, env, i64, i64)
-DEF_HELPER_FLAGS_2(umulh, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-
-DEF_HELPER_FLAGS_1(ctpop, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64)
-DEF_HELPER_FLAGS_1(ctlz, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64)
-DEF_HELPER_FLAGS_1(cttz, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64)
-
-DEF_HELPER_FLAGS_2(zap, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(zapnot, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-
-DEF_HELPER_FLAGS_2(cmpbge, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-
-DEF_HELPER_FLAGS_2(minub8, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(minsb8, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(minuw4, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(minsw4, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(maxub8, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(maxsb8, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(maxuw4, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(maxsw4, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(perr, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_1(pklb, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64)
-DEF_HELPER_FLAGS_1(pkwb, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64)
-DEF_HELPER_FLAGS_1(unpkbl, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64)
-DEF_HELPER_FLAGS_1(unpkbw, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64)
-
-DEF_HELPER_FLAGS_1(load_fpcr, TCG_CALL_CONST | TCG_CALL_PURE, i64, env)
-DEF_HELPER_FLAGS_2(store_fpcr, TCG_CALL_CONST, void, env, i64)
-
-DEF_HELPER_FLAGS_1(f_to_memory, TCG_CALL_CONST | TCG_CALL_PURE, i32, i64)
-DEF_HELPER_FLAGS_1(memory_to_f, TCG_CALL_CONST | TCG_CALL_PURE, i64, i32)
-DEF_HELPER_FLAGS_3(addf, TCG_CALL_CONST, i64, env, i64, i64)
-DEF_HELPER_FLAGS_3(subf, TCG_CALL_CONST, i64, env, i64, i64)
-DEF_HELPER_FLAGS_3(mulf, TCG_CALL_CONST, i64, env, i64, i64)
-DEF_HELPER_FLAGS_3(divf, TCG_CALL_CONST, i64, env, i64, i64)
-DEF_HELPER_FLAGS_2(sqrtf, TCG_CALL_CONST, i64, env, i64)
-
-DEF_HELPER_FLAGS_1(g_to_memory, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64)
-DEF_HELPER_FLAGS_1(memory_to_g, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64)
-DEF_HELPER_FLAGS_3(addg, TCG_CALL_CONST, i64, env, i64, i64)
-DEF_HELPER_FLAGS_3(subg, TCG_CALL_CONST, i64, env, i64, i64)
-DEF_HELPER_FLAGS_3(mulg, TCG_CALL_CONST, i64, env, i64, i64)
-DEF_HELPER_FLAGS_3(divg, TCG_CALL_CONST, i64, env, i64, i64)
-DEF_HELPER_FLAGS_2(sqrtg, TCG_CALL_CONST, i64, env, i64)
-
-DEF_HELPER_FLAGS_1(s_to_memory, TCG_CALL_CONST | TCG_CALL_PURE, i32, i64)
-DEF_HELPER_FLAGS_1(memory_to_s, TCG_CALL_CONST | TCG_CALL_PURE, i64, i32)
-DEF_HELPER_FLAGS_3(adds, TCG_CALL_CONST, i64, env, i64, i64)
-DEF_HELPER_FLAGS_3(subs, TCG_CALL_CONST, i64, env, i64, i64)
-DEF_HELPER_FLAGS_3(muls, TCG_CALL_CONST, i64, env, i64, i64)
-DEF_HELPER_FLAGS_3(divs, TCG_CALL_CONST, i64, env, i64, i64)
-DEF_HELPER_FLAGS_2(sqrts, TCG_CALL_CONST, i64, env, i64)
-
-DEF_HELPER_FLAGS_3(addt, TCG_CALL_CONST, i64, env, i64, i64)
-DEF_HELPER_FLAGS_3(subt, TCG_CALL_CONST, i64, env, i64, i64)
-DEF_HELPER_FLAGS_3(mult, TCG_CALL_CONST, i64, env, i64, i64)
-DEF_HELPER_FLAGS_3(divt, TCG_CALL_CONST, i64, env, i64, i64)
-DEF_HELPER_FLAGS_2(sqrtt, TCG_CALL_CONST, i64, env, i64)
-
-DEF_HELPER_FLAGS_3(cmptun, TCG_CALL_CONST, i64, env, i64, i64)
-DEF_HELPER_FLAGS_3(cmpteq, TCG_CALL_CONST, i64, env, i64, i64)
-DEF_HELPER_FLAGS_3(cmptle, TCG_CALL_CONST, i64, env, i64, i64)
-DEF_HELPER_FLAGS_3(cmptlt, TCG_CALL_CONST, i64, env, i64, i64)
-DEF_HELPER_FLAGS_3(cmpgeq, TCG_CALL_CONST, i64, env, i64, i64)
-DEF_HELPER_FLAGS_3(cmpgle, TCG_CALL_CONST, i64, env, i64, i64)
-DEF_HELPER_FLAGS_3(cmpglt, TCG_CALL_CONST, i64, env, i64, i64)
-
-DEF_HELPER_FLAGS_2(cvtts, TCG_CALL_CONST, i64, env, i64)
-DEF_HELPER_FLAGS_2(cvtst, TCG_CALL_CONST, i64, env, i64)
-DEF_HELPER_FLAGS_2(cvtqs, TCG_CALL_CONST, i64, env, i64)
-DEF_HELPER_FLAGS_2(cvtqt, TCG_CALL_CONST, i64, env, i64)
-DEF_HELPER_FLAGS_2(cvtqf, TCG_CALL_CONST, i64, env, i64)
-DEF_HELPER_FLAGS_2(cvtgf, TCG_CALL_CONST, i64, env, i64)
-DEF_HELPER_FLAGS_2(cvtgq, TCG_CALL_CONST, i64, env, i64)
-DEF_HELPER_FLAGS_2(cvtqg, TCG_CALL_CONST, i64, env, i64)
-
-DEF_HELPER_FLAGS_2(cvttq, TCG_CALL_CONST, i64, env, i64)
-DEF_HELPER_FLAGS_2(cvttq_c, TCG_CALL_CONST, i64, env, i64)
-DEF_HELPER_FLAGS_2(cvttq_svic, TCG_CALL_CONST, i64, env, i64)
-
-DEF_HELPER_FLAGS_2(setroundmode, TCG_CALL_CONST, void, env, i32)
-DEF_HELPER_FLAGS_2(setflushzero, TCG_CALL_CONST, void, env, i32)
-DEF_HELPER_FLAGS_1(fp_exc_clear, TCG_CALL_CONST, void, env)
-DEF_HELPER_FLAGS_1(fp_exc_get, TCG_CALL_CONST | TCG_CALL_PURE, i32, env)
+DEF_HELPER_FLAGS_2(umulh, TCG_CALL_NO_RGSE, i64, i64, i64)
+
+DEF_HELPER_FLAGS_1(ctpop, TCG_CALL_NO_RGSE, i64, i64)
+DEF_HELPER_FLAGS_1(ctlz, TCG_CALL_NO_RGSE, i64, i64)
+DEF_HELPER_FLAGS_1(cttz, TCG_CALL_NO_RGSE, i64, i64)
+
+DEF_HELPER_FLAGS_2(zap, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(zapnot, TCG_CALL_NO_RGSE, i64, i64, i64)
+
+DEF_HELPER_FLAGS_2(cmpbge, TCG_CALL_NO_RGSE, i64, i64, i64)
+
+DEF_HELPER_FLAGS_2(minub8, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(minsb8, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(minuw4, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(minsw4, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(maxub8, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(maxsb8, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(maxuw4, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(maxsw4, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(perr, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_1(pklb, TCG_CALL_NO_RGSE, i64, i64)
+DEF_HELPER_FLAGS_1(pkwb, TCG_CALL_NO_RGSE, i64, i64)
+DEF_HELPER_FLAGS_1(unpkbl, TCG_CALL_NO_RGSE, i64, i64)
+DEF_HELPER_FLAGS_1(unpkbw, TCG_CALL_NO_RGSE, i64, i64)
+
+DEF_HELPER_FLAGS_1(load_fpcr, TCG_CALL_NO_RGSE, i64, env)
+DEF_HELPER_FLAGS_2(store_fpcr, TCG_CALL_NO_RG, void, env, i64)
+
+DEF_HELPER_FLAGS_1(f_to_memory, TCG_CALL_NO_RGSE, i32, i64)
+DEF_HELPER_FLAGS_1(memory_to_f, TCG_CALL_NO_RGSE, i64, i32)
+DEF_HELPER_FLAGS_3(addf, TCG_CALL_NO_RG, i64, env, i64, i64)
+DEF_HELPER_FLAGS_3(subf, TCG_CALL_NO_RG, i64, env, i64, i64)
+DEF_HELPER_FLAGS_3(mulf, TCG_CALL_NO_RG, i64, env, i64, i64)
+DEF_HELPER_FLAGS_3(divf, TCG_CALL_NO_RG, i64, env, i64, i64)
+DEF_HELPER_FLAGS_2(sqrtf, TCG_CALL_NO_RG, i64, env, i64)
+
+DEF_HELPER_FLAGS_1(g_to_memory, TCG_CALL_NO_RGSE, i64, i64)
+DEF_HELPER_FLAGS_1(memory_to_g, TCG_CALL_NO_RGSE, i64, i64)
+DEF_HELPER_FLAGS_3(addg, TCG_CALL_NO_RG, i64, env, i64, i64)
+DEF_HELPER_FLAGS_3(subg, TCG_CALL_NO_RG, i64, env, i64, i64)
+DEF_HELPER_FLAGS_3(mulg, TCG_CALL_NO_RG, i64, env, i64, i64)
+DEF_HELPER_FLAGS_3(divg, TCG_CALL_NO_RG, i64, env, i64, i64)
+DEF_HELPER_FLAGS_2(sqrtg, TCG_CALL_NO_RG, i64, env, i64)
+
+DEF_HELPER_FLAGS_1(s_to_memory, TCG_CALL_NO_RGSE, i32, i64)
+DEF_HELPER_FLAGS_1(memory_to_s, TCG_CALL_NO_RGSE, i64, i32)
+DEF_HELPER_FLAGS_3(adds, TCG_CALL_NO_RG, i64, env, i64, i64)
+DEF_HELPER_FLAGS_3(subs, TCG_CALL_NO_RG, i64, env, i64, i64)
+DEF_HELPER_FLAGS_3(muls, TCG_CALL_NO_RG, i64, env, i64, i64)
+DEF_HELPER_FLAGS_3(divs, TCG_CALL_NO_RG, i64, env, i64, i64)
+DEF_HELPER_FLAGS_2(sqrts, TCG_CALL_NO_RG, i64, env, i64)
+
+DEF_HELPER_FLAGS_3(addt, TCG_CALL_NO_RG, i64, env, i64, i64)
+DEF_HELPER_FLAGS_3(subt, TCG_CALL_NO_RG, i64, env, i64, i64)
+DEF_HELPER_FLAGS_3(mult, TCG_CALL_NO_RG, i64, env, i64, i64)
+DEF_HELPER_FLAGS_3(divt, TCG_CALL_NO_RG, i64, env, i64, i64)
+DEF_HELPER_FLAGS_2(sqrtt, TCG_CALL_NO_RG, i64, env, i64)
+
+DEF_HELPER_FLAGS_3(cmptun, TCG_CALL_NO_RG, i64, env, i64, i64)
+DEF_HELPER_FLAGS_3(cmpteq, TCG_CALL_NO_RG, i64, env, i64, i64)
+DEF_HELPER_FLAGS_3(cmptle, TCG_CALL_NO_RG, i64, env, i64, i64)
+DEF_HELPER_FLAGS_3(cmptlt, TCG_CALL_NO_RG, i64, env, i64, i64)
+DEF_HELPER_FLAGS_3(cmpgeq, TCG_CALL_NO_RG, i64, env, i64, i64)
+DEF_HELPER_FLAGS_3(cmpgle, TCG_CALL_NO_RG, i64, env, i64, i64)
+DEF_HELPER_FLAGS_3(cmpglt, TCG_CALL_NO_RG, i64, env, i64, i64)
+
+DEF_HELPER_FLAGS_2(cvtts, TCG_CALL_NO_RG, i64, env, i64)
+DEF_HELPER_FLAGS_2(cvtst, TCG_CALL_NO_RG, i64, env, i64)
+DEF_HELPER_FLAGS_2(cvtqs, TCG_CALL_NO_RG, i64, env, i64)
+DEF_HELPER_FLAGS_2(cvtqt, TCG_CALL_NO_RG, i64, env, i64)
+DEF_HELPER_FLAGS_2(cvtqf, TCG_CALL_NO_RG, i64, env, i64)
+DEF_HELPER_FLAGS_2(cvtgf, TCG_CALL_NO_RG, i64, env, i64)
+DEF_HELPER_FLAGS_2(cvtgq, TCG_CALL_NO_RG, i64, env, i64)
+DEF_HELPER_FLAGS_2(cvtqg, TCG_CALL_NO_RG, i64, env, i64)
+
+DEF_HELPER_FLAGS_2(cvttq, TCG_CALL_NO_RG, i64, env, i64)
+DEF_HELPER_FLAGS_2(cvttq_c, TCG_CALL_NO_RG, i64, env, i64)
+DEF_HELPER_FLAGS_2(cvttq_svic, TCG_CALL_NO_RG, i64, env, i64)
+
+DEF_HELPER_FLAGS_2(setroundmode, TCG_CALL_NO_RG, void, env, i32)
+DEF_HELPER_FLAGS_2(setflushzero, TCG_CALL_NO_RG, void, env, i32)
+DEF_HELPER_FLAGS_1(fp_exc_clear, TCG_CALL_NO_RG, void, env)
+DEF_HELPER_FLAGS_1(fp_exc_get, TCG_CALL_NO_RGSE, i32, env)
 DEF_HELPER_3(fp_exc_raise, void, env, i32, i32)
 DEF_HELPER_3(fp_exc_raise_s, void, env, i32, i32)
 
@@ -110,13 +110,13 @@ DEF_HELPER_2(stq_phys, void, i64, i64)
 DEF_HELPER_3(stl_c_phys, i64, env, i64, i64)
 DEF_HELPER_3(stq_c_phys, i64, env, i64, i64)
 
-DEF_HELPER_FLAGS_1(tbia, TCG_CALL_CONST, void, env)
-DEF_HELPER_FLAGS_2(tbis, TCG_CALL_CONST, void, env, i64)
+DEF_HELPER_FLAGS_1(tbia, TCG_CALL_NO_RG, void, env)
+DEF_HELPER_FLAGS_2(tbis, TCG_CALL_NO_RG, void, env, i64)
 
 DEF_HELPER_1(halt, void, i64);
 
-DEF_HELPER_FLAGS_0(get_time, TCG_CALL_CONST, i64)
-DEF_HELPER_FLAGS_2(set_alarm, TCG_CALL_CONST, void, env, i64)
+DEF_HELPER_FLAGS_0(get_time, TCG_CALL_NO_RG, i64)
+DEF_HELPER_FLAGS_2(set_alarm, TCG_CALL_NO_RG, void, env, i64)
 #endif
 
 #include "def-helper.h"
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [Qemu-devel] [PATCH v2 16/26] target-arm: rename helper flags
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
                   ` (14 preceding siblings ...)
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 15/26] target-alpha: rename " Aurelien Jarno
@ 2012-10-09 19:56 ` Aurelien Jarno
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 17/26] target-cris: " Aurelien Jarno
                   ` (11 subsequent siblings)
  27 siblings, 0 replies; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 19:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Peter Maydell, Paul Brook, Aurelien Jarno

Rename helper flags to the new ones. This is purely a mechanical change,
it's possible to use better flags by looking at the helpers.

Cc: Paul Brook <paul@codesourcery.com>
Cc: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 target-arm/helper.h |   18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/target-arm/helper.h b/target-arm/helper.h
index 8b9adf1..b7836e6 100644
--- a/target-arm/helper.h
+++ b/target-arm/helper.h
@@ -1,8 +1,8 @@
 #include "def-helper.h"
 
-DEF_HELPER_FLAGS_1(clz, TCG_CALL_CONST | TCG_CALL_PURE, i32, i32)
-DEF_HELPER_FLAGS_1(sxtb16, TCG_CALL_CONST | TCG_CALL_PURE, i32, i32)
-DEF_HELPER_FLAGS_1(uxtb16, TCG_CALL_CONST | TCG_CALL_PURE, i32, i32)
+DEF_HELPER_FLAGS_1(clz, TCG_CALL_NO_RGSE, i32, i32)
+DEF_HELPER_FLAGS_1(sxtb16, TCG_CALL_NO_RGSE, i32, i32)
+DEF_HELPER_FLAGS_1(uxtb16, TCG_CALL_NO_RGSE, i32, i32)
 
 DEF_HELPER_3(add_setq, i32, env, i32, i32)
 DEF_HELPER_3(add_saturate, i32, env, i32, i32)
@@ -10,10 +10,10 @@ DEF_HELPER_3(sub_saturate, i32, env, i32, i32)
 DEF_HELPER_3(add_usaturate, i32, env, i32, i32)
 DEF_HELPER_3(sub_usaturate, i32, env, i32, i32)
 DEF_HELPER_2(double_saturate, i32, env, s32)
-DEF_HELPER_FLAGS_2(sdiv, TCG_CALL_CONST | TCG_CALL_PURE, s32, s32, s32)
-DEF_HELPER_FLAGS_2(udiv, TCG_CALL_CONST | TCG_CALL_PURE, i32, i32, i32)
-DEF_HELPER_FLAGS_1(rbit, TCG_CALL_CONST | TCG_CALL_PURE, i32, i32)
-DEF_HELPER_FLAGS_1(abs, TCG_CALL_CONST | TCG_CALL_PURE, i32, i32)
+DEF_HELPER_FLAGS_2(sdiv, TCG_CALL_NO_RGSE, s32, s32, s32)
+DEF_HELPER_FLAGS_2(udiv, TCG_CALL_NO_RGSE, i32, i32, i32)
+DEF_HELPER_FLAGS_1(rbit, TCG_CALL_NO_RGSE, i32, i32)
+DEF_HELPER_FLAGS_1(abs, TCG_CALL_NO_RGSE, i32, i32)
 
 #define PAS_OP(pfx)  \
     DEF_HELPER_3(pfx ## add8, i32, i32, i32, ptr) \
@@ -45,11 +45,11 @@ DEF_HELPER_3(usat, i32, env, i32, i32)
 DEF_HELPER_3(ssat16, i32, env, i32, i32)
 DEF_HELPER_3(usat16, i32, env, i32, i32)
 
-DEF_HELPER_FLAGS_2(usad8, TCG_CALL_CONST | TCG_CALL_PURE, i32, i32, i32)
+DEF_HELPER_FLAGS_2(usad8, TCG_CALL_NO_RGSE, i32, i32, i32)
 
 DEF_HELPER_1(logicq_cc, i32, i64)
 
-DEF_HELPER_FLAGS_3(sel_flags, TCG_CALL_CONST | TCG_CALL_PURE,
+DEF_HELPER_FLAGS_3(sel_flags, TCG_CALL_NO_RGSE,
                    i32, i32, i32, i32)
 DEF_HELPER_2(exception, void, env, i32)
 DEF_HELPER_1(wfi, void, env)
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [Qemu-devel] [PATCH v2 17/26] target-cris: rename helper flags
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
                   ` (15 preceding siblings ...)
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 16/26] target-arm: " Aurelien Jarno
@ 2012-10-09 19:56 ` Aurelien Jarno
  2012-10-10 10:02   ` Edgar E. Iglesias
  2012-10-10 10:05   ` Edgar E. Iglesias
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 18/26] target-i386: " Aurelien Jarno
                   ` (10 subsequent siblings)
  27 siblings, 2 replies; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 19:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Edgar E. Iglesias, Aurelien Jarno

Rename helper flags to the new ones. This is purely a mechanical change,
it's possible to use better flags by looking at the helpers.

Cc: Edgar E. Iglesias <edgar.iglesias@gmail.com>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 target-cris/helper.h |   18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/target-cris/helper.h b/target-cris/helper.h
index 99fb326..fe12083 100644
--- a/target-cris/helper.h
+++ b/target-cris/helper.h
@@ -10,19 +10,19 @@ DEF_HELPER_1(rfn, void, env);
 DEF_HELPER_3(movl_sreg_reg, void, env, i32, i32)
 DEF_HELPER_3(movl_reg_sreg, void, env, i32, i32)
 
-DEF_HELPER_FLAGS_1(lz, TCG_CALL_PURE, i32, i32);
-DEF_HELPER_FLAGS_4(btst, TCG_CALL_PURE, i32, env, i32, i32, i32);
+DEF_HELPER_FLAGS_1(lz, TCG_CALL_NO_SE, i32, i32);
+DEF_HELPER_FLAGS_4(btst, TCG_CALL_NO_SE, i32, env, i32, i32, i32);
 
-DEF_HELPER_FLAGS_4(evaluate_flags_muls, TCG_CALL_PURE, i32, env, i32, i32, i32)
-DEF_HELPER_FLAGS_4(evaluate_flags_mulu, TCG_CALL_PURE, i32, env, i32, i32, i32)
-DEF_HELPER_FLAGS_5(evaluate_flags_mcp, TCG_CALL_PURE, i32, env,
+DEF_HELPER_FLAGS_4(evaluate_flags_muls, TCG_CALL_NO_SE, i32, env, i32, i32, i32)
+DEF_HELPER_FLAGS_4(evaluate_flags_mulu, TCG_CALL_NO_SE, i32, env, i32, i32, i32)
+DEF_HELPER_FLAGS_5(evaluate_flags_mcp, TCG_CALL_NO_SE, i32, env,
                                                       i32, i32, i32, i32)
-DEF_HELPER_FLAGS_5(evaluate_flags_alu_4, TCG_CALL_PURE, i32, env,
+DEF_HELPER_FLAGS_5(evaluate_flags_alu_4, TCG_CALL_NO_SE, i32, env,
                                                         i32, i32, i32, i32)
-DEF_HELPER_FLAGS_5(evaluate_flags_sub_4, TCG_CALL_PURE, i32, env,
+DEF_HELPER_FLAGS_5(evaluate_flags_sub_4, TCG_CALL_NO_SE, i32, env,
                                                         i32, i32, i32, i32)
-DEF_HELPER_FLAGS_3(evaluate_flags_move_4, TCG_CALL_PURE, i32, env, i32, i32)
-DEF_HELPER_FLAGS_3(evaluate_flags_move_2, TCG_CALL_PURE, i32, env, i32, i32)
+DEF_HELPER_FLAGS_3(evaluate_flags_move_4, TCG_CALL_NO_SE, i32, env, i32, i32)
+DEF_HELPER_FLAGS_3(evaluate_flags_move_2, TCG_CALL_NO_SE, i32, env, i32, i32)
 DEF_HELPER_1(evaluate_flags, void, env)
 DEF_HELPER_1(top_evaluate_flags, void, env)
 
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [Qemu-devel] [PATCH v2 18/26] target-i386: rename helper flags
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
                   ` (16 preceding siblings ...)
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 17/26] target-cris: " Aurelien Jarno
@ 2012-10-09 19:56 ` Aurelien Jarno
  2012-10-10 17:15   ` Richard Henderson
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 19/26] target-microblaze: " Aurelien Jarno
                   ` (9 subsequent siblings)
  27 siblings, 1 reply; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 19:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Aurelien Jarno

Rename helper flags to the new ones. This is purely a mechanical change,
it's possible to use better flags by looking at the helpers.

Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 target-i386/helper.h |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/target-i386/helper.h b/target-i386/helper.h
index 93850ce..970fcd9 100644
--- a/target-i386/helper.h
+++ b/target-i386/helper.h
@@ -1,7 +1,7 @@
 #include "def-helper.h"
 
-DEF_HELPER_FLAGS_2(cc_compute_all, TCG_CALL_PURE, i32, env, int)
-DEF_HELPER_FLAGS_2(cc_compute_c, TCG_CALL_PURE, i32, env, int)
+DEF_HELPER_FLAGS_2(cc_compute_all, TCG_CALL_NO_SE, i32, env, int)
+DEF_HELPER_FLAGS_2(cc_compute_c, TCG_CALL_NO_SE, i32, env, int)
 
 DEF_HELPER_0(lock, void)
 DEF_HELPER_0(unlock, void)
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [Qemu-devel] [PATCH v2 19/26] target-microblaze: rename helper flags
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
                   ` (17 preceding siblings ...)
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 18/26] target-i386: " Aurelien Jarno
@ 2012-10-09 19:56 ` Aurelien Jarno
  2012-10-10 10:03   ` Edgar E. Iglesias
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 20/26] target-mips: " Aurelien Jarno
                   ` (8 subsequent siblings)
  27 siblings, 1 reply; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 19:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Edgar E. Iglesias, Aurelien Jarno

Rename helper flags to the new ones. This is purely a mechanical change,
it's possible to use better flags by looking at the helpers.

Cc: Edgar E. Iglesias <edgar.iglesias@gmail.com>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 target-microblaze/helper.h |    6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/target-microblaze/helper.h b/target-microblaze/helper.h
index a1a732c..6076a1b 100644
--- a/target-microblaze/helper.h
+++ b/target-microblaze/helper.h
@@ -2,10 +2,10 @@
 
 DEF_HELPER_2(raise_exception, void, env, i32)
 DEF_HELPER_1(debug, void, env)
-DEF_HELPER_FLAGS_3(carry, TCG_CALL_PURE | TCG_CALL_CONST, i32, i32, i32, i32)
+DEF_HELPER_FLAGS_3(carry, TCG_CALL_NO_RGSE, i32, i32, i32, i32)
 DEF_HELPER_2(cmp, i32, i32, i32)
 DEF_HELPER_2(cmpu, i32, i32, i32)
-DEF_HELPER_FLAGS_1(clz, TCG_CALL_PURE | TCG_CALL_CONST, i32, i32)
+DEF_HELPER_FLAGS_1(clz, TCG_CALL_NO_RGSE, i32, i32)
 
 DEF_HELPER_3(divs, i32, env, i32, i32)
 DEF_HELPER_3(divu, i32, env, i32, i32)
@@ -26,7 +26,7 @@ DEF_HELPER_3(fcmp_gt, i32, env, i32, i32)
 DEF_HELPER_3(fcmp_ne, i32, env, i32, i32)
 DEF_HELPER_3(fcmp_ge, i32, env, i32, i32)
 
-DEF_HELPER_FLAGS_2(pcmpbf, TCG_CALL_PURE | TCG_CALL_CONST, i32, i32, i32)
+DEF_HELPER_FLAGS_2(pcmpbf, TCG_CALL_NO_RGSE, i32, i32, i32)
 #if !defined(CONFIG_USER_ONLY)
 DEF_HELPER_2(mmu_read, i32, env, i32)
 DEF_HELPER_3(mmu_write, void, env, i32, i32)
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [Qemu-devel] [PATCH v2 20/26] target-mips: rename helper flags
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
                   ` (18 preceding siblings ...)
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 19/26] target-microblaze: " Aurelien Jarno
@ 2012-10-09 19:56 ` Aurelien Jarno
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 21/26] target-ppc: " Aurelien Jarno
                   ` (7 subsequent siblings)
  27 siblings, 0 replies; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 19:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Aurelien Jarno

Rename helper flags to the new ones. This is purely a mechanical change,
it's possible to use better flags by looking at the helpers.

Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 target-mips/helper.h |  106 +++++++++++++++++++++++++-------------------------
 1 file changed, 53 insertions(+), 53 deletions(-)

diff --git a/target-mips/helper.h b/target-mips/helper.h
index f35ed78..6ae8327 100644
--- a/target-mips/helper.h
+++ b/target-mips/helper.h
@@ -23,11 +23,11 @@ DEF_HELPER_4(scd, tl, env, tl, tl, int)
 #endif
 #endif
 
-DEF_HELPER_FLAGS_1(clo, TCG_CALL_CONST | TCG_CALL_PURE, tl, tl)
-DEF_HELPER_FLAGS_1(clz, TCG_CALL_CONST | TCG_CALL_PURE, tl, tl)
+DEF_HELPER_FLAGS_1(clo, TCG_CALL_NO_RGSE, tl, tl)
+DEF_HELPER_FLAGS_1(clz, TCG_CALL_NO_RGSE, tl, tl)
 #ifdef TARGET_MIPS64
-DEF_HELPER_FLAGS_1(dclo, TCG_CALL_CONST | TCG_CALL_PURE, tl, tl)
-DEF_HELPER_FLAGS_1(dclz, TCG_CALL_CONST | TCG_CALL_PURE, tl, tl)
+DEF_HELPER_FLAGS_1(dclo, TCG_CALL_NO_RGSE, tl, tl)
+DEF_HELPER_FLAGS_1(dclz, TCG_CALL_NO_RGSE, tl, tl)
 DEF_HELPER_3(dmult, void, env, tl, tl)
 DEF_HELPER_3(dmultu, void, env, tl, tl)
 #endif
@@ -304,62 +304,62 @@ DEF_HELPER_2(pmon, void, env, int)
 DEF_HELPER_1(wait, void, env)
 
 /* Loongson multimedia functions.  */
-DEF_HELPER_FLAGS_2(paddsh, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(paddush, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(paddh, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(paddw, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(paddsb, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(paddusb, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(paddb, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(paddsh, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(paddush, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(paddh, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(paddw, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(paddsb, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(paddusb, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(paddb, TCG_CALL_NO_RGSE, i64, i64, i64)
 
-DEF_HELPER_FLAGS_2(psubsh, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(psubush, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(psubh, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(psubw, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(psubsb, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(psubusb, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(psubb, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(psubsh, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(psubush, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(psubh, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(psubw, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(psubsb, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(psubusb, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(psubb, TCG_CALL_NO_RGSE, i64, i64, i64)
 
-DEF_HELPER_FLAGS_2(pshufh, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(packsswh, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(packsshb, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(packushb, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(pshufh, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(packsswh, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(packsshb, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(packushb, TCG_CALL_NO_RGSE, i64, i64, i64)
 
-DEF_HELPER_FLAGS_2(punpcklhw, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(punpckhhw, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(punpcklbh, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(punpckhbh, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(punpcklwd, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(punpckhwd, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(punpcklhw, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(punpckhhw, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(punpcklbh, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(punpckhbh, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(punpcklwd, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(punpckhwd, TCG_CALL_NO_RGSE, i64, i64, i64)
 
-DEF_HELPER_FLAGS_2(pavgh, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(pavgb, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(pmaxsh, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(pminsh, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(pmaxub, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(pminub, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(pavgh, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(pavgb, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(pmaxsh, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(pminsh, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(pmaxub, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(pminub, TCG_CALL_NO_RGSE, i64, i64, i64)
 
-DEF_HELPER_FLAGS_2(pcmpeqw, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(pcmpgtw, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(pcmpeqh, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(pcmpgth, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(pcmpeqb, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(pcmpgtb, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(pcmpeqw, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(pcmpgtw, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(pcmpeqh, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(pcmpgth, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(pcmpeqb, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(pcmpgtb, TCG_CALL_NO_RGSE, i64, i64, i64)
 
-DEF_HELPER_FLAGS_2(psllw, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(psllh, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(psrlw, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(psrlh, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(psraw, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(psrah, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(psllw, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(psllh, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(psrlw, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(psrlh, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(psraw, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(psrah, TCG_CALL_NO_RGSE, i64, i64, i64)
 
-DEF_HELPER_FLAGS_2(pmullh, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(pmulhh, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(pmulhuh, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(pmaddhw, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(pmullh, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(pmulhh, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(pmulhuh, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(pmaddhw, TCG_CALL_NO_RGSE, i64, i64, i64)
 
-DEF_HELPER_FLAGS_2(pasubub, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_1(biadd, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64)
-DEF_HELPER_FLAGS_1(pmovmskb, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64)
+DEF_HELPER_FLAGS_2(pasubub, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_1(biadd, TCG_CALL_NO_RGSE, i64, i64)
+DEF_HELPER_FLAGS_1(pmovmskb, TCG_CALL_NO_RGSE, i64, i64)
 
 #include "def-helper.h"
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [Qemu-devel] [PATCH v2 21/26] target-ppc: rename helper flags
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
                   ` (19 preceding siblings ...)
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 20/26] target-mips: " Aurelien Jarno
@ 2012-10-09 19:56 ` Aurelien Jarno
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 22/26] target-s390x: " Aurelien Jarno
                   ` (6 subsequent siblings)
  27 siblings, 0 replies; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 19:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alexander Graf, Aurelien Jarno

Rename helper flags to the new ones. This is purely a mechanical change,
it's possible to use better flags by looking at the helpers.

Cc: Alexander Graf <agraf@suse.de>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 target-ppc/helper.h |   38 +++++++++++++++++++-------------------
 1 file changed, 19 insertions(+), 19 deletions(-)

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index fd04c06..a8fe386 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -31,24 +31,24 @@ DEF_HELPER_2(icbi, void, env, tl)
 DEF_HELPER_5(lscbx, tl, env, tl, i32, i32, i32)
 
 #if defined(TARGET_PPC64)
-DEF_HELPER_FLAGS_2(mulhd, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(mulhdu, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(mulhd, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(mulhdu, TCG_CALL_NO_RGSE, i64, i64, i64)
 DEF_HELPER_3(mulldo, i64, env, i64, i64)
 #endif
 
-DEF_HELPER_FLAGS_1(cntlzw, TCG_CALL_CONST | TCG_CALL_PURE, tl, tl)
-DEF_HELPER_FLAGS_1(popcntb, TCG_CALL_CONST | TCG_CALL_PURE, tl, tl)
-DEF_HELPER_FLAGS_1(popcntw, TCG_CALL_CONST | TCG_CALL_PURE, tl, tl)
+DEF_HELPER_FLAGS_1(cntlzw, TCG_CALL_NO_RGSE, tl, tl)
+DEF_HELPER_FLAGS_1(popcntb, TCG_CALL_NO_RGSE, tl, tl)
+DEF_HELPER_FLAGS_1(popcntw, TCG_CALL_NO_RGSE, tl, tl)
 DEF_HELPER_3(sraw, tl, env, tl, tl)
 #if defined(TARGET_PPC64)
-DEF_HELPER_FLAGS_1(cntlzd, TCG_CALL_CONST | TCG_CALL_PURE, tl, tl)
-DEF_HELPER_FLAGS_1(popcntd, TCG_CALL_CONST | TCG_CALL_PURE, tl, tl)
+DEF_HELPER_FLAGS_1(cntlzd, TCG_CALL_NO_RGSE, tl, tl)
+DEF_HELPER_FLAGS_1(popcntd, TCG_CALL_NO_RGSE, tl, tl)
 DEF_HELPER_3(srad, tl, env, tl, tl)
 #endif
 
-DEF_HELPER_FLAGS_1(cntlsw32, TCG_CALL_CONST | TCG_CALL_PURE, i32, i32)
-DEF_HELPER_FLAGS_1(cntlzw32, TCG_CALL_CONST | TCG_CALL_PURE, i32, i32)
-DEF_HELPER_FLAGS_2(brinc, TCG_CALL_CONST | TCG_CALL_PURE, tl, tl, tl)
+DEF_HELPER_FLAGS_1(cntlsw32, TCG_CALL_NO_RGSE, i32, i32)
+DEF_HELPER_FLAGS_1(cntlzw32, TCG_CALL_NO_RGSE, i32, i32)
+DEF_HELPER_FLAGS_2(brinc, TCG_CALL_NO_RGSE, tl, tl, tl)
 
 DEF_HELPER_1(float_check_status, void, env)
 DEF_HELPER_1(reset_fpstatus, void, env)
@@ -345,25 +345,25 @@ DEF_HELPER_2(6xx_tlbd, void, env, tl)
 DEF_HELPER_2(6xx_tlbi, void, env, tl)
 DEF_HELPER_2(74xx_tlbd, void, env, tl)
 DEF_HELPER_2(74xx_tlbi, void, env, tl)
-DEF_HELPER_FLAGS_1(tlbia, TCG_CALL_CONST, void, env)
-DEF_HELPER_FLAGS_2(tlbie, TCG_CALL_CONST, void, env, tl)
+DEF_HELPER_FLAGS_1(tlbia, TCG_CALL_NO_RG, void, env)
+DEF_HELPER_FLAGS_2(tlbie, TCG_CALL_NO_RG, void, env, tl)
 #if defined(TARGET_PPC64)
-DEF_HELPER_FLAGS_3(store_slb, TCG_CALL_CONST, void, env, tl, tl)
+DEF_HELPER_FLAGS_3(store_slb, TCG_CALL_NO_RG, void, env, tl, tl)
 DEF_HELPER_2(load_slb_esid, tl, env, tl)
 DEF_HELPER_2(load_slb_vsid, tl, env, tl)
-DEF_HELPER_FLAGS_1(slbia, TCG_CALL_CONST, void, env)
-DEF_HELPER_FLAGS_2(slbie, TCG_CALL_CONST, void, env, tl)
+DEF_HELPER_FLAGS_1(slbia, TCG_CALL_NO_RG, void, env)
+DEF_HELPER_FLAGS_2(slbie, TCG_CALL_NO_RG, void, env, tl)
 #endif
-DEF_HELPER_FLAGS_2(load_sr, TCG_CALL_CONST, tl, env, tl);
-DEF_HELPER_FLAGS_3(store_sr, TCG_CALL_CONST, void, env, tl, tl)
+DEF_HELPER_FLAGS_2(load_sr, TCG_CALL_NO_RG, tl, env, tl);
+DEF_HELPER_FLAGS_3(store_sr, TCG_CALL_NO_RG, void, env, tl, tl)
 
-DEF_HELPER_FLAGS_1(602_mfrom, TCG_CALL_CONST | TCG_CALL_PURE, tl, tl)
+DEF_HELPER_FLAGS_1(602_mfrom, TCG_CALL_NO_RGSE, tl, tl)
 DEF_HELPER_1(msgsnd, void, tl)
 DEF_HELPER_2(msgclr, void, env, tl)
 #endif
 
 DEF_HELPER_4(dlmzb, tl, env, tl, tl, i32)
-DEF_HELPER_FLAGS_2(clcs, TCG_CALL_CONST | TCG_CALL_PURE, tl, env, i32)
+DEF_HELPER_FLAGS_2(clcs, TCG_CALL_NO_RGSE, tl, env, i32)
 #if !defined(CONFIG_USER_ONLY)
 DEF_HELPER_2(rac, tl, env, tl)
 #endif
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [Qemu-devel] [PATCH v2 22/26] target-s390x: rename helper flags
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
                   ` (20 preceding siblings ...)
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 21/26] target-ppc: " Aurelien Jarno
@ 2012-10-09 19:56 ` Aurelien Jarno
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 23/26] target-sh4: " Aurelien Jarno
                   ` (5 subsequent siblings)
  27 siblings, 0 replies; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 19:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Alexander Graf, Aurelien Jarno

Rename helper flags to the new ones. This is purely a mechanical change,
it's possible to use better flags by looking at the helpers.

Cc: Alexander Graf <agraf@suse.de>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 target-s390x/helper.h |   76 ++++++++++++++++++++++++-------------------------
 1 file changed, 38 insertions(+), 38 deletions(-)

diff --git a/target-s390x/helper.h b/target-s390x/helper.h
index 5419f37..91429ef 100644
--- a/target-s390x/helper.h
+++ b/target-s390x/helper.h
@@ -7,21 +7,21 @@ DEF_HELPER_4(xc, i32, env, i32, i64, i64)
 DEF_HELPER_4(mvc, void, env, i32, i64, i64)
 DEF_HELPER_4(clc, i32, env, i32, i64, i64)
 DEF_HELPER_3(mvcl, i32, env, i32, i32)
-DEF_HELPER_FLAGS_1(set_cc_comp_s32, TCG_CALL_PURE|TCG_CALL_CONST, i32, s32)
-DEF_HELPER_FLAGS_1(set_cc_comp_s64, TCG_CALL_PURE|TCG_CALL_CONST, i32, s64)
-DEF_HELPER_FLAGS_2(set_cc_icm, TCG_CALL_PURE|TCG_CALL_CONST, i32, i32, i32)
+DEF_HELPER_FLAGS_1(set_cc_comp_s32, TCG_CALL_NO_RGSE, i32, s32)
+DEF_HELPER_FLAGS_1(set_cc_comp_s64, TCG_CALL_NO_RGSE, i32, s64)
+DEF_HELPER_FLAGS_2(set_cc_icm, TCG_CALL_NO_RGSE, i32, i32, i32)
 DEF_HELPER_4(clm, i32, env, i32, i32, i64)
 DEF_HELPER_4(stcm, void, env, i32, i32, i64)
 DEF_HELPER_3(mlg, void, env, i32, i64)
 DEF_HELPER_3(dlg, void, env, i32, i64)
-DEF_HELPER_FLAGS_3(set_cc_add64, TCG_CALL_PURE|TCG_CALL_CONST, i32, s64, s64, s64)
-DEF_HELPER_FLAGS_3(set_cc_addu64, TCG_CALL_PURE|TCG_CALL_CONST, i32, i64, i64, i64)
-DEF_HELPER_FLAGS_3(set_cc_add32, TCG_CALL_PURE|TCG_CALL_CONST, i32, s32, s32, s32)
-DEF_HELPER_FLAGS_3(set_cc_addu32, TCG_CALL_PURE|TCG_CALL_CONST, i32, i32, i32, i32)
-DEF_HELPER_FLAGS_3(set_cc_sub64, TCG_CALL_PURE|TCG_CALL_CONST, i32, s64, s64, s64)
-DEF_HELPER_FLAGS_3(set_cc_subu64, TCG_CALL_PURE|TCG_CALL_CONST, i32, i64, i64, i64)
-DEF_HELPER_FLAGS_3(set_cc_sub32, TCG_CALL_PURE|TCG_CALL_CONST, i32, s32, s32, s32)
-DEF_HELPER_FLAGS_3(set_cc_subu32, TCG_CALL_PURE|TCG_CALL_CONST, i32, i32, i32, i32)
+DEF_HELPER_FLAGS_3(set_cc_add64, TCG_CALL_NO_RGSE, i32, s64, s64, s64)
+DEF_HELPER_FLAGS_3(set_cc_addu64, TCG_CALL_NO_RGSE, i32, i64, i64, i64)
+DEF_HELPER_FLAGS_3(set_cc_add32, TCG_CALL_NO_RGSE, i32, s32, s32, s32)
+DEF_HELPER_FLAGS_3(set_cc_addu32, TCG_CALL_NO_RGSE, i32, i32, i32, i32)
+DEF_HELPER_FLAGS_3(set_cc_sub64, TCG_CALL_NO_RGSE, i32, s64, s64, s64)
+DEF_HELPER_FLAGS_3(set_cc_subu64, TCG_CALL_NO_RGSE, i32, i64, i64, i64)
+DEF_HELPER_FLAGS_3(set_cc_sub32, TCG_CALL_NO_RGSE, i32, s32, s32, s32)
+DEF_HELPER_FLAGS_3(set_cc_subu32, TCG_CALL_NO_RGSE, i32, i32, i32, i32)
 DEF_HELPER_4(srst, i32, env, i32, i32, i32)
 DEF_HELPER_4(clst, i32, env, i32, i32, i32)
 DEF_HELPER_4(mvpg, void, env, i64, i64, i64)
@@ -30,15 +30,15 @@ DEF_HELPER_4(csg, i32, env, i32, i64, i32)
 DEF_HELPER_4(cdsg, i32, env, i32, i64, i32)
 DEF_HELPER_4(cs, i32, env, i32, i64, i32)
 DEF_HELPER_5(ex, i32, env, i32, i64, i64, i64)
-DEF_HELPER_FLAGS_1(abs_i32, TCG_CALL_PURE|TCG_CALL_CONST, i32, s32)
-DEF_HELPER_FLAGS_1(nabs_i32, TCG_CALL_PURE|TCG_CALL_CONST, s32, s32)
-DEF_HELPER_FLAGS_1(abs_i64, TCG_CALL_PURE|TCG_CALL_CONST, i64, s64)
-DEF_HELPER_FLAGS_1(nabs_i64, TCG_CALL_PURE|TCG_CALL_CONST, s64, s64)
+DEF_HELPER_FLAGS_1(abs_i32, TCG_CALL_NO_RGSE, i32, s32)
+DEF_HELPER_FLAGS_1(nabs_i32, TCG_CALL_NO_RGSE, s32, s32)
+DEF_HELPER_FLAGS_1(abs_i64, TCG_CALL_NO_RGSE, i64, s64)
+DEF_HELPER_FLAGS_1(nabs_i64, TCG_CALL_NO_RGSE, s64, s64)
 DEF_HELPER_4(stcmh, void, env, i32, i64, i32)
 DEF_HELPER_4(icmh, i32, env, i32, i64, i32)
 DEF_HELPER_3(ipm, void, env, i32, i32)
-DEF_HELPER_FLAGS_3(addc_u32, TCG_CALL_PURE|TCG_CALL_CONST, i32, i32, i32, i32)
-DEF_HELPER_FLAGS_3(set_cc_addc_u64, TCG_CALL_PURE|TCG_CALL_CONST, i32, i64, i64, i64)
+DEF_HELPER_FLAGS_3(addc_u32, TCG_CALL_NO_RGSE, i32, i32, i32, i32)
+DEF_HELPER_FLAGS_3(set_cc_addc_u64, TCG_CALL_NO_RGSE, i32, i64, i64, i64)
 DEF_HELPER_4(stam, void, env, i32, i64, i32)
 DEF_HELPER_4(lam, void, env, i32, i64, i32)
 DEF_HELPER_4(mvcle, i32, env, i32, i64, i32)
@@ -82,9 +82,9 @@ DEF_HELPER_3(seb, void, env, i32, i32)
 DEF_HELPER_3(sdb, i32, env, i32, i64)
 DEF_HELPER_3(mdb, void, env, i32, i64)
 DEF_HELPER_3(ddb, void, env, i32, i64)
-DEF_HELPER_FLAGS_3(cebr, TCG_CALL_PURE, i32, env, i32, i32)
-DEF_HELPER_FLAGS_3(cdbr, TCG_CALL_PURE, i32, env, i32, i32)
-DEF_HELPER_FLAGS_3(cxbr, TCG_CALL_PURE, i32, env, i32, i32)
+DEF_HELPER_FLAGS_3(cebr, TCG_CALL_NO_SE, i32, env, i32, i32)
+DEF_HELPER_FLAGS_3(cdbr, TCG_CALL_NO_SE, i32, env, i32, i32)
+DEF_HELPER_FLAGS_3(cxbr, TCG_CALL_NO_SE, i32, env, i32, i32)
 DEF_HELPER_4(cgebr, i32, env, i32, i32, i32)
 DEF_HELPER_4(cgdbr, i32, env, i32, i32, i32)
 DEF_HELPER_4(cgxbr, i32, env, i32, i32, i32)
@@ -104,12 +104,12 @@ DEF_HELPER_4(madbr, void, env, i32, i32, i32)
 DEF_HELPER_4(msdbr, void, env, i32, i32, i32)
 DEF_HELPER_3(ldeb, void, env, i32, i64)
 DEF_HELPER_3(lxdb, void, env, i32, i64)
-DEF_HELPER_FLAGS_3(tceb, TCG_CALL_PURE, i32, env, i32, i64)
-DEF_HELPER_FLAGS_3(tcdb, TCG_CALL_PURE, i32, env, i32, i64)
-DEF_HELPER_FLAGS_3(tcxb, TCG_CALL_PURE, i32, env, i32, i64)
+DEF_HELPER_FLAGS_3(tceb, TCG_CALL_NO_SE, i32, env, i32, i64)
+DEF_HELPER_FLAGS_3(tcdb, TCG_CALL_NO_SE, i32, env, i32, i64)
+DEF_HELPER_FLAGS_3(tcxb, TCG_CALL_NO_SE, i32, env, i32, i64)
 DEF_HELPER_3(flogr, i32, env, i32, i64)
 DEF_HELPER_3(sqdbr, void, env, i32, i32)
-DEF_HELPER_FLAGS_1(cvd, TCG_CALL_PURE|TCG_CALL_CONST, i64, s32)
+DEF_HELPER_FLAGS_1(cvd, TCG_CALL_NO_RGSE, i64, s32)
 DEF_HELPER_4(unpk, void, env, i32, i64, i64)
 DEF_HELPER_4(tr, void, env, i32, i64, i64)
 
@@ -117,36 +117,36 @@ DEF_HELPER_3(servc, i32, env, i32, i64)
 DEF_HELPER_4(diag, i64, env, i32, i64, i64)
 DEF_HELPER_3(load_psw, void, env, i64, i64)
 DEF_HELPER_1(program_interrupt, void, i32)
-DEF_HELPER_FLAGS_2(stidp, TCG_CALL_CONST, void, env, i64)
-DEF_HELPER_FLAGS_2(spx, TCG_CALL_CONST, void, env, i64)
-DEF_HELPER_FLAGS_1(sck, TCG_CALL_CONST, i32, i64)
+DEF_HELPER_FLAGS_2(stidp, TCG_CALL_NO_RG, void, env, i64)
+DEF_HELPER_FLAGS_2(spx, TCG_CALL_NO_RG, void, env, i64)
+DEF_HELPER_FLAGS_1(sck, TCG_CALL_NO_RG, i32, i64)
 DEF_HELPER_2(stck, i32, env, i64)
 DEF_HELPER_2(stcke, i32, env, i64)
-DEF_HELPER_FLAGS_2(sckc, TCG_CALL_CONST, void, env, i64)
-DEF_HELPER_FLAGS_2(stckc, TCG_CALL_CONST, void, env, i64)
-DEF_HELPER_FLAGS_2(spt, TCG_CALL_CONST, void, env, i64)
-DEF_HELPER_FLAGS_2(stpt, TCG_CALL_CONST, void, env, i64)
+DEF_HELPER_FLAGS_2(sckc, TCG_CALL_NO_RG, void, env, i64)
+DEF_HELPER_FLAGS_2(stckc, TCG_CALL_NO_RG, void, env, i64)
+DEF_HELPER_FLAGS_2(spt, TCG_CALL_NO_RG, void, env, i64)
+DEF_HELPER_FLAGS_2(stpt, TCG_CALL_NO_RG, void, env, i64)
 DEF_HELPER_4(stsi, i32, env, i64, i32, i32)
 DEF_HELPER_4(lctl, void, env, i32, i64, i32)
 DEF_HELPER_4(lctlg, void, env, i32, i64, i32)
 DEF_HELPER_4(stctl, void, env, i32, i64, i32)
 DEF_HELPER_4(stctg, void, env, i32, i64, i32)
-DEF_HELPER_FLAGS_2(tprot, TCG_CALL_CONST, i32, i64, i64)
-DEF_HELPER_FLAGS_2(iske, TCG_CALL_PURE|TCG_CALL_CONST, i64, env, i64)
-DEF_HELPER_FLAGS_3(sske, TCG_CALL_CONST, void, env, i32, i64)
-DEF_HELPER_FLAGS_3(rrbe, TCG_CALL_CONST, i32, env, i32, i64)
+DEF_HELPER_FLAGS_2(tprot, TCG_CALL_NO_RG, i32, i64, i64)
+DEF_HELPER_FLAGS_2(iske, TCG_CALL_NO_RGSE, i64, env, i64)
+DEF_HELPER_FLAGS_3(sske, TCG_CALL_NO_RG, void, env, i32, i64)
+DEF_HELPER_FLAGS_3(rrbe, TCG_CALL_NO_RG, i32, env, i32, i64)
 DEF_HELPER_3(csp, i32, env, i32, i32)
 DEF_HELPER_4(mvcs, i32, env, i64, i64, i64)
 DEF_HELPER_4(mvcp, i32, env, i64, i64, i64)
 DEF_HELPER_4(sigp, i32, env, i64, i32, i64)
 DEF_HELPER_2(sacf, void, env, i64)
-DEF_HELPER_FLAGS_3(ipte, TCG_CALL_CONST, void, env, i64, i64)
-DEF_HELPER_FLAGS_1(ptlb, TCG_CALL_CONST, void, env)
+DEF_HELPER_FLAGS_3(ipte, TCG_CALL_NO_RG, void, env, i64, i64)
+DEF_HELPER_FLAGS_1(ptlb, TCG_CALL_NO_RG, void, env)
 DEF_HELPER_3(lra, i32, env, i64, i32)
 DEF_HELPER_3(stura, void, env, i64, i32)
 DEF_HELPER_3(cksm, void, env, i32, i32)
 
-DEF_HELPER_FLAGS_5(calc_cc, TCG_CALL_PURE|TCG_CALL_CONST,
+DEF_HELPER_FLAGS_5(calc_cc, TCG_CALL_NO_RGSE,
                    i32, env, i32, i64, i64, i64)
 
 #include "def-helper.h"
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [Qemu-devel] [PATCH v2 23/26] target-sh4: rename helper flags
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
                   ` (21 preceding siblings ...)
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 22/26] target-s390x: " Aurelien Jarno
@ 2012-10-09 19:56 ` Aurelien Jarno
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 24/26] target-sparc: " Aurelien Jarno
                   ` (4 subsequent siblings)
  27 siblings, 0 replies; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 19:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Aurelien Jarno

Rename helper flags to the new ones. This is purely a mechanical change,
it's possible to use better flags by looking at the helpers.

Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 target-sh4/helper.h |    6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/target-sh4/helper.h b/target-sh4/helper.h
index 6c1a47d..7a469cd 100644
--- a/target-sh4/helper.h
+++ b/target-sh4/helper.h
@@ -19,8 +19,8 @@ DEF_HELPER_3(macw, void, env, i32, i32)
 
 DEF_HELPER_2(ld_fpscr, void, env, i32)
 
-DEF_HELPER_FLAGS_1(fabs_FT, TCG_CALL_CONST | TCG_CALL_PURE, f32, f32)
-DEF_HELPER_FLAGS_1(fabs_DT, TCG_CALL_CONST | TCG_CALL_PURE, f64, f64)
+DEF_HELPER_FLAGS_1(fabs_FT, TCG_CALL_NO_RGSE, f32, f32)
+DEF_HELPER_FLAGS_1(fabs_DT, TCG_CALL_NO_RGSE, f64, f64)
 DEF_HELPER_3(fadd_FT, f32, env, f32, f32)
 DEF_HELPER_3(fadd_DT, f64, env, f64, f64)
 DEF_HELPER_2(fcnvsd_FT_DT, f64, env, f32)
@@ -37,7 +37,7 @@ DEF_HELPER_2(float_DT, f64, env, i32)
 DEF_HELPER_4(fmac_FT, f32, env, f32, f32, f32)
 DEF_HELPER_3(fmul_FT, f32, env, f32, f32)
 DEF_HELPER_3(fmul_DT, f64, env, f64, f64)
-DEF_HELPER_FLAGS_1(fneg_T, TCG_CALL_CONST | TCG_CALL_PURE, f32, f32)
+DEF_HELPER_FLAGS_1(fneg_T, TCG_CALL_NO_RGSE, f32, f32)
 DEF_HELPER_3(fsub_FT, f32, env, f32, f32)
 DEF_HELPER_3(fsub_DT, f64, env, f64, f64)
 DEF_HELPER_2(fsqrt_FT, f32, env, f32)
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [Qemu-devel] [PATCH v2 24/26] target-sparc: rename helper flags
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
                   ` (22 preceding siblings ...)
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 23/26] target-sh4: " Aurelien Jarno
@ 2012-10-09 19:56 ` Aurelien Jarno
  2012-10-13  8:57   ` Blue Swirl
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 25/26] target-xtensa: " Aurelien Jarno
                   ` (3 subsequent siblings)
  27 siblings, 1 reply; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 19:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Blue Swirl, Aurelien Jarno

Rename helper flags to the new ones. This is purely a mechanical change,
it's possible to use better flags by looking at the helpers.

Cc: Blue Swirl <blauwirbel@gmail.com>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 target-sparc/helper.h |   50 ++++++++++++++++++++++++-------------------------
 1 file changed, 25 insertions(+), 25 deletions(-)

diff --git a/target-sparc/helper.h b/target-sparc/helper.h
index e1ae3c7..90cc91d 100644
--- a/target-sparc/helper.h
+++ b/target-sparc/helper.h
@@ -16,7 +16,7 @@ DEF_HELPER_1(rdccr, tl, env)
 DEF_HELPER_2(wrccr, void, env, tl)
 DEF_HELPER_1(rdcwp, tl, env)
 DEF_HELPER_2(wrcwp, void, env, tl)
-DEF_HELPER_FLAGS_2(array8, TCG_CALL_CONST | TCG_CALL_PURE, tl, tl, tl)
+DEF_HELPER_FLAGS_2(array8, TCG_CALL_NO_RGSE, tl, tl, tl)
 DEF_HELPER_1(popc, tl, tl)
 DEF_HELPER_4(ldda_asi, void, env, tl, int, int)
 DEF_HELPER_5(ldf_asi, void, env, tl, int, int, int)
@@ -51,7 +51,7 @@ DEF_HELPER_5(ld_asi, i64, env, tl, int, int, int)
 DEF_HELPER_5(st_asi, void, env, tl, i64, int, int)
 #endif
 DEF_HELPER_2(ldfsr, void, env, i32)
-DEF_HELPER_FLAGS_1(fabss, TCG_CALL_CONST | TCG_CALL_PURE, f32, f32)
+DEF_HELPER_FLAGS_1(fabss, TCG_CALL_NO_RGSE, f32, f32)
 DEF_HELPER_2(fsqrts, f32, env, f32)
 DEF_HELPER_2(fsqrtd, f64, env, f64)
 DEF_HELPER_3(fcmps, void, env, f32, f32)
@@ -63,7 +63,7 @@ DEF_HELPER_1(fcmpq, void, env)
 DEF_HELPER_1(fcmpeq, void, env)
 #ifdef TARGET_SPARC64
 DEF_HELPER_2(ldxfsr, void, env, i64)
-DEF_HELPER_FLAGS_1(fabsd, TCG_CALL_CONST | TCG_CALL_PURE, f64, f64)
+DEF_HELPER_FLAGS_1(fabsd, TCG_CALL_NO_RGSE, f64, f64)
 DEF_HELPER_3(fcmps_fcc1, void, env, f32, f32)
 DEF_HELPER_3(fcmps_fcc2, void, env, f32, f32)
 DEF_HELPER_3(fcmps_fcc3, void, env, f32, f32)
@@ -104,14 +104,14 @@ DEF_HELPER_3(fdivs, f32, env, f32, f32)
 DEF_HELPER_3(fsmuld, f64, env, f32, f32)
 DEF_HELPER_3(fdmulq, void, env, f64, f64);
 
-DEF_HELPER_FLAGS_1(fnegs, TCG_CALL_CONST | TCG_CALL_PURE, f32, f32)
+DEF_HELPER_FLAGS_1(fnegs, TCG_CALL_NO_RGSE, f32, f32)
 DEF_HELPER_2(fitod, f64, env, s32)
 DEF_HELPER_2(fitoq, void, env, s32)
 
 DEF_HELPER_2(fitos, f32, env, s32)
 
 #ifdef TARGET_SPARC64
-DEF_HELPER_FLAGS_1(fnegd, TCG_CALL_CONST | TCG_CALL_PURE, f64, f64)
+DEF_HELPER_FLAGS_1(fnegd, TCG_CALL_NO_RGSE, f64, f64)
 DEF_HELPER_1(fnegq, void, env)
 DEF_HELPER_2(fxtos, f32, env, s64)
 DEF_HELPER_2(fxtod, f64, env, s64)
@@ -131,36 +131,36 @@ DEF_HELPER_2(fstox, s64, env, f32)
 DEF_HELPER_2(fdtox, s64, env, f64)
 DEF_HELPER_1(fqtox, s64, env)
 
-DEF_HELPER_FLAGS_2(fpmerge, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(fmul8x16, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(fmul8x16al, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(fmul8x16au, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(fmul8sux16, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(fmul8ulx16, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(fmuld8sux16, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(fmuld8ulx16, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_2(fexpand, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
-DEF_HELPER_FLAGS_3(pdist, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64, i64)
-DEF_HELPER_FLAGS_2(fpack16, TCG_CALL_CONST | TCG_CALL_PURE, i32, i64, i64)
-DEF_HELPER_FLAGS_3(fpack32, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64, i64)
-DEF_HELPER_FLAGS_2(fpackfix, TCG_CALL_CONST | TCG_CALL_PURE, i32, i64, i64)
-DEF_HELPER_FLAGS_3(bshuffle, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64, i64)
+DEF_HELPER_FLAGS_2(fpmerge, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(fmul8x16, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(fmul8x16al, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(fmul8x16au, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(fmul8sux16, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(fmul8ulx16, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(fmuld8sux16, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(fmuld8ulx16, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_2(fexpand, TCG_CALL_NO_RGSE, i64, i64, i64)
+DEF_HELPER_FLAGS_3(pdist, TCG_CALL_NO_RGSE, i64, i64, i64, i64)
+DEF_HELPER_FLAGS_2(fpack16, TCG_CALL_NO_RGSE, i32, i64, i64)
+DEF_HELPER_FLAGS_3(fpack32, TCG_CALL_NO_RGSE, i64, i64, i64, i64)
+DEF_HELPER_FLAGS_2(fpackfix, TCG_CALL_NO_RGSE, i32, i64, i64)
+DEF_HELPER_FLAGS_3(bshuffle, TCG_CALL_NO_RGSE, i64, i64, i64, i64)
 #define VIS_HELPER(name)                                                 \
-    DEF_HELPER_FLAGS_2(f ## name ## 16, TCG_CALL_CONST | TCG_CALL_PURE,  \
+    DEF_HELPER_FLAGS_2(f ## name ## 16, TCG_CALL_NO_RGSE,  \
                        i64, i64, i64)                                    \
-    DEF_HELPER_FLAGS_2(f ## name ## 16s, TCG_CALL_CONST | TCG_CALL_PURE, \
+    DEF_HELPER_FLAGS_2(f ## name ## 16s, TCG_CALL_NO_RGSE, \
                        i32, i32, i32)                                    \
-    DEF_HELPER_FLAGS_2(f ## name ## 32, TCG_CALL_CONST | TCG_CALL_PURE,  \
+    DEF_HELPER_FLAGS_2(f ## name ## 32, TCG_CALL_NO_RGSE,  \
                        i64, i64, i64)                                    \
-    DEF_HELPER_FLAGS_2(f ## name ## 32s, TCG_CALL_CONST | TCG_CALL_PURE, \
+    DEF_HELPER_FLAGS_2(f ## name ## 32s, TCG_CALL_NO_RGSE, \
                        i32, i32, i32)
 
 VIS_HELPER(padd);
 VIS_HELPER(psub);
 #define VIS_CMPHELPER(name)                                              \
-    DEF_HELPER_FLAGS_2(f##name##16, TCG_CALL_CONST | TCG_CALL_PURE,      \
+    DEF_HELPER_FLAGS_2(f##name##16, TCG_CALL_NO_RGSE,      \
                        i64, i64, i64)                                    \
-    DEF_HELPER_FLAGS_2(f##name##32, TCG_CALL_CONST | TCG_CALL_PURE,      \
+    DEF_HELPER_FLAGS_2(f##name##32, TCG_CALL_NO_RGSE,      \
                        i64, i64, i64)
 VIS_CMPHELPER(cmpgt);
 VIS_CMPHELPER(cmpeq);
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [Qemu-devel] [PATCH v2 25/26] target-xtensa: rename helper flags
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
                   ` (23 preceding siblings ...)
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 24/26] target-sparc: " Aurelien Jarno
@ 2012-10-09 19:56 ` Aurelien Jarno
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 26/26] tcg: remove compatiblity call flags Aurelien Jarno
                   ` (2 subsequent siblings)
  27 siblings, 0 replies; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 19:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Max Filippov, Aurelien Jarno

Rename helper flags to the new ones. This is purely a mechanical change,
it's possible to use better flags by looking at the helpers.

Cc: Max Filippov <jcmvbkbc@gmail.com>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 target-xtensa/helper.h |   16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/target-xtensa/helper.h b/target-xtensa/helper.h
index 4cc0088..38ac002 100644
--- a/target-xtensa/helper.h
+++ b/target-xtensa/helper.h
@@ -5,8 +5,8 @@ DEF_HELPER_3(exception_cause, noreturn, env, i32, i32)
 DEF_HELPER_4(exception_cause_vaddr, noreturn, env, i32, i32, i32)
 DEF_HELPER_3(debug_exception, noreturn, env, i32, i32)
 
-DEF_HELPER_FLAGS_1(nsa, TCG_CALL_CONST | TCG_CALL_PURE, i32, i32)
-DEF_HELPER_FLAGS_1(nsau, TCG_CALL_CONST | TCG_CALL_PURE, i32, i32)
+DEF_HELPER_FLAGS_1(nsa, TCG_CALL_NO_RGSE, i32, i32)
+DEF_HELPER_FLAGS_1(nsau, TCG_CALL_NO_RGSE, i32, i32)
 DEF_HELPER_2(wsr_windowbase, void, env, i32)
 DEF_HELPER_4(entry, void, env, i32, i32, i32)
 DEF_HELPER_2(retw, i32, env, i32)
@@ -25,8 +25,8 @@ DEF_HELPER_2(advance_ccount, void, env, i32)
 DEF_HELPER_1(check_interrupts, void, env)
 
 DEF_HELPER_2(wsr_rasid, void, env, i32)
-DEF_HELPER_FLAGS_3(rtlb0, TCG_CALL_CONST | TCG_CALL_PURE, i32, env, i32, i32)
-DEF_HELPER_FLAGS_3(rtlb1, TCG_CALL_CONST | TCG_CALL_PURE, i32, env, i32, i32)
+DEF_HELPER_FLAGS_3(rtlb0, TCG_CALL_NO_RGSE, i32, env, i32, i32)
+DEF_HELPER_FLAGS_3(rtlb1, TCG_CALL_NO_RGSE, i32, env, i32, i32)
 DEF_HELPER_3(itlb, void, env, i32, i32)
 DEF_HELPER_3(ptlb, i32, env, i32, i32)
 DEF_HELPER_4(wtlb, void, env, i32, i32, i32)
@@ -37,15 +37,15 @@ DEF_HELPER_3(wsr_dbreaka, void, env, i32, i32)
 DEF_HELPER_3(wsr_dbreakc, void, env, i32, i32)
 
 DEF_HELPER_2(wur_fcr, void, env, i32)
-DEF_HELPER_FLAGS_1(abs_s, TCG_CALL_CONST | TCG_CALL_PURE, f32, f32)
-DEF_HELPER_FLAGS_1(neg_s, TCG_CALL_CONST | TCG_CALL_PURE, f32, f32)
+DEF_HELPER_FLAGS_1(abs_s, TCG_CALL_NO_RGSE, f32, f32)
+DEF_HELPER_FLAGS_1(neg_s, TCG_CALL_NO_RGSE, f32, f32)
 DEF_HELPER_3(add_s, f32, env, f32, f32)
 DEF_HELPER_3(sub_s, f32, env, f32, f32)
 DEF_HELPER_3(mul_s, f32, env, f32, f32)
 DEF_HELPER_4(madd_s, f32, env, f32, f32, f32)
 DEF_HELPER_4(msub_s, f32, env, f32, f32, f32)
-DEF_HELPER_FLAGS_3(ftoi, TCG_CALL_CONST | TCG_CALL_PURE, i32, f32, i32, i32)
-DEF_HELPER_FLAGS_3(ftoui, TCG_CALL_CONST | TCG_CALL_PURE, i32, f32, i32, i32)
+DEF_HELPER_FLAGS_3(ftoi, TCG_CALL_NO_RGSE, i32, f32, i32, i32)
+DEF_HELPER_FLAGS_3(ftoui, TCG_CALL_NO_RGSE, i32, f32, i32, i32)
 DEF_HELPER_3(itof, f32, env, i32, i32)
 DEF_HELPER_3(uitof, f32, env, i32, i32)
 
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [Qemu-devel] [PATCH v2 26/26] tcg: remove compatiblity call flags
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
                   ` (24 preceding siblings ...)
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 25/26] target-xtensa: " Aurelien Jarno
@ 2012-10-09 19:56 ` Aurelien Jarno
  2012-10-10 17:16   ` Richard Henderson
  2012-10-10  6:59 ` [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Paolo Bonzini
  2012-10-10 17:24 ` Richard Henderson
  27 siblings, 1 reply; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 19:56 UTC (permalink / raw)
  To: qemu-devel; +Cc: Aurelien Jarno

Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 tcg/tcg.h |    4 ----
 1 file changed, 4 deletions(-)

diff --git a/tcg/tcg.h b/tcg/tcg.h
index a985b26..9c7ad2c 100644
--- a/tcg/tcg.h
+++ b/tcg/tcg.h
@@ -268,10 +268,6 @@ typedef int TCGv_i64;
 #define TCG_CALL_NO_RGSE        (TCG_CALL_NO_RG | TCG_CALL_NO_SE)
 #define TCG_CALL_NO_WGSE        (TCG_CALL_NO_WG | TCG_CALL_NO_SE)
 
-/* compatibility call flags, they should be eventually be removed */
-#define TCG_CALL_PURE           TCG_CALL_NO_SIDE_EFFECTS
-#define TCG_CALL_CONST          TCG_CALL_NO_READ_GLOBALS
-
 /* used to align parameters */
 #define TCG_CALL_DUMMY_TCGV     MAKE_TCGV_I32(-1)
 #define TCG_CALL_DUMMY_ARG      ((TCGArg)(-1))
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* Re: [Qemu-devel] [PATCH v2 14/26] tcg: rework TCG helper flags
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 14/26] tcg: rework TCG helper flags Aurelien Jarno
@ 2012-10-09 20:04   ` Peter Maydell
  2012-10-09 20:24     ` Aurelien Jarno
  2012-10-10 17:11   ` Richard Henderson
  1 sibling, 1 reply; 54+ messages in thread
From: Peter Maydell @ 2012-10-09 20:04 UTC (permalink / raw)
  To: Aurelien Jarno; +Cc: qemu-devel

On 9 October 2012 20:56, Aurelien Jarno <aurelien@aurel32.net> wrote:
> +#define TCG_CALL_NO_RGSE        (TCG_CALL_NO_RG | TCG_CALL_NO_SE)

When I first read this (in the target-arm patch) I assumed it had
to be a typo for NO_REGS...

(alas I can't think of a better name)

-- PMM

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [Qemu-devel] [PATCH v2 14/26] tcg: rework TCG helper flags
  2012-10-09 20:04   ` Peter Maydell
@ 2012-10-09 20:24     ` Aurelien Jarno
  2012-10-10 17:12       ` Richard Henderson
  0 siblings, 1 reply; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-09 20:24 UTC (permalink / raw)
  To: Peter Maydell; +Cc: qemu-devel

On Tue, Oct 09, 2012 at 09:04:24PM +0100, Peter Maydell wrote:
> On 9 October 2012 20:56, Aurelien Jarno <aurelien@aurel32.net> wrote:
> > +#define TCG_CALL_NO_RGSE        (TCG_CALL_NO_RG | TCG_CALL_NO_SE)
> 
> When I first read this (in the target-arm patch) I assumed it had
> to be a typo for NO_REGS...
> 
> (alas I can't think of a better name)
> 

The idea is to provide short names, so that the definitions in helper.h
do not get more than 80 characters, and thus do not become multi-lines.
I am opened to suggestions there.

Maybe NO_RG_SE?

-- 
Aurelien Jarno                          GPG: 1024D/F1BCDB73
aurelien@aurel32.net                 http://www.aurel32.net

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
                   ` (25 preceding siblings ...)
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 26/26] tcg: remove compatiblity call flags Aurelien Jarno
@ 2012-10-10  6:59 ` Paolo Bonzini
  2012-10-10  7:42   ` Aurelien Jarno
  2012-10-10 17:24 ` Richard Henderson
  27 siblings, 1 reply; 54+ messages in thread
From: Paolo Bonzini @ 2012-10-10  6:59 UTC (permalink / raw)
  To: Aurelien Jarno; +Cc: qemu-devel

Il 09/10/2012 21:55, Aurelien Jarno ha scritto:
> This patch series rework the liveness analysis and register allocator
> in order to generate more optimized code, by avoiding a lot of move
> instructions. I have measured a 9% performance improvement in user mode
> and 4% in system mode.
> 
> The idea behind this patch series is to free registers as soon as the
> temps are not used anymore instead of waiting for a basic block end or
> an op with side effects.

Would it make any sense to express the saves as real TCG ops?  This
would have a couple of advantages:

- more copy propagation and dead code elimination.  Something like this:

        mov_i64 cc_dst,rax

right now is compiled as follows:

0x5555557ac37a:  mov    %rbp,(%r14)          # spill rax
0x5555557ac381:  mov    (%r14),%rbp          # load rax from memory
0x5555557ac38f:  mov    %rbp,0x98(%r14)      # spill cc_dst to memory

while expressing spills as TCG ops would turn the above into effectively

        st_i64  rax, env, $0x98

- constant propagation using constraints.  This would let tcg-i386 use
effectively the mov $imm,(addr) instruction for spills of known-constant
values.

Paolo

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator
  2012-10-10  6:59 ` [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Paolo Bonzini
@ 2012-10-10  7:42   ` Aurelien Jarno
  2012-10-10  7:49     ` Paolo Bonzini
  2012-10-10 17:04     ` Richard Henderson
  0 siblings, 2 replies; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-10  7:42 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Wed, Oct 10, 2012 at 08:59:43AM +0200, Paolo Bonzini wrote:
> Il 09/10/2012 21:55, Aurelien Jarno ha scritto:
> > This patch series rework the liveness analysis and register allocator
> > in order to generate more optimized code, by avoiding a lot of move
> > instructions. I have measured a 9% performance improvement in user mode
> > and 4% in system mode.
> > 
> > The idea behind this patch series is to free registers as soon as the
> > temps are not used anymore instead of waiting for a basic block end or
> > an op with side effects.
> 
> Would it make any sense to express the saves as real TCG ops?  This
> would have a couple of advantages:

It depends what you mean by that. Spills are decided more or less at the
last moment (no free registers available, clobbered registers in a 
function call). If it is about calling the same code in tcg-target.c for
register spills than for TCG ops, it's doable, though it might be easier
to provide a spill immediate function.

If it's about inserting them in the TCG stream, as it is done at the
last step, ie after copy propagation and dead code elimination, it's not
really useful anymore.

> - more copy propagation and dead code elimination.  Something like this:
> 
>         mov_i64 cc_dst,rax
> 
> right now is compiled as follows:
> 
> 0x5555557ac37a:  mov    %rbp,(%r14)          # spill rax
> 0x5555557ac381:  mov    (%r14),%rbp          # load rax from memory
> 0x5555557ac38f:  mov    %rbp,0x98(%r14)      # spill cc_dst to memory

I am surprised by this kind of code, and I think there's a bug somewhere
in TCG. With the current TCG code, given rax is not dead, it should be
spilled only after the move of cc_dst to memory, and thus second line is
not supposed to be emitted. With this patch series applied the second 
line should simply be removed.

> while expressing spills as TCG ops would turn the above into effectively
> 
>         st_i64  rax, env, $0x98

Which is basically the last assembly line of your example above.

> - constant propagation using constraints.  This would let tcg-i386 use
> effectively the mov $imm,(addr) instruction for spills of known-constant
> values.

This is indeed something quite frustrating and even more when the
same immediate value is loaded multiple time. One way to do that would
be to provide an optional tcg_out_st_immediate().

-- 
Aurelien Jarno                          GPG: 1024D/F1BCDB73
aurelien@aurel32.net                 http://www.aurel32.net

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator
  2012-10-10  7:42   ` Aurelien Jarno
@ 2012-10-10  7:49     ` Paolo Bonzini
  2012-10-10  8:24       ` Aurelien Jarno
  2012-10-10 17:04     ` Richard Henderson
  1 sibling, 1 reply; 54+ messages in thread
From: Paolo Bonzini @ 2012-10-10  7:49 UTC (permalink / raw)
  To: Aurelien Jarno; +Cc: qemu-devel

Il 10/10/2012 09:42, Aurelien Jarno ha scritto:
> On Wed, Oct 10, 2012 at 08:59:43AM +0200, Paolo Bonzini wrote:
>> Il 09/10/2012 21:55, Aurelien Jarno ha scritto:
>>> This patch series rework the liveness analysis and register allocator
>>> in order to generate more optimized code, by avoiding a lot of move
>>> instructions. I have measured a 9% performance improvement in user mode
>>> and 4% in system mode.
>>>
>>> The idea behind this patch series is to free registers as soon as the
>>> temps are not used anymore instead of waiting for a basic block end or
>>> an op with side effects.
>>
>> Would it make any sense to express the saves as real TCG ops?  This
>> would have a couple of advantages:
> 
> It depends what you mean by that. Spills are decided more or less at the
> last moment (no free registers available, clobbered registers in a 
> function call).

I'm not talking of spills; only saves of dead globals and local temps.
These can be computed before the optimizer runs, right?

> If it's about inserting them in the TCG stream, as it is done at the
> last step, ie after copy propagation and dead code elimination, it's not
> really useful anymore.
> 
>> - more copy propagation and dead code elimination.  Something like this:
>>
>>         mov_i64 cc_dst,rax
>>
>> right now is compiled as follows:
>>
>> 0x5555557ac37a:  mov    %rbp,(%r14)          # spill rax
>> 0x5555557ac381:  mov    (%r14),%rbp          # load rax from memory
>> 0x5555557ac38f:  mov    %rbp,0x98(%r14)      # spill cc_dst to memory
> 
> I am surprised by this kind of code, and I think there's a bug somewhere
> in TCG. With the current TCG code, given rax is not dead, it should be
> spilled only after the move of cc_dst to memory, and thus second line is
> not supposed to be emitted. With this patch series applied the second 
> line should simply be removed.

Note that the above was without your series.

>> - constant propagation using constraints.  This would let tcg-i386 use
>> effectively the mov $imm,(addr) instruction for spills of known-constant
>> values.
> 
> This is indeed something quite frustrating and even more when the
> same immediate value is loaded multiple time. One way to do that would
> be to provide an optional tcg_out_st_immediate().

Yes, that would be simple.

Paolo

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator
  2012-10-10  7:49     ` Paolo Bonzini
@ 2012-10-10  8:24       ` Aurelien Jarno
  0 siblings, 0 replies; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-10  8:24 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel

On Wed, Oct 10, 2012 at 09:49:53AM +0200, Paolo Bonzini wrote:
> Il 10/10/2012 09:42, Aurelien Jarno ha scritto:
> > On Wed, Oct 10, 2012 at 08:59:43AM +0200, Paolo Bonzini wrote:
> >> Il 09/10/2012 21:55, Aurelien Jarno ha scritto:
> >>> This patch series rework the liveness analysis and register allocator
> >>> in order to generate more optimized code, by avoiding a lot of move
> >>> instructions. I have measured a 9% performance improvement in user mode
> >>> and 4% in system mode.
> >>>
> >>> The idea behind this patch series is to free registers as soon as the
> >>> temps are not used anymore instead of waiting for a basic block end or
> >>> an op with side effects.
> >>
> >> Would it make any sense to express the saves as real TCG ops?  This
> >> would have a couple of advantages:
> > 
> > It depends what you mean by that. Spills are decided more or less at the
> > last moment (no free registers available, clobbered registers in a 
> > function call).
> 
> I'm not talking of spills; only saves of dead globals and local temps.
> These can be computed before the optimizer runs, right?

It's something that is doable, though it might not be that easy to
implement. Such an op should also mark the reg as mem_coherent, and for
that should associate the address passed to the st with the
corresponding global. Failing to do so means that the register might be
saved twice in case of register spill or a call clobber. The second
problem is to insert some ops in the TCG stream, which is not difficult
to solve, but might be more difficult to solve in an optimized way.

That said, I am not sure it will really help, besides providing a way to
save immediates directly to memory.

> > If it's about inserting them in the TCG stream, as it is done at the
> > last step, ie after copy propagation and dead code elimination, it's not
> > really useful anymore.
> > 
> >> - more copy propagation and dead code elimination.  Something like this:
> >>
> >>         mov_i64 cc_dst,rax
> >>
> >> right now is compiled as follows:
> >>
> >> 0x5555557ac37a:  mov    %rbp,(%r14)          # spill rax
> >> 0x5555557ac381:  mov    (%r14),%rbp          # load rax from memory
> >> 0x5555557ac38f:  mov    %rbp,0x98(%r14)      # spill cc_dst to memory
> > 
> > I am surprised by this kind of code, and I think there's a bug somewhere
> > in TCG. With the current TCG code, given rax is not dead, it should be
> > spilled only after the move of cc_dst to memory, and thus second line is
> > not supposed to be emitted. With this patch series applied the second 
> > line should simply be removed.
> 
> Note that the above was without your series.

Do you still have the corresponding log, or at least the TCG code and
the corresponding assembly code for this TB?

> >> - constant propagation using constraints.  This would let tcg-i386 use
> >> effectively the mov $imm,(addr) instruction for spills of known-constant
> >> values.
> > 
> > This is indeed something quite frustrating and even more when the
> > same immediate value is loaded multiple time. One way to do that would
> > be to provide an optional tcg_out_st_immediate().
> 
> Yes, that would be simple.
> 

At some point we should still try to avoid loading the same constant
multiple time. If an op is not able to take an immediate, this immediate
is going to be loaded to a register. I think it is better to reuse this
register instead of passing the same immediate to the op.

-- 
Aurelien Jarno	                        GPG: 1024D/F1BCDB73
aurelien@aurel32.net                 http://www.aurel32.net

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [Qemu-devel] [PATCH v2 17/26] target-cris: rename helper flags
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 17/26] target-cris: " Aurelien Jarno
@ 2012-10-10 10:02   ` Edgar E. Iglesias
  2012-10-10 10:05   ` Edgar E. Iglesias
  1 sibling, 0 replies; 54+ messages in thread
From: Edgar E. Iglesias @ 2012-10-10 10:02 UTC (permalink / raw)
  To: Aurelien Jarno; +Cc: qemu-devel

On Tue, Oct 09, 2012 at 09:56:15PM +0200, Aurelien Jarno wrote:
> Rename helper flags to the new ones. This is purely a mechanical change,
> it's possible to use better flags by looking at the helpers.
> 
> Cc: Edgar E. Iglesias <edgar.iglesias@gmail.com>
> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>

Looks good, thanks!

Acked-by: Edgar E. Iglesias <edgar.iglesias@gmail.com>


> ---
>  target-cris/helper.h |   18 +++++++++---------
>  1 file changed, 9 insertions(+), 9 deletions(-)
> 
> diff --git a/target-cris/helper.h b/target-cris/helper.h
> index 99fb326..fe12083 100644
> --- a/target-cris/helper.h
> +++ b/target-cris/helper.h
> @@ -10,19 +10,19 @@ DEF_HELPER_1(rfn, void, env);
>  DEF_HELPER_3(movl_sreg_reg, void, env, i32, i32)
>  DEF_HELPER_3(movl_reg_sreg, void, env, i32, i32)
>  
> -DEF_HELPER_FLAGS_1(lz, TCG_CALL_PURE, i32, i32);
> -DEF_HELPER_FLAGS_4(btst, TCG_CALL_PURE, i32, env, i32, i32, i32);
> +DEF_HELPER_FLAGS_1(lz, TCG_CALL_NO_SE, i32, i32);
> +DEF_HELPER_FLAGS_4(btst, TCG_CALL_NO_SE, i32, env, i32, i32, i32);
>  
> -DEF_HELPER_FLAGS_4(evaluate_flags_muls, TCG_CALL_PURE, i32, env, i32, i32, i32)
> -DEF_HELPER_FLAGS_4(evaluate_flags_mulu, TCG_CALL_PURE, i32, env, i32, i32, i32)
> -DEF_HELPER_FLAGS_5(evaluate_flags_mcp, TCG_CALL_PURE, i32, env,
> +DEF_HELPER_FLAGS_4(evaluate_flags_muls, TCG_CALL_NO_SE, i32, env, i32, i32, i32)
> +DEF_HELPER_FLAGS_4(evaluate_flags_mulu, TCG_CALL_NO_SE, i32, env, i32, i32, i32)
> +DEF_HELPER_FLAGS_5(evaluate_flags_mcp, TCG_CALL_NO_SE, i32, env,
>                                                        i32, i32, i32, i32)
> -DEF_HELPER_FLAGS_5(evaluate_flags_alu_4, TCG_CALL_PURE, i32, env,
> +DEF_HELPER_FLAGS_5(evaluate_flags_alu_4, TCG_CALL_NO_SE, i32, env,
>                                                          i32, i32, i32, i32)
> -DEF_HELPER_FLAGS_5(evaluate_flags_sub_4, TCG_CALL_PURE, i32, env,
> +DEF_HELPER_FLAGS_5(evaluate_flags_sub_4, TCG_CALL_NO_SE, i32, env,
>                                                          i32, i32, i32, i32)
> -DEF_HELPER_FLAGS_3(evaluate_flags_move_4, TCG_CALL_PURE, i32, env, i32, i32)
> -DEF_HELPER_FLAGS_3(evaluate_flags_move_2, TCG_CALL_PURE, i32, env, i32, i32)
> +DEF_HELPER_FLAGS_3(evaluate_flags_move_4, TCG_CALL_NO_SE, i32, env, i32, i32)
> +DEF_HELPER_FLAGS_3(evaluate_flags_move_2, TCG_CALL_NO_SE, i32, env, i32, i32)
>  DEF_HELPER_1(evaluate_flags, void, env)
>  DEF_HELPER_1(top_evaluate_flags, void, env)
>  
> -- 
> 1.7.10.4
> 

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [Qemu-devel] [PATCH v2 19/26] target-microblaze: rename helper flags
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 19/26] target-microblaze: " Aurelien Jarno
@ 2012-10-10 10:03   ` Edgar E. Iglesias
  0 siblings, 0 replies; 54+ messages in thread
From: Edgar E. Iglesias @ 2012-10-10 10:03 UTC (permalink / raw)
  To: Aurelien Jarno; +Cc: qemu-devel

On Tue, Oct 09, 2012 at 09:56:17PM +0200, Aurelien Jarno wrote:
> Rename helper flags to the new ones. This is purely a mechanical change,
> it's possible to use better flags by looking at the helpers.
> 
> Cc: Edgar E. Iglesias <edgar.iglesias@gmail.com>
> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>

Acked-by: Edgar E. Iglesias <edgar.iglesias@gmail.com>



> ---
>  target-microblaze/helper.h |    6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/target-microblaze/helper.h b/target-microblaze/helper.h
> index a1a732c..6076a1b 100644
> --- a/target-microblaze/helper.h
> +++ b/target-microblaze/helper.h
> @@ -2,10 +2,10 @@
>  
>  DEF_HELPER_2(raise_exception, void, env, i32)
>  DEF_HELPER_1(debug, void, env)
> -DEF_HELPER_FLAGS_3(carry, TCG_CALL_PURE | TCG_CALL_CONST, i32, i32, i32, i32)
> +DEF_HELPER_FLAGS_3(carry, TCG_CALL_NO_RGSE, i32, i32, i32, i32)
>  DEF_HELPER_2(cmp, i32, i32, i32)
>  DEF_HELPER_2(cmpu, i32, i32, i32)
> -DEF_HELPER_FLAGS_1(clz, TCG_CALL_PURE | TCG_CALL_CONST, i32, i32)
> +DEF_HELPER_FLAGS_1(clz, TCG_CALL_NO_RGSE, i32, i32)
>  
>  DEF_HELPER_3(divs, i32, env, i32, i32)
>  DEF_HELPER_3(divu, i32, env, i32, i32)
> @@ -26,7 +26,7 @@ DEF_HELPER_3(fcmp_gt, i32, env, i32, i32)
>  DEF_HELPER_3(fcmp_ne, i32, env, i32, i32)
>  DEF_HELPER_3(fcmp_ge, i32, env, i32, i32)
>  
> -DEF_HELPER_FLAGS_2(pcmpbf, TCG_CALL_PURE | TCG_CALL_CONST, i32, i32, i32)
> +DEF_HELPER_FLAGS_2(pcmpbf, TCG_CALL_NO_RGSE, i32, i32, i32)
>  #if !defined(CONFIG_USER_ONLY)
>  DEF_HELPER_2(mmu_read, i32, env, i32)
>  DEF_HELPER_3(mmu_write, void, env, i32, i32)
> -- 
> 1.7.10.4
> 

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [Qemu-devel] [PATCH v2 17/26] target-cris: rename helper flags
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 17/26] target-cris: " Aurelien Jarno
  2012-10-10 10:02   ` Edgar E. Iglesias
@ 2012-10-10 10:05   ` Edgar E. Iglesias
  2012-10-10 12:09     ` Aurelien Jarno
  1 sibling, 1 reply; 54+ messages in thread
From: Edgar E. Iglesias @ 2012-10-10 10:05 UTC (permalink / raw)
  To: Aurelien Jarno; +Cc: qemu-devel

On Tue, Oct 09, 2012 at 09:56:15PM +0200, Aurelien Jarno wrote:
> Rename helper flags to the new ones. This is purely a mechanical change,
> it's possible to use better flags by looking at the helpers.
> 
> Cc: Edgar E. Iglesias <edgar.iglesias@gmail.com>
> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
> ---
>  target-cris/helper.h |   18 +++++++++---------
>  1 file changed, 9 insertions(+), 9 deletions(-)
> 
> diff --git a/target-cris/helper.h b/target-cris/helper.h
> index 99fb326..fe12083 100644
> --- a/target-cris/helper.h
> +++ b/target-cris/helper.h
> @@ -10,19 +10,19 @@ DEF_HELPER_1(rfn, void, env);
>  DEF_HELPER_3(movl_sreg_reg, void, env, i32, i32)
>  DEF_HELPER_3(movl_reg_sreg, void, env, i32, i32)
>  
> -DEF_HELPER_FLAGS_1(lz, TCG_CALL_PURE, i32, i32);
> -DEF_HELPER_FLAGS_4(btst, TCG_CALL_PURE, i32, env, i32, i32, i32);
> +DEF_HELPER_FLAGS_1(lz, TCG_CALL_NO_SE, i32, i32);


btw, lz could be TCG_CALL_NO_RGSE like in the microblaze case.
I guess the _CONST was missing from before...





> +DEF_HELPER_FLAGS_4(btst, TCG_CALL_NO_SE, i32, env, i32, i32, i32);
>  
> -DEF_HELPER_FLAGS_4(evaluate_flags_muls, TCG_CALL_PURE, i32, env, i32, i32, i32)
> -DEF_HELPER_FLAGS_4(evaluate_flags_mulu, TCG_CALL_PURE, i32, env, i32, i32, i32)
> -DEF_HELPER_FLAGS_5(evaluate_flags_mcp, TCG_CALL_PURE, i32, env,
> +DEF_HELPER_FLAGS_4(evaluate_flags_muls, TCG_CALL_NO_SE, i32, env, i32, i32, i32)
> +DEF_HELPER_FLAGS_4(evaluate_flags_mulu, TCG_CALL_NO_SE, i32, env, i32, i32, i32)
> +DEF_HELPER_FLAGS_5(evaluate_flags_mcp, TCG_CALL_NO_SE, i32, env,
>                                                        i32, i32, i32, i32)
> -DEF_HELPER_FLAGS_5(evaluate_flags_alu_4, TCG_CALL_PURE, i32, env,
> +DEF_HELPER_FLAGS_5(evaluate_flags_alu_4, TCG_CALL_NO_SE, i32, env,
>                                                          i32, i32, i32, i32)
> -DEF_HELPER_FLAGS_5(evaluate_flags_sub_4, TCG_CALL_PURE, i32, env,
> +DEF_HELPER_FLAGS_5(evaluate_flags_sub_4, TCG_CALL_NO_SE, i32, env,
>                                                          i32, i32, i32, i32)
> -DEF_HELPER_FLAGS_3(evaluate_flags_move_4, TCG_CALL_PURE, i32, env, i32, i32)
> -DEF_HELPER_FLAGS_3(evaluate_flags_move_2, TCG_CALL_PURE, i32, env, i32, i32)
> +DEF_HELPER_FLAGS_3(evaluate_flags_move_4, TCG_CALL_NO_SE, i32, env, i32, i32)
> +DEF_HELPER_FLAGS_3(evaluate_flags_move_2, TCG_CALL_NO_SE, i32, env, i32, i32)
>  DEF_HELPER_1(evaluate_flags, void, env)
>  DEF_HELPER_1(top_evaluate_flags, void, env)
>  
> -- 
> 1.7.10.4
> 

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [Qemu-devel] [PATCH v2 17/26] target-cris: rename helper flags
  2012-10-10 10:05   ` Edgar E. Iglesias
@ 2012-10-10 12:09     ` Aurelien Jarno
  0 siblings, 0 replies; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-10 12:09 UTC (permalink / raw)
  To: Edgar E. Iglesias; +Cc: qemu-devel

On Wed, Oct 10, 2012 at 12:05:51PM +0200, Edgar E. Iglesias wrote:
> On Tue, Oct 09, 2012 at 09:56:15PM +0200, Aurelien Jarno wrote:
> > Rename helper flags to the new ones. This is purely a mechanical change,
> > it's possible to use better flags by looking at the helpers.
> > 
> > Cc: Edgar E. Iglesias <edgar.iglesias@gmail.com>
> > Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
> > ---
> >  target-cris/helper.h |   18 +++++++++---------
> >  1 file changed, 9 insertions(+), 9 deletions(-)
> > 
> > diff --git a/target-cris/helper.h b/target-cris/helper.h
> > index 99fb326..fe12083 100644
> > --- a/target-cris/helper.h
> > +++ b/target-cris/helper.h
> > @@ -10,19 +10,19 @@ DEF_HELPER_1(rfn, void, env);
> >  DEF_HELPER_3(movl_sreg_reg, void, env, i32, i32)
> >  DEF_HELPER_3(movl_reg_sreg, void, env, i32, i32)
> >  
> > -DEF_HELPER_FLAGS_1(lz, TCG_CALL_PURE, i32, i32);
> > -DEF_HELPER_FLAGS_4(btst, TCG_CALL_PURE, i32, env, i32, i32, i32);
> > +DEF_HELPER_FLAGS_1(lz, TCG_CALL_NO_SE, i32, i32);
> 
> 
> btw, lz could be TCG_CALL_NO_RGSE like in the microblaze case.
> I guess the _CONST was missing from before...
> 

Indeed. The change was purely mechanical. We should later review the
helpers flags for all targets, especially given this patch series give
new optimization opportunities. For example helpers which read globals,
but don't write them.

-- 
Aurelien Jarno	                        GPG: 1024D/F1BCDB73
aurelien@aurel32.net                 http://www.aurel32.net

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [Qemu-devel] [PATCH v2 04/26] tcg: sync output arguments on liveness request
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 04/26] tcg: sync output arguments on liveness request Aurelien Jarno
@ 2012-10-10 16:22   ` Richard Henderson
  0 siblings, 0 replies; 54+ messages in thread
From: Richard Henderson @ 2012-10-10 16:22 UTC (permalink / raw)
  To: Aurelien Jarno; +Cc: qemu-devel

On 10/09/2012 12:56 PM, Aurelien Jarno wrote:
> Synchronize an output argument when requested by the liveness analysis.
> This is needed so that the temp can be declared dead later.
> 
> For that, add a new op_sync_args table in which each bit tells if the
> corresponding output argument needs to be synchronized with the memory.
> Pass it to the tcg_reg_alloc_* functions, and honor this bit. We need to
> synchronize the argument before marking it as dead, and we have to make
> sure all the infos about the temp are correctly filled.
> 
> At the same time change some types from unsigned int to uint16_t when
> passing op_dead_args.
> 
> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>

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


r~

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [Qemu-devel] [PATCH v2 07/26] tcg: rewrite tcg_reg_alloc_mov()
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 07/26] tcg: rewrite tcg_reg_alloc_mov() Aurelien Jarno
@ 2012-10-10 16:27   ` Richard Henderson
  0 siblings, 0 replies; 54+ messages in thread
From: Richard Henderson @ 2012-10-10 16:27 UTC (permalink / raw)
  To: Aurelien Jarno; +Cc: qemu-devel

On 10/09/2012 12:56 PM, Aurelien Jarno wrote:
> Now that the liveness analysis provides more information, rewrite
> tcg_reg_alloc_mov(). This changes the behaviour about propagating
> constants and memory accesses. We now take the assumption that once
> a value is loaded into a register (from memory or from a constant),
> it's better to keep it there than to reload it later. This assumption
> is now always almost correct given that we are now sure the
> corresponding temp is going to be used later (otherwise it would have
> been synchronized and marked as dead already). The assumption is wrong
> if one of the op after clobbers some registers including the one
> of the holding the temp (this can be avoided by allocating clobbered
> registers last, which is what most TCG target do), or in case of lack
> of available register.
> 
> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>

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

> +        /* The code in the first if block should have moved the
> +           temp to a register. */
> +        assert(ts->val_type == TEMP_VAL_REG);
> +        if (IS_DEAD_ARG(1) && !ts->fixed_reg && !ots->fixed_reg) {
> +                /* the mov can be suppressed */
> +                if (ots->val_type == TEMP_VAL_REG) {
> +                    s->reg_to_temp[ots->reg] = -1;
> +                }
> +                ots->reg = ts->reg;
> +                temp_dead(s, args[1]);

Incorrect indentation?

>          } else {
> +            if (ots->val_type != TEMP_VAL_REG) {
> +                /* When allocating a new register, make sure to not spill the
> +                   input one. */
> +                tcg_regset_set_reg(allocated_regs, ts->reg);
> +                ots->reg = tcg_reg_alloc(s, oarg_ct->u.regs, allocated_regs);
>              }
> +            tcg_out_mov(s, ots->type, ots->reg, ts->reg);
> +        }

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [Qemu-devel] [PATCH v2 10/26] tcg: don't explicitly save globals and temps
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 10/26] tcg: don't explicitly save globals and temps Aurelien Jarno
@ 2012-10-10 16:55   ` Richard Henderson
  0 siblings, 0 replies; 54+ messages in thread
From: Richard Henderson @ 2012-10-10 16:55 UTC (permalink / raw)
  To: Aurelien Jarno; +Cc: qemu-devel

On 10/09/2012 12:56 PM, Aurelien Jarno wrote:
> The liveness analysis ensures that globals and temps are at the correct
> state at a basic block end or with an op with side effects. Avoid
> looping on all temps, this can be time consuming on targets with a lot
> of globals. Keep an assert in debug mode.
> 
> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>

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


r~

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [Qemu-devel] [PATCH v2 11/26] tcg: fix some op flags
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 11/26] tcg: fix some op flags Aurelien Jarno
@ 2012-10-10 16:56   ` Richard Henderson
  0 siblings, 0 replies; 54+ messages in thread
From: Richard Henderson @ 2012-10-10 16:56 UTC (permalink / raw)
  To: Aurelien Jarno; +Cc: qemu-devel

On 10/09/2012 12:56 PM, Aurelien Jarno wrote:
> Some branch related ops are marked with TCG_OPF_SIDE_EFFECTS, some other
> not. In practice they don't need to, as they are all marked with
> TCG_OPF_BB_END, which is handled specifically in all the code.
> 
> The call op is marked as TCG_OPF_SIDE_EFFECTS, which might be not true
> as there is are specific flags (TCG_CALL_CONST and TCG_CALL_PURE) for
> specifying that. On the other hand it always clobber arguments, so mark
> it as such even if the call op is handled in a different code path.
> 
> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>

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


r~

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [Qemu-devel] [PATCH v2 12/26] tcg: forbid ld/st function to modify globals
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 12/26] tcg: forbid ld/st function to modify globals Aurelien Jarno
@ 2012-10-10 16:57   ` Richard Henderson
  0 siblings, 0 replies; 54+ messages in thread
From: Richard Henderson @ 2012-10-10 16:57 UTC (permalink / raw)
  To: Aurelien Jarno; +Cc: qemu-devel

On 10/09/2012 12:56 PM, Aurelien Jarno wrote:
> Mapping a memory address using a global and accessing it through
> ld/st operations is currently broken. As it doesn't make any sense
> to do that performance wise, let's forbid that.
> 
> Update the TCG documentation, and remove partial support for that.
> 
> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>

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


r~

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [Qemu-devel] [PATCH v2 13/26] tcg: synchronize globals for ops with side effects
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 13/26] tcg: synchronize globals for ops with side effects Aurelien Jarno
@ 2012-10-10 17:01   ` Richard Henderson
  0 siblings, 0 replies; 54+ messages in thread
From: Richard Henderson @ 2012-10-10 17:01 UTC (permalink / raw)
  To: Aurelien Jarno; +Cc: qemu-devel

On 10/09/2012 12:56 PM, Aurelien Jarno wrote:
> Operations with side effects (in practice qemu_ld/st ops), only need to
> synchronize globals to make sure the CPU state is consistent in case of
> exception.
> 
> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>

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


r~

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator
  2012-10-10  7:42   ` Aurelien Jarno
  2012-10-10  7:49     ` Paolo Bonzini
@ 2012-10-10 17:04     ` Richard Henderson
  1 sibling, 0 replies; 54+ messages in thread
From: Richard Henderson @ 2012-10-10 17:04 UTC (permalink / raw)
  To: Aurelien Jarno; +Cc: Paolo Bonzini, qemu-devel

On 10/10/2012 12:42 AM, Aurelien Jarno wrote:
>> > - constant propagation using constraints.  This would let tcg-i386 use
>> > effectively the mov $imm,(addr) instruction for spills of known-constant
>> > values.
> This is indeed something quite frustrating and even more when the
> same immediate value is loaded multiple time. One way to do that would
> be to provide an optional tcg_out_st_immediate().

I think it should be possible to "simulate" a tcg opcode for this,
without having to have a specific entry point for it.  We've already
got all the information we need from the backend in the form of
constraints...


r~

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [Qemu-devel] [PATCH v2 14/26] tcg: rework TCG helper flags
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 14/26] tcg: rework TCG helper flags Aurelien Jarno
  2012-10-09 20:04   ` Peter Maydell
@ 2012-10-10 17:11   ` Richard Henderson
  2012-10-19 20:24     ` Aurelien Jarno
  1 sibling, 1 reply; 54+ messages in thread
From: Richard Henderson @ 2012-10-10 17:11 UTC (permalink / raw)
  To: Aurelien Jarno; +Cc: qemu-devel

On 10/09/2012 12:56 PM, Aurelien Jarno wrote:
> +                    if (!(call_flags & (TCG_CALL_NO_WRITE_GLOBALS |
> +                                        TCG_CALL_NO_READ_GLOBALS))) {

Code like this would be shorter, and perhaps clearer, by

> +/* Helper does not read globals (either directly or through an exception). It
> +   implies TCG_CALL_NO_WRITE_GLOBALS. */
> +#define TCG_CALL_NO_READ_GLOBALS    0x0010
> +/* Helper does not write globals */
> +#define TCG_CALL_NO_WRITE_GLOBALS   0x0020

having RG actually include WG, i.e.

#define TCG_CALL_NO_READ_GLOBALS  0x0030

That said, 

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


r~

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [Qemu-devel] [PATCH v2 14/26] tcg: rework TCG helper flags
  2012-10-09 20:24     ` Aurelien Jarno
@ 2012-10-10 17:12       ` Richard Henderson
  2012-10-10 17:14         ` Richard Henderson
  0 siblings, 1 reply; 54+ messages in thread
From: Richard Henderson @ 2012-10-10 17:12 UTC (permalink / raw)
  To: Aurelien Jarno; +Cc: Peter Maydell, qemu-devel

On 10/09/2012 01:24 PM, Aurelien Jarno wrote:
> Maybe NO_RG_SE?

Perhaps, yes.  But I certainly can't think of anything better.


r~

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [Qemu-devel] [PATCH v2 14/26] tcg: rework TCG helper flags
  2012-10-10 17:12       ` Richard Henderson
@ 2012-10-10 17:14         ` Richard Henderson
  0 siblings, 0 replies; 54+ messages in thread
From: Richard Henderson @ 2012-10-10 17:14 UTC (permalink / raw)
  To: Aurelien Jarno; +Cc: Peter Maydell, qemu-devel

On 10/10/2012 10:12 AM, Richard Henderson wrote:
> On 10/09/2012 01:24 PM, Aurelien Jarno wrote:
>> Maybe NO_RG_SE?
> 
> Perhaps, yes.  But I certainly can't think of anything better.

How about NO_RWG_SE.  I like having the fact that R implies W
be included in the symbol.


r~

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [Qemu-devel] [PATCH v2 15/26] target-alpha: rename helper flags
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 15/26] target-alpha: rename " Aurelien Jarno
@ 2012-10-10 17:14   ` Richard Henderson
  0 siblings, 0 replies; 54+ messages in thread
From: Richard Henderson @ 2012-10-10 17:14 UTC (permalink / raw)
  To: Aurelien Jarno; +Cc: qemu-devel

On 10/09/2012 12:56 PM, Aurelien Jarno wrote:
> Rename helper flags to the new ones. This is purely a mechanical change,
> it's possible to use better flags by looking at the helpers.
> 
> Cc: Richard Henderson <rth@twiddle.net>
> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>

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


r~

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [Qemu-devel] [PATCH v2 18/26] target-i386: rename helper flags
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 18/26] target-i386: " Aurelien Jarno
@ 2012-10-10 17:15   ` Richard Henderson
  0 siblings, 0 replies; 54+ messages in thread
From: Richard Henderson @ 2012-10-10 17:15 UTC (permalink / raw)
  To: Aurelien Jarno; +Cc: qemu-devel

On 10/09/2012 12:56 PM, Aurelien Jarno wrote:
> Rename helper flags to the new ones. This is purely a mechanical change,
> it's possible to use better flags by looking at the helpers.
> 
> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>

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


r~

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [Qemu-devel] [PATCH v2 26/26] tcg: remove compatiblity call flags
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 26/26] tcg: remove compatiblity call flags Aurelien Jarno
@ 2012-10-10 17:16   ` Richard Henderson
  0 siblings, 0 replies; 54+ messages in thread
From: Richard Henderson @ 2012-10-10 17:16 UTC (permalink / raw)
  To: Aurelien Jarno; +Cc: qemu-devel

On 10/09/2012 12:56 PM, Aurelien Jarno wrote:
> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
> ---
>  tcg/tcg.h |    4 ----
>  1 file changed, 4 deletions(-)

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


r~

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator
  2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
                   ` (26 preceding siblings ...)
  2012-10-10  6:59 ` [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Paolo Bonzini
@ 2012-10-10 17:24 ` Richard Henderson
  27 siblings, 0 replies; 54+ messages in thread
From: Richard Henderson @ 2012-10-10 17:24 UTC (permalink / raw)
  To: Aurelien Jarno; +Cc: qemu-devel

On 10/09/2012 12:55 PM, Aurelien Jarno wrote:
> Aurelien Jarno (26):
>   tcg: add temp_dead()
>   tcg: add tcg_reg_sync()
>   tcg: add temp_sync()
>   tcg: sync output arguments on liveness request
>   tcg: rework liveness analysis
>   tcg: improve tcg_reg_alloc_movi()
>   tcg: rewrite tcg_reg_alloc_mov()
>   tcg: always mark dead input arguments as dead
>   tcg: start with local temps in TEMP_VAL_MEM state
>   tcg: don't explicitly save globals and temps
>   tcg: fix some op flags
>   tcg: forbid ld/st function to modify globals
>   tcg: synchronize globals for ops with side effects
>   tcg: rework TCG helper flags
>   target-alpha: rename helper flags
>   target-arm: rename helper flags
>   target-cris: rename helper flags
>   target-i386: rename helper flags
>   target-microblaze: rename helper flags
>   target-mips: rename helper flags
>   target-ppc: rename helper flags
>   target-s390x: rename helper flags
>   target-sh4: rename helper flags
>   target-sparc: rename helper flags
>   target-xtensa: rename helper flags
>   tcg: remove compatiblity call flags

Modulo any possible bike-shedding of the patch 14 helper flag
names and values, I think the entire patch set is ready.

The mechanical nature of the target helper changes means that
any bugs in the flags are still present, and you have not
added any more.  A timeout waiting for target maintainer acks
would be appropriate, I think.


r~

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [Qemu-devel] [PATCH v2 24/26] target-sparc: rename helper flags
  2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 24/26] target-sparc: " Aurelien Jarno
@ 2012-10-13  8:57   ` Blue Swirl
  0 siblings, 0 replies; 54+ messages in thread
From: Blue Swirl @ 2012-10-13  8:57 UTC (permalink / raw)
  To: Aurelien Jarno; +Cc: qemu-devel

On Tue, Oct 9, 2012 at 7:56 PM, Aurelien Jarno <aurelien@aurel32.net> wrote:
> Rename helper flags to the new ones. This is purely a mechanical change,
> it's possible to use better flags by looking at the helpers.
>
> Cc: Blue Swirl <blauwirbel@gmail.com>
> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>

Acked-by: Blue Swirl <blauwirbel@gmail.com>

> ---
>  target-sparc/helper.h |   50 ++++++++++++++++++++++++-------------------------
>  1 file changed, 25 insertions(+), 25 deletions(-)
>
> diff --git a/target-sparc/helper.h b/target-sparc/helper.h
> index e1ae3c7..90cc91d 100644
> --- a/target-sparc/helper.h
> +++ b/target-sparc/helper.h
> @@ -16,7 +16,7 @@ DEF_HELPER_1(rdccr, tl, env)
>  DEF_HELPER_2(wrccr, void, env, tl)
>  DEF_HELPER_1(rdcwp, tl, env)
>  DEF_HELPER_2(wrcwp, void, env, tl)
> -DEF_HELPER_FLAGS_2(array8, TCG_CALL_CONST | TCG_CALL_PURE, tl, tl, tl)
> +DEF_HELPER_FLAGS_2(array8, TCG_CALL_NO_RGSE, tl, tl, tl)
>  DEF_HELPER_1(popc, tl, tl)
>  DEF_HELPER_4(ldda_asi, void, env, tl, int, int)
>  DEF_HELPER_5(ldf_asi, void, env, tl, int, int, int)
> @@ -51,7 +51,7 @@ DEF_HELPER_5(ld_asi, i64, env, tl, int, int, int)
>  DEF_HELPER_5(st_asi, void, env, tl, i64, int, int)
>  #endif
>  DEF_HELPER_2(ldfsr, void, env, i32)
> -DEF_HELPER_FLAGS_1(fabss, TCG_CALL_CONST | TCG_CALL_PURE, f32, f32)
> +DEF_HELPER_FLAGS_1(fabss, TCG_CALL_NO_RGSE, f32, f32)
>  DEF_HELPER_2(fsqrts, f32, env, f32)
>  DEF_HELPER_2(fsqrtd, f64, env, f64)
>  DEF_HELPER_3(fcmps, void, env, f32, f32)
> @@ -63,7 +63,7 @@ DEF_HELPER_1(fcmpq, void, env)
>  DEF_HELPER_1(fcmpeq, void, env)
>  #ifdef TARGET_SPARC64
>  DEF_HELPER_2(ldxfsr, void, env, i64)
> -DEF_HELPER_FLAGS_1(fabsd, TCG_CALL_CONST | TCG_CALL_PURE, f64, f64)
> +DEF_HELPER_FLAGS_1(fabsd, TCG_CALL_NO_RGSE, f64, f64)
>  DEF_HELPER_3(fcmps_fcc1, void, env, f32, f32)
>  DEF_HELPER_3(fcmps_fcc2, void, env, f32, f32)
>  DEF_HELPER_3(fcmps_fcc3, void, env, f32, f32)
> @@ -104,14 +104,14 @@ DEF_HELPER_3(fdivs, f32, env, f32, f32)
>  DEF_HELPER_3(fsmuld, f64, env, f32, f32)
>  DEF_HELPER_3(fdmulq, void, env, f64, f64);
>
> -DEF_HELPER_FLAGS_1(fnegs, TCG_CALL_CONST | TCG_CALL_PURE, f32, f32)
> +DEF_HELPER_FLAGS_1(fnegs, TCG_CALL_NO_RGSE, f32, f32)
>  DEF_HELPER_2(fitod, f64, env, s32)
>  DEF_HELPER_2(fitoq, void, env, s32)
>
>  DEF_HELPER_2(fitos, f32, env, s32)
>
>  #ifdef TARGET_SPARC64
> -DEF_HELPER_FLAGS_1(fnegd, TCG_CALL_CONST | TCG_CALL_PURE, f64, f64)
> +DEF_HELPER_FLAGS_1(fnegd, TCG_CALL_NO_RGSE, f64, f64)
>  DEF_HELPER_1(fnegq, void, env)
>  DEF_HELPER_2(fxtos, f32, env, s64)
>  DEF_HELPER_2(fxtod, f64, env, s64)
> @@ -131,36 +131,36 @@ DEF_HELPER_2(fstox, s64, env, f32)
>  DEF_HELPER_2(fdtox, s64, env, f64)
>  DEF_HELPER_1(fqtox, s64, env)
>
> -DEF_HELPER_FLAGS_2(fpmerge, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
> -DEF_HELPER_FLAGS_2(fmul8x16, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
> -DEF_HELPER_FLAGS_2(fmul8x16al, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
> -DEF_HELPER_FLAGS_2(fmul8x16au, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
> -DEF_HELPER_FLAGS_2(fmul8sux16, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
> -DEF_HELPER_FLAGS_2(fmul8ulx16, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
> -DEF_HELPER_FLAGS_2(fmuld8sux16, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
> -DEF_HELPER_FLAGS_2(fmuld8ulx16, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
> -DEF_HELPER_FLAGS_2(fexpand, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64)
> -DEF_HELPER_FLAGS_3(pdist, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64, i64)
> -DEF_HELPER_FLAGS_2(fpack16, TCG_CALL_CONST | TCG_CALL_PURE, i32, i64, i64)
> -DEF_HELPER_FLAGS_3(fpack32, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64, i64)
> -DEF_HELPER_FLAGS_2(fpackfix, TCG_CALL_CONST | TCG_CALL_PURE, i32, i64, i64)
> -DEF_HELPER_FLAGS_3(bshuffle, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64, i64)
> +DEF_HELPER_FLAGS_2(fpmerge, TCG_CALL_NO_RGSE, i64, i64, i64)
> +DEF_HELPER_FLAGS_2(fmul8x16, TCG_CALL_NO_RGSE, i64, i64, i64)
> +DEF_HELPER_FLAGS_2(fmul8x16al, TCG_CALL_NO_RGSE, i64, i64, i64)
> +DEF_HELPER_FLAGS_2(fmul8x16au, TCG_CALL_NO_RGSE, i64, i64, i64)
> +DEF_HELPER_FLAGS_2(fmul8sux16, TCG_CALL_NO_RGSE, i64, i64, i64)
> +DEF_HELPER_FLAGS_2(fmul8ulx16, TCG_CALL_NO_RGSE, i64, i64, i64)
> +DEF_HELPER_FLAGS_2(fmuld8sux16, TCG_CALL_NO_RGSE, i64, i64, i64)
> +DEF_HELPER_FLAGS_2(fmuld8ulx16, TCG_CALL_NO_RGSE, i64, i64, i64)
> +DEF_HELPER_FLAGS_2(fexpand, TCG_CALL_NO_RGSE, i64, i64, i64)
> +DEF_HELPER_FLAGS_3(pdist, TCG_CALL_NO_RGSE, i64, i64, i64, i64)
> +DEF_HELPER_FLAGS_2(fpack16, TCG_CALL_NO_RGSE, i32, i64, i64)
> +DEF_HELPER_FLAGS_3(fpack32, TCG_CALL_NO_RGSE, i64, i64, i64, i64)
> +DEF_HELPER_FLAGS_2(fpackfix, TCG_CALL_NO_RGSE, i32, i64, i64)
> +DEF_HELPER_FLAGS_3(bshuffle, TCG_CALL_NO_RGSE, i64, i64, i64, i64)
>  #define VIS_HELPER(name)                                                 \
> -    DEF_HELPER_FLAGS_2(f ## name ## 16, TCG_CALL_CONST | TCG_CALL_PURE,  \
> +    DEF_HELPER_FLAGS_2(f ## name ## 16, TCG_CALL_NO_RGSE,  \
>                         i64, i64, i64)                                    \
> -    DEF_HELPER_FLAGS_2(f ## name ## 16s, TCG_CALL_CONST | TCG_CALL_PURE, \
> +    DEF_HELPER_FLAGS_2(f ## name ## 16s, TCG_CALL_NO_RGSE, \
>                         i32, i32, i32)                                    \
> -    DEF_HELPER_FLAGS_2(f ## name ## 32, TCG_CALL_CONST | TCG_CALL_PURE,  \
> +    DEF_HELPER_FLAGS_2(f ## name ## 32, TCG_CALL_NO_RGSE,  \
>                         i64, i64, i64)                                    \
> -    DEF_HELPER_FLAGS_2(f ## name ## 32s, TCG_CALL_CONST | TCG_CALL_PURE, \
> +    DEF_HELPER_FLAGS_2(f ## name ## 32s, TCG_CALL_NO_RGSE, \
>                         i32, i32, i32)
>
>  VIS_HELPER(padd);
>  VIS_HELPER(psub);
>  #define VIS_CMPHELPER(name)                                              \
> -    DEF_HELPER_FLAGS_2(f##name##16, TCG_CALL_CONST | TCG_CALL_PURE,      \
> +    DEF_HELPER_FLAGS_2(f##name##16, TCG_CALL_NO_RGSE,      \
>                         i64, i64, i64)                                    \
> -    DEF_HELPER_FLAGS_2(f##name##32, TCG_CALL_CONST | TCG_CALL_PURE,      \
> +    DEF_HELPER_FLAGS_2(f##name##32, TCG_CALL_NO_RGSE,      \
>                         i64, i64, i64)
>  VIS_CMPHELPER(cmpgt);
>  VIS_CMPHELPER(cmpeq);
> --
> 1.7.10.4
>

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [Qemu-devel] [PATCH v2 14/26] tcg: rework TCG helper flags
  2012-10-10 17:11   ` Richard Henderson
@ 2012-10-19 20:24     ` Aurelien Jarno
  2012-10-19 22:25       ` Richard Henderson
  0 siblings, 1 reply; 54+ messages in thread
From: Aurelien Jarno @ 2012-10-19 20:24 UTC (permalink / raw)
  To: Richard Henderson; +Cc: qemu-devel

On Wed, Oct 10, 2012 at 10:11:54AM -0700, Richard Henderson wrote:
> On 10/09/2012 12:56 PM, Aurelien Jarno wrote:
> > +                    if (!(call_flags & (TCG_CALL_NO_WRITE_GLOBALS |
> > +                                        TCG_CALL_NO_READ_GLOBALS))) {
> 
> Code like this would be shorter, and perhaps clearer, by
> 
> > +/* Helper does not read globals (either directly or through an exception). It
> > +   implies TCG_CALL_NO_WRITE_GLOBALS. */
> > +#define TCG_CALL_NO_READ_GLOBALS    0x0010
> > +/* Helper does not write globals */
> > +#define TCG_CALL_NO_WRITE_GLOBALS   0x0020
> 
> having RG actually include WG, i.e.
> 
> #define TCG_CALL_NO_READ_GLOBALS  0x0030
> 

Agreed. On the other hand, the few lines just above the one your quoted
would be more complicated:

+                    if (!(call_flags & TCG_CALL_NO_READ_GLOBALS)) {
+                        /* globals should be synced to memory */
+                        memset(mem_temps, 1, s->nb_globals);
+                    }

would have to be written:

+                    if (!(call_flags & TCG_CALL_NO_READ_WRITE_GLOBALS) ||
+                        (call_flags & TCG_CALL_WRITE_GLOBALS)) {
+                        /* globals should be synced to memory */
+                        memset(mem_temps, 1, s->nb_globals);
+                    }

Note sure it makes the things clearer, and definitely not shorter.

-- 
Aurelien Jarno                          GPG: 1024D/F1BCDB73
aurelien@aurel32.net                 http://www.aurel32.net

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [Qemu-devel] [PATCH v2 14/26] tcg: rework TCG helper flags
  2012-10-19 20:24     ` Aurelien Jarno
@ 2012-10-19 22:25       ` Richard Henderson
  0 siblings, 0 replies; 54+ messages in thread
From: Richard Henderson @ 2012-10-19 22:25 UTC (permalink / raw)
  To: Aurelien Jarno; +Cc: qemu-devel

On 2012-10-20 06:24, Aurelien Jarno wrote:
> Agreed. On the other hand, the few lines just above the one your quoted
> would be more complicated:
> 
> +                    if (!(call_flags & TCG_CALL_NO_READ_GLOBALS)) {
> +                        /* globals should be synced to memory */
> +                        memset(mem_temps, 1, s->nb_globals);
> +                    }
> 
> would have to be written:
> 
> +                    if (!(call_flags & TCG_CALL_NO_READ_WRITE_GLOBALS) ||
> +                        (call_flags & TCG_CALL_WRITE_GLOBALS)) {
> +                        /* globals should be synced to memory */
> +                        memset(mem_temps, 1, s->nb_globals);
> +                    }
> 
> Note sure it makes the things clearer, and definitely not shorter.

Ah, didn't think of that.  Oh well.


r~

^ permalink raw reply	[flat|nested] 54+ messages in thread

end of thread, other threads:[~2012-10-19 22:25 UTC | newest]

Thread overview: 54+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-10-09 19:55 [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Aurelien Jarno
2012-10-09 19:55 ` [Qemu-devel] [PATCH v2 01/26] tcg: add temp_dead() Aurelien Jarno
2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 02/26] tcg: add tcg_reg_sync() Aurelien Jarno
2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 03/26] tcg: add temp_sync() Aurelien Jarno
2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 04/26] tcg: sync output arguments on liveness request Aurelien Jarno
2012-10-10 16:22   ` Richard Henderson
2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 05/26] tcg: rework liveness analysis Aurelien Jarno
2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 06/26] tcg: improve tcg_reg_alloc_movi() Aurelien Jarno
2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 07/26] tcg: rewrite tcg_reg_alloc_mov() Aurelien Jarno
2012-10-10 16:27   ` Richard Henderson
2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 08/26] tcg: always mark dead input arguments as dead Aurelien Jarno
2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 09/26] tcg: start with local temps in TEMP_VAL_MEM state Aurelien Jarno
2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 10/26] tcg: don't explicitly save globals and temps Aurelien Jarno
2012-10-10 16:55   ` Richard Henderson
2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 11/26] tcg: fix some op flags Aurelien Jarno
2012-10-10 16:56   ` Richard Henderson
2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 12/26] tcg: forbid ld/st function to modify globals Aurelien Jarno
2012-10-10 16:57   ` Richard Henderson
2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 13/26] tcg: synchronize globals for ops with side effects Aurelien Jarno
2012-10-10 17:01   ` Richard Henderson
2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 14/26] tcg: rework TCG helper flags Aurelien Jarno
2012-10-09 20:04   ` Peter Maydell
2012-10-09 20:24     ` Aurelien Jarno
2012-10-10 17:12       ` Richard Henderson
2012-10-10 17:14         ` Richard Henderson
2012-10-10 17:11   ` Richard Henderson
2012-10-19 20:24     ` Aurelien Jarno
2012-10-19 22:25       ` Richard Henderson
2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 15/26] target-alpha: rename " Aurelien Jarno
2012-10-10 17:14   ` Richard Henderson
2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 16/26] target-arm: " Aurelien Jarno
2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 17/26] target-cris: " Aurelien Jarno
2012-10-10 10:02   ` Edgar E. Iglesias
2012-10-10 10:05   ` Edgar E. Iglesias
2012-10-10 12:09     ` Aurelien Jarno
2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 18/26] target-i386: " Aurelien Jarno
2012-10-10 17:15   ` Richard Henderson
2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 19/26] target-microblaze: " Aurelien Jarno
2012-10-10 10:03   ` Edgar E. Iglesias
2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 20/26] target-mips: " Aurelien Jarno
2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 21/26] target-ppc: " Aurelien Jarno
2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 22/26] target-s390x: " Aurelien Jarno
2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 23/26] target-sh4: " Aurelien Jarno
2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 24/26] target-sparc: " Aurelien Jarno
2012-10-13  8:57   ` Blue Swirl
2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 25/26] target-xtensa: " Aurelien Jarno
2012-10-09 19:56 ` [Qemu-devel] [PATCH v2 26/26] tcg: remove compatiblity call flags Aurelien Jarno
2012-10-10 17:16   ` Richard Henderson
2012-10-10  6:59 ` [Qemu-devel] [PATCH v2 00/26] tcg: rework liveness analysis and register allocator Paolo Bonzini
2012-10-10  7:42   ` Aurelien Jarno
2012-10-10  7:49     ` Paolo Bonzini
2012-10-10  8:24       ` Aurelien Jarno
2012-10-10 17:04     ` Richard Henderson
2012-10-10 17:24 ` Richard Henderson

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.