Hello,
Here is a bug (?) of the compiler (FP 1.9.4) when setting Level 2
Optimizations. I post it here since I don't believe it is possible
to use the bug report form. (I work with Win98, AMD 2600+)
Types used in the code.
type
TBigInt = record
Digits: PDigits;// pointer to a digit array (digits are
longwords)
Capacity: Longint; // memory size (in longwords) of Digits^
Size: Longint; // number of digits currently used in Digits^
Negative: Boolean; // TRUE if and only if negative (0 is
non-negative)
end;
PBigInt = ^TBigInt;
//--
// Set A^.Size equal to NewSize
// ! The returned BigInt may be no more normalized. The calling proc has
to
// manage the normalization.
//--
procedure BigIntSetSize(A: PBigInt; NewSize: Longint);
begin
Assert(Longword(NewSize) <= ucMAXSIZE32); // check both < 0 and > max
with A^ do
begin
if NewSize > Capacity then BigIntSetCapacity(A,NewSize)
else
if NewSize < Size then
begin
nx_fill(@Digits^[NewSize],Size-NewSize,0); // fill with 0s
if NewSize = 0 then Negative := false;
end;
Size := NewSize;
end;
end;
compiled without optimization (the code works)
# [325] begin
NXINTEGERS_BIGINTSETSIZE$PBIGINT$LONGINT:
# Temps allocated between ebp-16 and ebp-8
pushl %ebp
movl%esp,%ebp
subl$16,%esp
movl%ebx,-16(%ebp)
movl%esi,-12(%ebp)
# Para A located at ebp-4
# Para NewSize located at ebp-8
movl%eax,-4(%ebp)
movl%edx,-8(%ebp)
# [328] with A^ do
movl-4(%ebp),%ebx -> EBX := A
movl%ebx,%eax
# [330] if NewSize > Capacity then BigIntSetCapacity(A,NewSize)
movl4(%eax),%eax
cmpl-8(%ebp),%eax
jl .L316
jmp .L317
.L316:
movl-8(%ebp),%edx
movl-4(%ebp),%eax
callNXINTEGERS_BIGINTSETCAPACITY$PBIGINT$LONGINT
jmp .L322
.L317:
movl%ebx,%eax-> EAX := EBX = A
# [332] if NewSize < Size then
movl8(%eax),%eax -> EAX := A^.SIZE
cmpl-8(%ebp),%eax
compiled with Optimizations 2
# [325] begin
NXINTEGERS_BIGINTSETSIZE$PBIGINT$LONGINT:
# Temps allocated between ebp-16 and ebp-8
pushl %ebp
movl%esp,%ebp
subl$16,%esp
movl%ebx,-16(%ebp)
movl%esi,-12(%ebp)
# Para A located at ebp-4
# Para NewSize located at ebp-8
movl%eax,-4(%ebp)
movl%edx,-8(%ebp)
# [330] if NewSize > Capacity then BigIntSetCapacity(A,NewSize)
movl4(%eax),%ebx-> EBX IS SET WITH "A^.CAPACITY"
cmpl%edx,%ebx
jnl .L317 -> JUMP WITH EBX = A^.CAPACITY (INSTEAD OF A)
movl%eax,%ebx -> EBX := A, SHOULD BE WRITTEN BEFORE 'jnl .L317'
callNXINTEGERS_BIGINTSETCAPACITY$PBIGINT$LONGINT
jmp .L322
.L317:
# [332] if NewSize < Size then
movl8(%ebx),%eax-> EBX <> A, ACCESS VIOLATION
cmpl-8(%ebp),%eax
I hope this is sufficient so that you can find the bug. I couldn't
provide more source code, I just started to adapt my libraries to
Free Pascal and, at the moment, almost nothing is debugged.
--
mm
http://www.ellipsa.net/
___
fpc-pascal maillist - [EMAIL PROTECTED]
http://lists.freepascal.org/mailman/listinfo/fpc-pascal