Comment définir et restaurer les registres FPU CTRL?
Question
Je peux réinitialiser les registres CTRL de la FPU avec ceci:
http://support.microsoft.com/kb/326219
Mais comment puis-je sauvegarder les registres actuels et les restaurer plus tard?
Cela provient du code .net ..
Ce que je suis en train de faire, c’est que Delphi appelle une dll .net en tant que module COM. Vérifier les registres Ctrl dans delphi donne une valeur, vérifier avec controlfp dans le code .net en donne une autre. Ce dont j'ai besoin, c’est essentiel:
_controlfp(_CW_DEFAULT, 0xfffff);
Ainsi, mes calculs en virgule flottante dans le code .net ne se bloquent pas, mais je souhaite restaurer les registres Ctrl lors du renvoi.
Peut-être que non? Peut-être que Delphi les réinitialise en cas de besoin? J'ai blogué à propos de ce problème ici . .
La solution
uses
SysUtils;
var
SavedCW: Word;
begin
SavedCW := Get8087CW;
try
Set8087CW($027f);
// Call .NET code here
finally
Set8087CW(SavedCW);
end;
end;
Autres conseils
Même fonction que vous utilisez pour les changer: _controlfp ()
. Si vous transmettez un masque de 0, la valeur actuelle ne sera pas modifiée, mais elle sera renvoyée - sauvegardez-la et utilisez un second appel à _controlfp ()
pour le restaurer plus tard.