qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 2/4] tcg/aarch64: implement new TCG target for a


From: Richard Henderson
Subject: Re: [Qemu-devel] [PATCH 2/4] tcg/aarch64: implement new TCG target for aarch64
Date: Mon, 27 May 2013 11:47:22 -0700
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130514 Thunderbird/17.0.6

On 2013-05-27 04:43, Claudio Fontana wrote:
Hmm, true.  Although I'd been thinking more along the lines of
arranging the code such that we'd use movz to set the zero.

I think we need to keep treating zero specially if we want to keep the 
optimization where we don't emit needless MOVK instructions for half-words of 
value 0000h.

I can however make one single function out of movi32 and movi64, it could look 
like this:

if (!value) {
     tcg_out_movr(s, 0, rd, TCG_REG_ZXR);
     return;
}

base = (value > 0xffffffff) ? 0xd2800000 : 0x52800000;

while (value) {
     /* etc etc */
}


    if (type == TCG_TYPE_I32) {
        value = (uint32_t)value;
        ext = 0;
    } else if (value <= 0xffffffff) {
        ext = 0;
    } else {
        ext = 0x80000000;
    }

    base = 0x52800000;  /* MOVZ */
    do {
        int shift = ctz64(value) & (63 & -16);
        int half = (value >> shift) & 0xffff;
        tcg_out32(s, base | ext | half << 5 | rd);
        value &= ~(0xffffUL << shift);
        base = 0x72800000;  /* MOVK */
    } while (value != 0);


Since we go through the loop at least once, we emit the movz for zero input. No need for any extra tests. And using ctz we can iterate fewer times.


r~



reply via email to

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