[fpc-pascal] LZMA Algorithm fails on 64bit

Jonas Maebe jonas.maebe at elis.ugent.be
Sat Jan 23 15:27:36 CET 2010


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

> On Sat, 23 Jan 2010 14:19:23 +0100, Jonas Maebe <jonas.maebe at 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


More information about the fpc-pascal mailing list