[fpc-pascal] EControlC instead of EZeroDivide when using SSE instructions
OBones
obones at free.fr
Wed Aug 22 13:14:01 CEST 2012
Olivier SANNIER wrote:
> Does any of you have any suggestion as to explain this behavior, and best of
> all, how to fix it?
I went further and changed the code this so that I can get better
details as to where the exception is coming from:
program test;
uses
sysutils,
classes;
function GetMXCSR: Cardinal;
asm
stmxcsr Result
end;
var
PreviousExceptProc: TExceptProc;
PreviousErrorProc: TErrorProc;
procedure MyExceptProc(Obj: TObject; Addr: Pointer; FrameCount: LongInt;
Frame: PPointer);
begin
WriteLn('MyExceptProc: ' + IntToHex(GetMXCSR, 2));
WriteLn(Obj.ClassName);
PreviousExceptProc(Obj, Addr, FrameCount, Frame);
end;
Procedure MyErrorProc(ErrNo : Longint; Address,Frame : Pointer);
begin
WriteLn('MyErrorProc: ' + IntToHex(GetMXCSR, 2));
WriteLn(ErrNo);
PreviousErrorProc(ErrNo, Address, Frame);
end;
procedure MyTestExcept;
var
Tmp: Double;
begin
Tmp := 0.0;
Tmp := 5.0 / Tmp;
end;
begin
PreviousExceptProc := ExceptProc;
ExceptProc := MyExceptProc;
PreviousErrorProc := ErrorProc;
ErrorProc := MyErrorProc;
MyTestExcept;
end.
I compiled it in both x86 and x64 and then ran it. Here are the results:
============================== x86 ========================================
MyErrorProc: 1900
217
MyExceptProc: 1900
EControlC
An unhandled exception occurred at $004017CE :
EControlC : Control-C hit
$004017CE MYTESTEXCEPT, line 64 of test.dpr
$00401815 main, line 76 of test.dpr
============================== x64 ========================================
MyErrorProc: 1900
200
MyExceptProc: 1900
EDivByZero
An unhandled exception occurred at $000000000040189B :
EDivByZero : Division by zero
$000000000040189B MYTESTEXCEPT, line 64 of test.dpr
$00000000004018FA main, line 76 of test.dpr
So clearly, there is an issue in the x86 build because the ErrorProc has
the wrong runtime error code. Strangely enough, the MXCSR has none of
its exception flags set, so it seems they are reset before ErrorProc is
called
I would very much appreciate any help in solving this issue.
Regards
Olivier
More information about the fpc-pascal
mailing list