[fpc-devel] LoadLibrary and FPU control word

LacaK lacak at zoznam.sk
Wed Aug 17 09:30:05 CEST 2011


Hi,
I encounter strange thing. Look at this program please:

var
  LibraryHandle: TLibHandle;
  cw: word;
begin
  cw:=Get8087CW;
  writeln('CW before:',cw, ' IntPower:', intpower(10,-6));
  LibraryHandle:=LoadLibrary('odbc32.dll');
  writeln('CW after:',Get8087CW, ' IntPower:', intpower(10,-6));
  Set8087CW(cw);
end.

Output:
CW before:4978 IntPower: 1.0000000000000000E-0006
CW after:4722 IntPower: 2.0000000000000000E-0006      <--- Wrong result 
of IntPower!!!

As you can see, LoadLibrary changes FPU control word (from $1372 to 
$1272, from 64bit precision to 53bit precision).
Which leads to wrong result of PowerInt.
But it seems, that this happens on *Windows98* only, on Windows XP,Vista 
it does not happen.
Do you have same experience on Windows98?

If yes, then I think, that good idea will be use SafeLoadLibrary instead 
of LoadLibrary (which partialy solves this problem).

Next:
But this error I have encounter when running fcl-db tests suite with 
IBConnection, where is PowerInt used.
When I change in "ibase60.inc" LoadLibrary to SafeLoadLibrary problem 
still exists, because later call to "isc_attach_database" again changes 
FPU control word. So I must save CW before call to "isc_attach_database" 
and then reset CW to original value.
This solves problem.

Please look at attached patches . Do you think, that this approach is 
acceptable or is there any other solution ?

BTW:
When I look at function SafeLoadLibrary in dynlibs.pas there is used :
{$ifdef i386}
  w:=get8087cw;

When I look at function SafeLoadLibrary in SysUtils.inc there is used :
{$if defined(cpui386) or defined(cpux86_64)}
      fpucw:=Get8087CW;

Which conditional is correct ? ("i386" or "cpui386")
Looking at 
http://www.freepascal.org/docs-html/prog/progap7.html#x316-331000G ... I 
see no "i386" ?
And what "FPUX87" ? Can not be used this ?

Thanks
-Laco.


-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: ibase60_cw.diff
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20110817/db4e40af/attachment.ksh>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: ibconnection_cw.diff
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20110817/db4e40af/attachment-0001.ksh>


More information about the fpc-devel mailing list