qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH v2 41/60] target-i386: Create gen_lea_v_seg


From: Richard Henderson
Subject: Re: [Qemu-devel] [PATCH v2 41/60] target-i386: Create gen_lea_v_seg
Date: Fri, 27 Dec 2013 06:49:12 -0800
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.2.0

On 12/26/2013 01:27 PM, Peter Maydell wrote:
>> The only time s->addseg will be false in 16-bit mode is during translation of
>> LEA.  I do need the addseg check there for LEA cleanup, but this change 
>> should
>> not affect gen_string_movl.
> 
> Oh, is that the bit that does:
> 
>         val = s->addseg;
>         s->addseg = 0;
>         gen_lea_modrm(env, s, modrm);
>         s->addseg = val;
> 
> ? I think we should get rid of that -- s->addseg should always
> mean "we can do the segment-base-is-zero optimization",
> it shouldn't be a secret hidden parameter to the gen_lea functions
> saying "don't do this addition".

Perhaps.  I'd rather do that as follow-up, since lea_v_seg isn't the top-level
function called for LEA.  And if we clean up addseg, we might as well clean up
popl_esp_hack as well.

How about a comment for now?

>> I disagree with the characterization "random temporary".  Using the output 
>> as a
>> temporary in computing the output is totally sensible, given that our most
>> popular host platform is 2-address.
> 
> This is the kind of thing that in an ideal world the register allocator
> would deal with. The tcg/README optimisation suggestions
> don't say anything about preferring to use X,X,Y rather than X,Y,Z
> ops where possible, and typically allocating and using a special
> purpose temp is more readable code.

I agree that a real register allocator would handle it.

I disagree that a special purpose temp would result in more readable code,
since then we'd need to add *more* code to deallocate it after the other
arithmetic.

> More generally, it's pretty unclear to me why we're handling
> "use default segment register for instruction" (ie ovr_seg == -1)
> differently for the three cases.

Because the handling of segments is fundamentally different in each of the
three cpu modes?

> Why is it OK to skip the addition of the base address for ES
> (in the movl_A0_EDI case) when the comment for addseg says
> it only applies to CS/DS/ES?

Err... when are we skipping the addition in gen_string_movl_A0_EDI?  We pass in
R_ES as the segment register to use...

> It seems to me that we ought to try to get this code to a
> point where it looks more like:
>     if (ovr_seg < 0) {
>         ovr_seg = def_seg;
>     }
>     emit code to get address;
>     if (!segment_base_guaranteed_zero(s, ovr_seg)) {
>         emit code to add base to address;
>     }
> 
> where segment_base_guaranteed_zero() is a helper
> function like:
> bool segment_base_guaranteed_zero(s, seg) {
>       /* Return true if we can guarantee at translate time that
>        * the base address of the specified segment is zero
>        * (and thus can skip emitting code to add it)
>        */
>       return (!s->addseg &&
>           (seg == R_CS || seg == R_DS || seg == R_SS));
> }

That does look much nicer, I agree.


r~



reply via email to

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