<HTML>
<div><style> BODY { font-family:Arial, Helvetica, sans-serif;font-size:12px; }</style>https://bugs.freepascal.org/view.php?id=33851</div><div><br>
</div><div>Someone pointed out that if you perform "(x shl 8) shr 8", where x is of type Word, the result is always x, even though logic dictates that the upper 8 bits should be shifted out and hence the result actually be equal to "x and $FF".  After analysing the assembly language that's produced, it turns out that the optimiser works with the full 32-bits of the register.  For example:<br>
<br>
is_this_a_bug:=((counter shl 8) shr 8);<br>
<br>
...becomes the following under -O3 (under -O1, %r13w and %si are replaced with references)...<br>
<br>
movzwl %r13w,%eax<br>
shl    $0x8,%eax<br>
shr    $0x8,%eax<br>
mox    %al,%si<br>
<br>
A similar situation happens if the variables are of type Byte as well - the intermediate values use the full 32 bits of the register.<br>
<br>
I'm not certain if this is a bug or intended behaviour though.  Can someone more senior make a decision on this?<br>
<br>
Gareth<br>
</div> </HTML>