qemu-discuss
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re:Question on implementation detail of `temp_sync`


From: lrwei
Subject: Re:Question on implementation detail of `temp_sync`
Date: Tue, 4 Aug 2020 12:40:21 +0800

Sorry for the unintentional sending of an uncompleted message.

I understands that the current code works, but gets confused on why `ts` needs to be loaded in to a register when `free_or_dead` is not set. For example in the following scenario:

movi_i32    r0, 0x1
add_i32      r1, r1, r0
...
(where r0 is not used any more, and both r0 and r1 are globals)

If I am not mistaken, the code gen procedure of the first IR will call `temp_sync` with `free_or_dead` not set, which load the constant in to a register and store it back to memory. At this time, `r0` will be `TEMP_VAL_REG` instead of `TEMP_VAL_CONST`, so the following IR can't embed this constant operand in the assembly instruction it produces. Also, this results in a seemingly useless register allocation (, why don't the further use of r0 use the constant directly?)
So I wonder whether there is any reason for this loading a constant into register, I'll be very appreciated if someone can point out the reason for me.

Thanks in advance.
lrwei 
 
------------------ Original ------------------
Date:  Tue, Aug 4, 2020 12:06 PM
To:  "qemu-discuss"<qemu-discuss@nongnu.org>;
Subject:  Question on implementation detail of `temp_sync`
 
Hello to the list,
Recently I have been studying the code of TCG, and get confused by the following detail in function `temp_sync` in tcg/tcg.c:

    case TEMP_VAL_CONST:
        /* If we're going to free the temp immediately, then we won't
           require it later in a register, so attempt to store the
           constant to memory directly.  */
        if (free_or_dead
           && tcg_out_sti(s, ts->type, ts->val,
                           ts->mem_base->reg, ts->mem_offset)) {
           break;
        }
        temp_load(s, ts, tcg_target_available_regs[ts->type],
                  allocated_regs, preferred_regs);
        /* fallthrough */

movi_i32

Would it be better to remove the `free_or_dead` in the if statement, i.e. turn the function to be:

    case TEMP_VAL_CONST:
        if (tcg_out_sti(s, ts->type, ts->val,
                           ts->mem_base->reg, ts->mem_offset)) {
           break;
        }
        temp_load(s, ts, tcg_target_available_regs[ts->type],
                  allocated_regs, preferred_regs);
        /* fallthrough */

reply via email to

[Prev in Thread] Current Thread [Next in Thread]