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