<HTML>
And apologies for my horrendous grammar in that last e-mail!  What I meant to say is that an option could be that x86-64 can favour MOVZX, since the oldest processors are guaranteed to have been first released no earlier than the early 2000s, while i386 and i8086 can favour MOV + AND, unless more <span class="swb">conditional checks "if current_settings.cputype<cpu_Pentium2 then" are permitted.</span><br>
 <br>
<br>
<span style="font-weight: bold;">On Fri 08/03/19 13:38 , "J. Gareth Moreton" gareth@moreton-family.com sent:<br>
</span><blockquote style="BORDER-LEFT: #F5F5F5 2px solid; MARGIN-LEFT: 5px; MARGIN-RIGHT:0px; PADDING-LEFT: 5px; PADDING-RIGHT: 0px"> 
<div>In that case, I would argue that it should optimise for more modern processors - that is, favour MOVZX, especially as the first few Pentium processors were released in the 90s.  If backwards-compatibility is more of a concern, well, if compiling for x86-64, when it's certain that the processor was released no earlier than the early 2000s (because, for x86_64-win64, SSE2 has to be present) and hence MOVZX is efficient, while i386 and i8086 can favour MOV/AND.<br>

 
<br>
 
Nevertheless, there is code in parts of the compiler that check for things like <span class="swb">"if current_settings.cputype<cpu_Pentium2 then", so setting a preference for MOV/AND is still an option.</span></div><div><br>
 
</div><div>Once the work with my x86_64 optimizer overhaul is accepted or rejected, I can make some conversions if approved.<br>
 
<br>
 
Gareth aka. Kit<br>
 
</div><br>
 
 <br>
 
<br>
 
<span style="font-weight: bold;">On Fri 08/03/19 14:25 , "MarÄ£ers ." margers.roked@inbox.lv sent:<br>
 
</span><blockquote style="BORDER-LEFT: #F5F5F5 2px solid; MARGIN-LEFT: 5px; MARGIN-RIGHT: 0px; PADDING-LEFT: 5px; PADDING-RIGHT: 0px"><span style="color: rgb(102, 102, 102);">> I'm a tad confused in regards to the best course 
</span><br>
 
 
of action regarding MOVZX.  Many of the peephole 
<br>
 
 
optimisations seek to change them to MOV followed 
<br>
 
 
by AND (e.g. "movzbl (mem), %eax" to "mov (mem), 
<br>
 
 
%al; and $0xff, %eax").  Does MOVZX have a 
<br>
 
 
well-documented performance penalty in modern 
<br>
 
 
processors that favours the MOV/AND combination?  
<br>
 
 
It seems odd because the combination implies a 
<br>
 
 
pipeline stall, which becomes more pronounced if 
<br>
 
 
the MOV instruction is reading from memory. 
<br>
 
 
 
<br>
 
 
For intel pentium and earlier processors 
<br>
 
 
combination MOV, AND was better, but now days cpu 
<br>
 
 
handle MOVZX as good as MOV. It's just question 
<br>
 
 
for which cpu to optimize? 
<br>
 
 
 
<br>
 
 
<br>
 
 
<br>
 
 
</blockquote> 

</blockquote></HTML>