On 23 Jan 2010, at 15:12, Matthias Klumpp wrote:

> On Sat, 23 Jan 2010 14:19:23 +0100, Jonas Maebe <jonas.ma...@elis.ugent.be>
> wrote:
>>> Does anyone know why the code fails to work?
>> 
>> Not really, but at least the following is will be evaluated differently
>> on 32 and 64 bit platforms:
>> 
>> [...]
>> v is a byte, i is a longint (integer in Delphi mode). Outsize is an
>> int64.
>> 
>> On a 32 bit platform, "v shl (8 * i)" will be evaluated as 32 bit. This
>> means that the upper 32 bits of the result of that expression will be
>> discarded before the "or" operation is performed. On a 64 bit platform,
>> that entire expression will be evaluated using 64 bit arithmetic.
>> 
> Hi!
> Maybe the is the reason why it fails, cause the compression does not do
> operations like this. How do I have to change the expression to make it
> work on 32bit and 64bit?

I think the code there is currently actually only correct on 64 bit platforms 
and wrong on 32 bit platforms: it seems that it should read an int64 in little 
endian format and converts it on-the-fly to the native endianess, but that 
currently only happens correctly on 64 bit platforms. I was also wrong about 
what it does on 32 bit platforms, because that depends on the used 
architecture. On PowerPC, it will indeed throw away the upper 32 bits as I 
described above. On i386, it will however result in something like "v shl ((8 
*i) and 31)".

I don't think there is a quick fix. Someone who knows what is going on has to 
go through it and properly fix it. Hacking the code you posted will only result 
in hiding a bug, and you will probably still get more errors elsewhere.


Jonas_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to