[fpc-devel] Unexpected behaviour with intermediate results
    J. Gareth Moreton 
    gareth at moreton-family.com
       
    Tue Jun 12 02:07:37 CEST 2018
    
    
  
 https://bugs.freepascal.org/view.php?id=33851
 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:
 is_this_a_bug:=((counter shl 8) shr 8);
 ...becomes the following under -O3 (under -O1, %r13w and %si are replaced
with references)...
 movzwl %r13w,%eax
 shl    $0x8,%eax
 shr    $0x8,%eax
 mox    %al,%si
 A similar situation happens if the variables are of type Byte as well -
the intermediate values use the full 32 bits of the register.
 I'm not certain if this is a bug or intended behaviour though.  Can
someone more senior make a decision on this?
 Gareth
  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20180612/3b02dfec/attachment.html>
    
    
More information about the fpc-devel
mailing list