Re: [Qemu-devel] [PATCH v2 for-2.5 05/12] tcg/optimize: track const/copy status separately

2015-07-27 Thread Paolo Bonzini


On 27/07/2015 15:40, Aurelien Jarno wrote:
   temps[dst].next_copy = temps[src].next_copy;
   temps[dst].prev_copy = src;
   temps[temps[dst].next_copy].prev_copy = dst;
   temps[src].next_copy = dst;

 Note that the patch doesn't change this part, it's already there in the
 original code.

Understood.

  This is:
  
  dst-next = src-next;
  dst-prev = src;
  dst-next-prev = dst;
  src-next = dst;
 
 Here we just want to insert one element, and thus before
 the insertion we have dst-next = dst-prev = dst.

Ah, you're right.

Paolo



Re: [Qemu-devel] [PATCH v2 for-2.5 05/12] tcg/optimize: track const/copy status separately

2015-07-27 Thread Paolo Bonzini


On 27/07/2015 12:56, Aurelien Jarno wrote:
  temps[dst].next_copy = temps[src].next_copy;
  temps[dst].prev_copy = src;
  temps[temps[dst].next_copy].prev_copy = dst;
  temps[src].next_copy = dst;

This is:

dst-next = src-next;
dst-prev = src;
dst-next-prev = dst;
src-next = dst;

which seems weird.  I think it should be one of

/* splice src after dst */
dst-next-prev = src-prev;
src-prev-next = dst-next;
dst-next = src;
src-prev = dst;

or

/* splice src before dst */
last = src-prev;
dst-prev-next = src;
src-prev = dst-prev;
last-next = dst;
dst-prev = last;

(written as pointer manipulations for clarity).

Maybe I'm missing the obvious, but if it's a problem it's better to fix
it before the links are used more pervasively.

Paolo



Re: [Qemu-devel] [PATCH v2 for-2.5 05/12] tcg/optimize: track const/copy status separately

2015-07-27 Thread Aurelien Jarno
On 2015-07-27 13:26, Paolo Bonzini wrote:
 
 
 On 27/07/2015 12:56, Aurelien Jarno wrote:
   temps[dst].next_copy = temps[src].next_copy;
   temps[dst].prev_copy = src;
   temps[temps[dst].next_copy].prev_copy = dst;
   temps[src].next_copy = dst;

Note that the patch doesn't change this part, it's already there in the
original code.

 This is:
 
 dst-next = src-next;
 dst-prev = src;
 dst-next-prev = dst;
 src-next = dst;
 
 which seems weird.  I think it should be one of
 
 /* splice src after dst */
 dst-next-prev = src-prev;
 src-prev-next = dst-next;
 dst-next = src;
 src-prev = dst;
 
 or
 
 /* splice src before dst */
 last = src-prev;
 dst-prev-next = src;
 src-prev = dst-prev;
 last-next = dst;
 dst-prev = last;
 
 (written as pointer manipulations for clarity).
 
 Maybe I'm missing the obvious, but if it's a problem it's better to fix
 it before the links are used more pervasively.

I think your code is the generic for inserting a circular linked list
into another. Here we just want to insert one element, and thus before
the insertion we have dst-next = dst-prev = dst.

-- 
Aurelien Jarno  GPG: 4096R/1DDD8C9B
aurel...@aurel32.net http://www.aurel32.net



[Qemu-devel] [PATCH v2 for-2.5 05/12] tcg/optimize: track const/copy status separately

2015-07-27 Thread Aurelien Jarno
Instead of using an enum which could be either a copy or a const, track
them separately. Constants are tracked through a bool. Copies are
tracked by initializing temp's next_copy and prev_copy to itself,
allowing to simplify the code a bit.

Cc: Richard Henderson r...@twiddle.net
Signed-off-by: Aurelien Jarno aurel...@aurel32.net
---
 tcg/optimize.c | 42 ++
 1 file changed, 14 insertions(+), 28 deletions(-)

diff --git a/tcg/optimize.c b/tcg/optimize.c
index 719fee2..e69ab05 100644
--- a/tcg/optimize.c
+++ b/tcg/optimize.c
@@ -35,14 +35,8 @@
 glue(glue(case INDEX_op_, x), _i32):\
 glue(glue(case INDEX_op_, x), _i64)
 
-typedef enum {
-TCG_TEMP_UNDEF = 0,
-TCG_TEMP_CONST,
-TCG_TEMP_COPY,
-} tcg_temp_state;
-
 struct tcg_temp_info {
-tcg_temp_state state;
+bool is_const;
 uint16_t prev_copy;
 uint16_t next_copy;
 tcg_target_ulong val;
@@ -54,27 +48,22 @@ static TCGTempSet temps_used;
 
 static inline bool temp_is_const(TCGArg arg)
 {
-return temps[arg].state == TCG_TEMP_CONST;
+return temps[arg].is_const;
 }
 
 static inline bool temp_is_copy(TCGArg arg)
 {
-return temps[arg].state == TCG_TEMP_COPY;
+return temps[arg].next_copy != arg;
 }
 
-/* Reset TEMP's state to TCG_TEMP_UNDEF.  If TEMP only had one copy, remove
-   the copy flag from the left temp.  */
+/* Reset TEMP's state, possibly removing the temp for the list of copies.  */
 static void reset_temp(TCGArg temp)
 {
-if (temp_is_copy(temp)) {
-if (temps[temp].prev_copy == temps[temp].next_copy) {
-temps[temps[temp].next_copy].state = TCG_TEMP_UNDEF;
-} else {
-temps[temps[temp].next_copy].prev_copy = temps[temp].prev_copy;
-temps[temps[temp].prev_copy].next_copy = temps[temp].next_copy;
-}
-}
-temps[temp].state = TCG_TEMP_UNDEF;
+temps[temps[temp].next_copy].prev_copy = temps[temp].prev_copy;
+temps[temps[temp].prev_copy].next_copy = temps[temp].next_copy;
+temps[temp].next_copy = temp;
+temps[temp].prev_copy = temp;
+temps[temp].is_const = false;
 temps[temp].mask = -1;
 }
 
@@ -88,7 +77,9 @@ static void reset_all_temps(int nb_temps)
 static void init_temp_info(TCGArg temp)
 {
 if (!test_bit(temp, temps_used.l)) {
-temps[temp].state = TCG_TEMP_UNDEF;
+temps[temp].next_copy = temp;
+temps[temp].prev_copy = temp;
+temps[temp].is_const = false;
 temps[temp].mask = -1;
 set_bit(temp, temps_used.l);
 }
@@ -218,7 +209,7 @@ static void tcg_opt_gen_movi(TCGContext *s, TCGOp *op, 
TCGArg *args,
 op-opc = new_op;
 
 reset_temp(dst);
-temps[dst].state = TCG_TEMP_CONST;
+temps[dst].is_const = true;
 temps[dst].val = val;
 mask = val;
 if (TCG_TARGET_REG_BITS  32  new_op == INDEX_op_movi_i32) {
@@ -260,16 +251,11 @@ static void tcg_opt_gen_mov(TCGContext *s, TCGOp *op, 
TCGArg *args,
 assert(!temp_is_const(src));
 
 if (s-temps[src].type == s-temps[dst].type) {
-if (!temp_is_copy(src)) {
-temps[src].state = TCG_TEMP_COPY;
-temps[src].next_copy = src;
-temps[src].prev_copy = src;
-}
-temps[dst].state = TCG_TEMP_COPY;
 temps[dst].next_copy = temps[src].next_copy;
 temps[dst].prev_copy = src;
 temps[temps[dst].next_copy].prev_copy = dst;
 temps[src].next_copy = dst;
+temps[dst].is_const = false;
 }
 
 args[0] = dst;
-- 
2.1.4